1. 程式人生 > 實用技巧 >【Python高階程式設計024 ● 網路程式設計 ● TCP服務端程式開發】

【Python高階程式設計024 ● 網路程式設計 ● TCP服務端程式開發】

程序與執行緒

程序

Process

早期的作業系統是單道批處理的,但是由於CPU執行是高效率的,而IO是低速的,所以就會出現CPU要等待IO的情況。為了進一步提高CPU利用率,就設計出了多道批處理系統,使多道程式能共享CPU和系統資源。後面又因為共享系統資源而導致程式在執行的過程中相互限制,所以就引入程序來給程式提供一個抽象的概念,他能申請到系統資源並且獨立給程式提供資源,從而解決程式間因為共享資源而相互限制的問題。

程序是具有獨立功能的程式關於某個資料集合上的一次執行活動,是系統進行資源分配和排程(線上程出現之前)的一個獨立單位。

特徵

動態性:程序的實質是程式的一次執行過程,是動態產生,動態消亡的。

併發性:任何程序都可以同其他程序一起併發執行。

獨立性:程序是一個能獨立執行的基本單位,同時也是系統分配資源和排程的獨立單位。

非同步性:由於程序間的相互制約,使程序具有執行的間斷性,即程序按各自獨立的、不可預知的速度向前推進。

結構特徵:程序由程式、資料和程序控制塊三部分組成。

執行緒

Thread

60年代,在OS中能擁有資源和獨立執行的基本單位是程序,然而隨著計算機技術的發展,程序出現了很多弊端,一是由於程序是資源擁有者,建立、撤消與切換存在較大的時空開銷,因此需要引入輕型程序;二是由於對稱多處理機(SMP)出現,可以滿足多個執行單位,而多個程序並行開銷過大。

因此在80年代,出現了能獨立執行的基本單位:執行緒

執行緒是作業系統能夠進行運算排程的最小單位。它被包含在程序之中,是程序中的實際運作單位。

特點

在多執行緒OS中,通常是一個程序中包括多個執行緒,每個執行緒都是作為利用CPU的基本單位,是花費最小開銷的實體。執行緒具有以下屬性:

  1. 輕型實體:執行緒基本上不擁有系統資源,只是有一點必不可少的、能保證獨立執行的資源。
  2. 獨立排程和分派的基本單位:執行緒是能獨立執行的基本單位,因而也是獨立排程和分派的基本單位。由於執行緒很“輕”,故執行緒的切換非常迅速且開銷小(在同一程序中的)。
  3. 可併發執行:在一個程序中的多個執行緒之間,可以併發執行,甚至允許在一個程序中所有執行緒都能併發執行;同樣,不同程序中的執行緒也能併發執行,充分利用和發揮了處理機與外圍裝置並行工作的能力。
  4. 共享程序資源:在同一程序中的各個執行緒,都可以共享該程序所擁有的資源,這首先表現在:所有執行緒都具有相同的地址空間(程序的地址空間),這意味著,執行緒可以訪問該地址空間的每一個虛地址;此外,還可以訪問程序所擁有的已開啟檔案、定時器、訊號量機構等。由於同一個程序內的執行緒共享記憶體和檔案,所以執行緒之間互相通訊不必呼叫核心。

二者比較

程序是資源分配的基本單位。所有與該程序有關的資源,都被記錄在程序控制塊PCB中。以表示該程序擁有這些資源或正在使用它們。

另外,程序也是搶佔處理機的排程單位,它擁有一個完整的虛擬地址空間。當程序發生排程時,不同的程序擁有不同的虛擬地址空間,而同一程序內的不同執行緒共享同一地址空間。

與程序相對應,執行緒與資源分配無關,它屬於某一個程序,並與程序內的其他執行緒一起共享程序的資源。

執行緒只由相關堆疊(系統棧或使用者棧)暫存器和執行緒控制表TCB組成。暫存器可被用來儲存執行緒內的區域性變數,但不能儲存其他執行緒的相關變數。

通常在一個程序中可以包含若干個執行緒,它們可以利用程序所擁有的資源。在引入執行緒的作業系統中,通常都是把程序作為分配資源的基本單位,而把執行緒作為獨立執行和獨立排程的基本單位。由於執行緒比程序更小,基本上不擁有系統資源,故對它的排程所付出的開銷就會小得多,能更高效的提高系統內多個程式間併發執行的程度,從而顯著提高系統資源的利用率和吞吐量。因而近年來推出的通用作業系統都引入了執行緒,以便進一步提高系統的併發性,並把它視為現代作業系統的一個重要指標。

執行緒與程序的區別可以歸納為以下4點:

  1. 地址空間和其它資源(如開啟檔案):程序間相互獨立,同一程序的各執行緒間共享。某程序內的執行緒在其它程序不可見。
  2. 通訊:程序間通訊IPC,執行緒間可以直接讀寫程序資料段(如全域性變數)來進行通訊——需要程序同步和互斥手段的輔助,以保證資料的一致性。
  3. 排程和切換:執行緒上下文切換比程序上下文切換要快得多。
  4. 在多執行緒OS中,程序不是一個可執行的實體。

參考:

程序-百科
執行緒-百科