
414
|
第十一章
超限運轉
第 11 章〈休眠與等待〉一節所探討的介面都能保證至少可以休眠所要求的時間(否則
會傳回錯誤碼以指出此事)。所要求的延遲時間沒有過去,這些介面絕不會成功返回。
然而,間隔時間比所要求的延遲時間還長是有可能的。
此現象可能是由於簡單的排班行為—所要求的時間可能已經過去,而且核心可能已經準
時喚醒行程,但是排班器可能已經選擇運行不同的任務。
然而,還存在一個更詭異的起因:
計時器超限運轉
(
timer overrun
)。當計時器的粒度
比所要求的時間間隔還大,便會發生此現象。舉例來說,假設系統計時器的時鐘週期具
有 10 ms 的時間間隔,而且有一個行程要求了 1 ms 的休眠時間。系統只能夠在 10 ms
的時間間隔(interval)量測時間以及回應時間相關事件(例如,喚醒一個休眠中的行
程)。如果,行程發出休眠要求時,計時器在距離一個週期屆滿前 1 ms 的地方,則一切
相安無事—在這 1 ms 中,所要求的時間(1 ms)將會過去,而且核心將會喚醒行程。
然而,如果行程送出休眠要求的同時,計時器剛好屆滿一個週期,行程將會修眠額外
9 ms !也就是,將有九次的 1 ms 超限運轉。平均而言,一個週期為
X
的計時器將具有
X/2
的超限運轉率。
使用高精確度的時間來源,例如 POSIX 時鐘所提供的那些,以及較高值的
HZ
,可最小
化計時器的超限運轉。
休眠的替代方案
如果可能,你應該避免休眠。通常,你無法避免,那也沒關係—特別是,如果你的程式
碼的修眠時間小於 1 秒。然而,若程式碼以修眠來「忙碌等待」 ...