C 如何在新的操作系统中实现时间计数?

C 如何在新的操作系统中实现时间计数?,c,time,cpu,sleep,thread-sleep,C,Time,Cpu,Sleep,Thread Sleep,我必须在操作系统中实现函数sleep()。 目前,在前面提到的系统中不存在。 问题是,我必须计算唤醒睡眠线程所用的时间 我该如何重温这一点?我必须计算CPU的滴答声还是有其他方法? CPU滴答声是否不取决于CPU频率,每个CPU的频率不同 我必须用C语言实现这个函数 时间函数也不存在 提前谢谢你 您可以使用time(): time_t t = time(); while(time() < t + sleepDuration); time\u t=time(); while(time()

我必须在操作系统中实现函数sleep()。 目前,在前面提到的系统中不存在。 问题是,我必须计算唤醒睡眠线程所用的时间

我该如何重温这一点?我必须计算CPU的滴答声还是有其他方法? CPU滴答声是否不取决于CPU频率,每个CPU的频率不同

我必须用C语言实现这个函数

时间函数也不存在

提前谢谢你

您可以使用
time()

time_t t = time();

while(time() < t + sleepDuration);
time\u t=time();
while(time()
您可以使用
time()

time_t t = time();

while(time() < t + sleepDuration);
time\u t=time();
while(time()
这完全取决于您的平台/操作系统。它必须向您提供一些类似时间的信息,例如滴答声。否则这是不可能的


当然,将滴答声转换为秒需要额外的信息。同样,这可以由您的平台提供。或者您必须通过其他方式(手动、自行配置等)找到它。

这完全取决于您的平台/操作系统。它必须向您提供一些类似时间的信息,例如滴答声。否则这是不可能的


当然,将滴答声转换为秒需要额外的信息。同样,这可以由您的平台提供。或者您必须通过其他方式(手动、自行配置等)找到它。

在操作系统中,最简单也是最常见的方法是设置一个静态频率的计时器中断,然后在此基础上构建一个计时器框架,然后使用该计时器框架为睡眠线程触发唤醒

一篇讨论各种数据结构的好论文是。我根据自己的经验推荐方案7。它很容易实现,性能也很好

您可以找到一个具有良好API的快速实现。但我有偏见,因为是我写的


如果您不想使用静态频率的计时器中断,那么实现一个性能良好的计时器工具将变得更加困难。我已经做了一些实验,但我建议你从一个静态频率的简单定时器中断开始。一旦你开始使用动态计时器,你就需要准确地了解你准备进行的权衡。

在操作系统中,最简单也是最常见的方法是以静态频率设置计时器中断,然后在此基础上构建计时器框架,然后使用该计时器框架为睡眠线程触发唤醒

一篇讨论各种数据结构的好论文是。我根据自己的经验推荐方案7。它很容易实现,性能也很好

您可以找到一个具有良好API的快速实现。但我有偏见,因为是我写的


如果您不想使用静态频率的计时器中断,那么实现一个性能良好的计时器工具将变得更加困难。我已经做了一些实验,但我建议你从一个静态频率的简单定时器中断开始。一旦开始使用动态计时器,您需要准确了解准备进行的权衡。

通常,这种功能由硬件计时器中断(及其相关驱动程序)提供,该中断管理“滴答计数”和“线程控制块”指针的增量队列(pTCB)。休眠线程的pTCP存储在队列中,队列按间隔到期滴答计数排序。计时器中断会增加勾号计数,并将其与队列头部项目的到期计数重新检查


当线程请求睡眠时,线程pTCB将从就绪线程集中取出,计算到期计数并将pTCB插入计时器队列。当pTCB到达队列的末尾,并且它的到期标记已经到达时,它将弹出并添加回就绪线程集,以便它可以被设置为运行。

通常,这种功能由硬件定时器中断(及其相关驱动程序)提供,它管理“滴答计数”和“线程控制块”指针的增量队列(pTCB)。休眠线程的pTCP存储在队列中,队列按间隔到期滴答计数排序。计时器中断会增加勾号计数,并将其与队列头部项目的到期计数重新检查


当线程请求睡眠时,线程pTCB将从就绪线程集中取出,计算到期计数并将pTCB插入计时器队列。当pTCB到达队列的末尾,并且它的到期标记已经到达时,它将弹出并添加回就绪线程集,以便可以将其设置为运行。

您可以使用CPU时间戳计数器(TSC)获取用于计时的计数器值。见第16.12.1章

TSC是一个低电平计数器,可提供独立于CPU速度的计数器值:

较新处理器中的时间戳计数器可能支持增强,称为不变TSC。处理器对不变TSC的支持由CPUID.8000007H:EDX[8]表示

不变TSC将在所有ACPI p-、C-、和T-状态下以恒定速率运行。这是向前发展的体系结构行为。在支持不变TSC的处理器上,操作系统可以将TSC用于挂钟计时器服务(而不是ACPI或HPET计时器).TSC读取效率更高,不会产生与环转换或访问平台资源相关的开销。”

但是,对于类似sleep()功能的实现,您应该查看计时器
硬件,如HPET
ACPI
,等等。有关详细信息,请参阅和。

您可以使用CPU时间戳计数器(TSC)来获取用于计时的计数器值。见第16.12.1章

TSC是一个低电平计数器