1. 程式人生 > >程序和執行緒的定義、區別與聯絡

程序和執行緒的定義、區別與聯絡

一、程序

程序:指在系統中能獨立執行並作為資源分配的基本單位,它是由一組機器指令、資料和堆疊等組成的,是一個能獨立執行的活動實體。

注意,程序一般有三個狀態:就緒狀態、執行狀態和等待狀態【或稱阻塞狀態】;程序只能由父程序建立,系統中所有的程序形成一種程序樹的層次體系;掛起命令可由程序自己和其他程序發出,但是解除掛起命令只能由其他程序發出。

程序控制塊(PCB):PCB不但可以記錄程序的屬性資訊,以便作業系統對程序進行控制和管理,而且PCB標誌著程序的存在,作業系統根據系統中是否有該程序的程序控制塊PCB而知道該程序存在與否。系統建立程序的同時就建立該程序的PCB,在撤銷一個程序時,也就撤銷其PCB,故程序的PCB對程序來說是它存在的具體的物理標誌和體現。一般PCB包括以下三類資訊:程序標識資訊;處理器狀態資訊;程序控制資訊。

    由程式段、相關的資料段和PCB三部分構成了程序實體(又稱程序印像),一般,我們把程序實體就簡稱為程序。

程序的特徵:
1.動態性:程序的實質是程式的一次執行過程,程序是動態產生,動態消亡的。
2.併發性:任何程序都可以同其他程序一起併發執行。
3.獨立性:程序是一個能獨立執行的基本單位,同時也是系統分配資源和排程的獨立單位。
4.非同步性:由於程序間的相互制約,使程序具有執行的間斷性,即程序按各自獨立的、不可預知的速度向前推進。


二、執行緒


執行緒:執行緒是程序中的一個實體,作為系統排程和分派的基本單位。
Linux下的執行緒看作輕量級程序。

執行緒的性質:
1.執行緒是程序內的一個相對獨立的可執行的單元。若把程序稱為任務的話,那麼執行緒則是應用中的一個子任務的執行。

2.由於執行緒是被排程的基本單元,而程序不是排程單元。所以,每個程序在建立時,至少需要同時為該程序建立一個執行緒。即程序中至少要有一個或一個以上的執行緒,否則該程序無法被排程執行。
3.程序是被分給並擁有資源的基本單元。同一程序內的多個執行緒共享該程序的資源,但執行緒並不擁有資源,只是使用他們。
4.執行緒是作業系統中基本排程單元,因此執行緒中應包含有排程所需要的必要資訊,且在生命週期中有狀態的變化。
5.由於共享資源【包括資料和檔案】,所以執行緒間需要通訊和同步機制,且需要時執行緒可以建立其他執行緒,但執行緒間不存在父子關係。


多執行緒使用的情形:前臺和後臺工作情況;非同步處理工作情況;需要加快執行速度情況;組織複雜工作的情況;同時有多個使用者服務請求的情況等。


執行緒機制的優點:
多執行緒執行在同一個程序的相同的地址空間內,和採用多程序相比有以下優點:
1.建立和撤銷執行緒的開銷較之程序要少。建立執行緒時只需要建立執行緒控制表相應的表目,或有關佇列,而建立程序時,要建立PCB表和初始化,進入有關程序佇列,建立它的地址空間和所需資源等。
2.CPU線上程之間開關時的開銷遠比程序要少得多。因開關執行緒都在同一地址空間內,只需要修改執行緒控制表或佇列,不涉及地址空間和其他工作。
3.執行緒機制也增加了通訊的有效性。程序間的通訊往往要求核心的參與,以提供通訊機制和保護機制,而執行緒間的通訊是在同一程序的地址空間內,共享主存和檔案,無需核心參與。


三、程序和執行緒的區別


(1)排程:
        在傳統的作業系統中,CPU排程和分派的基本單位是程序。而在引入執行緒的作業系統中,則把執行緒作為CPU排程和分派的基本單位,程序則作為資源擁有的基本單位,從而使傳統程序的兩個屬性分開,執行緒程式設計輕裝執行,這樣可以顯著地提高系統的併發性。同一程序中執行緒的切換不會引起程序切換,從而避免了昂貴的系統呼叫,但是在由一個程序中的執行緒切換到另一程序中的執行緒,依然會引起程序切換。

(2)併發性:
      在引入執行緒的作業系統中,不僅程序之間可以併發執行,而且在一個程序中的多個執行緒之間也可以併發執行,因而使作業系統具有更好的併發性,從而更有效地提高系統資源和系統的吞吐量。例如,在一個為引入執行緒的單CPU作業系統中,若僅設定一個檔案服務程序,當它由於某種原因被封鎖時,便沒有其他的檔案服務程序來提供服務。在引入執行緒的作業系統中,可以在一個檔案服務程序設定多個服務執行緒。當第一個執行緒等待時,檔案服務程序中的第二個執行緒可以繼續執行;當第二個執行緒封鎖時,第三個執行緒可以繼續執行,從而顯著地提高了檔案服務的質量以及系統的吞吐量。


(3)擁有資源:
      不論是引入了執行緒的作業系統,還是傳統的作業系統,程序都是擁有系統資源的一個獨立單位,他可以擁有自己的資源。一般地說,執行緒自己不能擁有資源(也有一點必不可少的資源),但它可以訪問其隸屬程序的資源,亦即一個程序的程式碼段、資料段以及系統資源(如已開啟的檔案、I/O裝置等),可供同一個程序的其他所有執行緒共享。


(4)獨立性:
        在同一程序中的不同執行緒之間的獨立性要比不同程序之間的獨立性低得多。這是因為

為防止程序之間彼此干擾和破壞,每個程序都擁有一個獨立的地址空間和其它資源,除了共享全域性變數外,不允許其它程序的訪問。但是同一程序中的不同執行緒往往是為了提高併發性以及進行相互之間的合作而建立的,它們共享程序的記憶體地址空間和資源,如每個執行緒都可以訪問它們所屬程序地址空間中的所有地址,如一個執行緒的堆疊可以被其它執行緒讀、寫,甚至完全清除。

(5)系統開銷:

       由於在建立或撤銷程序時,系統都要為之分配或回收資源,如記憶體空間、I/O裝置等。因此,作業系統為此所付出的開銷將顯著地大於在建立或撤消執行緒時的開銷。類似的,在程序切換時,涉及到整個當前程序CPU環境的儲存環境的設定以及新被排程執行的CPU環境的設定,而執行緒切換隻需儲存和設定少量的暫存器的內容,並不涉及儲存器管理方面的操作,可見,程序切換的開銷也遠大於執行緒切換的開銷。此外,由於同一程序中的多個執行緒具有相同的地址空間,致使他們之間的同步和通訊的實現也變得比較容易。在有的系統中,現成的切換、同步、和通訊都無需作業系統核心的干預。

(6)支援多處理機系統:
       在多處理機系統中,對於傳統的程序,即單執行緒程序,不管有多少處理機,該程序只能執行在一個處理機上。但對於多執行緒程序,就可以將一個程序中的多個執行緒分配到多個處理機上,使它們並行執行,這無疑將加速程序的完成。因此,現代處理機OS都無一例外地引入了多執行緒。