簡體   English   中英

如何在新的操作系統中實現計時?

[英]How to implement time counting in a new operating system?

我必須在操作系統中實現功能sleep()。 目前,這在前面提到的系統中不存在。 問題是,我必須計算經過的時間才能喚醒睡眠線程。

我應該如何處理呢? 我是否需要計算CPU時鍾數或還有其他方法嗎? CPU標記是否不依賴於每個CPU不同的CPU頻率?

我必須用C語言實現該功能。

時間函數也不存在

先感謝您!

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

當線程請求睡眠時,將線程pTCB從准備好的線程集中取出,計算到期時間,並將pTCB插入計時器隊列。 當pTCB到達隊列的末尾並且到達了到期時鍾時,它將彈出並添加回准備好的線程集中,以便可以將其設置為運行。

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

當然,將刻度轉換為秒還需要其他信息。 同樣,這可以由您的平台提供。 或者,您必須通過其他方式找到它(手動,自行配置,...)。

在操作系統中最簡單,最常見的方法是在靜態頻率上設置計時器中斷,然后在該頻率上構建計時器框架,然后使用該計時器框架為睡眠線程觸發喚醒。

中有關如何有效地做到這一點的各種數據結構良好的紙在這里 我從我自己的體驗方案7中推薦。它很容易實現並且表現出色。

您可以在此處找到具有良好API的快速實現。 但是我有偏見,因為我寫了它。

如果您不希望使用靜態頻率中斷計時器,則難以實現性能良好的良好計時器功能。 我已經做過一些實驗,但建議您從具有固定頻率的簡單計時器中斷開始。 一旦開始使用動態計時器,就需要准確地了解您准備進行的權衡。

您可以使用time()

time_t t = time();

while(time() < t + sleepDuration);

您可以使用CPU時間戳計數器( TSC )來獲取用於計時的計數器值。 請參閱“英特爾 ®64 和IA-32架構軟件開發人員手冊”的第16.12.1章。

TSC是一個低電平計數器,可以提供與CPU速度無關的計數器值:

“更新的處理器中的時間戳計數器可以支持一種稱為不變TSC的增強功能。處理器對不變TSC的支持由CPUID.80000007H:EDX [8]指示。

在所有ACPI P,C和T狀態下,不變TSC將以恆定速率運行。 這是前進的架構行為。 在具有不變TSC支持的處理器上,OS可以將TSC用於壁鍾計時器服務(而不是ACPI或HPET計時器)。 TSC讀取效率更高,並且不會產生與環轉換或訪問平台資源相關的開銷。”

但是,對於類似sleep()的功能的實現,您應該研究計時器硬件,例如HPETACPI等。 有關詳細信息,請參見“ Intel64®和IA-32體系結構軟件開發人員手冊,第3B卷:系統編程指南,第2部分”“ IA-PC HPET(高精度事件計時器)規范

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM