absmiddle Preemptive & Nonpreemptive / 先佔式與協調式


[解說] Eric.bbs@firebird.cs.ccu (Cater): 一般來說,多工大概分為 Non-Preemptive Multitasking (Cooperative Multitasking): 也就是 "非優先權式多工",或稱為 "非先佔式多工"、"協調式多工"。 像 Windows 3.1 就屬這種方式。在這種模式下,系統沒有強制力分配 CPU 時間。一個程式佔住了 CPU 時間,除非它願意放出來,不然別的 程式別想執行。所以,要達到多工,就要程式間彼此合作,不用 CPU 的時候,就把它放出來,不要死佔著不放。 Preemptive Multitasking: 也就是 "優先權式多工" 或是 "先佔式多工"。在這種模式下,每個程 式的執行時間完全由系統來分配,一個程式的時間用完了,系統就會 做 context switch,把 CPU 分配給下一個程式,沒有一個程式能獨 佔 CPU 時間。這類作業系統較常見的有 Windows NT、OS/2。 (上面說的 "程式",在 NT 與 OS/2 上是指 thread,並不是 process) [解說] EightCloud.bbs@csie.nctu (嵐雲): 多工, multi-tasking, 就字面上來說, 就是多個工作同時執行. 傳統所謂的多工 OS 的 scheduler , 在每過一個 time slice(約 10 到 100 ms)時, 能暫停當時正在 執行的 task, 而將叫下一個等待執行的 task 來執行. 而這種做法, 必需利用 preemptive scheduling. scheduler 讓正在執行的 task 暫 停, 而叫下一個等待的 task 執行叫做 preempt. 合作式多工, 協同式多工 cooperative multitasking 則是要由 task 合作, 正在執行的 task 必需主動放棄 CPU 的控制權, 然後 OS 的 scheduler 才能執行下一個等待執行的 task. 就 Win3.1 而言, 主動放棄執行的 code 是隱藏在 Win 的 API , 如 GetMessage() 而若一個 task 永遠不呼叫這類的 API, 那其它的 task 就永遠不能執行. 合作式多工這個名詞, 是 M$ Win3.x 流行被吵起來的, 而在 MacOS 就是類似的做法. 真多工和假多工 由於合作式多工與傳統多工不同, 又必須要 task 相互配合, 又被稱為 "假"多工而傳 統的為 "真"多工. Preemptive (先佔, 優先權式) 多工和 nonpreemptvie 多工 由於合作式多工並不需要 preemptive scheduling, 所以又被稱為 nonpreemptvie 多 工, 相對應的, 傳統的多工, 就被稱為 preemptive 多工. 一般 OS 的課本, 多工 和 scheduling 是不在一起講的. 如何知道一個 OS 是不是 preemptive 多工呢? 很簡單, 寫一個不 call 任何 system call, API 的程式, 若還能做工作切換, 就是 preemptive. 最簡單的, 就是寫一個 while(1); 的 C 程式去執行.
上一層目錄