程式和執行緒簡介

董雷發表於2021-12-31

程式和執行緒

注意事項
1.子程式會拷貝父程式的所有資源,變數。
注意:子程式拷貝了父程式資料空間、堆、棧等資源的副本,
2.父子程式間不共享這些儲存空間,共享的空間只有程式碼段,
子程式修改一個全域性變數,父程式的這個全域性變數不會改變,因為是一個副本。
比較

1.程式是資源分配的基本單位。

2.執行緒是獨立排程的基本單位。

3.在同一個程式中,執行緒的切換不會引起程式的切換。在不同的程式中進行執行緒切換,如從一個程式中的執行緒切換到另一個程式中的執行緒會引起程式的切換。

4.一個程式至少包含一個執行緒,執行緒共享整個程式的資源

5.程式結束後它所擁有的所有執行緒都將被銷燬,但是執行緒結束並不響應其他執行緒

6.執行緒執行時一般都需要同步和互斥,因為他們共享程式的所有資源

7.執行緒有自己的私有TCB,執行緒id,程式也有自己的PCB,程式id

8.在開銷方面:每個程式都有獨立的資料空間,程式之間的切換會有較大的開銷,執行緒是共享資料空間的,執行緒之間的切換開銷會小很多。建立一個程式需要給他申請記憶體空間,建立執行緒則不需要,相比之下建立程式比建立執行緒的開銷大很多。執行緒可分為使用者級執行緒和核心級執行緒

程式和執行緒之間通訊

每個程式有自己的地址空間。兩個程式中的地址即使值相同,實際指向的位置也不同。程式間通訊一般通過作業系統的公共區進行。同一程式中的執行緒因屬同一地址空間,可直接通訊。程式不僅是系統內部獨立執行的實體,而且是獨立競爭資源的實體。

執行緒也被稱為輕權程式,同一程式的執行緒共享全域性變數和記憶體,使得執行緒之間共享資料很容易也很方便,但會帶來某些共享資料的互斥問題。許多程式為了提高效率也都是用了執行緒來編寫。父子程式的派生是非常昂貴的,而且父子程式的通訊需要ipc或者其他方法來實現,比較麻煩。而執行緒的建立就花費少得多,並且同一程式內的執行緒共享全域性儲存區,所以通訊方便。執行緒的缺點也是由它的優點造成的,主要是同步,非同步和互斥的問題,值得在使用的時候小心設計。

執行緒間通訊:由於多執行緒共享地址空間和資料空間,所以多個執行緒間的通訊是一個執行緒的資料可以直接提供給其他執行緒使用,而不必通過作業系統(也就是核心的排程)。

一、程式間的通訊方式

1.管道( pipe ):

管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程式間使用。程式的親緣關係通常是指父子程式關係。

2.有名管道 (namedpipe) :

有名管道也是半雙工的通訊方式,但是它允許無親緣關係程式間的通訊。

3.訊號量(semophore ) :

訊號量是一個計數器,可以用來控制多個程式對共享資源的訪問。它常作為一種鎖機制,防止某程式正在訪問共享資源時,其他程式也訪問該資源。因此,主要作為程式間以及同一程式內不同執行緒之間的同步手段。

4.訊息佇列( messagequeue ) :

訊息佇列是由訊息的連結串列,存放在核心中並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少、管道只能承載無格式位元組流以及緩衝區大小受限等缺點。

5.訊號 (sinal ) :

訊號是一種比較複雜的通訊方式,用於通知接收程式某個事件已經發生。

6.共享記憶體(shared memory ) :

共享記憶體就是對映一段能被其他程式所訪問的記憶體,這段共享記憶體由一個程式建立,但多個程式都可以訪問。共享記憶體是最快的 IPC 方式,它是針對其他程式間通訊方式執行效率低而專門設計的。它往往與其他通訊機制,如訊號兩,配合使用,來實現程式間的同步和通訊。
套接字(socket ) :
套介面也是一種程式間通訊機制,與其他通訊機制不同的是,它可用於不同裝置及其間的程式通訊。

二、執行緒間的通訊方式

1.鎖機制

互斥鎖提供了以排他方式防止資料結構被併發修改的方法。

讀寫鎖允許多個執行緒同時讀共享資料,而對寫操作是互斥的。

條件變數可以以原子的方式阻塞程式,直到某個特定條件為真為止。對條件的測試是在互斥鎖的保護下進行的。條件變數始終與互斥鎖一起使用

2.訊號量機制(Semaphore):

包括無名執行緒訊號量和命名執行緒訊號量

3.訊號機制(Signal):類似程式間的訊號處理

執行緒間的通訊目的主要是用於執行緒同步,所以執行緒沒有像程式通訊中的用於資料交換的通訊機制。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
good good study day day up

相關文章