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

程式、程序、執行緒的區別與聯絡

程式

  • 程式並不能單獨執行,只有將程式載入到記憶體中,系統為他分配資源後才能夠執行,這種執行的程式稱之為程序,
  • 也就是說程序是系統進行資源分配和排程的一個獨立單位,每個程序都有自己單獨的地址空間。
  • 所以說程式與程序的區別在於,程式是指令的集合,是程序執行的靜態描述文字,
  • 而程序則是程式在系統上順序執行時的動態活動。 

程序

但是程序存在著很多缺陷,主要集中在兩點:

(1).程序只能在同一時間幹一件事情,如果想同時幹兩件事或多件事情,程序就無能為力了。

(2).程序在執行的過程中如果由於某種原因阻塞了,例如等待輸入,整個程序就會掛起,其他與輸入無關的工作也必須等待輸入結束後才能順序執行。

為了解決上述兩點缺陷,引入了執行緒這個概念。

執行緒

  • 執行緒是程序的一個實體,也是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位,有時又被稱為輕權程序或輕量級程序,
  • 相對程序而言,執行緒是一個更加接近於執行體的概念,程序在執行過程中擁有獨立的記憶體單元,而執行緒自己基本上不擁有系統資源,也沒有自己的地址空間,只擁有一點在執行中必不可少的資源(如程式計數器,一組暫存器和棧),
  • 執行緒的改變只代表了 CPU 執行過程的改變,而沒有發生程序所擁有的資源變化。除了CPU 之外,計算機內的軟硬體資源的分配與執行緒無關,但是它可與同屬一個程序的其他的執行緒共享程序所擁有的全部資源。

程序和執行緒的主要差別在於作業系統並沒有將多個執行緒看作多個獨立的應用,來實現程序的排程和管理以及資源分配。程序有獨立的地址空間,一個程序崩潰後,在保護模式下不會對其它程序產生影響,而執行緒只是一個程序中的不同執行路徑。執行緒有自己的堆疊和區域性變數,但執行緒之間沒有單獨的地址空間,一個執行緒死掉就等於整個程序死掉,所以多程序的程式要比多執行緒的程式健壯,但在程序切換時,耗費資源較大,效率要差一些,對於一些要求同時進行並且又要共享某些變數的併發操作,只能用執行緒,不能用程序,每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口,但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制。 

最後附一篇材料,以圖的方式將程序和執行緒做了很好的類比: 

計算機的核心是CPU,它承擔了所有的計算任務。它就像一座工廠,時刻在執行。

假定工廠的電力有限,一次只能供給一個車間使用。也就是說,一個車間開工的時候,其他車間都必須停工。背後的含義就是,單個CPU一次只能執行一個任務

這裡寫圖片描述

程序就好比工廠的車間,它代表CPU所能處理的單個任務。任一時刻,CPU總是執行一個程序,其他程序處於非執行狀態。 

這裡寫圖片描述

一個車間裡,可以有很多工人。他們協同完成一個任務。

這裡寫圖片描述

執行緒就好比車間裡的工人。一個程序可以包括多個執行緒。

這裡寫圖片描述

車間的空間是工人們共享的,比如許多房間是每個工人都可以進出的。這象徵一個程序的記憶體空間是共享的,每個執行緒都可以使用這些共享記憶體。 

這裡寫圖片描述

可是,每間房間的大小不同,有些房間最多隻能容納一個人,比如廁所。裡面有人的時候,其他人就不能進去了。這代表一個執行緒使用某些共享記憶體時,其他執行緒必須等它結束,才能使用這一塊記憶體。

這裡寫圖片描述

一個防止他人進入的簡單方法,就是門口加一把鎖。先到的人鎖上門,後到的人看到上鎖,就在門口排隊,等鎖開啟再進去。這就叫”互斥鎖”(Mutual exclusion,縮寫 Mutex),防止多個執行緒同時讀寫某一塊記憶體區域。 

這裡寫圖片描述

還有些房間,可以同時容納n個人,比如廚房。也就是說,如果人數大於n,多出來的人只能在外面等著。這好比某些記憶體區域,只能供給固定數目的執行緒使用。 

這裡寫圖片描述

這時的解決方法,就是在門口掛n把鑰匙。進去的人就取一把鑰匙,出來時再把鑰匙掛回原處。後到的人發現鑰匙架空了,就知道必須在門口排隊等著了。這種做法叫做”訊號量”(Semaphore),用來保證多個執行緒不會互相沖突。 不難看出,mutex是semaphore的一種特殊情況(n=1時)。也就是說,完全可以用後者替代前者。但是,因為mutex較為簡單,且效率高,所以在必須保證資源獨佔的情況下,還是採用這種設計。

這裡寫圖片描述

作業系統的設計,因此可以歸結為三點: (1)以多程序形式,允許多個任務同時執行; (2)以多執行緒形式,允許單個任務分成不同的部分執行; (3)提供協調機制,一方面防止程序之間和執行緒之間產生衝突,另一方面允許程序之間和執行緒之間共享資源。