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

时间:2014-11-05 12:15:21

标签: c time cpu sleep thread-sleep

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

我应该如何重温这个?我是否需要计算CPU Ticks还是有其他方法吗? CPU Ticks不依赖于每个CPU的CPU频率不同吗?

我必须用C语言实现这个功能。

时间功能不存在

提前谢谢!

5 个答案:

答案 0 :(得分:3)

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

当线程请求休眠时,线程pTCB从准备好的线程集合中取出,计算到期计数并将pTCB插入到计时器队列中。当pTCB到达队列的末尾,并且它已到期时,它会被弹出并添加回准备好的线程组,以便它可以设置为运行。

答案 1 :(得分:1)

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

将刻度转换为秒当然需要其他信息。同样,这可以由您的平台提供。或者你必须通过其他方式找到它(手动,自己配置,......)。

答案 2 :(得分:1)

在操作系统中最简单和最常见的方法是以静态频率设置计时器中断,然后在其上构建计时器框架,然后使用该计时器框架为您的休眠线程启动唤醒

一篇很好的论文,讨论了如何有效地进行各种数据结构here。我建议从我自己的经验方案7.它很容易实现和执行奇妙。

您可以找到具有良好API here的快速实施。但我有偏见,因为我写了它。

如果您不希望定时器中断具有静态频率,则实现具有良好性能的良好定时器设备变得更加困难。我做了一些实验,但我建议你从静态频率的简单定时器中断开始。一旦你开始做动态计时器,你需要准确理解你准备做出的权衡。

答案 3 :(得分:0)

您可以使用time()

time_t t = time();

while(time() < t + sleepDuration);

答案 4 :(得分:0)

您可以使用CPU时间戳计数器( TSC )来获取计时器的计时值。参见"Intel® 64 and IA-32 Architectures Software Developer’s Manual"的第16.12.1节。

TSC是一个低级计数器,它可以提供与CPU速度无关的计数器值:

  

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

     

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

但是,为了实现sleep()相似的功能,你应该考虑计时器 像HPETACPI等硬件。有关详细信息,请参阅"Intel 64® and IA-32 Architectures Software Developer's Manual, Volume 3B: System Programming Guide, Part 2""IA-PC HPET (High Precision Event Timers) Specification"