定时器和延迟是如何在低级别工作的



关于这个问题,我真的找不到任何有趣的东西,但很长一段时间以来,我一直在想,任何编程语言中的定时器和延迟是如何在低级别工作的。

据我所知,CPU在其所有核心中持续执行指令,速度尽可能快(取决于其时钟速度),只要有任何指令要执行(有一个正在运行的活动线程)。

我觉得在涉及实时性的情况下,没有一种简单的方法来操纵这种流。然后我想知道像动画这样的东西是如何工作的,在很多很多情况下都会遇到:

  • 在Windows7操作系统中,当您将鼠标移到开始菜单按钮上时,开始菜单按钮会逐渐亮起来
  • 在flash中,有一个时间线,flash文档中的所有对象都根据FPS设置和时间线进行动画处理
  • jQuery支持各种动画
  • 代码执行延迟

计算机(主板)有物理计时器吗?就像CPU有寄存器来执行操作并在计算之间保留数据一样?我在网上没有找到任何关于这方面的信息。操作系统是否有一些非常复杂的编程,为所有与计时相关的事情提供最底层的API?

我真的很好奇答案。

大多数(可能是所有)CPU都由主板上的时钟驱动;ticks";(产生信号),每隔一段时间。这就是处理器上的兆赫(MHZ)或千兆赫(GHz)额定值告诉你的,这个时钟的运行速度;"过度锁定";指的是,当你读到处理器可以安全地超频到更高的GHz设置时。你上面描述的大部分内容都是由";ticks";由该时钟生成。这决定了CPU尝试执行下一条指令的频率,以及它实际执行所有操作的频率。。。。

不要把这个时钟和实时时钟混淆,实时时钟记录它的时间;系统时间";或";服务器时间";使用实时时钟,它是主板上的一块单独的硬件,即使在电脑关闭的情况下也能跟踪时间。

这两个";时钟";它们彼此独立并且用于两个完全不同的目的。一个驱动所有CPU处理。如果一个指定的进程(比如说,将两个整数相乘)需要127个cpu周期,那么它需要多少实时性完全取决于cpu时钟设置为多少千兆赫……如果它设置为3.0 Ghz,那么这意味着cpu每秒可以执行30亿个处理器周期,所以需要127个周期的事情将需要127/30亿秒。如果你在主板上放了一个不同的时钟cpu,那么同样的乘法运算将花费更多(或更少)的时间。所有这些都与实时时钟没有任何关系,它只是跟踪时间

我不能保证这就是它的工作方式,但如果我要设计它,这就是我的起点。

首先你需要某种已知的时钟。这可以是运行CPU的相同硬件时钟,也可以是独立的晶体时钟。

接下来,你需要一个基本的计数器。这只是一个加法器,每个刻度加1。如果你想改变计时器的刻度,你可以自由地应用乘数。计数器可能以给定的速率溢出,或者更有可能在计时器关闭时重置。

然后您需要一个寄存器来存储计时器值。程序员将在这里输入他们想要监视的值。由于您的级别低到只关心异步逻辑,因此现在可以连续地将计数器中的每个位与寄存器中的相应位进行比较。您可以使用相等比较器来完成此操作。

当它们匹配时,比较器将发送一个可以触发中断的高信号(基本上是一个非常低级别的挂钩或回调函数,将立即运行——因此得名"中断")。

如果你在操作系统的规模上工作,它可以创建自己的一组计时器。OS已经在使用这样的定时器来设置"定时器";量子;调度器用来在同一核心上的线程之间分配时间。它甚至可能有自己的纯软件实现,可以提供给客户端软件。操作系统可以将硬件定时器can设置为1us(例如),并允许客户端在该频率的倍数上注册回调,以便在其下一个量子上运行。

操作系统支持"睡眠"调用的某些变体,该调用将执行权交给系统上运行的其他进程。如果所有进程都处于睡眠状态,那么内核告诉处理器睡眠一段时间——现代处理器有一条明确的指令。

最新更新