
194
|
第六章
合法的用途
實務中,
sched_yield()
在適當的先佔式多任務作業系統(例如 Linux)之上具有若干合
法的用途。核心完全有能力做出理想和最有效的排班決策—當然,相較於個別的應用程
式,核心有更好的裝備可用於決定要先佔什麼以及何時進行先佔。這也正是為什麼,作
業系統會放棄協同式多任務而支持先佔式多任務。
那麼,何以我們會有一個“重新排班我”(reschedule me)系統呼叫可用?答案在於應
用程式必須等待外部事件(也許是用戶、一個硬體元件或另一個行程所造成)。舉例來
說,如果一個行程需要等待另一個行程,則「讓出處理器直到另一個行程完成」是第一
個階段的解決方案。再舉一個例子,在 consumer/producer(消費者∕生產者)機制中一
個簡單的 consumer 實作可能會類似下面這個樣子:
/* consumer... */
do {
while (producer_not_ready ())
sched_yield ());
process_data ();
} while (!time_to_quit ());
值得慶幸的是,Unix 設計者不會動輒寫出這樣的程式碼。Unix 程式通常是事件驅動的
(event-driven)而且傾向於在 consumer 與 producer 之間運用某種可阻擋的機制(例
如,導管)來代替
sched_yield()
。此狀況下,consumer 讀取導管(pipe),並在需要時
遭到阻擋,直到資料可供讀取。接著,當新資料變為可用時,producer ...