協同運作式多工
協作式多工(Cooperative Multitasking),是一種多工處理方式,多工是使電腦能同時處理多個程式的技術,相對於搶佔式多工(Preemptive multitasking)由作業系統決定任務切換時機。協作式多工要求每一個運行中的程式,定時放棄(yield)自己的執行權利,告知作業系統可讓下一個程式執行[1][2],因為需要程式之間合作達到排程,故稱作協作式多工。
在多工處理中,處理器(CPU)會在相對於用戶來說極短的時間內,依次分配處理能力給不同的程式,以實現看似同時運行多個程式的效果。舉例來說,當你同時使用瀏覽器瀏覽網頁和播放MP3音樂時,CPU會快速切換處理能力,讓你感覺網頁在下捲時音樂仍在播放。然而,如果其中一個程式出現問題,例如因為設計不良或出現故障而無法釋放執行權,這樣的行為會導致整個作業系統停頓,甚至死機。因此,在開發軟件時,需要注意程式的質素和穩定性,避免出現此類問題,以確保系統的穩定運行。
用途
編輯儘管協作式多工排程在現代作業系統中很少用作主要的排程機制,但在受限制記憶體的嵌入式系統和特定應用程式(例如 CICS 或 JES2 子系統)中廣泛使用。在 Windows 95 和 Windows NT 之前以及Classic Mac OS 中,協作式多工排程是 16 位元應用程式的主要排程方式。Windows 9x使用非搶佔式多工排程處理 16 位元應用程式,而 Mac OS X 的 PowerPC 版本在 Leopard 之前使用它處理經典應用程式。NetWare 是一個面向網絡的作業系統,它在 NetWare 6.5 之前使用協作式多工排程。RISC OS 系統仍在使用合作式多工排程。
協作式多工排程與 await 在某些語言(例如 JavaScript 或 Python)中互動使用,這些語言的運行時特徵是單線程事件循環。這與作業系統合作式多工排程形成對比,因為 await 只限於函數或塊的作用範圍,這意味着在單個函數等待時,程式碼的其他部分可能會並行運行。在大多數現代語言中,async 和 await 被當作是coroutine。
問題
編輯作為一個協同多任務系統,依靠每個程式定期主動放棄執行給系統上的其他程式。一個設計不良的程式在執行大量計算、忙碌等待(busy waiting)可能消耗所有CPU時間,會導致整個系統無法動彈。在伺服器環境中,這是一個危險,使整個環境變得終止服務的漏洞。
相比之下,搶佔式多任務可以中斷應用程式並將控制權交給應用程式控制之外的其他進程。
使用watchdog程式可以避免系統死機的潛在問題,通常藉由硬件實現。
協同多任務允許更簡單與精巧的應用程式實作,因為它們的執行永遠不會被進程調度程式意外中斷。因此,不必要求每個函數都設計成可重入的。
參見
編輯參照
編輯- ^ Definition of non-preemptive multitasking. pcmag.com. [August 15, 2015]. (原始內容存檔於2019-07-26).
- ^ Joe Bartel. Non-Preemptive Multitasking (PDF). classiccmp.org. November 5, 2011 [August 15, 2015]. (原始內容存檔 (PDF)於2019-08-19).