6

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

据我了解,CPU 尽可能快地在其所有内核中连续执行指令(取决于其时钟速度),并且只要有任何要执行的指令(有一个正在运行的、活动的线)。

我觉得没有一种直接的方法可以在涉及实时的情况下操纵这个流程。然后我想知道动画之类的东西是如何工作的,在很多很多情况下都会遇到:

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

电脑(主板)有物理定时器吗?就像 CPU 有寄存器来执行其操作并在计算之间保存数据一样?我在互联网上没有找到任何关于此的内容。操作系统是否有一些非常复杂的编程,为与时间相关的所有事情提供最低级别的 API?

我真的很好奇答案。

4

3 回答 3

3

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

不要将此时钟与实时时钟混淆,后者会跟踪现在的时间。所有对“系统时间”或“服务器时间”的引用都使用实时时钟,它是主板上的一个独立硬件,即使在计算机关闭时也能跟踪时间。

这两个“时钟”相互独立,用于两个完全不同的目的。一个驱动所有 CPU 处理。如果一个指定的进程(例如,将两个整数相乘)将花费 127 个 cpu 周期,那么它将花费多少实时时间完全取决于 cpu 时钟设置为多少千兆赫......如果它设置为 3.0 Ghz,那么这意味着 CPU 每秒可以执行 30 亿个处理器周期,因此需要 127 个周期的事情将需要 127/30 亿秒。如果您在主板上放置不同的时钟 cpu,那么相同的乘法将花费更多(或更少)时间。这一切都与实时时钟没有任何关系,它只是跟踪现在是什么时间。

于 2012-11-02T17:15:40.137 回答
0

我不能保证这绝对是它的工作原理,但如果我要设计它,这就是我要开始的地方。

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

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

然后你需要一个寄存器来存储定时器的值。这是程序员将输入他们想要观察的值的地方。由于您已经足够低,只关心异步逻辑,因此您现在可以不断地将计数器中的每个位与寄存器中的相应位进行比较。您可以使用相等比较器来做到这一点。

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

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

于 2021-09-08T21:32:27.867 回答
-1

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

于 2012-11-02T17:10:12.513 回答