如何在新的操作系统中实现计时?
我必须在一个操作系统中实现sleep()函数。 目前,在前面提到的系统中并不存在。 问题是,我必须计算经过的时间来唤醒睡眠线程。如何在新的操作系统中实现计时?
我应该如何改变这一点?我是否需要计算CPU Ticks还是有其他方法? CPU Ticks是否不依赖于每个CPU都不同的CPU频率?
我要实现的语言功能C.
时间函数不存在任何
预先感谢您!
通常,这种功能由硬件定时器中断(及其相关驱动程序)提供,管理'线程控制块'指针的'滴答计数'和增量队列(pTCB)。睡眠线程的pTCP按间隔到期滴答计数排序存储在队列中。定时器中断使滴答计数增加,并再次检查队列头部项目的到期计数。
当一个线程请求休眠时,线程pTCB从准备线程集中取出,计算到期计数和pTCB插入到定时器队列中。当pTCB到达队列的末尾,并且它的到期时间tick已经到达时,它会弹出并加回到一组准备好的线程中,以便它可以被设置为正在运行。
您可以使用time()
:
time_t t = time();
while(time() < t + sleepDuration);
我没有时间功能... – Momo 2014-11-05 12:45:28
@Momo:time()是在time.h中的c标准库。你不能使用它? – 2014-11-05 13:03:47
这完全取决于你的平台/操作系统。它必须为您提供一些类似于时间的信息,例如蜱。否则,这是不可能的。
将刻度转换为秒数当然需要额外的信息。再次,这可以由您的平台提供。或者您必须通过其他方式找到它(手动,自己配置,...)。
在操作系统中最简单也是最常见的方法是在静态频率下设置一个定时器中断,然后在其上建立一个定时器框架,然后使用该定时器框架为睡眠唤醒唤醒线程。
一篇很好的论文,讨论了如何有效地完成它的各种数据结构是here。我从我自己的经验方案推荐7.这很容易实现和执行奇妙。
您可以通过一个好的API here找到一个快速实施。但我有偏见,因为我写了。
如果你不想要一个具有静态频率的定时器中断,那么实现具有良好性能的一个很好的定时器设施将变得更加困难。我已经做了一些实验,但我建议你从静态频率的简单定时器中断开始。一旦你开始做动态计时器,你需要准确理解你准备做出的折衷。
非常感谢 – Momo 2015-01-26 17:22:16
您可以使用CPU时间戳计数器(TSC)来获取计时器值以进行计时。参见"Intel® 64 and IA-32 Architectures Software Developer’s Manual"的章节16.12.1。
的TSC是一个低电平计数器,其可以提供独立的CPU速度的计数器值:
“在新的处理器时间戳计数器可以支持的增强中,被称为不变TSC处理器的支持。不变TSC由CPUID.80000007H表示:。EDX [8]
的不变TSC将在所有ACPI P-,C--,和T-状态的恒定速率运行这是建筑行为移动在支持不变TSC的处理器上,操作系统可以使用TSC作为挂钟定时器服务(而不是ACPI或HPET定时器)。 TSC读取都更加高效,并且不承担与环过渡或访问平台资源相关的开销。”
然而,对于睡眠的实现()一样的功能,你应该看看计时器 硬件像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"。
,看一下http://stackoverflow.com/questions/3930363/implement-time-delay-in-c 我觉得你的回答问题 – l0gg3r 2014-11-05 12:21:18
@ l0gg3r我严重怀疑'time()'已经实现如果OP从头开始编写操作系统。 – user694733 2014-11-05 12:32:49