1. 程式人生 > >多執行緒和多程序的區別

多執行緒和多程序的區別

1.定義

程式: 只是一組指令的有序集合,是計算機硬碟上的一些檔案,是“死的”

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

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

這些定義概念不太好理解.引用某些知乎大牛上解釋:

首先來一句概括的總論:程序和執行緒都是一個時間段的描述,是CPU工作時間段的描述。

下面細說背景:

CPU+RAM+各種資源(比如顯示卡,光碟機,鍵盤,GPS, 等等外設)構成我們的電腦,但是電腦的執行,實際就是CPU和相關暫存器以及RAM之間的事情。

一個最最基礎的事實:

CPU太快,太快,太快了,暫存器僅僅能夠追的上他的腳步,RAM和別的掛在各總線上的裝置完全是望其項背。那當多個任務要執行的時候怎麼辦呢?輪流著來?或者誰優先順序高誰來?不管怎麼樣的策略,一句話就是在CPU看來就是輪流著來。

一個必須知道的事實:

執行一段程式程式碼,實現一個功能的過程介紹 ,當得到CPU的時候,相關的資源必須也已經就位,就是顯示卡啊,GPS啊什麼的必須就位,然後CPU開始執行。這裡除了CPU以外所有的就構成了這個程式的執行環境,也就是我們所定義的程式上下文。當這個程式執行完了,或者分配給他的CPU執行時間用完了,那它就要被切換出去,等待下一次CPU的臨幸。在被切換出去的最後一步工作就是儲存程式上下文,因為這個是下次他被CPU臨幸的執行環境,必須儲存。串聯起來的事實:前面講過在CPU看來所有的任務都是一個一個的輪流執行的,

具體的輪流方法就是:先載入程式A的上下文,然後開始執行A,儲存程式A的上下文,調入下一個要執行的程式B的程式上下文,然後開始執行B,儲存程式B的上下文。。。。

========= 重要的東西出現了=============

程序和執行緒就是這樣的背景出來的,兩個名詞不過是對應的CPU時間段的描述,名詞就是這樣的功能。程序就是包換上下文切換的程式執行時間總和 = CPU載入上下文+CPU執行+CPU儲存上下文執行緒是什麼呢?程序的顆粒度太大,每次都要有上下的調入,儲存,調出。如果我們把程序比喻為一個執行在電腦上的軟體,那麼一個軟體的執行不可能是一條邏輯執行的,必定有多個分支和多個程式段,就好比要實現程式A,實際分成 a,b,c等多個塊組合而成。那麼這裡具體的執行就可能變成:程式A得到CPU =》CPU載入上下文,開始執行程式A的a小段,然後執行A的b小段,然後再執行A的c小段,最後CPU儲存A的上下文。這裡a,b,c的執行是共享了A的上下文,CPU在執行的時候沒有進行上下文切換的。這裡的a,b,c就是執行緒,也就是說執行緒是共享了程序的上下文環境,的更為細小的CPU時間段。到此全文結束,再一個總結:

程序和執行緒都是一個時間段的描述,是CPU工作時間段的描述,不過是顆粒大小不同。

開個QQ,開了一個程序;開了迅雷,開了一個程序。在QQ的這個程序裡,傳輸文字開一個執行緒、傳輸語音開了一個執行緒、彈出對話方塊又開了一個執行緒。所以執行某個軟體,相當於開了一個程序。在這個軟體執行的過程裡(在這個程序裡),多個工作支撐的完成QQ的執行,那麼這“多個工作”分別有一個執行緒。所以一個程序管著多個執行緒。通俗的講:“程序是爹媽,管著眾多的執行緒兒子”…

2.關係

一個執行緒可以建立和撤銷另一個執行緒;同一個程序中的多個執行緒之間可以併發執行(輪流獲取cpu的時間片,在總體上給人的感覺是同時在執行,這是併發,還有一個名詞叫並行,就是多核多cpu,真正的同時在執行,不過現在實現難度有點大,在用處上主要用在平行計算),至少要有一個執行緒

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

3.區別

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

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

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

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

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

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

4.優缺點

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