線程間通信:由于多線程共享地址空間和數(shù)據(jù)空間,所以多個(gè)線程間的通信是一個(gè)線程的數(shù)據(jù)可以直接提供給其他線程使用,而不必通過操作系統(tǒng)。
所以線程間通信和同步的方式主要有鎖、信號(hào)、信號(hào)量進(jìn)程間的通信則不同,它的數(shù)據(jù)空間的獨(dú)立性決定了它的通信相對(duì)比較復(fù)雜,需要通過操作系統(tǒng)。
通信機(jī)制主要有:管道、有名管道、消息隊(duì)列、信號(hào)量、共享空間、信號(hào)、套接字(socket)。
下面簡單介紹下進(jìn)程間的幾種通信方式:
管道:它傳遞數(shù)據(jù)是單向性的,只能從一方流向另一方,也就是一種半雙工的通信方式;只用于有親緣關(guān)系的進(jìn)程間的通信,親緣關(guān)系也就是 父子進(jìn)程或兄弟進(jìn)程;沒有名字并且大小受限,傳輸?shù)氖菬o格式的流,所以兩進(jìn)程通信時(shí)必須約定好數(shù)據(jù)通信的格式。
管道它就像一個(gè)特殊的文件,但這個(gè)文件之存在于內(nèi)存中,在創(chuàng)建管道時(shí),系統(tǒng)為管道分配了一個(gè)頁面作為數(shù)據(jù)緩沖區(qū),進(jìn)程對(duì)這個(gè)數(shù)據(jù)緩沖區(qū)進(jìn)行讀寫,以此來完成通信。其中一個(gè)進(jìn)程只能讀一個(gè)只能寫,所以叫半雙工通信,為什么一個(gè)只能讀一個(gè)只能寫呢?因?yàn)閷戇M(jìn)程是在緩沖區(qū)的末尾寫入,讀進(jìn)程是在緩沖區(qū)的頭部讀取,他們各自 的數(shù)據(jù)結(jié)構(gòu)不同,所以功能不同。
有名管道:看見這個(gè)名字就能知道個(gè)大概了,它于管道的不同的是它有名字了。這就不同與管道只能在具有親緣關(guān)系的進(jìn)程間通信了。
它提供了一個(gè)路徑名與之關(guān)聯(lián),有了自己的傳輸格式。有名管道和管道的不同之處還有一點(diǎn)是,有名管道是個(gè)設(shè)備文件,存儲(chǔ)在文件系統(tǒng)中,沒有親緣關(guān)系的進(jìn)程也可以訪問,但是它要按照先進(jìn)先出的原則讀取數(shù)據(jù)。同樣也是單雙工的。
共享內(nèi)存:就是分配一塊能被其他進(jìn)程訪問的內(nèi)存。共享內(nèi)存可以說是最有用的進(jìn)程間通信方式,也是最快的IPC形式。首先說下在使用共享內(nèi)存區(qū)前,必須通過系統(tǒng)函數(shù)將其附加到進(jìn)程的地址空間或說為映射到進(jìn)程空間。兩個(gè)不同進(jìn)程A、B共享內(nèi)存的意思是,同一塊物理內(nèi)存被映射到進(jìn)程A、B各自的進(jìn)程地址空間。進(jìn)程A可以即時(shí)看到進(jìn)程B對(duì)共享內(nèi)存中數(shù)據(jù)的更新,反之亦然。
由于多個(gè)進(jìn)程共享同一塊內(nèi)存區(qū)域,必然需要某種同步機(jī)制,互斥鎖和信號(hào)量都可以。采用共享內(nèi)存通信的一個(gè)顯而易 見的好處是效率高,因?yàn)檫M(jìn)程可以直接讀寫內(nèi)存,而不需要任何數(shù)據(jù)的拷貝。對(duì)于像管道和消息隊(duì)列等通信方式,則需要在內(nèi)核和用戶空間進(jìn)行四次的數(shù)據(jù)拷貝,而共享內(nèi)存則只拷貝兩次數(shù)據(jù)[1]:一次從輸入文件到共享內(nèi)存區(qū),另一次從共享內(nèi)存區(qū)到輸出文件。實(shí)際上,進(jìn)程之間在共享內(nèi)存時(shí),并不總是讀寫少量數(shù)據(jù)后就 解除映射,有新的通信時(shí),再重新建立共享內(nèi)存區(qū)域。而是保持共享區(qū)域,直到通信完畢為止,這樣,數(shù)據(jù)內(nèi)容一直保存在共享內(nèi)存中,并沒有寫回文件。共享內(nèi)存 中的內(nèi)容往往是在解除映射時(shí)才寫回文件的。因此,采用共享內(nèi)存的通信方式效率是非常高的。
信號(hào):信號(hào)是在軟件層次上對(duì)中斷機(jī)制的一種模擬,在原理上,一個(gè)進(jìn)程收到一個(gè)信號(hào)與處理器收到一個(gè)中斷請(qǐng)求可以說是一樣的。
信號(hào)是異步的,一個(gè)進(jìn)程不必通過任何操作來等待信號(hào)的到達(dá),事實(shí)上,進(jìn)程也不知道信號(hào)到底什么時(shí)候到達(dá)。信號(hào)是進(jìn)程間通信機(jī)制中唯一的異步通信機(jī)制,可以看作是異步通知,通知接收信號(hào)的進(jìn)程有哪些事情發(fā)生了。信號(hào)機(jī)制經(jīng)過POSIX實(shí)時(shí)擴(kuò)展后,功能更加強(qiáng)大,除了基本通知功能外,還可以傳遞附加信息。信號(hào)事件的發(fā)生有兩個(gè)來源:硬件來源(比如我們按下了鍵盤或者其它硬件故障);軟件來源。信號(hào)分為可靠信號(hào)和不可靠信號(hào),實(shí)時(shí)信號(hào)和非實(shí)時(shí)信號(hào)。進(jìn)程有三種方式響應(yīng)信號(hào)1.忽略信號(hào)2.捕捉信號(hào)3.執(zhí)行缺省操作。
信號(hào)量:也可以說是一個(gè)計(jì)數(shù)器,常用來處理進(jìn)程或線程同步的問題,特別是對(duì)臨界資源的訪問同步問題。臨界資源:為某一時(shí)刻只能由一個(gè)進(jìn)程或線程操作的資源,當(dāng)信號(hào)量的值大于或等于0時(shí),表示可以供并發(fā)進(jìn)程訪問的臨界資源數(shù),當(dāng)小于0時(shí),表示正在等待使用臨界資源的進(jìn)程數(shù)。更重要的是,信號(hào)量的值僅能由PV操作來改變。
-
信號(hào)
+關(guān)注
關(guān)注
11文章
2851瀏覽量
78229 -
共享內(nèi)存
+關(guān)注
關(guān)注
0文章
16瀏覽量
8421
原文標(biāo)題:盤點(diǎn)嵌入式Linux中進(jìn)程間通信和線程間通信的幾種方式
文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
嵌入式Linux學(xué)習(xí)步驟
Linux下進(jìn)程間通信
嵌入式linux學(xué)習(xí)步驟
嵌入式學(xué)習(xí)路線 嵌入式學(xué)習(xí)路線詳解
嵌入式linux學(xué)習(xí)步驟
嵌入式Linux學(xué)習(xí)步驟
初學(xué)者嵌入式linux系統(tǒng)的學(xué)習(xí)步驟
嵌入式設(shè)計(jì)應(yīng)具備的基本技能
嵌入式linux學(xué)習(xí)步驟
常用的進(jìn)程間通信主要有哪幾種方式
Linux進(jìn)程間通信方式——管道

談?wù)?b class='flag-5'>嵌入式系統(tǒng)中多進(jìn)程設(shè)計(jì)與進(jìn)程通信

評(píng)論