在一個進程里,線程的調度有搶占式或者非搶占的模式。
在搶占模式下,操作系統負責分配CPU時間給各個進程,一旦當前的進程使用完分配給自己的CPU時間,操作系統將決定下一個占用CPU時間的是哪一個線程。因此操作系統將定期的中斷當前正在執行的線程,將CPU分配給在等待隊列的下一個線程。所以任何一個線程都不能獨占CPU。每個線程占用CPU的時間取決於進程和操作系統。進程分配給每個線程的時間很短,以至於我們感覺所有的線程是同時執行的。實際上,系統運行每個進程的時間有2毫秒,然后調度其他的線程。它同時他維持着所有的線程和循環,分配很少量的CPU時間給線程。線程的的切換和調度是如此之快,以至於感覺是所有的線程是同步執行的。
調度是什么意思?調度意味着處理器存儲着將要執行完CPU時間的進程的狀態和將來某個時間裝載這個進程的狀態而恢復其運行。然而這種方式也有不足之處,一個線程可以在任何給定的時間中斷另外一個線程的執行。假設一個線程正在向一個文件做寫操作,而另外一個線程中斷其運行,也向同一個文件做寫操作。 Windows 95/NT, UNIX使用的就是這種線程調度方式。
在非搶占的調度模式下,每個線程可以需要CPU多少時間就占用CPU多少時間。在這種調度方式下,可能一個執行時間很長的線程使得其他所有需要CPU的線程”餓死”。在處理機空閑,即該進程沒有使用CPU時,系統可以允許其他的進程暫時使用CPU。占用CPU的線程擁有對CPU的控制權,只有它自己主動釋放CPU時,其他的線程才可以使用CPU。一些I/O和Windows 3。x就是使用這種調度策略。
在有些操作系統里面,這兩種調度策略都會用到。非搶占的調度策略在線程運行優先級一般時用到,而對於高優先級的線程調度則多采用搶占式的調度策略。如果你不確定系統采用的是那種調度策略,假設搶占的調度策略不可用是比較安全的。在設計應用程序的時候,我們認為那些占用CPU時間比較多的線程在一定的間隔是會釋放CPU的控制權的,這時候系統會查看那些在等待隊列里面的與當前運行的線程同一優先級或者更高的優先級的線程,而讓這些線程得以使用CPU。如果系統找到一個這樣的線程,就立即暫停當前執行的線程和激活滿足條件的線程。如果沒有找到同一優先級或更高級的線程,當前線程還繼續占有CPU。當正在執行的線程想釋放CPU的控制權給一個低優先級的線程,當前線程就轉入睡眠狀態而讓低優先級的線程占有CPU。
