Linux多執行緒程式設計———重點區分

mf1crystal發表於2017-12-09

多執行緒
執行緒(thread)技術早在60年代就被提出,但真正應用多執行緒到作業系統中去,是在80年代中期,solaris是這方面的佼佼者.傳統的Unix也支援執行緒的概念,但是在一個程式(process)中只允許有一個執行緒,這樣多執行緒就意味著多程式.現在,多執行緒技術已經被許多作業系統所支援,包括Windows/NT、Linux。

程式
程式是一個具有一定獨立功能的程式的一次執行活動,同時也是資源分配的最小單元;
程式是程式執行時的一個例項,即它是程式已經執行到某種程度的資料結構的彙集。
從核心的觀點看,程式的目的就是擔當分配系統資源(CPU時間、記憶體等)的基本單位。

執行緒和程式的區別
執行緒是程式的一個執行流,是CPU排程和分派的基本單位,它是比程式更小的能獨立執行的基本單位。
一個程式由幾個執行緒組成(擁有很多相對獨立的執行流的使用者程式共享應用程式的大部分資料結構),執行緒與同屬一個程式的其他的執行緒共享程式所擁有的全部資源。
“程式——資源分配的最小單位,執行緒——程式執行的最小單位”
程式有獨立的地址空間,一個程式崩潰後,在保護模式下不會對其它程式產生影響,而執行緒只是一個程式中的不同執行路徑。
執行緒有自己的堆疊和區域性變數,但執行緒沒有單獨的地址空間,一個執行緒死掉就等於整個程式死掉,所以多程式的程式要比多執行緒的程式健壯,但在程式切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共享某些變數的併發操作,只能用執行緒,不能用程式。
程式有獨立的地址空間,執行緒沒有單獨的地址空間(同一程式內的執行緒共享程式的地址空間)。
執行緒的優點
使用多執行緒的理由之一是:
和程式相比,它是一種非常“節儉”的多工操作方式.在Linux系統下,啟動一個新的程式必須分配給它獨立的地址空間,建立眾多的資料表來維護它的程式碼段、堆疊段和資料段,這是一種”昂貴”的多工工作方式
執行於一個程式中的多個執行緒,它們之間使用相同的地址空間,而且執行緒間彼此切換所需的時間也遠遠小於程式間切換所需要的時間.據統計,一個程式的開銷大約是一個執行緒開銷的30倍左右
使用多執行緒的理由之二是:
執行緒間方便的通訊機制。對不同程式來說,它們具有獨立的資料空間,要進行資料的傳遞只能通過程式間通訊的方式進行,這種方式不僅費時,而且很不方便。執行緒則不然,由於同一程式下的執行緒之間共享資料空間,所以一個執行緒的資料可以直接為其它執行緒所用,這不僅快捷,而且方便
除了以上所說的優點外,多執行緒程式作為一種多工、併發的工作方式,有如下優點:
使多CPU系統更加有效.作業系統會保證當執行緒數不大於CPU數目時,不同的執行緒執行於不同的CPU上.
改善程式結構.一個既長又複雜的程式可以考慮分為多個執行緒,成為幾個獨立或半獨立的執行部分,這樣的程式會利於理解和修改.
互斥量
為什麼需要互斥量:
Item * p =queue_list;
Queue_list=queue_list->next;
process_job(p);
free(p);
當執行緒1處理完Item *p=queue_list後,系統停止執行緒1的執行,改而執行執行緒2。執行緒2照樣取出頭節點,然後進行處理,最後釋放了該節點。過了段時間,執行緒1重新得到執行。而這個時候,p所指向的節點已經被執行緒2釋放掉,而執行緒1對此毫無知曉。他會接著執行process_job(p)。而這將導致無法預料的後果!
對於這種情況,系統給我們提供了互斥 量.執行緒在取出頭節點前必須要等待互斥量,如果此時有其他執行緒已經獲得該互斥量,那麼該執行緒將會阻塞在這裡.只有等到其他執行緒釋放掉該互斥量後,該執行緒才有可能得到該互斥量。互斥量從本質上說就是一把鎖, 提供對共享資源的保護訪問
訊號量和互斥量的區別
Mutex是一把鑰匙,一個人拿了就可進入一個房間,出來的時候把鑰匙交給佇列的第一個。

Semaphore是一件可以容納N人的房間,如果人不
滿就可以進去,如果人滿了,就要等待有人出來。
對於N=1的情況,稱為binary semaphore。

Binary semaphore與Mutex的差異:
1 mutex要由獲得鎖的執行緒來釋放(誰獲得,誰釋放)。而semaphore可以由其它執行緒釋放
2.初始狀態可能不一樣:mutex的初始值是1 ,semaphore的初始值可能是0(或者為1)
3互斥量用於執行緒的互斥,訊號量用於執行緒的同步。

這是互斥量和訊號量的根本區別,也就是互斥和同步之間的區別。

互斥:是指某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。

同步:是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況是指可以允許多個訪問者同時訪問資源

以上區別是主要想記住的。

note:訊號量可以用來實現互斥量的功能

4 互斥量值只能為0/1,訊號量值可以為非負整數。

也就是說,一個互斥量只能用於一個資源的互斥訪問,它不能實現多個資源的多執行緒互斥問題。訊號量可以實現多個同類資源的多執行緒互斥和同步。當訊號量為單值訊號量是,也可以完成一個資源的互斥訪問。

5 互斥量的加鎖和解鎖必須由同一執行緒分別對應使用,訊號量可以由一個執行緒釋放,另一個執行緒得到。

相關文章