[英]How to implement time counting in a new operating system?
我必須在操作系統中實現功能sleep()。 目前,這在前面提到的系統中不存在。 問題是,我必須計算經過的時間才能喚醒睡眠線程。
我應該如何處理呢? 我是否需要計算CPU時鍾數或還有其他方法嗎? CPU標記是否不依賴於每個CPU不同的CPU頻率?
我必須用C語言實現該功能。
時間函數也不存在
先感謝您!
通常,此類功能由硬件計時器中斷(及其相關的驅動程序)提供,該中斷管理“滴答計數”和“線程控制塊”指針(pTCB)的增量隊列。 睡眠線程的pTCP存儲在按時間間隔到期滴答計數排序的隊列中。 計時器中斷會增加滴答計數,並再次檢查它在隊列開頭的項的到期計數。
當線程請求睡眠時,將線程pTCB從准備好的線程集中取出,計算到期時間,並將pTCB插入計時器隊列。 當pTCB到達隊列的末尾並且到達了到期時鍾時,它將彈出並添加回准備好的線程集中,以便可以將其設置為運行。
這完全取決於您的平台/操作系統。 它必須為您提供一些類似時間的信息,例如刻度線。 否則,這是不可能的。
當然,將刻度轉換為秒還需要其他信息。 同樣,這可以由您的平台提供。 或者,您必須通過其他方式找到它(手動,自行配置,...)。
您可以使用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()的功能的實現,您應該研究計時器硬件,例如HPET
, ACPI
等。 有關詳細信息,請參見“ Intel64®和IA-32體系結構軟件開發人員手冊,第3B卷:系統編程指南,第2部分”和“ IA-PC HPET(高精度事件計時器)規范 ” 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.