1. 程式人生 > >程序和執行緒的區別,以及應用場景

程序和執行緒的區別,以及應用場景

什麼是執行緒?

Linux下執行緒用程序PCB模擬描述,也叫輕量級程序

執行緒是程序內部的一個執行流,也就是執行緒在程序的地址空間內執行。

一個程序內的所有執行緒共享程序資源

執行緒是CPU排程的基本單位(CPU排程是按照PCB進行排程的)

建立,銷燬一個執行緒相較建立,銷燬一個程序成本要低(建立程序要建立PCB,虛擬地址空間,建立頁表,維護對映,把硬碟的程式碼資料載入到記憶體,檔案描述符等等,而建立執行緒只需要一個PCB指向程序的虛擬地址空間即可,同樣銷燬一個執行緒只需要銷燬PCB即可)

執行緒間的切換相比於程序間的切換容易的多(程序間的切換,PCB切換,頁表切換等等,執行緒切換PCB切換,頁表不切換)

什麼是程序?

程序是擁有一個執行流,或多個執行流的執行緒組。

程序是一個能獨立執行的基本單位,同時也是系統分配資源基本單位。(獨立性)

程序是動態執行的程式(建立一個程序要建立PCB描述程序,為程序分配資源,程序可以被排程,被執行。而程式就只是靜靜躺在硬碟上)(動態性)

任何程序都可以同其他程序一起併發執行(併發性)(併發:一個CPU多個程序,分時切換)

程序間的相互制約,程序具有執行的間斷性,程序按照各自獨立不可預知的速度向前推進(非同步性)(非同步性:指程序以不可預知的速度向前推進,記憶體中的每個程序何時執行,何時暫停,以怎樣的速度向前推進,要用多長時間完成等都是不可預知的)

程序和程式的區別?

程式是指令的有序集合(靜靜的躺在硬碟上,靜態的),而程序是動態執行的程式(把程式載入到記憶體中,用PCB描述,被排程,被執行,有生命週期)--------------程式靜態的,程序動態的

程式可以作為一種軟體資料長期儲存,而程序是有生命週期的。------------程式:可以一直被儲存,無生命週期,程序是有生命週期的

程序和執行緒的區別?

執行緒是被CPU排程的基本單位,程序是能獨立執行的基本單位,是系統分配資源的基本單位

建立銷燬執行緒要比建立銷燬程序成本低的多。(建立程序要,建立PCB,開闢虛擬地址空間,建立頁表,維護對映關係,載入硬碟資料到記憶體,建立檔案描述符,等等,而建立執行緒只要建立一個PCB指向程序的虛擬地址空間即可)

程序擁有自己獨立的虛擬地址空間,而一個程序中的多個執行緒共享程序的虛擬地址空間

執行緒佔用的資源要比程序少

執行緒缺乏訪問控制,程序中的一個執行緒出錯,會終止掉整個程序,從而導致其他執行緒也涼涼,而一個程序出錯,不會影響另一個程序

執行緒和程序共享資源,但是有一部分資料是自己私有的?

執行緒和程序共享:

同一地址空間      (堆,程式碼段,資料段,環境變數,頁表)

檔案描述符表

每種訊號的處理方式

當前工作目錄

使用者id和組id

執行緒和程序私有:

私有棧結構(儲存臨時資料,保證執行緒執行時不相互影響)

上下文資料(CPU排程切換資料儲存)

排程優先順序

errno

訊號遮蔽字

執行緒優缺點,以及應用場景

執行緒優點:

執行緒共享程序的地址空間,因此執行緒間通訊比較容易(但是不安全要注意維護),而程序間通訊就相比較困難了,因為兩個程序看到同一塊資源不容易 ------------節約資源,成本低,排程切換快

建立銷燬成本低

執行緒間切換容易

等待慢速I/O的同時,可以幹其他事情

程序優點:

更強的容錯性,安全,一個程序掛了,不影響其他.

多程序比多執行緒編寫,除錯容易。

執行緒應用場景:

等待慢速I/O時,交給一個執行緒等待,接著做其他事情

通訊,比較容易(注意加鎖)

程序的應用場景:

需要安全穩定時用程序,需要速度時用程序,既要速度又要安全。有的書上說,能用多程序解決的儘量不要用多執行緒