windows的進程和線程1--基本的概念

這篇文章用來對window下的進程和線程的基本概念來做總結,文章的形式是採用問答式,這樣可以更有目的性。

1.進程和線程分別是什麼?

說道這個問題,我們需要首先說下操作系統,操作系統將硬體管理起來,提供統一管理介面供用戶調用。操作系統提供一個平台,進程則在平台上完成相應的操作(比如聽音樂,看電影,編輯word文檔等等)。在現代的操作系統中,操作系統支持多進程,即現代操作系統支持多個進程*同時*運行。進程提供了運行的環境,具體的邏輯任務由線程來完成。

我們來系統總結下:進程提供一個各種資源的容器,定義了一個地址空間作為基本的執行環境;線程是一個指令執行序列,可以直接訪問進程中的資源。每個進程中至少有一個線程,線程在任一時刻必屬於某個進程。

2.前面說現代操作系統支持多個進程同時運行,那麼是如何實現同時運行呢?

這裡的同時運行,需要區分CPU多核和單核的情況。

在單核的情況下,因為只有一個CPU,所以只能是在某一個時候只有一個進程在運行,操作系統採用了「分時」的辦法。

首先,我們可以將進程想像為一長串順序的指令流,當指令流執行完畢後,進程就退出來了,那麼我們可以將這一串指令流來切開,即將這一長串指令流切為一片一片的指令片,只要CPU按照順序執行這些指令片,也能得到和一直執行進程的結果。

當有多個進程的時候,我們將每個進程都切為對應的片,每隔一定時間來執行某個進程的片,之後在切換到另一個進程的片,這樣就達到了「同時運行」的效果。只要時間片是很短暫的,小於人的感知時間(大約100ms到200ms),就可以讓人感覺不到進程在切換。

多核的情況和單核的情況相似,也是採用「分時」的方法。只不過是多核有多個處理器。這裡可以把每個核想像為一個個單核就可以了。

到這裡,大家就知道了如何達到多進程並行的效果,那麼這需要操作系統提供什麼呢?

很顯然,操作系統要想完成分時的效果,需要做如下的事情:

  1. 維護一個全局的進程表,記錄當前哪些進程正在被執行。

  2. 將時間分為適當的片段。

  3. 在進程間實施切換,即保存上一個進程的執行環境信息,恢復下一個進程的執行環境。

3.進程在操作系統中是怎麼來的和怎麼沒的呢?

在操作系統啟動的時候,需要先把進程的運行環境全部創建起來,為進程的運行打好基礎。創建一個進程即為進程建立基本的執行環境,然後將其加入到系統的全局進程表中,這樣進程就能獲得相應的資源來運行。

而進程的退出則是通知操作系統將其由全局進程表中去除,之後銷毀此進程所有的資源。一般,系統會有檢測的功能,當發現某個進程不正常的時候,操作系統可以將這個進程*殺掉*,從而釋放對應的資源。

4.既然進程就能達到並行的目的,那麼為什麼還需要線程呢?

總地說來,是因為線程比進程成本更低。因為創建一個進程需要為其分配各種資源,而線程只需要使用進程事先分配好的即可;進程之間的通信成本也會較高,而線程則是在一個進程的環境下,通信起來會很方便。其實,我們可以把線程看做是一個「輕量級」的進程。

5.線程的創建和切換是什麼樣子的?

線程的創建其實和進程類似,也是建立起來線程的執行環境,比如分配線程所需要的數據結構和調用棧,完成這些數據結構的初始化操作。雖然這些操作比較於進程是很輕量級的,但是頻繁創建和銷毀也會是不可忽視的消耗。所以當需要頻繁創建和銷毀線程的時候,可以考慮線程池式的方式來解決消耗過大的問題。

進程中的多個線程執行的時候,是亂序的,即在某個時刻執行哪個線程,是不確定的,所以多線程的問題會比較難以調試。對於線程來說,是有用戶態和內核態的區別,當進行線程切換的時候,如果線程是用戶態,是需要切換為內核態的,這種切換也是需要耗費資源,不過目前隨著硬體的發展,這部分切換的成本正在減少,所以,這部分的開銷是可以接受的,大部分情況下,我們可以忽略線程的切換。

6.線程的調度演算法

在這裡我們先需要來了解下如何評價演算法。調度演算法的準則大約有如下的方面:

  1. 公平性,在選擇下一個運行的線程時,要考慮同等地位的線程必須有相同的機會來獲取處理器執行權。

  2. CPU有效利用,即只要有進程和線程在等待,CPU就不能空閑。

對於不同類型的操作系統會對演算法有不同的需求,例如:實時操作系統對於響應時間有最低的要求。

調度演算法可以分為非搶佔式和搶佔式,在非搶佔式系統中,一個線程一旦被選擇在處理器上執行,就一直運行,直到阻塞或自願放棄或退出。我們可以看到,這類演算法如果一個線程陷入長時間的處理中時,系統就無法切換其它的線程,容易造成其它線程的餓死。而搶佔式系統中,一個線程被選中後,允許運行的時間長度有最大的限制,當到達這個時間後,就被迫放棄執行權,由系統來決定下一個執行的線程。

這裡介紹三種典型的線程調度演算法,限於篇幅,這裡只給出簡單的介紹,具體了解則需要去尋找對應的資料。

  1. 先到先服務演算法:這是在非搶佔系統中的演算法,顧名思義,即誰先來先執行誰。

  2. 時間片輪換演算法:將處理器時間分為最大長度不超過某個時間的片段,然後用輪轉的方式來分配給線程。

  3. 優先順序調度演算法:將線程分為不同的優先順序,之後按照優先順序來調度演算法。

7.windows線程採用了何種調度演算法呢

windows的調度演算法是 搶佔式,支持多處理器的優先順序調度演算法,即結合了前面幾種演算法的優缺點的一種演算法。windows為每個處理器定義了一個鏈表數組,相同優先順序的線程在同一鏈表中。當線程滿足執行條件的時候,它首先被掛到當前處理器的一個待分配的鏈表(延遲的就緒鏈表),然後調度器在適當的時候(當調度器獲取控制權)把待分配表上的線程分配到到某個處理器對應優先順序的線程鏈表中。當處理器選擇下一個運行的線程時,會根據優先順序來選擇線程。

以上就是windows進程和線程的簡單總結了。如果有描述錯誤或不清楚的地方,請指正。

參考資料:

《Windows內核原理與實現》--潘愛民

推薦閱讀:

在Android系統下有沒有可能開發出類似Windows里「驅動精靈」這樣的應用程序?
為什麼 Windows 不考慮用華文黑體(黑體-簡)作簡體中文界面字體?
Windows RT 真的說再見了嗎?
Windows 7 的 C 盤居然有了 30G 的已用空間,用 CCleaner 只能釋放出 200M,什麼東西這麼大?如何有效釋放空間?
為什麼在Universal App的概念提出後,很多新發布的應用(國內)還是只兼容手機/PC?

TAG:MicrosoftWindows | 進程 | 線程 |