两个不同的进程 虚拟地址相同_记一次阿里面试题:都有哪些进程间通信方式?麻烦你不要再背了...
1 管道
學(xué)習(xí)軟件工程規(guī)范的時(shí)候,我們知道瀑布模型,在整個(gè)項(xiàng)目開發(fā)過程分為多個(gè)階段,上一階段的輸出作為下一階段的輸入。各個(gè)階段的具體內(nèi)容如下圖所示
最初我們在學(xué)習(xí)Linux基本命令使用的時(shí)候,我們經(jīng)常通過多個(gè)命令的組合來完成我們的需求。比如說我們想知道如何查看進(jìn)程或者端口是否在使用,會使用下面的這條命令
這里的"|"實(shí)際上就是管道的意思。"|"前面部分作為"|"后面的輸入,很明顯是單向的傳輸,這樣的管道我們叫做"匿名管道",自行創(chuàng)建和銷毀。既然有匿名管道,應(yīng)該就有帶名字的管道"命名管道"。如果你想雙向傳輸,可以考慮使用兩個(gè)管道拼接即可。
創(chuàng)建命名管道的方式
test即為管道的名稱,在Linux中一切皆文件,管道也是以文件的方式存在,咱們可以使用ls -l 查看下文件的屬性,它會"p"標(biāo)識。
下面我們向管道寫入內(nèi)容
echo "666" > test
此時(shí)按道理來說咋們已經(jīng)將內(nèi)容寫入了test,沒有直接輸出是因?yàn)槲覀冃枰_啟另一個(gè)終端進(jìn)行輸出(可以理解為暫存管道)
cat < test
ok,我們發(fā)現(xiàn)管道內(nèi)容被讀出來,同時(shí)echo退出。那么管道這種通信方式有什么缺點(diǎn)?我們知道瀑布模型的軟件開發(fā)模式是非常低下的,同理采用管道進(jìn)行通信的效率也很低,因?yàn)榧僭O(shè)現(xiàn)在有AB兩個(gè)進(jìn)程,A進(jìn)程將數(shù)據(jù)寫入管道,B進(jìn)程需要等待A進(jìn)程將信息寫完以后才能讀出來,所以這種方案不適合頻繁的通信。那優(yōu)點(diǎn)是什么?
最明顯的優(yōu)點(diǎn)就是簡單,我們平時(shí)經(jīng)常使用以致于都不知道這是管道。鑒于上面的缺點(diǎn),我們怎么去彌補(bǔ)呢?接著往下看
2 消息隊(duì)列
管道通信屬于一股腦的輸入,能不能稍微溫柔點(diǎn)有規(guī)矩點(diǎn)的發(fā)送消息?
答:可以的。消息隊(duì)列在發(fā)送數(shù)據(jù)的時(shí)候,按照一個(gè)個(gè)獨(dú)立單元(消息體)進(jìn)行發(fā)送,其中每個(gè)消息體規(guī)定大小塊,同時(shí)發(fā)送方和接收方約定好消息類型或者正文的格式。
在管道中,其大小受限且只能承載無格式字節(jié)流的方式,而消息隊(duì)列允許不同進(jìn)程以消息隊(duì)列的形式發(fā)送給任意的進(jìn)程。
但是當(dāng)發(fā)送到消息隊(duì)列的數(shù)據(jù)太大,需要拷貝的時(shí)間也就越多,所以還有其他的方式?繼續(xù)看
3 共享內(nèi)存
使用消息隊(duì)列可以達(dá)到不錯的效果,但是如果我們兩個(gè)部門需要交換比較大的數(shù)據(jù)的時(shí)候,一發(fā)一收還是不能及時(shí)的感知數(shù)據(jù)。能不能更好的辦法,雙方能很快的分享內(nèi)容數(shù)據(jù),答:有的,共享內(nèi)存
我們知道每個(gè)進(jìn)程都有自己的虛擬內(nèi)存空間,不同的進(jìn)程映射到不同的物理內(nèi)存空間。那么我們可不可以申請一塊虛擬地址空間,不同進(jìn)程通過這塊虛擬地址空間映射到相同的物理地址空間呢?這樣不同進(jìn)程就可以及時(shí)的感知進(jìn)程都干了啥,就不需要再拷貝來拷貝去。
我們可以通過shmget創(chuàng)建一份共享內(nèi)存,并可以通過ipcs命令查看我們創(chuàng)建的共享內(nèi)存。此時(shí)如果一個(gè)進(jìn)程需要訪問這段內(nèi)存,需要將這個(gè)內(nèi)存加載到自己虛擬地址空間的一個(gè)位置,讓內(nèi)核給它一個(gè)合法地址。使用完畢接觸板頂并刪除內(nèi)存對象。
那么問題來了,這么多進(jìn)程都共享這塊內(nèi)存,如果同時(shí)都往里面寫內(nèi)容,難免會出現(xiàn)沖突的現(xiàn)象,比如A進(jìn)程寫了數(shù)字5,B進(jìn)程同樣的地址寫了6就直接給覆蓋了,這樣就不友好了,怎么辦?繼續(xù)往下看
4 信號量
為了防止沖突,我們得有個(gè)約束或者說一種保護(hù)機(jī)制。使得同一份共享的資源只能一個(gè)進(jìn)程使用,這里就出現(xiàn)了信號量機(jī)制。
信號量實(shí)際上是一個(gè)計(jì)數(shù)器,這里需要注意下,信號量主要實(shí)現(xiàn)進(jìn)程之間的同步和互斥,而不是存儲通信內(nèi)容。
信號量定義了兩種操作,p操作和v操作,p操作為申請資源,會將數(shù)值減去M,表示這部分被他使用了,其他進(jìn)程暫時(shí)不能用。v操作是歸還資源操作,告知?dú)w還了資源可以用這部分。
5 信號
從管道----消息隊(duì)列-共享內(nèi)存/信號量,有需要等待的管道機(jī)制,共享內(nèi)存空間的進(jìn)程通信方式,還有一種特殊的方式--信號
我們或許聽說過運(yùn)維或者部分開發(fā)需要7 * 24小時(shí)值守(項(xiàng)目需要上線的時(shí)候),當(dāng)然也有各種監(jiān)管,告警系統(tǒng),一旦出現(xiàn)系統(tǒng)資源緊張等問題就會告知開發(fā)或運(yùn)維人員,對應(yīng)到操作系統(tǒng)中,這就是信號。
在操作系統(tǒng)中,不同信號用不同的值表示,每個(gè)信號設(shè)置相應(yīng)的函數(shù),一旦進(jìn)程發(fā)送某一個(gè)信號給另一個(gè)進(jìn)程,另一進(jìn)程將執(zhí)行相應(yīng)的函數(shù)進(jìn)行處理。也就是說先把可能出現(xiàn)的異常等問題準(zhǔn)備好,一旦信號產(chǎn)生就執(zhí)行相應(yīng)的邏輯即可。
6 套接字
上面的幾種方式都是單機(jī)情況下多個(gè)進(jìn)程的通信方式,如果我想和相隔幾千里的小姐姐通信怎么辦?
這就需要套接字socket了。其實(shí)這玩意隨處可見,我們平時(shí)的聊天,我們天天請求瀏覽器給予的響應(yīng)等,都是這老鐵。
7 總結(jié)
分享了一下幾種進(jìn)程間通信方式,希望大家能知其然并知其所以然,機(jī)械式的記憶容易忘記哦。
- 管道
- 消息隊(duì)列
- 共享內(nèi)存
- 信號量
- 信號
- 套接字
總結(jié)
以上是生活随笔為你收集整理的两个不同的进程 虚拟地址相同_记一次阿里面试题:都有哪些进程间通信方式?麻烦你不要再背了...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java cpu过高排查_论线上如何排查
- 下一篇: 用python玩转数据第四周答案_大学慕