程序和執行緒的區別,以及應用場景
什麼是執行緒?
Linux下執行緒用程序PCB模擬描述,也叫輕量級程序
執行緒是程序內部的一個執行流,也就是執行緒在程序的地址空間內執行。
一個程序內的所有執行緒共享程序資源
執行緒是CPU排程的基本單位(CPU排程是按照PCB進行排程的)
建立,銷燬一個執行緒相較建立,銷燬一個程序成本要低(建立程序要建立PCB,虛擬地址空間,建立頁表,維護對映,把硬碟的程式碼資料載入到記憶體,檔案描述符等等,而建立執行緒只需要一個PCB指向程序的虛擬地址空間即可,同樣銷燬一個執行緒只需要銷燬PCB即可)
執行緒間的切換相比於程序間的切換容易的多(程序間的切換,PCB切換,頁表切換等等,執行緒切換PCB切換,頁表不切換)
什麼是程序?
程序是擁有一個執行流,或多個執行流的執行緒組。
程序是一個能獨立執行的基本單位,同時也是系統分配資源基本單位。(獨立性)
程序是動態執行的程式(建立一個程序要建立PCB描述程序,為程序分配資源,程序可以被排程,被執行。而程式就只是靜靜躺在硬碟上)(動態性)
任何程序都可以同其他程序一起併發執行(併發性)(併發:一個CPU多個程序,分時切換)
程序間的相互制約,程序具有執行的間斷性,程序按照各自獨立不可預知的速度向前推進(非同步性)(非同步性:指程序以不可預知的速度向前推進,記憶體中的每個程序何時執行,何時暫停,以怎樣的速度向前推進,要用多長時間完成等都是不可預知的)
程序和程式的區別?
程式是指令的有序集合(靜靜的躺在硬碟上,靜態的),而程序是動態執行的程式(把程式載入到記憶體中,用PCB描述,被排程,被執行,有生命週期)--------------程式靜態的,程序動態的
程式可以作為一種軟體資料長期儲存,而程序是有生命週期的。------------程式:可以一直被儲存,無生命週期,程序是有生命週期的
程序和執行緒的區別?
執行緒是被CPU排程的基本單位,程序是能獨立執行的基本單位,是系統分配資源的基本單位
建立銷燬執行緒要比建立銷燬程序成本低的多。(建立程序要,建立PCB,開闢虛擬地址空間,建立頁表,維護對映關係,載入硬碟資料到記憶體,建立檔案描述符,等等,而建立執行緒只要建立一個PCB指向程序的虛擬地址空間即可)
程序擁有自己獨立的虛擬地址空間,而一個程序中的多個執行緒共享程序的虛擬地址空間
執行緒佔用的資源要比程序少
執行緒缺乏訪問控制,程序中的一個執行緒出錯,會終止掉整個程序,從而導致其他執行緒也涼涼,而一個程序出錯,不會影響另一個程序
執行緒和程序共享資源,但是有一部分資料是自己私有的?
執行緒和程序共享:
同一地址空間 (堆,程式碼段,資料段,環境變數,頁表)
檔案描述符表
每種訊號的處理方式
當前工作目錄
使用者id和組id
執行緒和程序私有:
私有棧結構(儲存臨時資料,保證執行緒執行時不相互影響)
上下文資料(CPU排程切換資料儲存)
排程優先順序
errno
訊號遮蔽字
執行緒優缺點,以及應用場景
執行緒優點:
執行緒共享程序的地址空間,因此執行緒間通訊比較容易(但是不安全要注意維護),而程序間通訊就相比較困難了,因為兩個程序看到同一塊資源不容易 ------------節約資源,成本低,排程切換快
建立銷燬成本低
執行緒間切換容易
等待慢速I/O的同時,可以幹其他事情
程序優點:
更強的容錯性,安全,一個程序掛了,不影響其他.
多程序比多執行緒編寫,除錯容易。
執行緒應用場景:
等待慢速I/O時,交給一個執行緒等待,接著做其他事情
通訊,比較容易(注意加鎖)
程序的應用場景:
需要安全穩定時用程序,需要速度時用程序,既要速度又要安全。有的書上說,能用多程序解決的儘量不要用多執行緒