1. 程式人生 > >以操作系統的角度述說線程與進程

以操作系統的角度述說線程與進程

電腦 時也 示意圖 也有 無限制 監視 thread 人的 enter

引言

面試官經常會問到線程與進程的區別,大多數人的回答都僅限於課本上的那幾句定義,比如:

1、定義方面:進程是程序在某個數據集合上的一次運行活動;線程是進程中的一個執行路徑。

2、角色方面:在支持線程機制的系統中,進程是系統資源分配的單位,線程是系統調度的單位。

3、資源共享方面:進程之間不能共享資源,而線程共享所在進程的地址空間和其它資源。同時線程還有自己的棧、程序計數器、寄存器。

4、獨立性方面:進程有自己獨立的地址空間,而線程沒有,線程必須依賴於進程而存在。

當然這種說法並不是不正確,只能說不夠精確。 本文將從從cpu調度,上下文切換,數據共享,多核cup利用率,資源占用,等等各方面回答這個問題。

一、CPU調度

大部分操作系統(如Windows、Linux)的任務調度是采用時間片輪轉的搶占式調度方式,也就是說一個任務執行一小段時間後強制暫停去執行下一個任務,每個任務輪流執行。任務執行的一小段時間叫做時間片,任務正在執行時的狀態叫運行狀態,任務執行一段時間後強制暫停去執行下一個任務,被暫停的任務就處於就緒狀態等待下一個屬於它的時間片的到來。這樣每個任務都能得到執行,由於CPU的執行效率非常高,時間片非常短,在各個任務之間快速地切換,給人的感覺就是多個任務在“同時進行”,這也就是我們所說的並發(別覺得並發有多高深,它的實現很復雜,但它的概念很簡單,就是一句話:多個任務同時執行)。多任務運行過程的示意圖如下:


技術分享圖片

                圖 1:操作系統中的任務調度

二、進程的實現

為了實現進程模型,操作系統維護著一張表格(一個結構數組),稱為進程表。每個進程占用一個進程表項(PCB),該表項包含了進程狀態的重要信息。包括程序計數器,堆棧指針,內存分配狀況,打開文件狀況,賬號和調度信息,以及從運行狀態,切換到就緒狀態或者阻塞狀態必須保存的信息,這樣在重新獲得CPU時間片能夠繼續執行,好像從未中斷過一樣。下圖展示了進程表項的關鍵字段。

技術分享圖片

      圖2:進程表項

三、線程的實現

進程之間的切換開銷較大,已經無法滿足越來越復雜的程序的要求了。於是就發明了線程,線程是程序執行中一個單一的順序控制流程,是程序執行流的最小單元,是處理器調度和分派的基本單位。一個進程可以有一個或多個線程,各個線程之間共享程序的內存空間(也就是所在進程的內存空間)。一個標準的線程由線程ID、當前指令指針(PC)、寄存器和堆棧組成。而進程由內存空間(代碼、數據、進程空間、打開的文件)和一個或多個線程組成。

技術分享圖片

  圖3:線程內容

四、進線程的區別

此時就可以回到引言部分所說內容了,

1、定義方面:進程是程序在某個數據集合上的一次運行活動;線程是進程中的一個執行路徑。

2、角色方面:在支持線程機制的系統中,進程是系統資源分配的單位,線程是系統調度的單位。

3、資源共享方面:進程之間不能共享資源,而線程共享所在進程的地址空間和其它資源。同時線程還有自己的棧、程序計數器、寄存器。

4、獨立性方面:進程有自己獨立的地址空間,而線程沒有,線程必須依賴於進程而存在。

線程與進程關系的示意圖:

技術分享圖片

                  圖4:進程線程關系

五、多線程與多核

上面提到的時間片輪轉的調度方式說一個任務執行一小段時間後強制暫停去執行下一個任務,每個任務輪流執行。很多操作系統的書都說“同一時間點只有一個任務在執行”。那有人可能就要問雙核處理器呢?難道兩個核不是同時運行嗎?

其實“同一時間點只有一個任務在執行”這句話是不準確的,至少它是不全面的。那多核處理器的情況下,線程是怎樣執行呢?這就需要了解內核線程。

多核(心)處理器是指在一個處理器上集成多個運算核心從而提高計算能力,也就是有多個真正並行計算的處理核心,每一個處理核心對應一個內核線程。內核線程(Kernel Thread, KT)就是直接由操作系統內核支持的線程,這種線程由內核來完成線程切換,內核通過操作調度器對線程進行調度,並負責將線程的任務映射到各個處理器上。一般一個處理核心對應一個內核線程,比如單核處理器對應一個內核線程,雙核處理器對應兩個內核線程,四核處理器對應四個內核線程。

現在的電腦一般是雙核四線程、四核八線程,是采用超線程技術將一個物理處理核心模擬成兩個邏輯處理核心,對應兩個內核線程,所以在操作系統中看到的CPU數量是實際物理CPU數量的兩倍,如你的電腦是雙核四線程,打開“任務管理器\性能”可以看到4個CPU的監視器,四核八線程可以看到8個CPU的監視器。

技術分享圖片

              圖5:超線程cpu

超線程技術就是利用特殊的硬件指令,把一個物理芯片模擬成兩個邏輯處理核心,讓單個處理器都能使用線程級並行計算,進而兼容多線程操作系統和軟件,減少了CPU的閑置時間,提高的CPU的運行效率。這種超線程技術(如雙核四線程)由處理器硬件的決定,同時也需要操作系統的支持才能在計算機中表現出來。

程序一般不會直接去使用內核線程,而是去使用內核線程的一種高級接口——輕量級進程(Light Weight Process,LWP),輕量級進程就是我們通常意義上所講的線程(我們在這稱它為用戶線程),由於每個輕量級進程都由一個內核線程支持,因此只有先支持內核線程,才能有輕量級進程。用戶線程與內核線程的對應關系有三種模型:一對一模型、多對一模型、多對多模型,在這以4個內核線程、3個用戶線程為例對三種模型進行說明。

一對一模型

對於一對一模型來說,一個用戶線程就唯一地對應一個內核線程(反過來不一定成立,一個內核線程不一定有對應的用戶線程)。這樣,如果CPU沒有采用超線程技術(如四核四線程的計算機),一個用戶線程就唯一地映射到一個物理CPU的線程,線程之間的並發是真正的並發。一對一模型使用戶線程具有與內核線程一樣的優點,一個線程因某種原因阻塞時其他線程的執行不受影響;此處,一對一模型也可以讓多線程程序在多處理器的系統上有更好的表現。

但一對一模型也有兩個缺點:1.許多操作系統限制了內核線程的數量,因此一對一模型會使用戶線程的數量受到限制;2.許多操作系統內核線程調度時,上下文切換的開銷較大,導致用戶線程的執行效率下降。

技術分享圖片

                    圖 6:一對一模型

多對一模型

多對一模型將多個用戶線程映射到一個內核線程上,線程之間的切換由用戶態的代碼來進行,因此相對一對一模型,多對一模型的線程切換速度要快許多;此外,多對一模型對用戶線程的數量幾乎無限制。但多對一模型也有兩個缺點:1.如果其中一個用戶線程阻塞,那麽其它所有線程都將無法執行,因為此時內核線程也隨之阻塞了;2.在多處理器系統上,處理器數量的增加對多對一模型的線程性能不會有明顯的增加,因為所有的用戶線程都映射到一個處理器上了。

技術分享圖片

                    圖 7:多對一模型

多對多模型

多對多模型結合了一對一模型和多對一模型的優點,將多個用戶線程映射到多個內核線程上。多對多模型的優點有:1.一個用戶線程的阻塞不會導致所有線程的阻塞,因為此時還有別的內核線程被調度來執行;2.多對多模型對用戶線程的數量沒有限制;3.在多處理器的操作系統中,多對多模型的線程也能得到一定的性能提升,但提升的幅度不如一對一模型的高。

在現在流行的操作系統中,大都采用多對多的模型。

技術分享圖片

                    圖 8:多對多模型

以操作系統的角度述說線程與進程