進程和線程
進程
進程是資源分配的基本單位。
進程控制塊(PCB)描述進程基本信息和運行狀態,創建進程和撤銷進程。
線程
線程是CPU調度的基本單位。
一個進程可以有多個線程。他們共享進程資源。
QQ 和瀏覽器是兩個進程,瀏覽器進程裏面有很多線程,例如 HTTP 請求線程、事件響應線程、渲染線程等等,線程的併發執行使得在瀏覽器中點擊一個新鏈接從而發起 HTTP 請求時,瀏覽器還可以響應用戶的其它事件。
進程和線程的區別
資源方面
進程是資源分配的基本單位,但是線程不擁有資源,線程可以訪問進程的資源。
調度方面
線程時獨立調度的基本單位,在同一進程中,線程的切換不會引起進程切換。從一個進程中的線程切換到另一個進程的線程時,會引起進程的切換。
系統開銷方面
創建和撤銷進程時,系統都要爲之分配或回收資源,如內存空間、I/O設備等,所帶來的的開銷遠大於創建和撤銷線程的開銷。
另外,在進程切換時,涉及當前執行進程CPU環境的保存及新調度進程CPU環境的設置,但線程切換時,只需保存和設置少量子村器內容,開銷很少。
通信方面
線程間可以通過直接讀寫同一進程中的數據進行通信,但是進程通信需要IPC
進程狀態
- 就緒狀態——等待被調度
- 運行狀態——進程運行
- 阻塞狀態——等待資源
- 只有就緒態和運行態可以相互轉換,其他都是單向轉換
- 就緒態的進程通過調度算法獲得CPU的運行時間,轉爲運行態
- 運行態的進程,在分配給它的CPU時間片用完後會轉爲就緒狀態
- 阻塞狀態時缺少需要的資源從而有運行態轉換而來,該資源不包括CPU時間,缺少CPU時間會從運行態轉爲就緒態
七態模型
七態模型在五態模型的基礎上增加了掛起就緒態和掛起等待態。
- 掛起就緒態:進程具備運行條件,但目前在外存中,只有它被對換到內存才能被調度執行。
- 掛起等待態:表明進程正在等待某一個事件發生且在外存中。
進程進入掛起狀態是由於操作系統、父進程或進程本身阻止它的運行。
線程狀態
下圖是Java線程的狀態
- 初始狀態:new一個實例,線程就進入了初始狀態。
- 就緒狀態:有運行的資格,調度程序還沒挑選到該線程
- 運行狀態:線程的run方法執行時
- 阻塞狀態:線程阻塞進入synchronized關鍵字修飾方法或代碼塊時的狀態。
- 等待狀態:處於這種狀態的線程不會被分配CPU執行時間,它們要等待被顯式地喚醒。否則會處於無限期等待的狀態。
- 超時狀態:處於這種狀態的線程不讓出系統資源,無須無限期等待被其他線程顯示地喚醒,在達到一定時間後它們會自動喚醒。
- 終止狀態:run()方法完成時,就認爲它終止了。
進程調度算法
不同環境調度方法不同。
批處理系統
批處理系統沒有太多的用戶操作,在該系統中,調度算法目標是保證吞吐量和週轉時間。
先來先服務
非搶佔式調度算法,按照請求的順序進行調度。
有利於長作業,不利於短作業,因爲短作業必須等待前面的長作業執行完畢才能執行。
短作業優先
非搶佔式調度算法,按估計運行時間最短的順序進行調度。
長作業可能餓死,處於一直等待短作業完畢的狀態。
最短剩餘時間優先
最短作業時間優先的搶佔式版本,按照剩餘運行時間的順序進行調度。
當一個新作業到達時,其整個運行時間與當前進程的剩餘時間作比較。如果新的進程需要的時間更少,則掛起當前進程,否則新的進程等待。
交互式系統
交互式系統有大量的用戶交互操作,在該系統中調度算法的目標是快速地進行響應。
時間片輪轉
所有就緒進程按到來的先後順序排成一個隊列。
每次調度時,把CPU時間分配給隊首進程,該進程可以執行一個時間片。但時間片用完時,由計時器發出時鐘中斷,調度程序停止該進程的執行,並把它送至隊列的末尾,同時繼續把CPU時間分配給隊首進程。
優先級調度
給每個進程分配一個優先級,按優先級進行調度。
爲了防止低優先級繼承永遠得不到調度,可以隨時間的推移增加等待進程的優先級。
多級反饋隊列
一個進程需要執行100個時間片時,若採用時間片輪轉算法,那麼需要交換100次。
多級隊列是爲這種需要執行多個時間片的進程考慮,他設置了多個隊列,每個隊列時間片都不同。例如1 2 4 8…。進程在第一個隊列沒執行完會被移到下一個隊列。
每個隊列優先權不同,最上面的優先權最高。只有上一個隊列沒有進程在排隊時,才能調度當前隊列上的進程。