首頁>技術>

執行緒與程序的比較

概述:

程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位.

執行緒是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位.執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源(如程式計數器,一組暫存器和棧),但是它可與同屬一個程序的其他的執行緒共享程序所擁有的全部資源.

一個執行緒可以建立和撤銷另一個執行緒;同一個程序中的多個執行緒之間可以併發執行.

相對程序而言,執行緒是一個更加接近於執行體的概念,它可以與同進程中的其他執行緒共享資料,但擁有自己的棧空間,擁有獨立的執行序列。

在序列程式基礎上引入執行緒和程序是為了提高程式的併發度,從而提高程式執行效率和響應時間。

區別:

進 程和執行緒的主要差別在於它們是不同的作業系統資源管理方式。程序有獨立的地址空間,一個程序崩潰後,在保護模式下不會對其它程序產生影響,而執行緒只是一個 程序中的不同執行路徑。執行緒有自己的堆疊和區域性變數,但執行緒之間沒有單獨的地址空間,一個執行緒死掉就等於整個程序死掉,所以多程序的程式要比多執行緒的程式 健壯,但在程序切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共享某些變數的併發操作,只能用執行緒,不能用程序。

1) 簡而言之,一個程式至少有一個程序,一個程序至少有一個執行緒.

2) 執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高。

3) 另外,程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。

4) 執行緒在執行過程中與程序還是有區別的。每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。

5) 從邏輯角度來看,多執行緒的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個執行緒看做多個獨立的應用,來實現程序的排程和管理以及資源分配。這就是程序和執行緒的重要區別。

優缺點:

執行緒和程序在使用上各有優缺點:執行緒執行開銷小,但不利於資源的管理和保護;而程序正相反。同時,執行緒適合於在SMP機器上執行,而程序則可以跨機器遷移。

多程序,多執行緒

概述:

程序就是一個程式執行的時候被CPU抽象出來的,一個程式執行後被抽象為一個程序,但是執行緒是從一個程序裡面分割出來的,由於CPU處理程序的時候是採用時間片輪轉的方式,所以要把一個大個程序給分割成多個執行緒,例如:網際快車中檔案分成100部分 10個執行緒 檔案就被分成了10份來同時下載 1-10 佔一個執行緒 11-20佔一個執行緒,依次類推,執行緒越多,檔案就被分的越多,同時下載 當然速度也就越快

程序是程式在計算機上的一次執行活動。當 你執行一個程式,你就啟動了一個程序。顯然,程式只是一組指令的有序集合,它本身沒有任何執行的含義,只是一個靜態實體。而程序則不同,它是程式在某個數 據集上的執行,是一個動態實體。它因建立而產生,因排程而執行,因等待資源或事件而被處於等待狀態,因完成任務而被撤消,反映了一個程式在一定的資料集上 執行的全部動態過程。程序是作業系統分配資源的單位。在Windows下,程序又被細化為執行緒,也就是一個程序下有多個能獨立執行的更小的單位。執行緒(Thread)是程序的一個實體,是CPU排程和分派的基本單位。執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。

執行緒和程序的關係是:執行緒是屬於程序的,執行緒執行在程序空間內,同一程序所產生的執行緒共享同一記憶體空間,當程序退出時該程序所產生的執行緒都會被強制退出並清除。執行緒可與屬於同一程序的其它執行緒共享程序所擁有的全部資源,但是其本身基本上不擁有系統資源,只擁有一點在執行中必不可少的資訊(如程式計數器、一組暫存器和棧)。

在同一個時間裡,同一個計算機系統中如果允許兩個或兩個以上的程序處於執行狀態,這便是多工。現代的作業系統幾乎都是多工作業系統,能夠同時管理多個程序的執行。 多工帶來的好處是明顯的,比如你可以邊聽mp3邊上網,與此同時甚至可以將下載的文件打印出來,而這些任務之間絲毫不會相互干擾。那麼這裡就涉及到並行的問題,俗話說,一心不能二用,這對計算機也一樣,原則上一個CPU只能分配給一個程序,以便執行這個程序。我們通常使用的計算機中只有一個CPU,也就是說只有一顆心,要讓它一心多用,同時執行多個程序,就必須使用併發技術。實現併發技術相當複雜,最容易理解的是“時間片輪轉程序排程演算法”,它的思想簡單介紹如下:在作業系統的管理下,所有正在執行的程序輪流使用CPU,每個程序允許佔用CPU的時間非常短(比如10毫秒),這樣使用者根本感覺不出來CPU是在輪流為多個程序服務,就好象所有的程序都在不間斷地執行一樣。但實際上在任何一個時間內有且僅有一個程序佔有CPU。

如果一臺計算機有多個CPU,情況就不同了,如果程序數小於CPU數,則不同的程序可以分配給不同的CPU來執行,這樣,多個程序就是真正同時執行的,這便是並行。但如果程序數大於CPU數,則仍然需要使用併發技術。

在Linux中,進行CPU分配是以執行緒為單位的,一個程序可能由多個執行緒組成,這時情況更加複雜,但簡單地說,有如下關係:

匯流排程數<= CPU數量:並行執行

匯流排程數> CPU數量:併發執行

並行執行的效率顯然高於併發執行,所以在多CPU的計算機中,多工的效率比較高。但是,如果在多CPU計算機中只執行一個程序(執行緒),就不能發揮多CPU的優勢。

多工作業系統(如Windows)的基本原理是:作業系統將CPU的時間片分配給多個執行緒,每個執行緒在作業系統指定的時間片內完成(注意,這裡的多個執行緒是分屬於不同程序的).作業系統不斷的從一個執行緒的執行切換到另一個執行緒的執行,如此往復,宏觀上看來,就好像是多個執行緒在一起執行.由於這多個執行緒分屬於不同的程序,因此在我們看來,就好像是多個程序在同時執行,這樣就實現了多工.

分類

根據程序與執行緒的設定,作業系統大致分為如下型別:

(1) 單程序、單執行緒,MS-DOS大致是這種作業系統;

(2) 多程序、單執行緒,多數UNIX(及類UNIX的LINUX)是這種作業系統;

(3) 多程序、多執行緒,Win32(Windows NT/2000/XP等)、Solaris 2.x和OS/2都是這種作業系統;

(4) 單程序、多執行緒,VxWorks是這種作業系統。

引入執行緒帶來的主要好處

(1) 在程序內建立、終止執行緒比建立、終止程序要快;

(2) 同一程序內的執行緒間切換比程序間的切換要快,尤其是使用者級執行緒間的切換。

使用者級執行緒 (UserLevel Threads — ULT)

核心級執行緒 (Kernel Supported threads — KST)

核心級執行緒KST

對於一切的程序,無論是系統程序還是使用者程序,程序的建立和撤銷,以及I/O操作都是利用系統呼叫進入到核心,由核心處理完成,所以說在KST下, 所有程序都是在作業系統核心的支援下執行的,是與核心緊密相關的。核心空間實現還為每個核心支援執行緒設定了一個執行緒控制快,核心是根據該控制快而感知某個 執行緒是否存在,並加以控制。

優點:

1. 在多處理器上,核心可以呼叫同一程序中的多個執行緒同時工作;

2. 如果一個程序中的一個執行緒阻塞了,其他執行緒仍然可以得到執行;

缺點:對於使用者執行緒的切換代價太大,在同一個執行緒中,從一個執行緒切換到另一個執行緒時,需要從使用者態,進入到核心態並且由核心切換。因為執行緒排程和管理在核心實現。

核心級執行緒駐留在核心空間,它們是核心物件。有了核心執行緒,每個使用者執行緒被對映或繫結到一個核心執行緒。使用者執行緒在其生命期內都會繫結到該核心執行緒。一旦用 戶執行緒終止,兩個執行緒都將離開系統。這被稱作"一對一"執行緒對映,如圖所示。作業系統排程器管理、排程並分派這些執行緒。執行時庫為每個使用者級 執行緒請求一個核心級執行緒。作業系統的記憶體管理和排程子系統必須要考慮到數量巨大的使用者級執行緒。您必須瞭解每個程序允許的執行緒的最大數目是多少。作業系統為 每個執行緒建立上下文。程序的每個執行緒在資源可用時都可以被指派到處理器核心。

使用者級執行緒 ULT

使用者程序ULT僅存在於使用者空間中。對於這種執行緒的建立、撤銷、執行緒之間的同步和通訊等功能,都無需系統呼叫來實現。對於同一程序的執行緒之間切換仍然是不需要核心支援的。所以,核心也會是完全不會知道使用者級執行緒的存在。

但是有一點必須注意:設定了使用者級執行緒的系統,其排程荏苒是以程序為單位進行的哦。

優點:

1. 執行緒切換不需要轉換到核心空間,節省了寶貴的核心空間;

2. 排程演算法可以是程序專用,由使用者程式進行指定;

3. 使用者級執行緒實現和作業系統無關;

缺點:

1. 系統呼叫阻塞,同一程序中一個執行緒阻塞和整個程序都阻塞了。

2. 一個程序只能在一個cpu上獲得執行。

使用者級執行緒駐留在使用者空間或模式。執行時庫管理這些執行緒,它也位於使用者空間。它們對於作業系統是不可見的,因此無法被排程到處理器核心。每個執行緒並不具有 自身的執行緒上下文。因此,就執行緒的同時執行而言,任意給定時刻每個程序只能夠有一個執行緒在執行,而且只有一個處理器核心會被分配給該程序。對於一個程序, 可能有成千上萬個使用者級執行緒,但是它們對系統資源沒有影響。執行時庫排程並分派這些執行緒。如同在圖中看到的那樣,庫排程器從程序的多個執行緒中 選擇一個執行緒,然後該執行緒和該程序允許的一個核心執行緒關聯起來。核心執行緒將被作業系統排程器指派到處理器核心。使用者級執行緒是一種"多對一"的執行緒對映。

混合方式

在很多的作業系統中ULT和KLT進行組合,整合了ULT和KLT的優點。

混合執行緒實現是使用者執行緒和核心執行緒的交叉,使得庫和作業系統都可以管理執行緒。使用者執行緒由執行時庫排程器管理,核心執行緒由作業系統排程器管理。在這種實現 中,程序有著自己的核心執行緒池。可執行的使用者執行緒由執行時庫分派並標記為準備好執行的可用執行緒。作業系統選擇使用者執行緒並將它對映到執行緒池中的可用核心線 程。多個使用者執行緒可以分配給相同的核心執行緒。在圖中,程序A在它的執行緒池中有兩個核心執行緒,而程序B有3個核心執行緒。程序A的使用者執行緒2和3 被對映到核心執行緒(2)。程序B有5個執行緒,使用者執行緒1和2對映到同一個核心執行緒(3),使用者執行緒4和5對映到核心同一個核心執行緒(5)。當建立新的使用者 執行緒時,只需要簡單地將它對映到執行緒池中現有的一個核心執行緒即可。這種實現使用了"多對多"執行緒對映。該方法中儘量使用多對一對映。很多使用者執行緒將會對映 到一個核心執行緒,就像您在前面的示例中所看到的。因此,對核心執行緒的請求將會少於使用者執行緒的數目。

核心執行緒池不會被銷燬和重建,這些執行緒總是位於系統中。它們會在必要時分配給不同的使用者級執行緒,而不是當建立新的使用者級執行緒時就建立一個新的核心執行緒,而 純核心級執行緒被建立時,就會建立一個新的核心執行緒。只對池中的每個執行緒建立上下文。有了核心執行緒和混合執行緒,作業系統分配一組處理器核心,程序的執行緒可以 在這些處理器核心之上執行。執行緒只能在為它們所屬執行緒指派的處理器核心上執行。

執行緒上下文

作業系統管理很多程序的執行。有些程序是來自各種程式、系統和應用程式的單獨程序,而某些程序來自被分解為很多程序的應用或程式。當一個程序從核心 中移出,另一個程序成為活動的,這些程序之間便發生了上下文切換。作業系統必須記錄重啟程序和啟動新程序使之活動所需要的所有資訊。這些資訊被稱作上下 文,它描述了程序的現有狀態。當程序成為活動的,它可以繼續從被搶佔的位置開始執行。程序的上下文資訊包括:

程序id

指向可執行檔案的指標

靜態和動態分配的變數的記憶體

處理器暫存器

程序上下文的多數資訊都與地址空間的描述有關。程序的上下文使用很多系統資源,而且會花費一些時間來從一個程序的上下文切換到另一個程序的上下文。 執行緒也有上下文。當執行緒被搶佔時,就會發生執行緒之間的上下文切換。如果執行緒屬於相同的程序,它 們共享相同的地址空間,因為執行緒包含在它們所屬於的程序的地址空間內。這樣,程序需要恢復的多數資訊對於執行緒而言是不需要的。儘管程序和它的執行緒共享了很 多內容,但最為重要的是其地址空間和資源,有些資訊對於執行緒而言是本地且唯一的,而執行緒的其他方面包含在程序的各個段的內部。

執行緒本地(且唯一)的資訊包括執行緒id、處理器暫存器(當執行緒執行時暫存器的狀態,包括程式計數器和棧指標)、執行緒狀態及優先順序、執行緒特定數 據(thread-specific data,TSD)。

執行緒id是在建立執行緒時指定的。執行緒能夠訪問它所屬程序的資料段,因此執行緒可以讀寫它所屬程序的全域性宣告資料。程序中一個執行緒做出的 任何改動都可以被程序中的所有執行緒以及主執行緒獲得。在多數情況下,這要求某種型別的同步以防止無意的更新。執行緒的區域性宣告變數不應當被任何對等執行緒訪問。 它們被放置到執行緒棧中,而且當執行緒完成時,它們便會被移走。

10
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 碼雲GVP專案 libhv C++跨平臺網路庫實現web服務