协作式多任务

協作式多工(Cooperative Multitasking),是一種多工處理方式,多工是使電腦能同時處理多個程序的技術,相對於搶佔式多工(Preemptive multitasking)由作業系統決定任務切換時機。協作式多工要求每一個運行中的程序,定時放棄(yield)自己的執行權利,告知作業系統可讓下一個程序執行[1][2],因為需要程序之間合作達到排程,故稱作協作式多工。


在多工處理中,處理器(CPU)會在相對於用戶來說極短的時間內,依次分配處理能力給不同的程序,以實現看似同時運行多個程序的效果。舉例來說,當你同時使用瀏覽器瀏覽網頁和播放MP3音樂時,CPU會快速切換處理能力,讓你感覺網頁在下捲時音樂仍在播放。然而,如果其中一個程序出現問題,例如因為設計不良或出現故障而無法釋放執行權,這樣的行為會導致整個作業系統停頓,甚至當機。因此,在開發軟體時,需要注意程式的品質和穩定性,避免出現此類問題,以確保系統的穩定運行。

用途

儘管協作式多工排程在現代作業系統中很少用作主要的排程機制,但在受限制記憶體的嵌入式系統和特定應用程式(例如 CICSJES2英语JES2 子系統)中廣泛使用。在 Windows 95Windows NT 之前以及Classic Mac OS 中,協作式多工排程是 16 位元應用程式的主要排程方式。Windows 9x使用非搶佔式多工排程處理 16 位元應用程式,而 Mac OS X 的 PowerPC 版本在 Leopard 之前使用它處理經典應用程式。NetWare 是一個面向網絡的作業系統,它在 NetWare 6.5 之前使用協作式多工排程。RISC OS 系統仍在使用合作式多工排程。

協作式多工排程與 await 在某些語言(例如 JavaScriptPython)中交互使用,這些語言的運行時特徵是單執行緒事件循環。這與作業系統合作式多工排程形成對比,因為 await 只限於函數或塊的作用範圍,這意味著在單個函數等待時,程式碼的其他部分可能會並行運行。在大多數現代語言中,async 和 await 被當作是coroutine

問題

作為一個協同多任務系統,依靠每個程序定期主動放棄執行給系統上的其他程序。一個設計不良的程序在執行大量計算、忙碌等待(busy waiting)可能消耗所有CPU時間,會導致整個系統無法動彈。在伺服器環境中,這是一個危險,使整個環境變得終止服務的漏洞。

相比之下,抢占式多任務可以中斷應用程序並將控制權交給應用程序控制之外的其他進程。

使用watchdog程式可以避免系統當機的潛在問題,通常藉由硬件實現。

協同多任務允許更簡單與精巧的應用程序實作,因為它們的執行永遠不會被進程調度程序意外中斷。因此,不必要求每個函式都設計成可重入的。

参见

引用

  1. ^ Definition of non-preemptive multitasking. pcmag.com. [August 15, 2015]. (原始内容存档于2019-07-26). 
  2. ^ Joe Bartel. Non-Preemptive Multitasking (PDF). classiccmp.org. November 5, 2011 [August 15, 2015]. (原始内容存档 (PDF)于2019-08-19).