九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
進(jìn)程間通訊的7種方式

1、常見的通信方式

管道pipe:管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動,而且只能在具有親緣關(guān)系的進(jìn)程間使用。進(jìn)程的親緣關(guān)系通常是指父子進(jìn)程關(guān)系。

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

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

共享存儲SharedMemory:共享內(nèi)存就是映射一段能被其他進(jìn)程所訪問的內(nèi)存,這段共享內(nèi)存由一個進(jìn)程創(chuàng)建,但多個進(jìn)程都可以訪問。共享內(nèi)存是最快的 IPC 方式,它是針對其他進(jìn)程間通信方式運行效率低而專門設(shè)計的。它往往與其他通信機(jī)制,如信號量,配合使用,來實現(xiàn)進(jìn)程間的同步和通信。

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

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

信號 ( sinal ) : 信號是一種比較復(fù)雜的通信方式,用于通知接收進(jìn)程某個事件已經(jīng)發(fā)生。

2、按通信類型區(qū)分

共享存儲器系統(tǒng)

1.基于共享數(shù)據(jù)結(jié)構(gòu)的通信方式

(僅適用于傳遞相對少量的數(shù)據(jù),通信效率低,屬于低級通信)

2.基于共享存儲區(qū)的通信方式

管道通信系統(tǒng)

管道是指用于連接一個讀進(jìn)程和一個寫進(jìn)程以實現(xiàn)它們之間通信的一個共享文件(pipe文件)

管道機(jī)制需要提供一下幾點的協(xié)調(diào)能力

1.互斥,即當(dāng)一個進(jìn)程正在對pipe執(zhí)行讀/寫操作時,其它進(jìn)程必須等待

2.同步,當(dāng)一個進(jìn)程將一定數(shù)量的數(shù)據(jù)寫入,然后就去睡眠等待,直到讀進(jìn)程將數(shù)據(jù)取走,再去喚醒。讀進(jìn)程與之類似

3.確定對方是否存在

消息傳遞系統(tǒng)

1.直接通信方式

發(fā)送進(jìn)程利用OS所提供的發(fā)送原語直接把消息發(fā)給目標(biāo)進(jìn)程

2.間接通信方式

發(fā)送和接收進(jìn)程都通過共享實體(郵箱)的方式進(jìn)行消息的發(fā)送和接收

客戶機(jī)服務(wù)器系統(tǒng)

1.套接字 – 通信標(biāo)識型的數(shù)據(jù)結(jié)構(gòu)是進(jìn)程通信和網(wǎng)絡(luò)通信的基本構(gòu)件

基于文件型的 (當(dāng)通信進(jìn)程都在同一臺服務(wù)器中)其原理類似于管道

基于網(wǎng)絡(luò)型的(非對稱方式通信,發(fā)送者需要提供接收者命名。通信雙方的進(jìn)程運行在不同主機(jī)環(huán)境下被分配了一對套接字,一個屬于發(fā)送進(jìn)程,一個屬于接收進(jìn)程)

2.遠(yuǎn)程過程調(diào)用和遠(yuǎn)程方法調(diào)用

3、詳解

3.1 管道

管道,通常指無名管道,是 UNIX 系統(tǒng)IPC最古老的形式。

1、特點:

它是半雙工的(即數(shù)據(jù)只能在一個方向上流動),具有固定的讀端和寫端。

它只能用于具有親緣關(guān)系的進(jìn)程之間的通信(也是父子進(jìn)程或者兄弟進(jìn)程之間)。

它可以看成是一種特殊的文件,對于它的讀寫也可以使用普通的read、write 等函數(shù)。但是它不是普通的文件,并不屬于其他任何文件系統(tǒng),并且只存在于內(nèi)存中。

管道分為pipe(無名管道)和fifo(命名管道)兩種,除了建立、打開、刪除的方式不同外,這兩種管道幾乎是一樣的。他們都是通過內(nèi)核緩沖區(qū)實現(xiàn)數(shù)據(jù)傳輸。

pipe用于相關(guān)進(jìn)程之間的通信,例如父進(jìn)程和子進(jìn)程,它通過pipe()系統(tǒng)調(diào)用來創(chuàng)建并打開,當(dāng)最后一個使用它的進(jìn)程關(guān)閉對他的引用時,pipe將自動撤銷。

FIFO即命名管道,在磁盤上有對應(yīng)的節(jié)點,但沒有數(shù)據(jù)塊——換言之,只是擁有一個名字和相應(yīng)的訪問權(quán)限,通過mknode()系統(tǒng)調(diào)用或者mkfifo()函數(shù)來建立的。一旦建立,任何進(jìn)程都可以通過文件名將其打開和進(jìn)行讀寫,而不局限于父子進(jìn)程,當(dāng)然前提是進(jìn)程對FIFO有適當(dāng)?shù)脑L問權(quán)。當(dāng)不再被進(jìn)程使用時,F(xiàn)IFO在內(nèi)存中釋放,但磁盤節(jié)點仍然存在。

管道的實質(zhì)是一個內(nèi)核緩沖區(qū),進(jìn)程以先進(jìn)先出的方式從緩沖區(qū)存取數(shù)據(jù):管道一端的進(jìn)程順序地將進(jìn)程數(shù)據(jù)寫入緩沖區(qū),另一端的進(jìn)程則順序地讀取數(shù)據(jù),該緩沖區(qū)可以看做一個循環(huán)隊列,讀和寫的位置都是自動增加的,一個數(shù)據(jù)只能被讀一次,讀出以后再緩沖區(qū)都不復(fù)存在了。當(dāng)緩沖區(qū)讀空或者寫滿時,有一定的規(guī)則控制相應(yīng)的讀進(jìn)程或?qū)戇M(jìn)程是否進(jìn)入等待隊列,當(dāng)空的緩沖區(qū)有新數(shù)據(jù)寫入或慢的緩沖區(qū)有數(shù)據(jù)讀出時,就喚醒等待隊列中的進(jìn)程繼續(xù)讀寫。

3.2 無名管道

pipe的例子:父進(jìn)程創(chuàng)建管道,并在管道中寫入數(shù)據(jù),而子進(jìn)程從管道讀出數(shù)據(jù)

3.3 命名管道

和無名管道的主要區(qū)別在于,命名管道有一個名字,命名管道的名字對應(yīng)于一個磁盤索引節(jié)點,有了這個文件名,任何進(jìn)程有相應(yīng)的權(quán)限都可以對它進(jìn)行訪問。

而無名管道卻不同,進(jìn)程只能訪問自己或祖先創(chuàng)建的管道,而不能訪任意訪問已經(jīng)存在的管道——因為沒有名字。

Linux中通過系統(tǒng)調(diào)用mknod()或makefifo()來創(chuàng)建一個命名管道。最簡單的方式是通過直接使用shellmkfifo myfifo

等價于mknod myfifo p

以上命令在當(dāng)前目錄下創(chuàng)建了一個名為myfifo的命名管道。用ls -p命令查看文件的類型時,可以看到命名管道對應(yīng)的文件名后有一條豎線"|",表示該文件不是普通文件而是命名管道。

使用open()函數(shù)通過文件名可以打開已經(jīng)創(chuàng)建的命名管道,而無名管道不能由open來打開。當(dāng)一個命名管道不再被任何進(jìn)程打開時,它沒有消失,還可以再次被打開,就像打開一個磁盤文件一樣。

可以用刪除普通文件的方法將其刪除,實際刪除的事磁盤上對應(yīng)的節(jié)點信息。

例子:用命名管道實現(xiàn)聊天程序,一個張三端,一個李四端。兩個程序都建立兩個命名管道,fifo1,fifo2,張三寫fifo1,李四讀fifo1;李四寫fifo2,張三讀fifo2。

用select把,管道描述符和stdin假如集合,用select進(jìn)行阻塞,如果有i/o的時候喚醒進(jìn)程。(粉紅色部分為select部分,黃色部分為命名管道部分)

3.4 消息隊列

消息隊列,就是一個消息的鏈表,是一系列保存在內(nèi)核中消息的列表。用戶進(jìn)程可以向消息隊列添加消息,也可以向消息隊列讀取消息。

消息隊列與管道通信相比,其優(yōu)勢是對每個消息指定特定的消息類型,接收的時候不需要按照隊列次序,而是可以根據(jù)自定義條件接收特定類型的消息。

可以把消息看做一個記錄,具有特定的格式以及特定的優(yōu)先級。對消息隊列有寫權(quán)限的進(jìn)程可以向消息隊列中按照一定的規(guī)則添加新消息,對消息隊列有讀權(quán)限的進(jìn)程可以從消息隊列中讀取消息。

消息隊列的常用函數(shù)如下表:

進(jìn)程間通過消息隊列通信,主要是:創(chuàng)建或打開消息隊列,添加消息,讀取消息和控制消息隊列。

3.5 共享內(nèi)存

共享內(nèi)存允許兩個或多個進(jìn)程共享一個給定的存儲區(qū),這一段存儲區(qū)可以被兩個或兩個以上的進(jìn)程映射至自身的地址空間中,一個進(jìn)程寫入共享內(nèi)存的信息,可以被其他使用這個共享內(nèi)存的進(jìn)程,通過一個簡單的內(nèi)存讀取錯做讀出,從而實現(xiàn)了進(jìn)程間的通信。

采用共享內(nèi)存進(jìn)行通信的一個主要好處是效率高,因為進(jìn)程可以直接讀寫內(nèi)存,而不需要任何數(shù)據(jù)的拷貝,對于像管道和消息隊里等通信方式,則需要再內(nèi)核和用戶空間進(jìn)行四次的數(shù)據(jù)拷貝,而共享內(nèi)存則只拷貝兩次:一次從輸入文件到共享內(nèi)存區(qū),另一次從共享內(nèi)存到輸出文件。

一般而言,進(jìn)程之間在共享內(nèi)存時,并不總是讀寫少量數(shù)據(jù)后就解除映射,有新的通信時在重新建立共享內(nèi)存區(qū)域;而是保持共享區(qū)域,直到通信完畢為止,這樣,數(shù)據(jù)內(nèi)容一直保存在共享內(nèi)存中,并沒有寫回文件。共享內(nèi)存中的內(nèi)容往往是在解除映射時才寫回文件,因此,采用共享內(nèi)存的通信方式效率非常高。

共享內(nèi)存有兩種實現(xiàn)方式:1、內(nèi)存映射 2、共享內(nèi)存機(jī)制

3.6 信號量

信號量(semaphore)與已經(jīng)介紹過的 IPC 結(jié)構(gòu)不同,它是一個計數(shù)器。信號量用于實現(xiàn)進(jìn)程間的互斥與同步,而不是用于存儲進(jìn)程間通信數(shù)據(jù)。

1、特點

信號量用于進(jìn)程間同步,若要在進(jìn)程間傳遞數(shù)據(jù)需要結(jié)合共享內(nèi)存。

信號量基于操作系統(tǒng)的 PV 操作,程序?qū)π盘柫康牟僮鞫际窃硬僮鳌?/p>

每次對信號量的 PV 操作不僅限于對信號量值加 1 或減 1,而且可以加減任意正整數(shù)。

支持信號量組。

2、原型

最簡單的信號量是只能取 0 和 1 的變量,這也是信號量最常見的一種形式,叫做二值信號量(Binary Semaphore)。而可以取多個正整數(shù)的信號量被稱為通用信號量。

Linux 下的信號量函數(shù)都是在通用的信號量數(shù)組上進(jìn)行操作,而不是在一個單一的二值信號量上進(jìn)行操作。#include // 創(chuàng)建或獲取一個信號量組:若成功返回信號量集ID,失敗返回-1 int semget(key_t key, int num_sems, int sem_flags); // 對信號量組進(jìn)行操作,改變信號量的值:成功返回0,失敗返回-1 int semop(int semid, struct sembuf semoparray[], size_t numops);   // 控制信號量的相關(guān)信息 int semctl(int semid, int sem_num, int cmd, ...);

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
linux進(jìn)程間通訊的幾種方式的特點和優(yōu)缺點,和適用場合。
Linux的進(jìn)程通信(IPC)
高性能服務(wù)器設(shè)計——模塊間通信
消息隊列和管道的區(qū)別(轉(zhuǎn)載)
linux基礎(chǔ)——linux進(jìn)程間通信(IPC)機(jī)制總結(jié)
java中進(jìn)程間幾種通信方式
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服