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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux 进程通信比较,浅析Linux进程通信的几种方式及其比较

發(fā)布時(shí)間:2024/2/28 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 进程通信比较,浅析Linux进程通信的几种方式及其比较 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

摘要:本文通過(guò)對(duì)Linux下幾種主要通信方式進(jìn)行概述,并結(jié)合Linux系統(tǒng)的系統(tǒng)調(diào)用對(duì)OS中的實(shí)現(xiàn)進(jìn)行簡(jiǎn)要概述,并對(duì)其優(yōu)缺點(diǎn)進(jìn)行分析,闡述了在不同通信情況下應(yīng)該選擇何種通信方式進(jìn)行選擇。

關(guān)鍵詞:Linux;通訊方式

中圖分類號(hào):TP39 文獻(xiàn)標(biāo)識(shí)碼:A

1.進(jìn)程通信的基本概念

進(jìn)程間通信(IPC)指的是至少兩個(gè)進(jìn)程間傳送數(shù)據(jù)或者信號(hào)的一些技術(shù)和方法,進(jìn)程是計(jì)算機(jī)系統(tǒng)分配資源的基本單位,每個(gè)進(jìn)程都有自己的一部分獨(dú)立的系統(tǒng)資源,彼此是隔離的。為了能使不同的進(jìn)程互相訪問(wèn)資源并進(jìn)行協(xié)調(diào)工作,才有了進(jìn)程之間的通信。

2.進(jìn)程通信的分類

操作系統(tǒng)中進(jìn)程間傳遞的信息量有多有少,因此根據(jù)進(jìn)程通信時(shí)信息量大小的不同,可以將進(jìn)程通信劃分為兩大類型,一種類型主要用于傳遞進(jìn)程之間同步、互斥、終止、掛起等控制信息的傳遞,由于進(jìn)程互斥與同步交換的信息量較少,并且每次通信傳遞的信息量固定且效率較低,因此稱這兩種通信方式為低級(jí)通信方式,主要方式有信號(hào)量。另一種類型在進(jìn)程間以較高的效率傳送大量數(shù)據(jù),被稱為高級(jí)通信方式,主要方式有管道,共享內(nèi)存和消息隊(duì)列。下面對(duì)這四種通信方式進(jìn)行簡(jiǎn)單的論述。

3.信號(hào)量

信號(hào)量也叫信號(hào)燈,是一個(gè)確定的二元組(S,Q),其中S是個(gè)具有非負(fù)初置的整形變量,表示的是臨界資源的實(shí)體。信號(hào)量的值有以下兩種情況:

1)代表可用資源的數(shù)量,此時(shí)Q 的隊(duì)列為空。

2)代表由于等待此種資源而被阻塞的進(jìn)程的數(shù)量,也就是Q隊(duì)列中進(jìn)程的個(gè)數(shù)。

信號(hào)量的值僅能由P、V操作進(jìn)行改變,其中p操作和v操作是不可中斷的程序段,稱為原語(yǔ)操作,它是典型的同步機(jī)制之一。每執(zhí)行一次P操作表示分配一個(gè)該類資源給執(zhí)行P操作的進(jìn)程,因此P操作將信號(hào)量的值減1,當(dāng)信號(hào)量的值小于0時(shí),表示已經(jīng)沒(méi)有這類資源可供分配了,所以請(qǐng)求資源的進(jìn)程將被阻塞而被插入到Q的等待隊(duì)列當(dāng)中。此時(shí),信號(hào)量的絕對(duì)值等于Q隊(duì)列中進(jìn)程的個(gè)數(shù),即等待分配該類資源的進(jìn)程數(shù)。執(zhí)行一次V操作意味著進(jìn)程釋放出一個(gè)該類可用資源,因而V操作是將信號(hào)量的值加1。因信號(hào)量的值小于等于0表示在該信號(hào)量的等待隊(duì)列中有請(qǐng)求該類型而被阻塞的進(jìn)程,因而應(yīng)把該信號(hào)量等待隊(duì)中的隊(duì)首的進(jìn)程喚醒,即進(jìn)程的狀態(tài)由阻塞狀態(tài)變?yōu)榛顒?dòng)就緒狀態(tài)。

信號(hào)量的創(chuàng)建:Linux系統(tǒng)中使用semget(key,nSemes,flag)來(lái)創(chuàng)建一個(gè)信號(hào)量,key是標(biāo)識(shí)信號(hào)量的關(guān)鍵字,nSemes表示創(chuàng)建信號(hào)量的個(gè)數(shù),flag表示為信號(hào)量存取權(quán)標(biāo)志與建立標(biāo)志。

信號(hào)量的操作:Linux系統(tǒng)中采用semop(semid,sops,nsops)來(lái)實(shí)現(xiàn)對(duì)信號(hào)量的操作,semid為關(guān)鍵字值,由semget返回得來(lái),第二個(gè)參數(shù)是指向?qū)⒁僮鞯臄?shù)組的指針,nsops為數(shù)組sops的大小。

4.管道通信方式

管道是Linux支持的最初Unix IPC形式之一,當(dāng)兩個(gè)進(jìn)程利用管道進(jìn)行通信時(shí),發(fā)送信息的進(jìn)程稱為寫進(jìn)程,接收信息的進(jìn)程稱為讀進(jìn)程。管道通信方式的中間介質(zhì)就是文件,通常稱這種文件為管道文件.它就像管道一樣將一個(gè)寫進(jìn)程和一個(gè)讀進(jìn)程連接在一起,實(shí)現(xiàn)兩個(gè)進(jìn)程之間的通信。寫進(jìn)程通過(guò)寫入端(發(fā)送端)往管道文件中寫入信息,讀進(jìn)程通過(guò)讀出端(接收端)從管道文件中讀取信息。管道具有如下特點(diǎn):

1)管道是半雙工的,數(shù)據(jù)只能向一個(gè)方向流動(dòng),數(shù)據(jù)只能由寫的一方向讀得一方流動(dòng)。

2)單獨(dú)構(gòu)成一種獨(dú)立的文件系統(tǒng):管道對(duì)于管道兩端的進(jìn)程而言,就是一個(gè)文件,成為管道文件,但它不屬于某種文件系統(tǒng),而是自立門戶,單獨(dú)構(gòu)成一種文件系統(tǒng),并且只存在與內(nèi)存中。

3)數(shù)據(jù)的讀出和寫入:管道建立時(shí),通信兩端的任務(wù)都是被固定了的,也就是說(shuō),一端只能用于讀,而另一端只能用于寫,寫入的內(nèi)容每次都添加在管道緩沖區(qū)的末尾,并且每次都是從緩沖區(qū)的頭部讀出數(shù)據(jù)。

5.消息隊(duì)列

消息隊(duì)列的基本思想是:系統(tǒng)管理一組消息緩沖區(qū),并稱之為消息緩沖池,其中每個(gè)消息緩沖區(qū)存放一條消息。消息實(shí)際上就是一組信息。當(dāng)一個(gè)進(jìn)程要發(fā)送消息時(shí),首先向系統(tǒng)申請(qǐng)一個(gè)消息緩沖區(qū),寫入消息后將其連接到接受進(jìn)程PCB所指示的消息隊(duì)列。接受進(jìn)程在適當(dāng)?shù)臅r(shí)候從其消息隊(duì)列中取得消息,并立即釋放該消息緩沖區(qū),交回給系統(tǒng)管理。

消息隊(duì)列就是一個(gè)消息的鏈表。就是把消息看作一個(gè)記錄,并且這個(gè)記錄具有特定的格式以及特定的優(yōu)先級(jí)。對(duì)消息隊(duì)列有寫權(quán)限的進(jìn)程可以按照一定的規(guī)則添加新消息;對(duì)消息隊(duì)列有讀權(quán)限的進(jìn)程則可以從消息隊(duì)列中讀出消息。

Linux采用消息隊(duì)列的方式來(lái)實(shí)現(xiàn)消息傳遞。這種消息的發(fā)送方式是:發(fā)送方不必等待接收方檢查它所收到的消息就可以繼續(xù)工作下去,而接收方如果沒(méi)有收到消息也不需等待。這種通信機(jī)制相對(duì)簡(jiǎn)單,但是應(yīng)用程序使用起來(lái)就需要使用相對(duì)復(fù)雜的方式來(lái)應(yīng)付了。新的消息總是放在隊(duì)列的末尾,接收的時(shí)候并不總是從頭來(lái)接收,可以從中間來(lái)接收。

Linux中定義了一個(gè)名為msgbuf的數(shù)據(jù)結(jié)構(gòu)來(lái)表示消息,并利用MSGGET()來(lái)創(chuàng)建一個(gè)消息隊(duì)列,然后返回這個(gè)消息隊(duì)列的標(biāo)識(shí)號(hào),然后調(diào)用MSGSND()向一個(gè)消息隊(duì)列發(fā)送一個(gè)消息,接收進(jìn)城通過(guò)MSGRCV()來(lái)從一個(gè)消息隊(duì)列中收到一個(gè)消息。在通信雙方進(jìn)行通信的過(guò)程中,系統(tǒng)可以利用MSGCTL()在消息隊(duì)列上執(zhí)行指定的操作,更具參數(shù)的不同和權(quán)限的不同,可以執(zhí)行檢索、刪除等得操作。

共享的消息隊(duì)列是一個(gè)臨界資源,針對(duì)同一消息隊(duì)列的諸發(fā)送和接收進(jìn)程必須保證互斥進(jìn)入,這種進(jìn)程間的同步和互斥是由系統(tǒng)提供的系統(tǒng)調(diào)用自動(dòng)實(shí)現(xiàn)的,所以用戶在使用時(shí)不需要再考慮它們之間的同步關(guān)系,非常方便。

6.共享內(nèi)存

除上述幾種通信方式之外,Linux還提供了正文段,也就是程序段的共享,當(dāng)若干進(jìn)程需要對(duì)公共數(shù)據(jù)區(qū)中的數(shù)據(jù)進(jìn)行頻繁操作時(shí),共享內(nèi)存的通信方式是一種很有用的通信機(jī)制,而且是以一種效率較高的進(jìn)程通信機(jī)制。其基本思想是:系統(tǒng)管理一組共享內(nèi)存控制塊,當(dāng)用戶程序進(jìn)程需要使用共享內(nèi)存段時(shí),使用SHMGET()系統(tǒng)調(diào)用申請(qǐng)一個(gè)共享內(nèi)存段,系統(tǒng)位置分配存儲(chǔ)空間和建立有關(guān)的數(shù)據(jù)結(jié)構(gòu),并返回該共享內(nèi)存段的標(biāo)識(shí)符shmid,然后系統(tǒng)調(diào)用SHMAT()將由標(biāo)識(shí)符shmid標(biāo)識(shí)的共享內(nèi)存段附加到進(jìn)程地址空間,一旦將一個(gè)共享內(nèi)存段連接到進(jìn)程邏輯地址空間后,進(jìn)程可以像訪問(wèn)其私有數(shù)據(jù)段一樣存取該共享內(nèi)存段中的數(shù)據(jù)。當(dāng)不在使用共享內(nèi)存時(shí),由系統(tǒng)調(diào)用SHMDT()將由參數(shù)定位的共享內(nèi)存段脫離調(diào)用進(jìn)程的數(shù)據(jù)段。在此期間,可以使用系統(tǒng)調(diào)用SHMCTL()查詢由shmid標(biāo)識(shí)的共享內(nèi)存段的狀態(tài)和設(shè)置有關(guān)參數(shù),對(duì)共享內(nèi)存段進(jìn)行控制。

共享內(nèi)存通信與消息緩沖通信有很多類似之處:都是使用一個(gè)id來(lái)標(biāo)識(shí)一個(gè)IPC目標(biāo),通過(guò)使用GET(msgget,shmget)來(lái)建立一個(gè)IPC目標(biāo),都要進(jìn)行權(quán)限檢查等來(lái)實(shí)現(xiàn)通信。不同點(diǎn)是:共享內(nèi)存一旦附接后就作為進(jìn)程地址空間的一部分提供給進(jìn)程使用對(duì)于該共享內(nèi)存的讀寫操作如同對(duì)進(jìn)程私有的緩沖區(qū)一樣。操作系統(tǒng)不再關(guān)心進(jìn)程間是如何使用這個(gè)共享內(nèi)存,更無(wú)法進(jìn)行干預(yù)。

7.各種通信方式的比較和優(yōu)缺點(diǎn)。

如果用戶傳遞的信息較少。或是需要通過(guò)信號(hào)來(lái)觸發(fā)某些行為,信號(hào)量不失為一種簡(jiǎn)捷有效的進(jìn)程間通信方式。但若是進(jìn)程間要求傳遞的信息量比較大或者進(jìn)程間存在交換數(shù)據(jù)的要求,就需要考慮高級(jí)通信機(jī)制。無(wú)名管道簡(jiǎn)單方便。但局限于單向通信的工作方式,并且只能在創(chuàng)建它的進(jìn)程及其子孫進(jìn)程之間實(shí)現(xiàn)管道的共享。有名管道雖然可以提供給任意關(guān)系的進(jìn)程使用,但是由于其長(zhǎng)期存在于系統(tǒng)之中,使用不當(dāng)容易出錯(cuò).所以普通用戶一般不建議使用。

消息緩沖可以不再局限于父子進(jìn)程,而允許任意進(jìn)程通過(guò)共享消息隊(duì)列來(lái)實(shí)現(xiàn)進(jìn)程間通信,并由系統(tǒng)調(diào)用函數(shù)來(lái)實(shí)現(xiàn)消息發(fā)送

超強(qiáng)干貨來(lái)襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生

總結(jié)

以上是生活随笔為你收集整理的linux 进程通信比较,浅析Linux进程通信的几种方式及其比较的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。