




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
3.5進(jìn)程通信3.5.1信號通信機(jī)制3.5.2共享文件通信機(jī)制3.5.3共享存儲區(qū)通信機(jī)制3.5.4消息傳遞通信機(jī)制3.5.5有關(guān)消息傳遞實(shí)現(xiàn)的若干問題進(jìn)程通信概念(1)
并發(fā)進(jìn)程之間的交互必須滿足兩個基本要求:同步和通信。進(jìn)程競爭資源時要實(shí)施互斥,互斥是一種特殊的同步,實(shí)質(zhì)上需要解決好進(jìn)程同步問題,進(jìn)程同步是一種進(jìn)程通信,通過修改信號量,進(jìn)程之間可建立起聯(lián)系,相互協(xié)調(diào)運(yùn)行和協(xié)同工作。進(jìn)程通信概念(2)
進(jìn)程協(xié)同工作時,需要互相交換信息,有些情況下進(jìn)程間交換的少量信息,有些情況下進(jìn)程間交換大批數(shù)據(jù)。進(jìn)程之間互相交換信息的工作稱為進(jìn)程通信IPC(InterProcessCommunication)。
進(jìn)程間通信的方式(1)信號(signal)通信機(jī)制;共享存儲區(qū)(sharedmemory)通信機(jī)制;共享文件(sharedfile)通信機(jī)制;消息傳遞(messagepassing)通信機(jī)制。
進(jìn)程間通信的方式(2)
socket通信機(jī)制(在ch8中介紹)socket既適合單機(jī)上的進(jìn)程通信,也適用于網(wǎng)絡(luò)環(huán)境下的進(jìn)程通信。這種機(jī)制其實(shí)是命名pipe在網(wǎng)絡(luò)環(huán)境下的實(shí)現(xiàn)和推廣,己成為所有網(wǎng)絡(luò)操作系統(tǒng)的一項(xiàng)基礎(chǔ)功能。
進(jìn)程間通信的方式(3)
UNIX發(fā)展歷史中,AT&T的Bell與加大伯克利的BSD是兩大主力。Bell致力于改進(jìn)傳統(tǒng)的進(jìn)程IPC,形成了SYSTEMⅤIPC機(jī)制。BSD在改進(jìn)IPC的同時,把網(wǎng)絡(luò)通信規(guī)程(TCP/IP)實(shí)現(xiàn)到UNIX內(nèi)核中,考慮把同一計(jì)算機(jī)上的進(jìn)程通信納入更廣的網(wǎng)絡(luò)范圍的進(jìn)程通通信,這種努力結(jié)果出現(xiàn)了socket通信機(jī)制。
進(jìn)程間通信的方式(4)
STSTEMⅤIPC進(jìn)程通信機(jī)制,包括:消息隊(duì)列、共享存儲區(qū)和信號量。消息隊(duì)列允許一個進(jìn)程向其他進(jìn)程發(fā)送消息(格式化數(shù)據(jù));共享存儲區(qū)讓多個進(jìn)程可共享它們的部分虛地址空間;信號量則允許若干進(jìn)程通過它來同步地運(yùn)行。進(jìn)程間通信的方式(5)
低級通信機(jī)制,適用于集中式操作系統(tǒng)高級通信機(jī)制,既適用于集中式操作系統(tǒng),又適用于分布式操作系統(tǒng)3.5.1信號通信機(jī)制
信號機(jī)制又稱軟中斷,一種簡單的通信機(jī)制,通過發(fā)送一個指定信號來通知進(jìn)程某個異常事件發(fā)生。信號不但能從內(nèi)核發(fā)給一個進(jìn)程,也能由一個進(jìn)程發(fā)給另一個進(jìn)程。UNIX系統(tǒng)信號分成以下幾類(1)
?與進(jìn)程終止相關(guān)的信號SIGCLD、SIGHUP、SIGKILL、SIGCHLD等,如進(jìn)程結(jié)束、進(jìn)程殺死子進(jìn)程,;?與進(jìn)程例外事件相關(guān)的信號SIGBUS、SIGSEGV、SIGPWR、SIGFPE等,如進(jìn)程執(zhí)行特權(quán)指令、寫只讀區(qū)、地址越界、總線超時,硬件故障;?與進(jìn)程執(zhí)行系統(tǒng)調(diào)用相關(guān)的信號SIGPIPE、SIGSYS、SIGILL等,如進(jìn)程執(zhí)行非法系統(tǒng)調(diào)用、管道存取錯;UNIX系統(tǒng)信號分成以下幾類(2)
?與進(jìn)程終端交互相關(guān)的信號SIGINT、SIGQUT等,如進(jìn)程掛斷終端、用戶按delete鍵或break健。?用戶進(jìn)程發(fā)信號SIGTERM、SIGALRM、SIGUSR1、SIGUS2等,如進(jìn)程向另一進(jìn)程發(fā)一個信號、要求報警;?跟蹤進(jìn)程執(zhí)行的信號SIGTRAP等。UNIX軟中斷機(jī)制(1)具有以下功能:軟中斷信號的發(fā)送,軟中斷信號的響應(yīng)和軟中斷信號的處理。信號發(fā)送工作由系統(tǒng)調(diào)用kill完成信號響應(yīng)使用系統(tǒng)調(diào)用signal完成信號的處理過程UNIX軟中斷機(jī)制(2)
用戶空間系統(tǒng)空間應(yīng)用程序系統(tǒng)調(diào)用或中斷服務(wù)信號處理程序應(yīng)用程序產(chǎn)生系統(tǒng)調(diào)用或中斷訪管轉(zhuǎn)向用戶空間執(zhí)行信號處理信號處理程序結(jié)束返回內(nèi)核從內(nèi)核返回用戶空間信號的檢測與處理流程3.5.2共享文件通信機(jī)制(1)
管道(pipeline)是連接讀寫進(jìn)程的一個特殊文件,允許進(jìn)程按先進(jìn)先出方式傳送數(shù)據(jù),也能使進(jìn)程同步執(zhí)行操作。發(fā)送進(jìn)程以字符流形式把大量數(shù)據(jù)送入管道,接收進(jìn)程從管道中接收數(shù)據(jù),所以叫管道通信。共享文件通信機(jī)制(2)
管道的實(shí)質(zhì)是一個共享文件,基本上可借助于文件系統(tǒng)的機(jī)制實(shí)現(xiàn),包括(管道)文件的創(chuàng)建、打開、關(guān)閉和讀寫。共享文件通信機(jī)制(3)
讀寫進(jìn)程相互協(xié)調(diào),必須做到:?
進(jìn)程對通信機(jī)構(gòu)的使用應(yīng)該互斥,一個進(jìn)程正在使用某個管道寫入或讀出數(shù)據(jù)時,另一個進(jìn)程就必須等待。?
發(fā)送者和接收者雙方必須能夠知道對方是否存在,如果對方已經(jīng)不存在,就沒有必要再發(fā)送信息。共享文件通信機(jī)制(4)
?管道長度有限,發(fā)送信息和接收信息之間要實(shí)現(xiàn)正確的同步關(guān)系。
?write阻塞。
?read阻塞。
共享文件通信機(jī)制(5)寫進(jìn)程共享文件讀進(jìn)程共享文件通信機(jī)制(6)
系統(tǒng)打開文件表用戶打開文件表內(nèi)存活動索引節(jié)點(diǎn)表外存fp讀進(jìn)程寫進(jìn)程fp文件節(jié)點(diǎn)指針文件節(jié)點(diǎn)指針?biāo)饕?jié)點(diǎn)pipe文件
pipe的數(shù)據(jù)結(jié)構(gòu)UNIX中管道的定義如下
intpipe(files);
intfiles[2];父子進(jìn)程通過管道傳送信息
的一個例子(1)
#include<stdio.h>#defineMSGSIZE16char*msg1=”hello,world#1”;char*msg2=”hello,world#2”;char*msg3=”hello,world#3”;
父子進(jìn)程通過管道傳送信息
的一個例子(2)main(){charinbuf[MSGSIZE];
intp[2],j,pid;
if(pipe(p)<0){/*openpipe*/
perror(“pipecall”);exit(1);}if((pid=fork()<0){
perror(“forkcall”);exit(2);}
父子進(jìn)程通過管道傳送信息
的一個例子(3)
/*ifparent,thenclosereadfiledescriptorandwritedownpipe*/if(pid>0{close(p[0]);write(p[1],msg1,MSGSIZE);write(p[1],msg2,MSGSIZE);write(p[1],msg3,MSGSIZE);wait((int*)0);}
/*ifchild,thenclosewritefiledescriptorandreadfrompipe*/if(pid==0){close(p[1]);for(j=0;j<3;j++)read(p[0],inbuf,MSGSIZE);
printf(“%s\n,inbuf”);}}exit(0);}兄弟進(jìn)程通過管道傳送信息
的一個例子(1)
(1)進(jìn)程A創(chuàng)建一個管道,創(chuàng)建完成時代表管道兩端的兩個己打開文件都在進(jìn)程A中。(2)進(jìn)程A通過fork()創(chuàng)建出子進(jìn)程B,在fork()過程中進(jìn)程A的打開文件表按原樣復(fù)制到進(jìn)程B中。(3)進(jìn)程A關(guān)閉管道的讀端,而進(jìn)程B關(guān)閉管道的寫端。于是,管道的寫端在進(jìn)程A中而讀端在進(jìn)程B中,成為父子進(jìn)程之間的通信管道。兄弟進(jìn)程通過管道傳送信息
的一個例子(2)
(4)進(jìn)程A又通過fork()創(chuàng)建進(jìn)程C,然后,關(guān)閉其管道寫端而與管道脫離關(guān)系,使得管道的寫端在進(jìn)程C中的讀端在進(jìn)程B中,成為兩個兄弟之間的管道。(5)進(jìn)程C和進(jìn)程B各自通過exec()執(zhí)行各自的目標(biāo)程序,并通過管道進(jìn)行單向通信。
兄弟進(jìn)程通過管道傳送信息
的一個例子(3)
寫端讀端…進(jìn)程A寫端讀端…進(jìn)程B管道文件(緩沖區(qū))進(jìn)程A打開文件表進(jìn)程B打開文件表父子進(jìn)程通過管道單向通信兄弟進(jìn)程通過管道傳送信息
的一個例子(4)
寫端讀端…進(jìn)程B管道文件(緩沖區(qū))寫端讀端…進(jìn)程A進(jìn)程A打開文件表進(jìn)程B打開文件表兄弟進(jìn)程通過管道單向通信寫端讀端…進(jìn)程C進(jìn)程C打開文件表兄弟進(jìn)程通過管道傳送信息
的一個例子(5)
例如,一個使用管道的Shell命令行:
ls–1|
wc-1則上述A進(jìn)程相當(dāng)于Shell,進(jìn)程B執(zhí)行“wc-1”,而進(jìn)程C執(zhí)行“l(fā)s-1”。不過在進(jìn)程C中要將“標(biāo)準(zhǔn)輸出”stdout重定向到管道的寫端,而在進(jìn)程B中要將“標(biāo)準(zhǔn)輸入”stdin重定向到管道的讀端。3.5.3共享存儲區(qū)通信機(jī)制
ProcessAProcessBSharedmemorykernel與共享存儲有關(guān)的系統(tǒng)調(diào)用?
shmget(key,size,permflags)?
shmat(shm-id,daddr,shmflags)?
shmdt(memptr)?
shmctl(shm-id,command,&shm-stat)3.5.4消息傳遞(1)什么是消息傳遞(messagepassing)?消息和消息傳遞機(jī)制基本的消息傳遞原語send,receive消息傳遞(2)?
采用消息傳遞機(jī)制后,一個正在執(zhí)行的進(jìn)程可在任何時刻向另一個正在執(zhí)行的進(jìn)程發(fā)送消息;一個正在執(zhí)行的進(jìn)程也可在任何時刻向正在執(zhí)行的另一個進(jìn)程請求消息。消息傳遞(3)?
一個進(jìn)程在某一時刻的執(zhí)行依賴于另一進(jìn)程的消息或等待其他進(jìn)程對發(fā)出消息的回答,那么,消息傳遞機(jī)制緊密地與進(jìn)程的阻塞和釋放相聯(lián)系。消息傳遞就進(jìn)一步擴(kuò)充了并發(fā)進(jìn)程間對數(shù)據(jù)的共享,提供了進(jìn)程同步的能力。直接通信發(fā)送或接收消息的進(jìn)程必須指出信件發(fā)給誰或從誰那里接收消息原語send(P,消息):把一個消息發(fā)送給進(jìn)程P原語receive(Q,消息):從進(jìn)程Q接收一個消息間接通信(1)
進(jìn)程間發(fā)送或接收消息通過信箱進(jìn)行,消息可被理解成信件?原語send(A,信件):把一封信件(消息)傳送到信箱A?原語receive(A,信件):從信箱A接收一封信件(消息)間接通信(2)
間接通信的實(shí)現(xiàn)(1)信箱是存放信件的存儲區(qū)域,每個信箱可分成信箱特征和信箱體兩部分。信箱特征指出信箱容量、信件格式、指針等;信箱體用來存放信件間接通信(3)
間接通信的實(shí)現(xiàn)(2)發(fā)送信件:如果指定信箱未滿,則將信件送入信箱中由指針?biāo)甘镜奈恢?,并釋放等待該信箱中信件的等待者;否則發(fā)送信件者被置成等待信箱狀態(tài)間接通信(4)
間接通信的實(shí)現(xiàn)(3)接收信件:如果指定信箱中有信,則取出一封信件,并釋放等待信箱的等待者,否則接收信件者被置成等待信箱中信件的狀態(tài)間接通信(5)typebox=recordsize:integer;/*信箱大小*/
count:integer;/*現(xiàn)有信件數(shù)*/
letter:array[1..n]ofmessage;/*信箱*/
S1,S2:semaphore;/*等信箱和等信件信號量*/end間接通信(6)proceduresend(varB:box,M:message)
varI:integer;begin
ifB.count=B.sizethenW(B.s1);
i:=B.count+1;
B.letter[i]:=M;
B.coumt:=I;
R(B.S2)end;{send}間接通信(7)procedurereceive(varB:box,x:message)
vari:integer;beginifB.count=0thenW(B.s2);B.count:=B.count-1;x:=B.letter[1];ifB.countnot=0thenfori=1tob.countdoB.letter[i]:=B.letter[i+1];R(B.S1);end;{receive}用消息傳遞機(jī)制解決
生產(chǎn)者-消費(fèi)者問題(1)
varcapacity:integer;
/*緩沖大小*/
i:integer;procedureproducer;
varpmsg:message;beginwhiletruedobeginreceive(mapproduce,pmsg);/*等待空消息*/
pmsg:=produce;/*生產(chǎn)消息*/
send(mayconsume,pmsg);/*發(fā)送消息*/
endend;用消息傳遞機(jī)制解決
生產(chǎn)者-消費(fèi)者問(2)
procedureconsumer;
varcmsg:message;beginwhiletruedobeginreceive(mayconsume,cmsg);/*接收消息*/
consume(csmg);/*消耗消息*/
send(mayproduce,null);/*發(fā)送空消息*/
endend;用消息傳遞機(jī)制解決
生產(chǎn)者-消費(fèi)者問題(3)
begin/*主程序*/
creat-mailbox(mayprocuce);/*創(chuàng)建信箱*/
creat-mailbox(mayconsume);fori=1tocapacitydosend(mayproduce,null);/*發(fā)送空消息*/
cobegin
producer;consumer;
coendend3.5.5有關(guān)消息傳遞實(shí)現(xiàn)的若干問題
信箱容量問題多進(jìn)程與信箱相連的信件接收問題信箱的所有權(quán)問題信件的格式問題通信進(jìn)程并行性問題消息緩沖通信涉及的數(shù)據(jù)結(jié)構(gòu)
sender:發(fā)送消息的進(jìn)程名或標(biāo)識符
size:發(fā)送的消息長度
text:發(fā)送的消息正文
next-ptr:指向下一個消息緩沖區(qū)的指針在進(jìn)程的PCB中涉及通信的數(shù)據(jù)結(jié)構(gòu):
mptr:消息隊(duì)列隊(duì)首指針
mutex:消息隊(duì)列互斥信號量,初值為1
sm:表示接收進(jìn)程消息隊(duì)列上消息的個數(shù),初值為0,是控制收發(fā)進(jìn)程同步的信號量消息緩沖通信的發(fā)送原語
和接收原語(1)
?發(fā)送原語send:申請一個消息緩沖區(qū),把發(fā)送區(qū)內(nèi)容復(fù)制到這個緩沖區(qū)中;找到接收進(jìn)程的PCB,執(zhí)行互斥操作P(mutex);把緩沖區(qū)掛到接收進(jìn)程消息隊(duì)列的尾部,執(zhí)行V(sm)、即消息數(shù)加1;執(zhí)行V(mutex)。
消息緩沖通信的發(fā)送原語
和接收原語(2)
?接收原語receive:執(zhí)行P(sm)查看有否信件;執(zhí)行互斥操作P(mutex),從消息隊(duì)列中摘下第一個消息,執(zhí)行V(mutex);把消息緩沖區(qū)內(nèi)容復(fù)制到接收區(qū),釋放消息緩沖區(qū)。
消息緩沖通信過程
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 修理廠租房合同
- 中介房屋出租合同
- 建筑工地施工安全防范及免責(zé)條款合同
- 區(qū)住宅區(qū)物業(yè)管理委托合同
- 夫妻離婚合同協(xié)議書
- 智慧餐飲供應(yīng)鏈管理系統(tǒng)開發(fā)及運(yùn)營合同
- 成都商品房買賣合同
- 大連翻譯職業(yè)學(xué)院《影視劇配音》2023-2024學(xué)年第二學(xué)期期末試卷
- 濟(jì)源職業(yè)技術(shù)學(xué)院《產(chǎn)品結(jié)構(gòu)設(shè)計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 銅仁職業(yè)技術(shù)學(xué)院《明清檔案學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 幕墻工安全技術(shù)交底
- 集裝箱七點(diǎn)檢查表
- 7S管理標(biāo)準(zhǔn)目視化管理標(biāo)準(zhǔn)
- 籃球場改造工程投標(biāo)方案(技術(shù)方案)
- 茉莉花的生長習(xí)性及栽培管理辦法
- 蛤蟆先生去看心理醫(yī)生
- 懸挑式卸料平臺安拆作業(yè)安全技術(shù)交底
- 疾病診斷編碼庫ICD-10
- 腦血管造影病人的護(hù)理-課件
- 阿里巴巴管理精髓管理者必修的24招
- 西漢-北京大學(xué)歷史學(xué)系教學(xué)課件
評論
0/150
提交評論