1. 程式人生 > >程序與執行緒之間的區別

程序與執行緒之間的區別

我們在討論程序與執行緒的區別之前,首先我們要清楚程序與執行緒的概念。

 什麼是程序?

程序是併發執行程式在執行過程中資源分配和管理的基本單位(資源分配的最小單位),是指令+資料+資源的一個集合。程序可以理解為程式的一次例項化,應用程式一旦執行,就是一個程序。每個程序都有自己獨立的地址空間,每啟動一個程序,系統就會為它分配地址空間,建立資料表來維護程式碼段、堆疊段和資料段。

什麼是執行緒?

執行緒是程序內部的一條執行序列(執行流),是程序的最小執行單位,一個程序可以有多個執行緒,但是最少要有一個執行緒體現在程式碼裡面就是我們最少要有一個main()函式,這些執行緒由多執行緒控制機制來控制。

我們在解決實際問題時,通常會遇到要實現幾個工作的併發執行,在解決這個問題時,我們就會面臨這樣的狀況:究竟是在一個程序裡面用多個執行緒來完成工作呢,還是用多個程序來解決問題,這樣我們就需要了解程序與執行緒的區別來根據實際情況安排了。

程序與執行緒又在哪些方面有區別呢?

1.個體單位

簡而言之,程序是資源分配的單位,執行緒是CPU排程的單位。

如果這樣說不便於理解的話,我們不妨將程序看做一個生產車間,執行緒看做車間裡面的若干個生產線其中的一個,我們需要完成的server看作生產部門,那麼對於我們要完成的server,需要由好幾個車間裡的若干個生產線完成,資源的分配自然是按車間來分配,每個車間都有自己的任務量,根據任務有自己拿到的資源,這些資源一般情況下供自己車間使用,正如我們程序之間的資源不共享一樣,所以說,程序是資源的分配單位。而生產線就是完成server的一條條流程,是完成server的獨立的最小的單位,工作時是給每個執行緒分配具體的工作內容,每個車間內的資源是共享的,生產線可以根據自己的工作能力來獲取資源,所以說執行緒是CPU排程的單位。

2.切換效率

執行緒的切換效率比程序高。

執行緒之所以切換效率高於程序,是由於執行緒的切換是指令之間的切換,即從一段執行序列(程式)切換到另一段執行序列(程式),而記憶體對映表不變;但是程序的切換包括指令的切換和記憶體(對映表)的切換(資源的切換),這相對於執行緒切換來說,效率就會降低很多。

3.地址空間:同一程序的所有執行緒共享本程序的地址空間,而不同的程序之間的地址空間是獨立的。

4.資源擁有: 同一程序的所有執行緒共享本程序的資源,如記憶體,CPU,IO等。程序之間的資源是獨立的,無法共享。

5.執行過程:每一個程序可以說就是一個可執行的應用程式,每一個獨立的程序都有一個程式執行的入口,順序執行序列。但是執行緒不能夠獨立執行,必須依存在應用程式中,由程式的多執行緒控制機制進行控制。

6.安全性:因為同一程序的所以執行緒共享此執行緒的資源,因此當一個執行緒發生崩潰時,此程序也會發生崩潰。 但是各個程序之間的資源是獨立的,因此當一個程序崩潰時,不會影響其他程序。因此程序比執行緒健壯。

7.程序之間相互獨立,不存在資料安全問題,相對於執行緒而言,建立時,開闢的資源多,CPU排程慢,如果多程序要進行通訊,必須藉助特定的手段(訊號,訊號量,共享記憶體,管道,訊息佇列)。

如何考慮程序與執行緒的選擇

從以上我們提到的6點區別來看,我們可以從以下幾個方面考慮:

1.如果需要頻繁建立銷燬的優先用執行緒

因為程序的建立、銷燬和切換都是比較複雜的,速度也很慢,但是執行緒的建立、銷燬和切換都較為簡單,速度很快

2.如果需要進行大量計算的優先使用執行緒

大量計算,多指演算法和影象處理,這些操作就是要耗費很多CPU,切換相當的頻繁了,這種情況下執行緒是最合適的,因為它的切換速度相當快。

3.強相關的處理用執行緒,弱相關的處理用程序

什麼叫強相關、弱相關?理論上很難定義,給大家說個簡單的例子理解一下吧。

一個專案需要完成如下任務:訊息收發、訊息處理。“訊息收發”和“訊息處理”就是弱相關的任務,而“訊息處理”裡面可能又分為“訊息解碼”、“業務處理”,這兩個任務相對來說相關性就要強多了。因此“訊息收發”和“訊息處理”可以分程序設計,這是考慮到程序之間資料共享比較複雜,而程序的除錯比較簡單;“訊息解碼”、“業務處理”可以分執行緒設計,這是考慮到相關性強的業務之間資料共享容易。