版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
進(jìn)程通信1.進(jìn)程通信類型共享存儲(chǔ)器系統(tǒng)通信管道通信消息傳遞系統(tǒng)通信客戶-服務(wù)器系統(tǒng)通信2.消息緩沖隊(duì)列通信機(jī)制3.Linux進(jìn)程通信相關(guān)系統(tǒng)調(diào)用3.6進(jìn)程通信3.6.1進(jìn)程通信類型1.分析說明共享存儲(chǔ)器系統(tǒng)通信的基本概念及性能特點(diǎn)2.說明消息傳遞系統(tǒng)通信基本概念(1)直接通信概念及類型(2)間接通信概念3.說明管道通信概念(1)無名管道概念(2)有名管道概念4.客戶/服務(wù)器系統(tǒng)通信(自學(xué))(1)socket概念及通信流程(2)遠(yuǎn)程過程調(diào)用概念及流程3.6進(jìn)程通信3.6.1進(jìn)程通信類型1.共享存儲(chǔ)器系統(tǒng)通信通過共享存儲(chǔ)分區(qū)實(shí)現(xiàn)進(jìn)程之間的信息交換通信過程:
(1)申請(qǐng)共享存儲(chǔ)分區(qū);(2)將共享存儲(chǔ)分區(qū)映射到本進(jìn)程地址空間中;(3)進(jìn)行數(shù)據(jù)讀寫;(4)解除共享存儲(chǔ)分區(qū)映射;(5)刪除共享存儲(chǔ)分區(qū):內(nèi)核共享存儲(chǔ)區(qū)共享存儲(chǔ)分區(qū)進(jìn)程1地址空間共享內(nèi)存映射區(qū)進(jìn)程2地址空間共享內(nèi)存映射區(qū)共享存儲(chǔ)器系統(tǒng)通信方式的特點(diǎn):
(1)最大的特點(diǎn)是沒有中間環(huán)節(jié),通信直接快速(2)該通信機(jī)制沒有提供進(jìn)程同步機(jī)制。舉例:#include<stdio.h>#include<sys/types.h>#include<sys/msg.h>#include<sys/ipc.h>#include<unistd.h>#defineSHMKEY75intshmid,i;int*addr;voidCLIENT()發(fā)送進(jìn)程{inti;shmid=shmget(SHMKEY,1024,0777);addr=shmat(shmid,0,0);for(i=9;i>=0;i--){ while(*addr!=-1);//是否已讀取 printf("(client)sent"); *addr=i; printf("%d\n",*addr); sleep(1);}}voidSERVER()接收進(jìn)程{shmid=shmget(SHMKEY,1024,0777|IPC_CREAT);addr=shmat(shmid,0,0);//附接到用戶的虛地址空間do{ *addr=-1; while(*addr==-1);//client是否已經(jīng)寫入 printf("(server)received%d\n",*addr); sleep(1);}while(*addr);
shmctl(shmid,IPC_RMID,0);}main(){intp1,p2;p1=fork();if(p1==0) SERVER();else{p2=fork(); if(p2==0)CLIENT();}wait(0);wait(0);}進(jìn)程間的數(shù)據(jù)交換是以消息(或報(bào)文)為單位。在消息通信中,接收方和發(fā)送方之間有明確的協(xié)議和消息格式。
消息格式:消息頭消息正文消息頭:存放消息傳輸時(shí)所需的控制信息。3.6進(jìn)程通信3.6.1進(jìn)程通信類型2.消息傳遞系統(tǒng)通信你會(huì)在消息頭中設(shè)置哪些內(nèi)容?2.消息傳遞系統(tǒng)通信
消息傳遞系統(tǒng)實(shí)現(xiàn)類型:3.6.1進(jìn)程通信類型
直接通信:send(),receive()
直接通信同步關(guān)系阻塞發(fā)送,阻塞接收無阻塞發(fā)送,無阻塞接收無阻塞發(fā)送,阻塞接收2.消息傳遞系統(tǒng)通信
消息傳遞系統(tǒng)實(shí)現(xiàn)類型
間接通信:
通信雙方利用一個(gè)共享的稱為信箱的中間實(shí)體實(shí)現(xiàn)信息交換。發(fā)送進(jìn)程A信箱頭
…信箱體接收進(jìn)程Bsend(m)receive(m)郵箱通信結(jié)構(gòu)信箱頭:信箱名、信箱大小、創(chuàng)建者、存取信件指針、信件數(shù)量等信箱體:存放消息信箱信箱創(chuàng)建者私用信箱:用戶進(jìn)程公用信箱:操作系統(tǒng)共享信箱:用戶進(jìn)程
管道通信概念:管道:用于連接一個(gè)發(fā)送進(jìn)程和一個(gè)接收進(jìn)程,以實(shí)現(xiàn)它們之間通信的共享文件(pipe文件,又稱為FIFO文件)FIFO文件的寫入和讀出:嚴(yán)格遵循先進(jìn)先出,不支持文件定位操作。進(jìn)程2讀出進(jìn)程1寫入3.6進(jìn)程通信3.6.1進(jìn)程通信類型3.管道(pipe)通信fd[1]fd[0](1)無名管道:intpipe(intfd[2])
fd[1]為寫入端,fd[0]為讀出端。用于父子或兄弟進(jìn)程間通信(2)有名管道:
intmkfifo(constchar*pathname,mode_tmode)用于任意進(jìn)程間通信(又稱FIFO通信)
兩種實(shí)現(xiàn)機(jī)制:寫端讀端fd[1]fd[0]write(fd[1],buf,size)read(fd[0],buf,size)pipe(fd)3.6進(jìn)程通信3.6.1進(jìn)程通信類型3.管道(pipe)通信
管道通信應(yīng)注意的問題:寫端讀端fd[1]fd[0]write(fd[1],buf,size)read(fd[0],buf,size)pipe(fd)
對(duì)管道的讀寫操作必須互斥進(jìn)行
對(duì)管道的讀寫操作必須同步進(jìn)行通信雙方必須同時(shí)存在:有名管道管道常用于單向通信3.6進(jìn)程通信3.6.1進(jìn)程通信類型3.管道(pipe)通信編寫一程序,建立一個(gè)管道。同時(shí),父進(jìn)程生成了進(jìn)程P1和P2,這兩個(gè)子進(jìn)程分別向管道中寫入各自的字符串,父進(jìn)程讀出它們。fd[1]fd[0]pipe(fd)子進(jìn)程P1父進(jìn)程子進(jìn)程P2
無名管道應(yīng)用舉例:3.6進(jìn)程通信3.6.1進(jìn)程通信類型3.管道(pipe)通信#include<stdio.h>#include<unistd.h>main(){
inti,r,p1,p2,fd[2];
charbuf[50],s[50];
pipe(fd); p1=fork();
if(p1==0)
{
lockf(fd[1],1,0);
sprintf(buf,“childprocess1issending\n”);
printf("childprocess1!\n");
write(fd[1],buf,50);
sleep(5);
lockf(fd[1],0,0);
exit(0);
}lockf:用于鎖定文件的某些段或整個(gè)文件頭文件:#include<unistd.h>參數(shù)定義:intlockf(files,function,size) intfiles,function:longsizefunction:1鎖定,0解鎖Size:0,表示從文件的當(dāng)前位置到文件尾
無名管道應(yīng)用舉例:3.管道(pipe)通信
else
{
p2=fork();
if(p2==0)
{
lockf(fd[1],1,0);
sprintf(buf,"childprocess2issending!\n");
printf("childprocess2!\n");
write(fd[1],buf,50);
sleep(5);
lockf(fd[1],0,0);
exit(0);
}
else
{
wait(0);
if((r=read(fd[0],s,50))==-1)
printf("can'treadpipe\n");
else
printf("%s\n",s);
wait(0);
if((r=read(fd[0],s,50))==-1)
printf("can'treadpipe\n");
else
printf("%s\n",s);
exit(0);
}}}/*
mainend*/
無名管道應(yīng)用舉例:客戶端提出請(qǐng)求,服務(wù)器提供服務(wù)3.6進(jìn)程通信3.6.1進(jìn)程通信類型4.客戶-服務(wù)器系統(tǒng)通信(C/S模式)套接字(Socket)Socket又稱為套接字或插口,是一條通信線路兩頭端口的抽象表示。Socket網(wǎng)絡(luò)地址連接類型網(wǎng)絡(luò)規(guī)程有連接(TCP)無連接(UDP)通信流程客戶端提出請(qǐng)求,服務(wù)器提供服務(wù)3.6進(jìn)程通信3.6.1進(jìn)程通信類型4.客戶-服務(wù)器系統(tǒng)通信(C/S模式)遠(yuǎn)程過程調(diào)用(RPC)RPC允許客戶機(jī)上的進(jìn)程通過網(wǎng)絡(luò)調(diào)用位于遠(yuǎn)程主機(jī)上的過程。按照系統(tǒng)規(guī)定的消息結(jié)構(gòu)將調(diào)用過程的標(biāo)識(shí)符及參數(shù)打包成消息3.6進(jìn)程通信1.分析消息緩沖隊(duì)列通信機(jī)制的基本思想2.說明消息緩沖隊(duì)列通信機(jī)制的相關(guān)數(shù)據(jù)結(jié)構(gòu)
消息緩沖區(qū)
消息緩沖隊(duì)列3.分析發(fā)送原語實(shí)現(xiàn)過程4.分析接收原語實(shí)現(xiàn)過程3.6.2消息緩沖隊(duì)列通信機(jī)制發(fā)送進(jìn)程發(fā)送區(qū)設(shè)置公用緩沖區(qū)復(fù)制消息接收隊(duì)列掛入取消息消息緩沖區(qū)復(fù)制接收進(jìn)程接收區(qū)3.6進(jìn)程通信3.6.2消息緩沖隊(duì)列通信機(jī)制1.基本思想:消息緩沖區(qū):
structmesg_buffer{intsender;char*text;intsize;timesend_time;structmesg_buffer*next;
……}buffer;2.相關(guān)數(shù)據(jù)結(jié)構(gòu):3.6進(jìn)程通信3.6.2消息緩沖隊(duì)列通信機(jī)制消息緩沖隊(duì)列:空白消息緩沖區(qū)隊(duì)列;接收進(jìn)程的消息隊(duì)列;PCB中與通信有關(guān)的數(shù)據(jù)項(xiàng):
structmessage_buf*mq:消息隊(duì)列隊(duì)首指針;semaphoremutex:消息隊(duì)列互斥信號(hào)量;semaphoresm:消息隊(duì)列同步信號(hào)量
Freebuff_mutex;Freebuff_sm2.相關(guān)數(shù)據(jù)結(jié)構(gòu):哪些進(jìn)程會(huì)使用這個(gè)隊(duì)列?哪些進(jìn)程會(huì)使用這個(gè)隊(duì)列?3.6進(jìn)程通信3.6.2消息緩沖隊(duì)列通信機(jī)制3.發(fā)送原語:send()申請(qǐng)空白消息緩沖區(qū);填寫該空白消息緩沖區(qū);將該消息緩沖區(qū)掛到接收進(jìn)程的消息隊(duì)列上。發(fā)送原語需要完成哪些工作呢?3.6.2消息緩沖隊(duì)列通信機(jī)制要成功申請(qǐng)到一個(gè)空白消息緩沖區(qū),需要滿足幾個(gè)條件?3.發(fā)送原語:send()proceduresend(receiver,a)
{ getbuf(a.size,i); copy(i,a);receiver_pcb=getpcb(receiver);wait(receiver_pcb.mutex);insert(receiver_pcb.mq,i);signal(receiver_pcb.mutex);signal(receiver_pcb.sm)}
wait(freebuf_sm);wait(freebuf_mutex);getafreebufsignal(freebuf_mutex);3.6.2消息緩沖隊(duì)列通信機(jī)制從接收隊(duì)列中取下一個(gè)消息緩沖區(qū);將該消息緩沖區(qū)內(nèi)容復(fù)制到接收區(qū)中;將該消息緩沖區(qū)清空后掛到空白消息緩沖隊(duì)列上。4.接收原語:receive()接收原語需要完成哪些工作呢?要成功取得一個(gè)消息緩沖區(qū),需要滿足幾個(gè)條件?3.6.2消息緩沖隊(duì)列通信機(jī)制procedurereceive(b)
{
wait(receiver_pcb.sm) wait(receiver_pcb.mutex); remove(receiver_pcb.mq,j) signal(receiver_pcb.mutex); copy(b,j); releasebuf(j);
}wait(freebuf_mutex);putafreebufsignal(freebuf_mutex);signal(freebuf_sm);4.接收原語:receive()3.6.2消息緩沖隊(duì)列通信機(jī)制3.1進(jìn)程通信1.共享存儲(chǔ)器系統(tǒng)通信的基本概念及性能特點(diǎn)2.消息傳遞系統(tǒng)通信基本概念:直接通信、間接通信3.管道通信概念:無名管道、有名管道4.消息緩沖隊(duì)列通信機(jī)制的基本思想:(1)發(fā)送原語實(shí)現(xiàn)過程(2)接收原語實(shí)現(xiàn)過程本節(jié)知識(shí)小結(jié)哪個(gè)小組來總結(jié)下?3.6進(jìn)程通信省平臺(tái)課堂在線測(cè)試(6分鐘)3.6進(jìn)程通信3.6.3Linux/openEuler進(jìn)程通信系統(tǒng)調(diào)用管道通信機(jī)制IPC消息隊(duì)列通信機(jī)制共享內(nèi)存通信無名管道:1.Linux/openEuler管道通信機(jī)制
無名管道只能用于具有親緣關(guān)系的進(jìn)程之間的通信。
無名管道是半雙工的
無名管道沒有對(duì)應(yīng)的磁盤映像,只存在于內(nèi)存中基本概念:創(chuàng)建無名管道:pipe()intpipe(intfiledes[2])功能:在內(nèi)存緩沖區(qū)中創(chuàng)建一個(gè)管道,主要是建立相關(guān)VFS對(duì)象,并將讀寫該管道的一對(duì)文件描述符保存在filedes[2]中。3.6.3Linux/openEuler進(jìn)程通信系統(tǒng)調(diào)用
從管道中讀取數(shù)據(jù):pipe_read()
阻塞型讀取數(shù)據(jù):管道大小為p,請(qǐng)求讀取n管道大小至少有一個(gè)寫進(jìn)程沒有寫進(jìn)程有睡眠寫進(jìn)程無睡眠寫進(jìn)程p=0讀取n個(gè)字節(jié)并返回n,當(dāng)管道緩沖區(qū)為空時(shí)等待寫進(jìn)程寫數(shù)據(jù)等待寫進(jìn)程寫數(shù)據(jù),然后再讀取數(shù)據(jù)返回00<p<n讀取P個(gè)字節(jié)并返回P;管道緩沖區(qū)中還剩0個(gè)字節(jié)p≥n讀取n個(gè)字節(jié),返回n,管道緩沖區(qū)中還剩p-n個(gè)字節(jié)
非阻塞型讀取數(shù)據(jù):管道大小為p,請(qǐng)求讀取nP<n:讀取p字節(jié)并返回p;P≥n:讀取n字節(jié)并返回n1.Linux/openEuler管道通信機(jī)制無名管道:無名管道:向管道中寫入數(shù)據(jù):pipe_write()緩沖區(qū)剩余空間至少有一個(gè)讀進(jìn)程沒有讀進(jìn)程阻塞寫非阻塞寫寫入失敗,內(nèi)核向?qū)戇M(jìn)程發(fā)送SIGPIPE信號(hào),并返回-EPIPEu<n≤4096等待,直到有n-u個(gè)字節(jié)被讀出為止,寫入n個(gè)字節(jié)并返回n返回-EAGAIN,提醒以后再寫n>4096寫入n個(gè)字節(jié)(必要時(shí)要等待)并返回n如果u>0,寫入u字節(jié)并返回u;否則就返回-EAGAINu≥n寫入n個(gè)字節(jié)并返回n管道中空閑空間u字節(jié),請(qǐng)求寫入n字節(jié)1.Linux/openEuler管道通信機(jī)制有名管道創(chuàng)建有名管道:可用于任意進(jìn)程間的信息交換intmkfifo(constchar*pathname,mode_tmode)功能:在磁盤上創(chuàng)建一個(gè)有名管道文件打開有名管道:intopen(constchar*pathname,intflags)從有名管道中讀取數(shù)據(jù):管道大小阻塞讀非阻塞讀p=0讀進(jìn)程阻塞,等待寫進(jìn)程寫入數(shù)據(jù)返回-1,當(dāng)前errno值為EAGAIN,提醒以后再試0<p<n讀取p個(gè)字節(jié)并返回pp≥n讀取n個(gè)字節(jié)并返回n1.Linux/openEuler管道通信機(jī)制有名管道向有名管道中寫入數(shù)據(jù):緩沖區(qū)剩余空間阻塞寫非阻塞寫u<n≤4096等待,直到有n-u個(gè)字節(jié)被讀出為止,寫入n個(gè)字節(jié)并返回n返回-EAGAIN,提醒以后再寫n>4096
寫入n個(gè)字節(jié)(必要時(shí)要等待)
并返回n如果u>0,寫入u字節(jié)并返回u;否則就返回-EAGAINu≥n寫入n個(gè)字節(jié)并返回n1.Linux/openEuler管道通信機(jī)制相關(guān)數(shù)據(jù)結(jié)構(gòu)2.Linux/openEuler的IPC消息隊(duì)列通信機(jī)制
消息緩沖區(qū)structmsgbuf:消息緩沖區(qū)設(shè)計(jì)舉例:structmsgbuf{ /*消息定義的參照格式*/longmtype;/*消息類型(大于0的長(zhǎng)整數(shù))*/charmtext[1]; /*消息正文*/};structmy_msgbuf{longmtype;/*Messagetype*/longsender_id,receiver_id;charmytext[1024];/*text*/};相關(guān)數(shù)據(jù)結(jié)構(gòu)
消息頭結(jié)構(gòu):msg_msg和msg_msgseg結(jié)構(gòu)structmsg_msg{structlist_headm_list;/*指向消息隊(duì)列中的下一條消息*/longm_type;/*消息類型,同structmsgbuf中的mtype*/intm_ts;/*消息正文的大小*/structmsg_msgseg*next;/*消息的下一部分*/void*security;};/*該結(jié)構(gòu)后面緊接著存放消息正文*/structmsg_msgseg{structmsg_msgseg*next;};msg_msgText4072Bnext2.Linux/openEuler的IPC消息隊(duì)列通信機(jī)制相關(guān)數(shù)據(jù)結(jié)構(gòu):msg_msgText4072Bnextmsg_msgsegTextnextmsg_msgsegTextnext同一個(gè)消息放在3個(gè)消息緩沖區(qū)中
消息頭結(jié)構(gòu):msg_msg和msg_msgseg結(jié)構(gòu)2.Linux/openEuler的IPC消息隊(duì)列通信機(jī)制相關(guān)數(shù)據(jù)結(jié)構(gòu):
消息隊(duì)列結(jié)構(gòu):msg_queuestructmsg_queue{ structkern_ipc_permq_perm;/*消息隊(duì)列的kern_ipc_perm*/ time_tq_stime; /*最近一次調(diào)用msgsnd()的時(shí)間*/ time_tq_rtime; /*最近一次調(diào)用msgrcv()的時(shí)間*/ time_tq_ctime; /*最近一次修改時(shí)間*/ unsignedlongq_cbytes; /*隊(duì)列中的總字節(jié)數(shù)*/ unsignedlongq_qnum; /*隊(duì)列中的消息個(gè)數(shù)*/ unsignedlongq_qbytes; /*隊(duì)列中最大消息的字節(jié)數(shù)*/ pid_tq_lspid; /*最近一次調(diào)用msgsnd()的PID*/ pid_tq_lrpid; /*最近一次調(diào)用msgrcv()的PID*/ structlist_headq_messages;/*隊(duì)列中的消息鏈表*/ structlist_headq_receivers;/*接收消息的進(jìn)程鏈表*/ structlist_headq_senders;/*發(fā)送消息的進(jìn)程鏈表*/};IPC消息隊(duì)列數(shù)最多為16個(gè),每個(gè)消息大小最大為8192B,一個(gè)消息隊(duì)列中全部消息大小最大為16384B2.Linux/openEuler的IPC消息隊(duì)列通信機(jī)制相關(guān)系統(tǒng)調(diào)用intmsgget(key_tkey,intmsgflg)功能:新創(chuàng)建一個(gè)消息隊(duì)列并返回其標(biāo)識(shí)符,或者返回具有相同鍵值的已存在的消息隊(duì)列的標(biāo)識(shí)符intmsgsnd(intmsqid,structmsgbuf*msgp,size_tmsgsz,intmsgflg)功能:向標(biāo)識(shí)符為msqid的消息隊(duì)列中發(fā)送一個(gè)消息ssize_tmsgrcv(intmsqid,structmsgbuf*msgp,size_tmsgsz,longmsgtyp,intms
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《從傳統(tǒng)到時(shí)尚》課件
- 七大洲四大洋的位置
- 山東省煙臺(tái)市招遠(yuǎn)市(五四學(xué)制)2024-2025學(xué)年九年級(jí)上學(xué)期期末考試道德與法治試卷(含答案)
- 2024年全國(guó)社會(huì)工作者初級(jí)職業(yè)水平《社會(huì)工作實(shí)務(wù)》考試題參考答案
- 單位管理制度展示合集【人事管理篇】
- 單位管理制度展示大合集職員管理十篇
- 定期報(bào)告:一月可能繼續(xù)震蕩偏強(qiáng)中小盤成長(zhǎng)占優(yōu)
- 2024-2030年中國(guó)偶氮顏料行業(yè)市場(chǎng)深度分析及發(fā)展趨勢(shì)預(yù)測(cè)報(bào)告
- 單位管理制度展示大合集職工管理篇十篇
- 單位管理制度品讀選集【員工管理篇】
- NB-T35009-2013抽水蓄能電站選點(diǎn)規(guī)劃編制規(guī)范
- 曳引驅(qū)動(dòng)電梯調(diào)試作業(yè)指導(dǎo)書
- 上海市中考英語試卷及答案
- 基礎(chǔ)會(huì)計(jì)課程思政教案設(shè)計(jì)
- 蘇教版科學(xué)小學(xué)五年級(jí)上冊(cè)期末測(cè)試卷及完整答案(奪冠系列)
- 監(jiān)控工程竣工驗(yàn)收?qǐng)?bào)告
- 經(jīng)皮肝穿刺膽道引流(PTCD)導(dǎo)管的護(hù)理要點(diǎn)
- 國(guó)家開放大學(xué)《心理學(xué)》形考任務(wù)1-4參考答案
- 2024年社會(huì)工作者《社會(huì)工作實(shí)務(wù)(中級(jí))》考試真題必考題
- 國(guó)家基層糖尿病神經(jīng)病變?cè)\治指南(2024版)
- FZ∕T 74001-2020 紡織品 針織運(yùn)動(dòng)護(hù)具
評(píng)論
0/150
提交評(píng)論