2014-11-05 70 views
1

我必須在一個操作系統中實現sleep()函數。 目前,在前面提到的系統中並不存在。 問題是,我必須計算經過的時間來喚醒睡眠線程。如何在新的操作系統中實現計時?

我應該如何改變這一點?我是否需要計算CPU Ticks還是有其他方法? CPU Ticks是否不依賴於每個CPU都不同的CPU頻率?

我要實現的語言功能C.

時間函數不存在任何

預先感謝您!

+0

,看一下http://stackoverflow.com/questions/3930363/implement-time-delay-in-c 我覺得你的回答問題 – l0gg3r 2014-11-05 12:21:18

+0

@ l0gg3r我嚴重懷疑'time()'已經實現如果OP從頭開始編寫操作系統。 – user694733 2014-11-05 12:32:49

回答

3

通常,這種功能由硬件定時器中斷(及其相關驅動程序)提供,管理'線程控制塊'指針的'滴答計數'和增量隊列(pTCB)。睡眠線程的pTCP按間隔到期滴答計數排序存儲在隊列中。定時器中斷使滴答計數增加,並再次檢查隊列頭部項目的到期計數。

當一個線程請求休眠時,線程pTCB從準備線程集中取出,計算到期計數和pTCB插入到定時器隊列中。當pTCB到達隊列的末尾,並且它的到期時間tick已經到達時,它會彈出並加回到一組準備好的線程中,以便它可以被設置爲正在運行。

0

您可以使用time()

time_t t = time(); 

while(time() < t + sleepDuration); 
+0

我沒有時間功能... – Momo 2014-11-05 12:45:28

+0

@Momo:time()是在time.h中的c標準庫。你不能使用它? – 2014-11-05 13:03:47

1

這完全取決於你的平臺/操作系統。它必須爲您提供一些類似於時間的信息,例如蜱。否則,這是不可能的。

將刻度轉換爲秒數當然需要額外的信息。再次,這可以由您的平臺提供。或者您必須通過其他方式找到它(手動,自己配置,...)。

1

在操作系統中最簡單也是最常見的方法是在靜態頻率下設置一個定時器中斷,然後在其上建立一個定時器框架,然後使用該定時器框架爲睡眠喚醒喚醒線程。

一篇很好的論文,討論瞭如何有效地完成它的各種數據結構是here。我從我自己的經驗方案推薦7.這很容易實現和執行奇妙。

您可以通過一個好的API here找到一個快速實施。但我有偏見,因爲我寫了。

如果你不想要一個具有靜態頻率的定時器中斷,那麼實現具有良好性能的一個很好的定時器設施將變得更加困難。我已經做了一些實驗,但我建議你從靜態頻率的簡單定時器中斷開始。一旦你開始做動態計時器,你需要準確理解你準備做出的折衷。

+0

非常感謝 – Momo 2015-01-26 17:22:16

0

您可以使用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讀取都更加高效,並且不承擔與環過渡或訪問平臺資源相關的開銷。」

然而,對於睡眠的實現()一樣的功能,你應該看看計時器 硬件像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"