我必须在操作系统中实现sleep()函数。 目前,这在前面提到的系统中并不存在。 问题是,我必须计算唤醒睡眠线程所用的时间。
我应该如何重温这个?我是否需要计算CPU Ticks还是有其他方法吗? CPU Ticks不依赖于每个CPU的CPU频率不同吗?
我必须用C语言实现这个功能。
时间功能不存在
提前谢谢!
答案 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()相似的功能,你应该考虑计时器
像HPET
,ACPI
等硬件。有关详细信息,请参阅"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"。