日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux线程间通信优点,进程间通信与线程间通信【转】

發布時間:2024/8/1 linux 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux线程间通信优点,进程间通信与线程间通信【转】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一個進程寫管道:寫入字節數小于PIPE_BUF是原子操作,寫操作在管道緩沖區沒有及時讀走時發生阻塞。

一個進程讀管道:讀操作在管道緩沖區沒有數據時發生阻塞。

以前一直想找個機會總結一下進程和線程的通信機制,但由于技術和平臺的局限性,一直沒有找準切入點。由于馬上要畢業了,對自己技術的總結和梳理的前提下寫了本篇文章,如有錯誤之處,敬請拍磚和指教。

操作系統的主要任務是管理計算機的軟件、硬件資源。現代操作系統的主要特點是多用戶和多任務,也就是程序的并行執行,windows如此linux也是如此。所以操作系統就借助于進程來管理計算機的軟、硬件資源,支持多任務的并行執行。要并行執行就需要多進程、多線程。因此多進程和多線程間為了完成一定的任務,就需要進行一定的通信。而線程間通信又和進程間的通信不同。由于進程的數據空間相對獨立而線程是共享數據空間的,彼此通信機制也很不同。

線程間通信:由于多線程共享地址空間和數據空間,所以多個線程間的通信是一個線程的數據可以直接提供給其他線程使用,而不必通過操作系統(也就是內核的調度)。

進程間的通信則不同,它的數據空間的獨立性決定了它的通信相對比較復雜,需要通過操作系統。以前進程間的通信只能是單機版的,現在操作系統都繼承了基于套接字(socket)的進程間的通信機制。這樣進程間的通信就不局限于單臺計算機了,實現了網絡通信。

進程的通信機制主要有:管道、有名管道、消息隊列、信號量、共享空間、信號、套接字。

管道:它傳遞數據是單向性的,只能從一方流向另一方,也就是一種半雙工的通信方式;只用于有親緣關系的進程間的通信,親緣關系也就是父子進程或兄弟進程;沒有名字并且大小受限,傳輸的是無格式的流,所以兩進程通信時必須約定好數據通信的格式。管道它就像一個特殊的文件,但這個文件之存在于內存中,在創建管道時,系統為管道分配了一個頁面作為數據緩沖區,進程對這個數據緩沖區進行讀寫,以此來完成通信。其中一個進程只能讀一個只能寫,所以叫半雙工通信,為什么一個只能讀一個只能寫呢?因為寫進程是在緩沖區的末尾寫入,讀進程是在緩沖區的頭部讀取,他們各自

的數據結構不同,所以功能不同。

有名管道:看見這個名字就能知道個大概了,它于管道的不同的是它有名字了。這就不同與管道只能在具有親緣關系的進程間通信了。它提供了一個路徑名與之關聯,有了自己的傳輸格式。有名管道和管道的不同之處還有一點是,有名管道是個設備文件,存儲在文件系統中,沒有親緣關系的進程也可以訪問,但是它要按照先進先出的原則讀取數據。同樣也是單雙工的。

消息隊列:是存放在內核中的消息鏈表,每個消息隊列由消息隊列標識符標識,于管道不同的是,消息隊列存放在內核中,只有在內核重啟時才能刪除一個消息隊列,內核重啟也就是系統重啟,同樣消息隊列的大小也是受限制的。

信號量:也可以說是一個計數器,常用來處理進程或線程同步的問題,特別是對臨界資源的訪問同步問題。臨界資源:為某一時刻只能由一個進程或線程操作的資源,當信號量的值大于或等于0時,表示可以供并發進程訪問的臨界資源數,當小于0時,表示正在等待使用臨界資源的進程數。更重要的是,信號量的值僅能由PV操作來改變。

共享內存:就是分配一塊能被其他進程訪問的內存。共享內存可以說是最有用的進程間通信方式,也是最快的IPC形式。首先說下在使用共享內存區前,必須通過系統函數將其附加到進程的地址空間或說為映射到進程空間。兩個不同進程A、B共享內存的意思是,同一塊物理內存被映射到進程A、B各自的進程地址空間。進程A可以即時看到進程B對共享內存中數據的更新,反之亦然。由于多個進程共享同一塊內存區域,必然需要某種同步機制,互斥鎖和信號量都可以。采用共享內存通信的一個顯而易見的好處是效率高,因為進程可以直接讀寫內存,而不需要任何數據的拷貝。對于像管道和消息隊列等通信方式,則需要在內核和用戶空間進行四次的數據拷貝,而共享內存則只拷貝兩次數據[1]:一次從輸入文件到共享內存區,另一次從共享內存區到輸出文件。實際上,進程之間在共享內存時,并不總是讀寫少量數據后就解除映射,有新的通信時,再重新建立共享內存區域。而是保持共享區域,直到通信完畢為止,這樣,數據內容一直保存在共享內存中,并沒有寫回文件。共享內存中的內容往往是在解除映射時才寫回文件的。因此,采用共享內存的通信方式效率是非常高的。

信號:信號是在軟件層次上對中斷機制的一種模擬,在原理上,一個進程收到一個信號與處理器收到一個中斷請求可以說是一樣的。信號是異步的,一個進程不必通過任何操作來等待信號的到達,事實上,進程也不知道信號到底什么時候到達。信號是進程間通信機制中唯一的異步通信機制,可以看作是異步通知,通知接收信號的進程有哪些事情發生了。信號機制經過POSIX實時擴展后,功能更加強大,除了基本通知功能外,還可以傳遞附加信息。信號事件的發生有兩個來源:硬件來源(比如我們按下了鍵盤或者其它硬件故障);軟件來源。信號分為可靠信號和不可靠信號,實時信號和非實時信號。進程有三種方式響應信號1.忽略信號2.捕捉信號3.執行缺省操作。

套接字:這一塊在網絡編程那一塊講的

很多,在此就不在說拉。

對于進程的學習只是皮毛,望高手指點!

linux中進程間通信和線程間通信的區別

1.linux中的進程,是有fork()系統調用創建的,進程間都有獨立的地址空間,他們之間不能直接通信,必須通過一些IPC進程進程間通信機制來完成。

常見的IPC有:PIPE,命名管道,信號,共享內存以及socket等;

2.linux中的線程,是clone()系統調用創建的,一個進程下的線程間是共享內存空間的,故線程A可以之間訪問線程B中定義的變量,但是必須注意并發的情況;

另:“線程上下文”的規模要遠遠小于進程上下文

一、進程/線程間同步機制。

臨界區、互斥區、事件、信號量四種方式

臨界區(Critical

Section)、互斥量(Mutex)、信號量(Semaphore)、事件(Event)的區別

1、臨界區:通過對多線程的串行化來訪問公共資源或一段代碼,速度快,適合控制數據訪問。在任意時刻只允許一個線程對共享資源進行訪問,如果有多個線程試圖訪問公共資源,那么在有一個線程進入后,其他試圖訪問公共資源的線程將被掛起,并一直等到進入臨界區的線程離開,臨界區在被釋放后,其他線程才可以搶占。

2、互斥量:采用互斥對象機制。

只有擁有互斥對象的線程才有訪問公共資源的權限,因為互斥對象只有一個,所以能保證公共資源不會同時被多個線程訪問。互斥不僅能實現同一應用程序的公共資源安全共享,還能實現不同應用程序的公共資源安全共享

.互斥量比臨界區復雜。因為使用互斥不僅僅能夠在同一應用程序不同線程中實現資源的安全共享,而且可以在不同應用程序的線程之間實現對資源的安全共享。

3、信號量:它允許多個線程在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大線程數目 .信號量對象對線程的同步方式與前面幾種方法不同,信號允許多個線程同時使用共享資源,這與操作系統中的PV操作相同。它指出了同時訪問共享資源的線程最大數目。它允許多個線程在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大線程數目。

PV操作及信號量的概念都是由荷蘭科學家E.W.Dijkstra提出的。信號量S是一個整數,S大于等于零時代表可供并發進程使用的資源實體數,但S小于零時則表示正在等待使用共享資源的進程數。

P操作申請資源:

(1)S減1;

(2)若S減1后仍大于等于零,則進程繼續執行;

(3)若S減1后小于零,則該進程被阻塞后進入與該信號相對應的隊列中,然后轉入進程調度。

V操作 釋放資源:

(1)S加1;

(2)若相加結果大于零,則進程繼續執行;

(3)若相加結果小于等于零,則從該信號的等待隊列中喚醒一個等待進程,然后再返回原進程繼續執行或轉入進程調度。

4、事 件: 通過通知操作的方式來保持線程的同步,還可以方便實現對多個線程的優先級比較的操作 .

總結:

1.

互斥量與臨界區的作用非常相似,但互斥量是可以命名的,也就是說它可以跨越進程使用。所以創建互斥量需要的資源更多,所以如果只為了在進程內部是用的話使用臨界區會帶來速度上的優勢并能夠減少資源占用量。因為互斥量是跨進程的互斥量一旦被創建,就可以通過名字打開它。

2.

互斥量(Mutex),信號燈(Semaphore),事件(Event)都可以被跨越進程使用來進行同步數據操作,而其他的對象與數據同步操作無關,但對于進程和線程來講,如果進程和線程在運行狀態則為無信號狀態,在退出后為有信號狀態。所以可以使用WaitForSingleObject來等待進程和線程退出。

3.

通過互斥量可以指定資源被獨占的方式使用,但如果有下面一種情況通過互斥量就無法處理,比如現在一位用戶購買了一份三個并發訪問許可的數據庫系統,可以根據用戶購買的訪問許可數量來決定有多少個線程/進程能同時進行數據庫操作,這時候如果利用互斥量就沒有辦法完成這個要求,信號燈對象可以說是一種資源計數器。

二、進程間通信方式

由于比較容易混淆,我們把進程間通信方法也列在這里做比較。

程間通信就是在不同進程之間傳播或交換信息,那么不同進程之間存在著什么雙方都可以訪問的介質呢?進程的用戶空間是互相獨立的,一般而言是不能互相訪問的,唯一的例外是共享內存區。但是,系統空間卻是“公共場所”,所以內核顯然可以提供這樣的條件。除此以外,那就是雙方都可以訪問的外設了。在這個意義上,兩個進程當然也可以通過磁盤上的普通文件交換信息,或者通過“注冊表”或其它數據庫中的某些表項和記錄交換信息。廣義上這也是進程間通信的手段,但是一般都不把這算作“進程間通信”。因為那些通信手段的效率太低了,而人們對進程間通信的要求是要有一定的實時性。

進程間通信主要包括管道,

系統IPC(包括消息隊列,信號量,共享存儲), SOCKET.

管道分為有名管道和無名管道,無名管道只能用于親屬進程之間的通信,而有名管道則可用于無親屬關系的進程之間。

消息隊列用于運行于同一臺機器上的進程間通信,與管道相似;

共享內存通常由一個進程創建,其余進程對這塊內存區進行讀寫。得到共享內存有兩種方式:映射/dev/mem設備和內存映像文件。前一種方式不給系統帶來額外的開銷,但在現實中并不常用,因為它控制存取的是實際的物理內存;

本質上,信號量是一個計數器,它用來記錄對某個資源(如共享內存)的存取狀況。一般說來,為了獲得共享資源,進程需要執行下列操作:

(1)測試控制該資源的信號量;

(2)若此信號量的值為正,則允許進行使用該資源,進程將進號量減1;

(3)若此信號量為0,則該資源目前不可用,進程進入睡眠狀態,直至信號量值大于0,進程被喚醒,轉入步驟(1);

(4)當進程不再使用一個信號量控制的資源時,信號量值加1,如果此時有進程正在睡眠等待此信號量,則喚醒此進程。

套接字通信并不為Linux所專有,在所有提供了TCP/IP協議棧的操作系統中幾乎都提供了socket,而所有這樣操作系統,對套接字的編程方法幾乎是完全一樣的

三、進程/線程同步機制與進程間通信機制比較

很明顯2者有類似,但是差別很大

同步主要是臨界區、互斥、信號量、事件

進程間通信是管道、內存共享、消息隊列、信號量、socket

共通之處是,信號量和消息(事件)

其他資料:

進程間通訊(IPC)方法主要有以下幾種:?管道/FIFO/共享內存/消息隊列/信號

1.管道中還有命名管道和非命名管道(即匿名管道)之分,非命名管道(即匿名管道)只能用于父子進程通訊,命名管道可用于非父子進程,命名管道就是FIFO,管道是先進先出的通訊方式

2.消息隊列是用于兩個進程之間的通訊,首先在一個進程中創建一個消息隊列,然后再往消息隊列中寫數據,而另一個進程則從那個消息隊列中取數據。需要注意的是,消息隊列是用創建文件的方式建立的,如果一個進程向某個消息隊列中寫入了數據之后,另一個進程并沒有取出數據,即使向消息隊列中寫數據的進程已經結束,保存在消息隊列中的數據并沒有消失,也就是說下次再從這個消息隊列讀數據的時候,就是上次的數據!!!!

3.信號量,它與WINDOWS下的信號量是一樣的,所以就不用多說了

4.共享內存,類似于WINDOWS下的DLL中的共享變量,但LINUX下的共享內存區不需要像DLL這樣的東西,只要首先創建一個共享內存區,其它進程按照一定的步驟就能訪問到這個共享內存區中的數據,當然可讀可寫

以上幾種方式的比較:

1.管道:速度慢,容量有限,只有父子進程能通訊

2.FIFO:任何進程間都能通訊,但速度慢

3.消息隊列:容量受到系統限制,且要注意第一次讀的時候,要考慮上一次沒有讀完數據的問題

4.信號量:不能傳遞復雜消息,只能用來同步

5.共享內存區:能夠很容易控制容量,速度快,但要保持同步,比如一個進程在寫的時候,另一個進程要注意讀寫的問題,相當于線程中的線程安全,當然,共享內存區同樣可以用作線程間通訊,不過沒這個必要,線程間本來就已經共享了同一進程內的一塊內存

各自的特點:

管道(PIPE):管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關系(父子進程)的進程間使用。另外管道傳送的是無格式的字節流,并且管道緩沖區的大小是有限的(管道緩沖區存在于內存中,在管道創建時,為緩沖區分配一個頁面大小)。

有名管道 (FIFO): 有名管道也是半雙工的通信方式,但是它允許無親緣關系進程間的通信。

信號(Signal): 信號是一種比較復雜的通信方式,用于通知接收進程某個事件已經發生。

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

消息隊列(Message

Queue):消息隊列是由消息的鏈表,存放在內核中并由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩沖區大小受限等缺點。

共享內存(Shared Memory

):共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的 IPC

方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號量,配合使用,來實現進程間的同步和通信。

套接字(Socket): 套解口也是一種進程間通信機制,與其他通信機制不同的是,它可用于不同主機間的進程通信。

Linux系統中的線程通信方式主要以下幾種:

*?鎖機制:包括互斥鎖、條件變量、讀寫鎖

互斥鎖提供了以排他方式防止數據結構被并發修改的方法。

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

讀寫鎖允許多個線程同時讀共享數據,而對寫操作是互斥的。

*?信號量機制(Semaphore):包括無名線程信號量和命名線程信號量

*?信號機制(Signal):類似進程間的信號處理

線程間的通信目的主要是用于線程同步。所以線程沒有像進程通信中的用于數據交換的通信機制。

多線程通信的方法主要有以下三種:

1.全局變量

進程中的線程間內存共享,這是比較常用的通信方式和交互方式。

注:定義全局變量時最好使用volatile來定義,以防編譯器對此變量進行優化。

線程通信主要包括兩種方法:

(1)共享內存

(2)管道

主要分為一下步驟:

首先建立管道流,并將管道流的輸入輸出對象進行鏈接;

將管道流加入到生產對象(線程)中;

通過管道流引出輸入輸出流,并在線程中對這些流進行操作;

注:管道流的的read的方法是一種阻塞方法;

總結

以上是生活随笔為你收集整理的linux线程间通信优点,进程间通信与线程间通信【转】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。