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

歡迎訪問 生活随笔!

生活随笔

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

linux

(王道408考研操作系统)第二章进程管理-第一节4:进程通信(配合Linux)

發(fā)布時(shí)間:2025/3/15 linux 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (王道408考研操作系统)第二章进程管理-第一节4:进程通信(配合Linux) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 一:什么是進(jìn)程通信
  • 二:如何實(shí)現(xiàn)進(jìn)程間通信及其分類
  • 三:通信方式1-共享存儲(chǔ)(共享內(nèi)存)
    • (1)課本基礎(chǔ)內(nèi)容
    • (2)補(bǔ)充-Linux中的進(jìn)程通信
  • 四:通信方式2-管道
    • (1)管道是什么
    • (2)匿名管道
      • A:讀端和寫端
      • B:建立匿名管道的函數(shù)
      • C:最簡(jiǎn)單的進(jìn)程間通信-演示
      • D:管道四大特性
      • E:管道的特點(diǎn)
      • F:從內(nèi)核角度理解管道
      • G:管道總結(jié)
    • (3)命名管道
      • A:命名管道和匿名管道的區(qū)別
      • B:如何創(chuàng)建命名管道
      • C:演示-管道實(shí)現(xiàn)服務(wù)端和客戶端的通信
  • 五:通信方式3-消息隊(duì)列

一:什么是進(jìn)程通信

“微信想要獲取手機(jī)存儲(chǔ)權(quán)限”這就是一個(gè)典型的進(jìn)程通信的例子,進(jìn)程是操作系統(tǒng)分配資源的最基本單位,每個(gè)進(jìn)程擁有各自獨(dú)立的地址空間,在正常情況下,它們是互不干擾的,體現(xiàn)了進(jìn)程的獨(dú)立性

那么獨(dú)立性體現(xiàn)的是數(shù)據(jù)的互不干擾,而通信體現(xiàn)的卻是數(shù)據(jù)的交互,這兩點(diǎn)看起來豈不是“矛盾”的嗎?但是實(shí)則不然,我們所說的獨(dú)立并不是完全獨(dú)立,進(jìn)程與進(jìn)程之間也會(huì)產(chǎn)生協(xié)作關(guān)系,這種協(xié)作是需要通過通信來完成的

進(jìn)程間實(shí)現(xiàn)通信的目的無外乎以下幾種

  • 數(shù)據(jù)傳輸:一個(gè)進(jìn)程需要將它的數(shù)據(jù)發(fā)送給另外一個(gè)進(jìn)程
  • 資源共享:多個(gè)進(jìn)程之間共享資源
  • 通知事件:一個(gè)進(jìn)程需要向另一個(gè)或另一組進(jìn)程發(fā)送消息,通知發(fā)生了什么事件
  • 進(jìn)程控制:有些進(jìn)程希望控制另一些進(jìn)程,比如說調(diào)試功能

二:如何實(shí)現(xiàn)進(jìn)程間通信及其分類

先不要管這樣那樣的分類方式,想要實(shí)現(xiàn)進(jìn)程間通信,其核心思想就是:用盡一切辦法讓他們看見同一份內(nèi)存空間

至于這個(gè)內(nèi)存空間是由誰提供的,或者是以什么方式提供的就決定了進(jìn)程間通信的方式。如果操作系統(tǒng)以文件的方式提供的,就叫做管道;如果操作系統(tǒng)避開文件層,直接從內(nèi)核構(gòu)建通信,就是System V IPC

1:管道

  • 匿名管道pipe
  • 命名管道

2:System V IPC

  • System V消息隊(duì)列
  • System V共享內(nèi)存
  • System V信號(hào)量

3:POSIX IPC

  • 消息隊(duì)列
  • 共享內(nèi)存
  • 信號(hào)量
  • 互斥量
  • 條件變量

三:通信方式1-共享存儲(chǔ)(共享內(nèi)存)

(1)課本基礎(chǔ)內(nèi)容

前面在進(jìn)程地址空間的時(shí)候,我們知道了每個(gè)進(jìn)程看到的都是虛擬內(nèi)存,頁表則負(fù)責(zé)將虛擬內(nèi)存映射到真實(shí)的物理內(nèi)存處

既然頁表是負(fù)責(zé)映射的,那么是否可以在物理內(nèi)存上開辟一片空間,然后通過頁表讓他們都映射到一片內(nèi)存空間,這樣就符合“看到同一片內(nèi)存空間”的規(guī)則呢?

答案是可以的。這樣的話,兩個(gè)進(jìn)程在進(jìn)行讀寫時(shí)實(shí)際操縱的是同一片內(nèi)存,進(jìn)程1的讀寫操作就可以讓進(jìn)程2看到了

課本中所說的基于存儲(chǔ)區(qū)的共享,其中區(qū)域就在堆區(qū)和棧區(qū)的中間,這里可以處理通信,也可以存放我們常常聽到過的動(dòng)態(tài)庫等內(nèi)容

(2)補(bǔ)充-Linux中的進(jìn)程通信

不管是管道,還是共享內(nèi)存,進(jìn)程間通信的本質(zhì)就是讓他們看見相同的內(nèi)存資源。大家需要明白的一點(diǎn)是,進(jìn)程間通信不是嘴上說說那么簡(jiǎn)單,想要實(shí)現(xiàn)兩個(gè)進(jìn)程看見同一份內(nèi)存資源,以及看見資源后如何寫入,讀取,同時(shí)對(duì)于這份內(nèi)存如何把不同進(jìn)程關(guān)聯(lián)上去,如何保證關(guān)聯(lián)的穩(wěn)定等等 ,這都是需要去管理的,況且操作系統(tǒng)會(huì)存在大量的進(jìn)程通信,所以對(duì)于操作系統(tǒng),想要管理好進(jìn)程間通信,一定是先組織,再描述,也就是底層會(huì)存在大量與此相關(guān)的數(shù)據(jù)結(jié)構(gòu)

正如描述進(jìn)程時(shí)的task_strct,描述文件時(shí)的file struct,描述進(jìn)程間通信的結(jié)構(gòu)體則是shmid_ds

剩余內(nèi)容篇幅較長(zhǎng),如有興趣可以移步Linux系統(tǒng)編程28:進(jìn)程間通信之共享內(nèi)存和相關(guān)通信接口(ftok,shmget,shmctl,shmat,shmdt)

四:通信方式2-管道

(1)管道是什么

管道是UNIX中一種古老的通信方式,管道本質(zhì)其實(shí)是一個(gè)文件

如上,命令行who的標(biāo)準(zhǔn)輸出原本是屏幕,但是卻輸出到了管道文件中,發(fā)生了重定向,然后wc命令再從以管道文件作為標(biāo)準(zhǔn)輸入,然后輸出到屏幕中
其中who | wc -l這種屬于匿名管道

(2)匿名管道

A:讀端和寫端

從who | wc -l可以看出,who作為一個(gè)進(jìn)程是把內(nèi)容寫入管道文件,使用的是管道的寫端,wc從管道中讀入數(shù)據(jù),使用的是管道的讀端
所以兩個(gè)進(jìn)程利用管道通信時(shí),一個(gè)進(jìn)程要使用管道的寫端寫入數(shù)據(jù),另一個(gè)進(jìn)程則要使用管道的讀端讀入數(shù)據(jù),所以管道文件就要用兩個(gè)文件描述符進(jìn)行控制,一個(gè)控制讀端,一個(gè)控制寫端

所以下面是父進(jìn)程創(chuàng)建了管道

接著父進(jìn)程創(chuàng)建子進(jìn)程

可以發(fā)現(xiàn)此時(shí)父子進(jìn)程可以同時(shí)對(duì)管道進(jìn)行寫入的和讀取,但是管道只能一端寫入一端讀入,所以要進(jìn)行調(diào)整

B:建立匿名管道的函數(shù)

pipe函數(shù)用于建立匿名管道,其頭文件是unistd.h
其函數(shù)原型為int pipe(int fd[2]),其中fd是一個(gè)有兩個(gè)元素fd[0],fd[1]的數(shù)組,傳入函數(shù)pipe后在其內(nèi)部分別以讀寫的方式打開管道文件,默認(rèn)情況下,fd[0]和fd[1]會(huì)分別獲得文件描述符,其中fd[0]表示讀端,fd[1]表示寫端

模擬實(shí)現(xiàn)一下pipe函數(shù)可能就是下面這樣的

有很多同學(xué)在這里會(huì)感到疑惑,因?yàn)橛糜谶M(jìn)程間通信的管道文件就只有一個(gè),為什么會(huì)有兩個(gè)文件描述符呢?(默認(rèn)是3和4)

其實(shí)這一點(diǎn)在之前的基礎(chǔ)IO中我沒有表示特別清楚,以讀方式的打開一個(gè)文件,會(huì)分配一個(gè)描述符(假設(shè)是3),然后再以寫方式打開剛才的你文件也會(huì)分配一個(gè)描述符(假設(shè)是4),這里的3和4操作的是一個(gè)文件,只不過一個(gè)負(fù)責(zé)讀,一個(gè)負(fù)責(zé)寫
比如下面這個(gè)例子就可以說明這個(gè)情況

C:最簡(jiǎn)單的進(jìn)程間通信-演示

這里我們可以根據(jù)上面讀端和寫端的那個(gè)流程,首先調(diào)用pipe函數(shù),接著創(chuàng)建子進(jìn)程

現(xiàn)在的場(chǎng)景就是這樣
接著,我們讓子進(jìn)程寫入數(shù)據(jù)到管道,父進(jìn)程從管道讀取數(shù)據(jù)。于是關(guān)閉子進(jìn)程的讀端也即是fd[0],關(guān)閉父進(jìn)程的寫端也就是fd[1]

還有一點(diǎn)十分重要:文件描述符數(shù)組(pipefd)是創(chuàng)建子進(jìn)程之前就有的,而且調(diào)用pipe函數(shù)之后,數(shù)組內(nèi)容就沒有改變過,所以不發(fā)生寫時(shí)拷貝,所以數(shù)組是父子進(jìn)程共有的。但是files struct是父子進(jìn)程各自擁有的,對(duì)子進(jìn)程來說close(fd[0]),就相當(dāng)于抹殺了子進(jìn)程對(duì)該文件的讀權(quán)限

為了觀察方便,對(duì)父子進(jìn)程都是用死循環(huán)。子進(jìn)程每隔一秒讀入一段信息this is the data that the child process wrote用來證明子進(jìn)程寫入了數(shù)據(jù);對(duì)于父進(jìn)程則取讀取數(shù)據(jù),一旦讀完數(shù)據(jù),就輸出the father process got the information,用來證明父進(jìn)程讀取到了數(shù)據(jù)

#include <fcntl.h> #include <unistd.h> #include <stdio.h> #include <string.h>int main() {int pipefd[2]={0};pipe(pipefd);pid_t id=fork();if(id==0)//child{close(pipefd[0]);const char* msg="This is the data that the child process wrote";while(1){write(pipefd[1],msg,strlen(msg));sleep(1);} }else//father{close(pipefd[1]);char buffer[64];while(1){ssize_t ret=read(pipefd[0],buffer,sizeof(buffer)-1);if(ret>0)//判斷是否讀到{buffer[ret]='\0';//加上結(jié)束標(biāo)志,便于輸出printf("The father process got the information:%s\n",buffer);}}}return 0; }

效果如下,這樣就完成了一個(gè)最簡(jiǎn)單的進(jìn)程間通信

D:管道四大特性

特性一:如果寫端(這里是子進(jìn)程)不關(guān)閉文件描述符,且不寫入(簡(jiǎn)稱為讀端條件不就緒),那么讀端可能會(huì)長(zhǎng)時(shí)間阻塞(當(dāng)管道有歷史數(shù)據(jù)時(shí)會(huì)先讀完,管道為空,且寫端不寫入會(huì)長(zhǎng)時(shí)間堵塞),也就是讀端快,寫端慢

比如,將上面例子中,子進(jìn)程的睡眠由1秒提升至5秒,就會(huì)發(fā)現(xiàn)雖然父進(jìn)程在死循環(huán)且沒有睡眠的情況下,也會(huì)和子進(jìn)程同步

特性二:當(dāng)寫端在寫入時(shí),寫端條件不就緒(比如管道已經(jīng)滿了),寫端就要被阻塞,也就是寫端快,讀端慢

比如,修改上面的例子如下,在子進(jìn)程中使用cout查看子進(jìn)程寫入管道的次數(shù),然后父進(jìn)程每隔1s讀取一次

#include <fcntl.h> #include <unistd.h> #include <stdio.h> #include <string.h>int main() {int pipefd[2]={0};pipe(pipefd);pid_t id=fork();if(id==0)//child{close(pipefd[0]);const char* msg="This is the data that the child process wrote";int cout=0;//統(tǒng)計(jì)次數(shù)while(1){write(pipefd[1],msg,strlen(msg));printf("The number of times the child process writes:%d\n",cout++);}}else//father{close(pipefd[1]);char buffer[64];while(1){ssize_t ret=read(pipefd[0],buffer,sizeof(buffer)-1);if(ret>0){buffer[ret]='\0';printf("The father process got the information:%s\n",buffer);sleep(1);}}}return 0; }

效果如下,寫端瞬間將管道充滿,然后讀端慢慢的從管道中讀數(shù)據(jù)

特性三:如果寫端關(guān)閉文件描述符,那么讀端當(dāng)讀完管道內(nèi)容后,或讀到文件結(jié)尾(此時(shí)read的返回值是0)

如下,當(dāng)子進(jìn)程讀入上次后,關(guān)閉子進(jìn)程的寫端,跳出循環(huán)退出子進(jìn)程,父進(jìn)程仍舊每秒從管道中讀取數(shù)據(jù)一次,并且輸出read接口的返回值

#include <fcntl.h> #include <unistd.h> #include <stdio.h> #include <string.h> #include <stdlib.h>int main() {int pipefd[2]={0};pipe(pipefd);pid_t id=fork();if(id==0)//child{close(pipefd[0]);const char* msg="This is the data that the child process wrote";int cout=0;while(1){write(pipefd[1],msg,strlen(msg));printf("The number of times the child process writes:%d\n",cout++);if(cout==10){close(pipefd[1]);//讀10次后關(guān)閉寫端break;}}exit(2);}else//father{close(pipefd[1]);char buffer[64];while(1){ssize_t ret=read(pipefd[0],buffer,sizeof(buffer)-1);if(ret>0){buffer[ret]='\0';printf("The father process got the information:%s\n",buffer);sleep(1);}printf("the father process read the end of file which the return value of 'read' is %ld\n",ret);//read接口的返回值}}return 0; }


刷屏太快,將其重定向到文件中。

對(duì)比特性一,特性一中是寫端不關(guān)閉文件描述符還寫的特別慢,因此讀端也被牽制住,造成讀端堵塞。而當(dāng)寫端文件描述符關(guān)閉之后,這個(gè)管道文件唯一的輸入來源就切斷了,因此如果不給其結(jié)束標(biāo)記,那么就會(huì)造成讀端永久阻塞

特性四:如果讀端關(guān)閉文件描述符,那么寫端有可能被操作系統(tǒng)結(jié)束掉

如下,讓子進(jìn)程不斷寫入數(shù)據(jù),讓父進(jìn)程讀取5次數(shù)據(jù)后,就關(guān)閉讀端,使用如下腳本觀察進(jìn)程

while :; do ps axj | grep test.exe | grep -v grep; echo "#######################";sleep 1;done #include <fcntl.h> #include <unistd.h> #include <stdio.h> #include <string.h> #include <stdlib.h>int main() {int pipefd[2]={0};pipe(pipefd);pid_t id=fork();if(id==0)//child{close(pipefd[0]);const char* msg="This is the data that the child process wrote";int cout=0;while(1){write(pipefd[1],msg,strlen(msg));printf("The number of times the child process writes:%d\n",cout++);} }else//father{close(pipefd[1]);char buffer[64];int cout=0;while(1){ssize_t ret=read(pipefd[0],buffer,sizeof(buffer)-1);if(ret>0){buffer[ret]='\0';printf("The father process got the information:%s\n",buffer);sleep(1);cout++;}if(cout==5){close(pipefd[0]);//讀5次后就關(guān)閉讀端}}}return 0; }

可以很明顯當(dāng)父進(jìn)程讀5次后,子進(jìn)程退出,變?yōu)榱私┦瑺顟B(tài)

當(dāng)讀端關(guān)閉之后,就沒有進(jìn)程讀取數(shù)據(jù)了,那么寫入的操作就變成了一種無用操作,所以操作系統(tǒng)發(fā)現(xiàn)了這種浪費(fèi)資源的行為后,就發(fā)送了13號(hào)信號(hào),結(jié)束了子進(jìn)程

根據(jù)前面的進(jìn)程等待的知識(shí),我們也可以獲取退出信號(hào),正是SIGPIPE

E:管道的特點(diǎn)

  • 只能用于具有共同祖先的進(jìn)程(具有親緣關(guān)系的進(jìn)程)之間進(jìn)行通信。通常,一個(gè)管道由一個(gè)進(jìn)程創(chuàng)建,然后該進(jìn)程調(diào)用fork,此后父子進(jìn)程之間就可使用該管道
  • 管道提供流式服務(wù)。所謂流式服務(wù)就是讀端在讀取時(shí)可以任意讀取,想讀多少就讀多少,就像水龍頭一樣,你想開多大完全取決于你
  • 一般而言,進(jìn)程退出,管道釋放,所以管道的生命周期跟隨進(jìn)程
  • 由特性1,2可知,管道之間具有同步和互斥的機(jī)制
  • 管道是半雙工的,數(shù)據(jù)只能向一個(gè)方向流動(dòng)
  • F:從內(nèi)核角度理解管道

    Linux下一切皆文件

    如下便是進(jìn)程打開的文件的file結(jié)構(gòu)體,其中有一個(gè)結(jié)構(gòu)體path

    跳轉(zhuǎn)過去,其中的dentry表示該file所在的目錄結(jié)構(gòu)體

    跳轉(zhuǎn)過去,當(dāng)找到其所在的目錄后,其結(jié)構(gòu)體內(nèi)就存儲(chǔ)了目錄的inode

    根據(jù)目錄的inode可以找到目錄的數(shù)據(jù)塊,而之前說過目錄中存儲(chǔ)的就是文件名和inodei·映射關(guān)系,于是就可找到該文件file的inode,如下

    而inode中有一個(gè)union,它是迎來標(biāo)識(shí)文件類型的,可以發(fā)現(xiàn)第一個(gè)便是管道文件

    G:管道總結(jié)

    至此我們便可以從更深的層次中理解管道的本質(zhì)。sleep 1000 | sleep 2000,分別是兩個(gè)進(jìn)程,它們的父進(jìn)程均是bash,所以bash創(chuàng)建了管道,然后關(guān)閉了它對(duì)管道的通信,這兩個(gè)sleep命令則利用管道進(jìn)行通信

    who | wc -l,bash創(chuàng)建了管道,who和wc利用管道通信,who發(fā)生輸出了重定向,將輸出重定向的管道文件中,wc發(fā)生了輸入重定向,將輸入來源從鍵盤更改為管道文件,Linux一切皆文件,這就管道的本質(zhì)

    (3)命名管道

    A:命名管道和匿名管道的區(qū)別

    前面說過,匿名管道的限制就是只能在具有共同祖先(具有親緣關(guān)系)的進(jìn)程間通信,而不適合與毫無相干的兩個(gè)進(jìn)程

    如果我們想在兩個(gè)不相干的進(jìn)程之間進(jìn)行通信,可以使用FIFO文件完成,也被稱為命名管道,命名管道實(shí)際是一種類型為“p”的文件

    B:如何創(chuàng)建命名管道

    匿名管道由pipe函數(shù)創(chuàng)建并打開,命名管道則有mkfifo函數(shù)創(chuàng)建
    命名管道可以從命令行上創(chuàng)建

    mkfifo filename

    也可以從程序中創(chuàng)建,其函數(shù)原型為

    int mkfifo(const char* filename,modet_t mode); //filename是創(chuàng)建管道文件的路徑+文件名 //mode是權(quán)限值

    C:演示-管道實(shí)現(xiàn)服務(wù)端和客戶端的通信

    如下我將虛擬機(jī)中的centos系統(tǒng)作為服務(wù)端,在其上創(chuàng)建一個(gè)文件叫做server.c,服務(wù)端用來讀取數(shù)據(jù)。
    在Windows中,以Windows作為客戶端,客戶端用來寫入數(shù)據(jù),利用xshell遠(yuǎn)程登錄主機(jī),然后創(chuàng)建一個(gè)文件client.c。這就像xshell是QQ窗口,我像Linux主機(jī),也就是騰訊服務(wù)器發(fā)送消息,然后服務(wù)端回傳回來。雖然不是特別準(zhǔn)確,但是足以說明命名管道在·的作用

    Makefile如下

    .PHONY:all all:client.exe server.exe client.exe:client.cgcc -o $@ $^ server.exe:server.cgcc -o $@ $^.PHONY:clean clean:rm client.exe server.exe fifo


    首先編寫服務(wù)端代碼,服務(wù)端中利用mkfifo創(chuàng)建管道文件,然后打開這個(gè)管道文件,不斷讀取數(shù)據(jù)

    #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>int main() {umask(0);//屏蔽命令行umask干擾if(mkfifo("./fifo",0666)==-1)//如果mkfifo返回值是-1,創(chuàng)建失敗{perror("打開失敗");return 1;}int fd=open("fifo",O_RDONLY);//服務(wù)端以只讀的方式打開管道文件if(fd>=0){char buffer[64];while(1){printf("客戶端正在接受消息\n");printf("############################\n");ssize_t ret=read(fd,buffer,sizeof(buffer)-1);if(ret>0){buffer[ret]='\0';printf("服務(wù)端接受到客戶端消息:%s\n",buffer);}else if(ret==0)//如果客戶端退出,將會(huì)讀到文件結(jié)束,所以服務(wù)端也要退出{printf("客戶端已經(jīng)下線,服務(wù)端下線\n");break;}else {perror("讀取失敗\n");break;}}} }

    在客戶端則直接打開管道文件,然后寫入數(shù)據(jù)

    #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>int main() {int fd=open("fifo",O_WRONLY);//直接打開管道文件if(fd>=0){ char buffer[64];//從鍵盤讀入數(shù)據(jù)到這個(gè)緩沖區(qū)while(1){ printf("客戶端-請(qǐng)輸入消息:");ssize_t ret=read(0,buffer,sizeof(buffer)-1);//從鍵盤讀入數(shù)據(jù)if(ret>0){ buffer[ret]='\0';write(fd,buffer,ret);//讀入ret個(gè)數(shù)據(jù)就向管道中寫入ret個(gè)數(shù)據(jù)}}} }

    現(xiàn)在,在虛擬機(jī)中運(yùn)行服務(wù)端,然后在xshell中運(yùn)行客戶端,然后客戶端輸入數(shù)據(jù),服務(wù)端就會(huì)接受到,客戶端下線,服務(wù)端也會(huì)下線

    這里還有一個(gè)非常有趣的點(diǎn):那個(gè)fifo文件是0個(gè)字節(jié),自始至終它都是一個(gè)字節(jié)

    這表明它們之間通信時(shí),并沒有直接在這個(gè)文件上進(jìn)行IO操作,因?yàn)槿绻M(jìn)行IO操作其實(shí)代價(jià)就太大了。這里的fifo其實(shí)僅僅起到了一種標(biāo)志的作用,它的底層其實(shí)和匿名管道是差不多的

    上面演示的是調(diào)用系統(tǒng)調(diào)用接口mkfifo進(jìn)行操作,而mkfifo其實(shí)也是一個(gè)命令,也就是直接可以創(chuàng)建管道完成通信

    然后在客戶端輸入一段腳本,將一段文字不斷輸入到管道中,接著在服務(wù)端不斷讀取

    while :; do echo "this is client";sleep 1;done > pipe

    五:通信方式3-消息隊(duì)列

    在消息傳遞系統(tǒng)中,進(jìn)程的數(shù)據(jù)交換是以格式化的**信息(Message)**為單位的。最典型的例子就是計(jì)網(wǎng)中的報(bào)文,如TCP/IP報(bào)文

    進(jìn)程通過系統(tǒng)提供的發(fā)送消息接受消息兩個(gè)原語進(jìn)行數(shù)據(jù)交換

  • 直接通信方式:發(fā)送進(jìn)程直接把消息發(fā)送給接受進(jìn)程,并將它掛在接受進(jìn)程的消息緩沖隊(duì)列中,接受進(jìn)程從消息緩沖隊(duì)列中取得消息
  • 間接通信方式:發(fā)送進(jìn)程把消息送到某個(gè)中間實(shí)體,接受進(jìn)程從中間實(shí)體取得信息,稱之為信箱,因此又叫做信箱通信方式。
  • 總結(jié)

    以上是生活随笔為你收集整理的(王道408考研操作系统)第二章进程管理-第一节4:进程通信(配合Linux)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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