操作系統(tǒng)全部課件3.5進(jìn)程通信_(tái)第1頁
操作系統(tǒng)全部課件3.5進(jìn)程通信_(tái)第2頁
操作系統(tǒng)全部課件3.5進(jìn)程通信_(tái)第3頁
操作系統(tǒng)全部課件3.5進(jìn)程通信_(tái)第4頁
操作系統(tǒng)全部課件3.5進(jìn)程通信_(tái)第5頁
已閱讀5頁,還剩58頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、1一、進(jìn)程通信的定義 二、進(jìn)程通信方式三、信號(hào)通信機(jī)制 四、管道通信機(jī)制 五、共享主存通信機(jī)制 六、消息傳遞通信機(jī)制 3.5 進(jìn)程通信 2進(jìn)程通信問題思考 (1)1、進(jìn)程與操作系統(tǒng)之間的通信前面章節(jié)主要討論了操作系統(tǒng)對(duì)進(jìn)程的管理。操作系統(tǒng)與進(jìn)程之間的通信是自然的、容易的、直接的。操作系統(tǒng)會(huì)與所有的進(jìn)程打交道但是進(jìn)程如何與進(jìn)程打交道(即通信)是一個(gè)新問題3進(jìn)程通信問題思考 (2)2、進(jìn)程與進(jìn)程之間通信方法的猜想進(jìn)程A、B間通信時(shí),操作系統(tǒng)起什么作用?操作系統(tǒng)起信息轉(zhuǎn)交的作用呢?還是一個(gè)旁觀者,要通信的數(shù)據(jù)由進(jìn)程A直接交給進(jìn)程B?進(jìn)程A能夠看到進(jìn)程B內(nèi)部的空間和信息嗎?操作系統(tǒng)內(nèi)部對(duì)用戶進(jìn)程是封閉

2、的,而操作系統(tǒng)卻可以看到所有用戶進(jìn)程的空間內(nèi)容4一、進(jìn)程通信的定義1、進(jìn)程通信定義進(jìn)程之間互相交換信息的工作稱為進(jìn)程通信IPC(InterProcess Communication)。2、進(jìn)程通信與同步互斥機(jī)制的區(qū)別進(jìn)程同步互斥的主要目的是在進(jìn)程間交換信息,即進(jìn)程通信。臨界資源是多個(gè)進(jìn)程訪問的共享變量(數(shù)據(jù)),在各個(gè)進(jìn)程空間相互隔離的情況下,各個(gè)進(jìn)程如何看到共同的數(shù)據(jù)?這就是進(jìn)程通信要研究的問題。5一、進(jìn)程通信的定義在討論信號(hào)量及PV操作時(shí),暫時(shí)忽略了共享數(shù)據(jù)存放空間位置的創(chuàng)建、讀寫細(xì)節(jié),假設(shè)各個(gè)相關(guān)進(jìn)程已經(jīng)看到了共享數(shù)據(jù)(變量),重點(diǎn)討論同步互斥問題?,F(xiàn)在要展開共享數(shù)據(jù)的創(chuàng)建讀寫等細(xì)節(jié)問題。

3、進(jìn)程通信的目的是在進(jìn)程之間交換大量數(shù)據(jù)。進(jìn)程通信需要使用必要的同步互斥機(jī)制。基于信號(hào)量的同步互斥機(jī)制傳遞的是信號(hào)量,而不是數(shù)據(jù)6二、進(jìn)程通信方式(1)(1)信號(hào)(signal)通信機(jī)制只能發(fā)送單個(gè)信號(hào),不能傳遞數(shù)據(jù)(2)管道(pipeline)通信機(jī)制只能在進(jìn)程家族內(nèi)傳送數(shù)據(jù) (3)消息傳遞(message passing)通信機(jī)制 (4)信號(hào)量(semaphore)通信機(jī)制(5)共享主存(shared memory)通信機(jī)制信號(hào)和管道是UNIX最早版本提供的進(jìn)程通信機(jī)制7二、進(jìn)程通信方式(2)消息傳遞、信號(hào)量和共享主存是UNIX System V版研制開發(fā),稱為System V IPC。同一

4、機(jī)器上任何進(jìn)程之間都可用的3種通信機(jī)制。BSD UNIX把網(wǎng)絡(luò)通信規(guī)程(TCP/IP)實(shí)現(xiàn)到UNIX內(nèi)核中,實(shí)現(xiàn)了套接字網(wǎng)絡(luò)通信機(jī)制,實(shí)現(xiàn)不同機(jī)器上進(jìn)程間的通信8三、信號(hào)通信機(jī)制(1)1、信號(hào)的概念信號(hào)機(jī)制又稱軟中斷,一種簡單的通信機(jī)制,通過發(fā)送一個(gè)指定信號(hào)通知進(jìn)程某個(gè)異常事件發(fā)生。思考:“誰”可以發(fā)送信號(hào)? 9三、信號(hào)通信機(jī)制(2)2、信號(hào)的產(chǎn)生源用戶、內(nèi)核和進(jìn)程都能生成信號(hào)請(qǐng)求: 1)用戶用戶能通過輸入ctrl+c,或終端驅(qū)動(dòng)程序分配給信號(hào)控制字符的其他任何鍵來請(qǐng)求內(nèi)核產(chǎn)生信號(hào)。 2)內(nèi)核當(dāng)進(jìn)程執(zhí)行出錯(cuò)時(shí),內(nèi)核檢測(cè)到事件并給進(jìn)程發(fā)送信號(hào),例如,非法段存取、浮點(diǎn)數(shù)溢出、或非法操作碼,內(nèi)核利用

5、信號(hào)通知進(jìn)程種種特定事件發(fā)生。 3)進(jìn)程進(jìn)程可通過系統(tǒng)調(diào)用kill給另一個(gè)進(jìn)程發(fā)送信號(hào),一個(gè)進(jìn)程可通過信號(hào)與另一個(gè)進(jìn)程通信。10三、信號(hào)通信機(jī)制(3)3、信號(hào)應(yīng)用實(shí)例:用戶發(fā)送信號(hào)殺死進(jìn)程的過程:步1 用戶鍵入中斷組合鍵ctrl+c;步2 終端驅(qū)動(dòng)程序收到輸入字符,并調(diào)用信號(hào)系統(tǒng);步3 信號(hào)系統(tǒng)發(fā)送SIGINT信號(hào)給shell,shell再把它發(fā)送給進(jìn)程;步4 進(jìn)程收到SIGINT信號(hào);步5 進(jìn)程撤銷。11三、信號(hào)通信機(jī)制(4)4、信號(hào)響應(yīng)情況執(zhí)行默認(rèn)操作執(zhí)行預(yù)置的信號(hào)處理程序忽略此信號(hào)標(biāo)準(zhǔn)版UNIX提供19個(gè)信號(hào)Linux定義64個(gè)信號(hào)12三、信號(hào)通信機(jī)制(5)5、Linux系統(tǒng)信號(hào)分類(1

6、)與進(jìn)程終止相關(guān)的信號(hào)SIGCHLD(子進(jìn)程暫?;蚪K止)SIGHUP(進(jìn)程掛起)SIGKILL(強(qiáng)行殺死進(jìn)程)SIGABRT(進(jìn)程異常終止)SIGSTOP(被調(diào)試器阻塞,進(jìn)程暫停)SIGTSTP(來自終端的暫停信號(hào))13三、信號(hào)通信機(jī)制(6)(2)進(jìn)程例外事件相關(guān)的信號(hào)SIGBUS(總線超時(shí))SIGSEGV(段違例)SIGPWR(電源故障)SIGFPE(浮點(diǎn)溢出)SIGSTKFLT(協(xié)處理器棧出錯(cuò))SIGURG(套接字緊急情況)SIGXCPU(CPU限時(shí)超出)SIGXFSZ(文件限制超出)SIGWINCH(窗口大小變化)14三、信號(hào)通信機(jī)制(7)(3)與進(jìn)程執(zhí)行系統(tǒng)調(diào)用相關(guān)的信號(hào)SIGPIPE

7、(管道有寫者無讀者)SIGILL(非法指令)SIGIO(與I/O操作有關(guān))(4)與進(jìn)程終端交互相關(guān)的信號(hào)SIGINT(鍵盤中斷)SIGQUIT(輸入退出命令)SIGTTIN(后臺(tái)進(jìn)程讀終端)SIGTTOU(后臺(tái)進(jìn)程寫終端)15三、信號(hào)通信機(jī)制(7)6、Linux信號(hào)機(jī)制的實(shí)現(xiàn)信號(hào)有一個(gè)產(chǎn)生、傳送、捕獲和釋放的過程。(1)數(shù)據(jù)結(jié)構(gòu)每個(gè)進(jìn)程task_struct結(jié)構(gòu)中signal域?qū)iT用來保存接收到的信號(hào),進(jìn)程接收到信號(hào)時(shí),對(duì)應(yīng)位置1,相當(dāng)于“中斷請(qǐng)求寄存器”的某位置位。task_struct的blocked是信號(hào)屏蔽標(biāo)記相當(dāng)于“中斷屏蔽寄存器”,進(jìn)程需要忽略某信號(hào)時(shí)就把對(duì)應(yīng)位置1。task_st

8、ruct的sigaction數(shù)組存放信號(hào)處理程序入口。信號(hào)編號(hào)對(duì)應(yīng)數(shù)組下標(biāo)。16三、信號(hào)通信機(jī)制(7)(2)信號(hào)函數(shù)sigaction(signo,act,oldact)為指定信號(hào)預(yù)置處理程序,signo指出接收信號(hào)類型,act是信號(hào)處理函數(shù)地址,oldact存放最近一次為信號(hào)signo定義的函數(shù)地址。kill(pid,sig)向進(jìn)程pid(進(jìn)程標(biāo)識(shí)號(hào))發(fā)送信號(hào)sig17三、信號(hào)通信機(jī)制(7)(3)信號(hào)的檢測(cè)和響應(yīng)過程 在中斷或異常處理程序末尾,進(jìn)程從核心態(tài)返回用戶態(tài)之前,或時(shí)鐘中斷結(jié)束之前,系統(tǒng)調(diào)用內(nèi)核函數(shù)do_signal()檢查該進(jìn)程是否收到信號(hào),若是則執(zhí)行handle_signal()

9、讓進(jìn)程返回用戶態(tài)轉(zhuǎn)入信號(hào)處理程序執(zhí)行。信號(hào)處理結(jié)束后,執(zhí)行系統(tǒng)調(diào)用sigreturn()陷入內(nèi)核,內(nèi)核做好善后工作后返回用戶態(tài),回到應(yīng)用程序斷點(diǎn)執(zhí)行。18三、信號(hào)通信機(jī)制(7)分析思考:信號(hào)發(fā)送、檢測(cè)、執(zhí)行時(shí)機(jī)問題假設(shè)進(jìn)程P1當(dāng)前正在CPU上運(yùn)行,P1執(zhí)行信號(hào)發(fā)送系統(tǒng)調(diào)用kill(P2,5)向進(jìn)程P2發(fā)送信號(hào)5,則CPU從P1切換到OS空間發(fā)送信號(hào)。這表明兩個(gè)進(jìn)程間的通信需要通過OS來轉(zhuǎn)交信號(hào),他們不能脫離OS直接交換信息。OS將發(fā)給P2的信號(hào)5放到其進(jìn)程控制塊PCB的signal域,PCB在操作系統(tǒng)空間,只有OS能訪問到,用戶進(jìn)程訪問不到。該信號(hào)通常不會(huì)馬上得到執(zhí)行,因?yàn)镻2當(dāng)前處于非運(yùn)行狀

10、態(tài)。19三、信號(hào)通信機(jī)制(7)P2不會(huì)因?yàn)槭盏叫盘?hào)而馬上被喚醒獲得調(diào)度。因?yàn)镺S執(zhí)行完系統(tǒng)調(diào)用kill(P2,5)后可能返回P1,也可能調(diào)度別的進(jìn)程運(yùn)行。在將來的某個(gè)時(shí)刻,OS在執(zhí)行中斷處理程序之后執(zhí)行進(jìn)程調(diào)度程序時(shí),有可能選中P2,OS在將CPU交給P2之前先查看一下P2的進(jìn)程控制塊PCB中是否有信號(hào),若有則返回P2先執(zhí)行信號(hào)處理程序,之后再返回OS,OS做信號(hào)終止處理后控制(CPU)再切換回P2,從斷點(diǎn)恢復(fù)原來的程序。這表明信號(hào)處理程序可以在用戶態(tài)執(zhí)行。20進(jìn)程P1操作系統(tǒng)OS主程序進(jìn)程P2kill(P2,5)信號(hào)處理程序kill系統(tǒng)調(diào)用中斷處理和進(jìn)程調(diào)度P2的PCB 信號(hào)域:5P1的PC

11、B 信號(hào)域:信號(hào)終止處理和斷點(diǎn)返回?cái)帱c(diǎn)21信號(hào)機(jī)制的實(shí)現(xiàn) 系統(tǒng)空間中斷或異常服務(wù)當(dāng)前進(jìn)程因中斷/異常而進(jìn)入核心態(tài)在返回用戶態(tài)之前,調(diào)用do_signal( ),handle_signal( )轉(zhuǎn)向用戶空間執(zhí)行信號(hào)處理程序陷入內(nèi)核后執(zhí)行善后工作從內(nèi)核返回用戶空間 信號(hào)的檢測(cè)與處理流程用戶空間應(yīng)用程序信號(hào)處理程序應(yīng)用程序繼續(xù)執(zhí)行發(fā)送信號(hào)執(zhí)行信號(hào)處理程序斷點(diǎn)斷點(diǎn)返回信號(hào)處理程序執(zhí)行結(jié)束,執(zhí)行sigreturn( )22四、管道通信機(jī)制(1)1、管道的定義管道(pipeline)是連接讀寫進(jìn)程的一個(gè)特殊文件,允許進(jìn)程按先進(jìn)先出(FCFS)方式傳送數(shù)據(jù),也能使進(jìn)程同步執(zhí)行操作。發(fā)送進(jìn)程以字符流形式把大量

12、數(shù)據(jù)送入管道尾部,接收進(jìn)程從管道頭部接收數(shù)據(jù),所以叫管道通信。2、管道的實(shí)質(zhì)管道的實(shí)質(zhì)是一個(gè)共享文件,存在于內(nèi)存中,基本上可借助于文件系統(tǒng)的機(jī)制實(shí)現(xiàn),包括(管道)文件的創(chuàng)建、打開、關(guān)閉和讀寫。23四、管道通信機(jī)制(2)3、讀寫進(jìn)程之間的同步讀寫進(jìn)程訪問共享文件需要同步:(1)管道文件應(yīng)互斥使用,管道讀寫不能同時(shí)進(jìn)行。一個(gè)進(jìn)程正在執(zhí)行管道寫入或讀出操作時(shí),另一進(jìn)程須等待。讀寫結(jié)束時(shí),喚醒等待進(jìn)程。 (write阻塞、read阻塞)讀寫互斥標(biāo)志位位于管道文件inode節(jié)點(diǎn)特征域。(2)發(fā)送者和接收者雙方必須能夠知道對(duì)方是否存在,如果對(duì)方已經(jīng)不存在,就沒有必要再發(fā)送或接收信息。系統(tǒng)發(fā)送SIGPIPE

13、信號(hào)通知進(jìn)程對(duì)方不存在。24四、管道通信機(jī)制(3)(3)管道還存在寫溢出問題,因?yàn)楣艿牢募臻g的大小是有限的,只使用inode節(jié)點(diǎn)的直接地址,長度不超過10個(gè)盤塊。寫入時(shí)需判斷管道空間是否夠用,不夠用則阻塞,待讀取數(shù)據(jù)后喚醒寫進(jìn)程。25四、管道通信機(jī)制(4)4、管道的實(shí)現(xiàn)機(jī)制(1)管道創(chuàng)建及使用的步驟第一步:應(yīng)用程序使用管道創(chuàng)建函數(shù)pipe()創(chuàng)建管道。int pipe(int files2);files0包含管道read()端的文件描述符,files1包含管道write()端的文件描述符。pipe()參數(shù)中沒有路徑名,其他現(xiàn)存進(jìn)程無法得到該管道的文件描述符。第二步:創(chuàng)建兩個(gè)進(jìn)程讀進(jìn)程和寫進(jìn)程

14、用來讀寫管道。26#include #include #include int main(void) int files2,nbytes; pid_t childpid; char string=“Hello,world!n”; char readbuffer80; pipe(files); if(childpid=fork()=-1) /*fork()函數(shù)調(diào)用一次,返回兩次:在子進(jìn)程中返回0;在父進(jìn)程中返回子進(jìn)程的進(jìn)程ID;出錯(cuò)則返回-1*/ printf(“Error:fork”); exit(1); 27 if(childpid=0)/*子進(jìn)程是管道的寫進(jìn)程*/ close(files0

15、);/*關(guān)閉寫進(jìn)程不需要的讀端*/ write(files1,string,strlen(string); close(files1);/*關(guān)閉管道的寫端*/ exit(0); else close(files1); /*關(guān)閉讀進(jìn)程不需要的寫端*/ nbytes=read(files0,readbuffer,sizeof(readbuffer); printf(“Received string:%s”, readbuffer); close(files0);/*關(guān)閉管道的讀端*/ return(0);28四、管道通信機(jī)制(5)對(duì)于fork()函數(shù),調(diào)用一次,返回兩次:在子進(jìn)程中返回0;在父進(jìn)程

16、中返回子進(jìn)程的進(jìn)程ID;出錯(cuò)則返回-1。為什么子進(jìn)程中只需返回0,而無需返回父進(jìn)程的進(jìn)程ID?子進(jìn)程中可以調(diào)用getppid()函數(shù)來獲得父進(jìn)程的進(jìn)程ID為什么在父進(jìn)程中要返回子進(jìn)程的進(jìn)程ID?一個(gè)父進(jìn)程可能有多個(gè)子進(jìn)程,所以在調(diào)用fork()函數(shù)創(chuàng)建新進(jìn)程是就需要保存新創(chuàng)建的子進(jìn)程的進(jìn)程ID29四、管道通信機(jī)制(6)pipe()返回2個(gè)句柄files0和files1,接收者即讀者進(jìn)程通過files0用read()讀出數(shù)據(jù),發(fā)送者即寫者進(jìn)程通過files1用write()向管道寫入數(shù)據(jù)。管道 不用時(shí)調(diào)用close()關(guān)閉管道。30四、管道通信機(jī)制(7)系統(tǒng)打開文件表用戶打開文件表主存活動(dòng)索引節(jié)

17、點(diǎn)表內(nèi)存fp讀進(jìn)程寫進(jìn)程fp文件節(jié)點(diǎn)指針文件節(jié)點(diǎn)指針?biāo)饕?jié)點(diǎn)pipe文件 pipe的數(shù)據(jù)結(jié)構(gòu)i_count=2files0files131四、管道通信機(jī)制(8)5、管道使用限制(1)匿名管道匿名管道僅用于具有共同祖先進(jìn)程的父子進(jìn)程或兄弟進(jìn)程之間的通信,僅存在于內(nèi)存中。(2)有名管道有名管道又稱FIFO,克服只能用于具有親緣關(guān)系的進(jìn)程之間通信的限制。特別用于服務(wù)器通過網(wǎng)絡(luò)與多個(gè)客戶進(jìn)行交互通信。FIFO具有文件名、目錄項(xiàng)、訪問權(quán)限,像文件一樣操作,通過FIFO不相關(guān)的進(jìn)程也能交換數(shù)據(jù)。有名管道使用mknod而非pipe創(chuàng)建,使用open打開管道,使用系統(tǒng)調(diào)用read和write讀寫管道。 32五

18、、共享主存通信機(jī)制(1)1、共享內(nèi)存的概念共享內(nèi)存是允許兩個(gè)或多個(gè)進(jìn)程共同訪問實(shí)現(xiàn)進(jìn)程通信的物理內(nèi)存區(qū)域。共享內(nèi)存會(huì)映射到各個(gè)進(jìn)程自己獨(dú)立的虛地址空間。2、內(nèi)存隔離與內(nèi)存共享每個(gè)進(jìn)程都有唯一的虛擬地址空間,各個(gè)進(jìn)程的虛擬地址空間是相互隔離、不能互相訪問的,但是共享內(nèi)存卻是通信進(jìn)程的公共地址空間。33五、共享主存通信機(jī)制(2)3、共享主存區(qū)到進(jìn)程虛擬地址空間的映射共享主存區(qū)應(yīng)映射到進(jìn)程中未使用的虛地址區(qū),以免與進(jìn)程映像發(fā)生沖突。共享主存的頁面在每個(gè)共享進(jìn)程的頁表中都有頁表項(xiàng)引用,但無須在所有進(jìn)程的虛地址段都有相同的地址。共享主存區(qū)屬于臨界資源,讀寫共享主存區(qū)的代碼自然屬于臨界區(qū)。34五、共享主存

19、通信機(jī)制(3) 進(jìn)程1的虛存空間虛存段進(jìn)程2的虛存空間虛存段 物理主存共享主存35五、共享主存通信機(jī)制(4)4、共享內(nèi)存操作函數(shù)(1)建立共享內(nèi)存int shmget(key,size,permflags)參數(shù)說明:key:標(biāo)識(shí)共享內(nèi)存的鍵值:0/IPC_PRIVATE。 當(dāng)key的取值為IPC_PRIVATE,則函數(shù)shmget()將創(chuàng)建一塊新的共享內(nèi)存;如果key的取值為0,而參數(shù)shmflg中設(shè)置了IPC_PRIVATE這個(gè)標(biāo)志,則同樣將創(chuàng)建一塊新的共享內(nèi)存。size(單位字節(jié)Byte):是要建立共享內(nèi)存的長度。所有的內(nèi)存分配操作都是以頁為單位的。所以如果一段進(jìn)程只申請(qǐng)一塊只有一個(gè)字節(jié)的

20、內(nèi)存,內(nèi)存也會(huì)分配整整一頁(在i386機(jī)器中一頁的缺省大小PACE_SIZE=4096字節(jié))。這樣,新創(chuàng)建的共享內(nèi)存的大小實(shí)際上是從size這個(gè)參數(shù)調(diào)整而來的頁面大小。即如果size為1至4096,則實(shí)際申請(qǐng)到的共享內(nèi)存大小為4K(一頁);若size=4097到8192,則實(shí)際申請(qǐng)到的共享內(nèi)存大小為8K(兩頁),依此類推。 36五、共享主存通信機(jī)制(5)shmflg:主要和一些標(biāo)志有關(guān)。其中有效的包括IPC_CREAT和IPC_EXCL,它們的功能與open()的O_CREAT和O_EXCL相當(dāng)。IPC_CREAT如果共享內(nèi)存不存在,則創(chuàng)建一個(gè)共享內(nèi)存,否則打開操作。IPC_EXCL只有在共享

21、內(nèi)存不存在的時(shí)候,新的共享內(nèi)存才建立,否則就產(chǎn)生錯(cuò)誤。 如果單獨(dú)使用IPC_CREAT,shmget()函數(shù)要么返回一個(gè)已經(jīng)存在的共享內(nèi)存的操作符,要么返回一個(gè)新建的共享內(nèi)存的標(biāo)識(shí)符。 如果將IPC_CREAT和IPC_EXCL標(biāo)志一起使用,shmget()將返回一個(gè)新建的共享內(nèi)存的標(biāo)識(shí)符;如果該共享內(nèi)存已存在,或者返回-1。IPC_EXEL標(biāo)志本身并沒有太大的意義,但是和IPC_CREAT標(biāo)志一起使用可以用來保證所得的對(duì)象是新建的,而不是打開已有的對(duì)象。對(duì)于用戶的讀取和寫入許可指定SHM_R和SHM_W,(SHM_R3)和(SHM_W3)是一組讀取和寫入許可,而(SHM_R6)和(SHM_W

22、6)是全局讀取和寫入許可。37五、共享主存通信機(jī)制(6)返回值-成功返回共享內(nèi)存的標(biāo)識(shí)符;不成功返回-1,errno儲(chǔ)存錯(cuò)誤原因。 EINVAL 參數(shù)size小于SHMMIN或大于SHMMAX。 EEXIST 預(yù)建立key所致的共享內(nèi)存,但已經(jīng)存在。 EIDRM 參數(shù)key所致的共享內(nèi)存已經(jīng)刪除。 ENOSPC 超過了系統(tǒng)允許建立的共享內(nèi)存的最大值(SHMALL )。 ENOENT 參數(shù)key所指的共享內(nèi)存不存在,參數(shù)shmflg也未設(shè)IPC_CREAT位。 EACCES 沒有權(quán)限。 ENOMEM 核心內(nèi)存不足。38五、共享主存通信機(jī)制(7)(2)把共享內(nèi)存區(qū)對(duì)象映射到調(diào)用進(jìn)程的地址空間 vo

23、id *shmat(int shmid, const void *shmaddr, int shmflg) 功能:連接共享內(nèi)存標(biāo)識(shí)符為shmid的共享內(nèi)存,連接成功后把共享內(nèi)存區(qū)對(duì)象映射到調(diào)用進(jìn)程的地址空間,隨后可像本地空間一樣訪問。參數(shù)說明:shmid:共享內(nèi)存標(biāo)識(shí)符shmaddr:指定共享內(nèi)存出現(xiàn)在進(jìn)程內(nèi)存地址的什么位置,直接指定為NULL讓內(nèi)核自己決定一個(gè)合適的地址位置 shmflg:SHM_RDONLY:為只讀模式,其他為讀寫模式 函數(shù)返回值成功:附加好的共享內(nèi)存地址 出錯(cuò):-1,錯(cuò)誤原因存于error中 39五、共享主存通信機(jī)制(8)附加說明:fork后子進(jìn)程繼承已連接的共享內(nèi)存地址

24、。exec后該子進(jìn)程與已連接的共享內(nèi)存地址自動(dòng)脫離(detach)。進(jìn)程結(jié)束后,已連接的共享內(nèi)存地址會(huì)自動(dòng)脫離(detach) 錯(cuò)誤代碼EACCES:無權(quán)限以指定方式連接共享內(nèi)存EINVAL:無效的參數(shù)shmid或shmaddrENOMEM:核心內(nèi)存不足40五、共享主存通信機(jī)制(9)(3)斷開共享內(nèi)存連接int shmdt(const void *shmaddr)功能:與shmat函數(shù)相反,是用來斷開與共享內(nèi)存附加點(diǎn)的地址,禁止本進(jìn)程訪問此片共享內(nèi)存 。參數(shù)說明:shmaddr:連接的共享內(nèi)存的起始地址 shmaddr:指定共享內(nèi)存出現(xiàn)在進(jìn)程內(nèi)存地址的什么位置,直接指定為NULL讓內(nèi)核自己決定

25、一個(gè)合適的地址位置 shmflg:SHM_RDONLY:為只讀模式,其他為讀寫模式 函數(shù)返回值成功:0 出錯(cuò):-1,錯(cuò)誤原因存于error中 附加說明:本函數(shù)調(diào)用并不刪除所指定的共享內(nèi)存區(qū),而只是將先前用shmat函數(shù)連接(attach)好的共享內(nèi)存脫離(detach)目前的進(jìn)程錯(cuò)誤代碼EINVAL:無效的參數(shù)shmaddr41五、共享主存通信機(jī)制(10)(4)共享內(nèi)存管理 int shmctl(int shmid, int cmd, struct shmid_ds *buf)功能:完成對(duì)共享內(nèi)存的控制 。參數(shù)說明:shmid :共享內(nèi)存標(biāo)識(shí)符 cmd IPC_STAT:得到共享內(nèi)存的狀態(tài),把

26、共享內(nèi)存的shmid_ds結(jié)構(gòu)復(fù)制到buf中 IPC_SET:改變共享內(nèi)存的狀態(tài),把buf所指的shmid_ds結(jié)構(gòu)中的uid、gid、mode復(fù)制到共享內(nèi)存的shmid_ds結(jié)構(gòu)內(nèi) IPC_RMID:刪除這片共享內(nèi)存buf:共享內(nèi)存管理結(jié)構(gòu)體。具體說明參見共享內(nèi)存內(nèi)核結(jié)構(gòu)定義部分42五、共享主存通信機(jī)制(11)函數(shù)返回值成功:0 出錯(cuò):-1,錯(cuò)誤原因存于error中 附加說明:本函數(shù)調(diào)用并不刪除所指定的共享內(nèi)存區(qū),而只是將先前用shmat函數(shù)連接(attach)好的共享內(nèi)存脫離(detach)目前的進(jìn)程錯(cuò)誤代碼EACCESS:參數(shù)cmd為IPC_STAT,確無權(quán)限讀取該共享內(nèi)存EFAULT:

27、參數(shù)buf指向無效的內(nèi)存地址EIDRM:標(biāo)識(shí)符為msqid的共享內(nèi)存已被刪除EINVAL:無效的參數(shù)cmd或shmidEPERM:參數(shù)cmd為IPC_SET或IPC_RMID,卻無足夠的權(quán)限執(zhí)行43五、共享主存通信機(jī)制(12)/共享內(nèi)存區(qū)段的掛載,脫離和使用/理解共享內(nèi)存區(qū)段就是一塊大內(nèi)存#include#include#include#include#defineMY_SHM_ID67483intmain()/共享內(nèi)存區(qū)段的掛載和脫離intshmid,ret;void*mem;shmid=shmget(MY_SHM_ID,0,0);if(shmid=0)mem=shmat(shmid,(co

28、nstvoid*)0,0);/shmat()返回進(jìn)程地址空間中指向區(qū)段的指針44五、共享主存通信機(jī)制(13)if(int)mem!=-1)printf(Sharedmemorywasattachedinouraddressspaceat%p/n,mem);/向共享區(qū)段內(nèi)存寫入數(shù)據(jù)strcpy(char*)mem,Thisisateststring./n);printf(%s/n,(char*)mem);/脫離共享內(nèi)存區(qū)段ret=shmdt(mem);if(ret=0)printf(Successfullydetachedmemory/n);elseprintf(Memorydetachedfa

29、iled%d/n,errno);elseprintf(shmat()failed/n);45五、共享主存通信機(jī)制(14)elseprintf(sharedmemorysegmentnotfound/n);return0;46六、消息傳遞通信機(jī)制(1)1、消息的概念消息是格式化的數(shù)據(jù),在計(jì)算機(jī)網(wǎng)絡(luò)中稱報(bào)文。 消息由消息頭和消息體組成。2、消息傳遞通信機(jī)制的組成主要由信箱、發(fā)送(send)原語和接收原語(receive)組成。信箱是存放信件的存儲(chǔ)區(qū)域,每個(gè)信箱可分成信箱頭和信箱體兩部分。信箱頭指出信箱容量、信件格式、信件位置指針等;信箱體用來存放信件,可分成若干個(gè)區(qū),每個(gè)區(qū)容納一個(gè)信件。47六、消

30、息傳遞通信機(jī)制(2)原語send(A,信件):若信箱未滿,則把一封信件(消息)發(fā)送到信箱A,同時(shí)喚醒信件等待者進(jìn)程,否則發(fā)送者阻塞。原語receive(A,信件):若信箱不空,則從信箱A接收一封信件(消息),同時(shí)喚醒等待發(fā)送者進(jìn)程;否則接受者阻塞。同步細(xì)節(jié)均被封裝。發(fā)送(send)原語和接收原語(receive)包含有阻塞喚醒機(jī)制,程序員使用它們進(jìn)行程序設(shè)計(jì)時(shí)如同進(jìn)行順序程序設(shè)計(jì),而不是并發(fā)程序設(shè)計(jì)。48六、消息傳遞通信機(jī)制(3)3、應(yīng)用范圍單機(jī)系統(tǒng)、多機(jī)系統(tǒng)、計(jì)算機(jī)網(wǎng)絡(luò)。4、信箱的所有權(quán)問題 一個(gè)信箱可以為一個(gè)進(jìn)程所有,也可以為操作系統(tǒng)所有。如果信箱為進(jìn)程所有,則必須區(qū)分信箱的所有者和它的用

31、戶。當(dāng)擁有信箱的進(jìn)程執(zhí)行結(jié)束時(shí),信箱也隨之消失,這時(shí),擁有信箱的進(jìn)程必須將這一情況通知這個(gè)信箱的用戶。操作系統(tǒng)擁有的信箱由操作系統(tǒng)設(shè)置,供相互通信的進(jìn)程共享。如消息緩沖機(jī)制。49六、消息傳遞通信機(jī)制(4)5、通信進(jìn)程的同步問題當(dāng)發(fā)送進(jìn)程執(zhí)行send發(fā)出一封信件后,它本身的執(zhí)行可以分兩種情況:一種是阻塞型,等待接收進(jìn)程回答消息后才繼續(xù)進(jìn)行下去;另一種是非阻塞型,發(fā)出信件后不等回信立即執(zhí)行下去,直到某個(gè)時(shí)刻需要接收進(jìn)程送來的消息時(shí),才對(duì)回答信件進(jìn)行處理。對(duì)于接收進(jìn)程,執(zhí)行receive后也可以是阻塞型和非阻塞型的,前者指直到信件交付完成它都處于等待信件狀態(tài);后者則不要求進(jìn)程等待,當(dāng)它需要信件時(shí),再

32、去查找并接收信件,需要時(shí)再發(fā)送回答信件。50六、消息傳遞通信機(jī)制(5)阻塞型send和阻塞型receive用于進(jìn)程不設(shè)緩沖區(qū)的緊密同步方式。兩個(gè)進(jìn)程平時(shí)都處于阻塞狀態(tài),直到有消息傳遞才被喚醒工作。非阻塞型send和阻塞型receive:發(fā)送進(jìn)程不阻塞,可把一個(gè)或多個(gè)消息發(fā)給目標(biāo)進(jìn)程,接收進(jìn)程平時(shí)都處于阻塞狀態(tài),直到有消息傳來才被喚醒。如客戶機(jī)/服務(wù)器工作模式。非阻塞型send和非阻塞型receive:如能容納多個(gè)消息的消息隊(duì)列連接的收發(fā)進(jìn)程只有在隊(duì)列滿或空時(shí)才有其中之一阻塞。阻塞型receive:請(qǐng)求消息的進(jìn)程大都需要接收并處理消息后才能繼續(xù)執(zhí)行下去。51六、消息傳遞通信機(jī)制(6)6、傳遞通信

33、與信號(hào)、管道、共享內(nèi)存的區(qū)別信號(hào)不是數(shù)據(jù),不用來傳遞大量數(shù)據(jù);管道和共享內(nèi)存存在于有關(guān)聯(lián)的進(jìn)程之間,是他們私有的通信資源,由私有進(jìn)程維護(hù);傳遞通信中的消息隊(duì)列存在于系統(tǒng)內(nèi)核空間,可以在系統(tǒng)范圍內(nèi)公開給所有不相關(guān)的進(jìn)程使用,也可以公開給不在同一機(jī)器上的不同進(jìn)程使用,消息隊(duì)列由OS內(nèi)核負(fù)責(zé)維護(hù)。52六、消息傳遞通信機(jī)制(7)使用消息隊(duì)列時(shí),一個(gè)進(jìn)程要向隊(duì)列中寫入消息,這要引起從用戶地址空間向內(nèi)核地址空間的一次復(fù)制,同樣一個(gè)進(jìn)程進(jìn)行消息讀取時(shí)也要進(jìn)行一次復(fù)制。共享內(nèi)存的優(yōu)點(diǎn)是完全省去了這些操作。共享內(nèi)存會(huì)映射到進(jìn)程的虛擬地址空間,進(jìn)程對(duì)其可以直接訪問,避免了數(shù)據(jù)的復(fù)制過程。53六、消息傳遞通信機(jī)制(

34、8)7、Linux的消息隊(duì)列通信機(jī)制(1)消息隊(duì)列的屬性消息隊(duì)列(也叫做報(bào)文隊(duì)列)是Unix系統(tǒng)V版本中3種進(jìn)程間通信機(jī)制之一。另外兩種是信號(hào)燈和共享內(nèi)存。這些IPC機(jī)制使用共同的授權(quán)方法。只有通過系統(tǒng)調(diào)用將標(biāo)志符傳遞給核心之后,進(jìn)程才能存取這些資源。這種系統(tǒng)IPC對(duì)象使用的控制方法和文件系統(tǒng)非常類似。使用對(duì)象的引用標(biāo)志符作為資源表中的索引。 54六、消息傳遞通信機(jī)制(9)Linux的消息隊(duì)列通信機(jī)制屬于消息傳遞通信機(jī)制。消息隊(duì)列是內(nèi)核地址空間中的內(nèi)部鏈表。消息可以順序地發(fā)送到隊(duì)列中,并以幾種不同的方式從隊(duì)列中獲取。每個(gè)消息隊(duì)列都是由IPC標(biāo)識(shí)符所唯一標(biāo)識(shí)的。對(duì)消息隊(duì)列有寫權(quán)限的進(jìn)程可以按照一

35、定的規(guī)則添加新消息;對(duì)消息隊(duì)列有讀權(quán)限的進(jìn)程則可以從消息隊(duì)列中讀出消息。 55六、消息傳遞通信機(jī)制(10)Linux采用消息隊(duì)列的方式來實(shí)現(xiàn)消息傳遞。這種消息的發(fā)送方式是:發(fā)送方不必等待接收方檢查它所收到的消息就可以繼續(xù)工作下去,而接收方如果沒有收到消息也不需等待。新的消息總是放在隊(duì)列的末尾,接收的時(shí)候并不總是從頭來接收,可以從中間來接收。消息隊(duì)列是隨內(nèi)核持續(xù)的并和進(jìn)程相關(guān),即使進(jìn)程退出它仍然存在。只有在內(nèi)核重起或者顯示刪除一個(gè)消息隊(duì)列時(shí),該消息隊(duì)列才會(huì)真正被刪除。因此系統(tǒng)中記錄消息隊(duì)列的數(shù)據(jù)結(jié)構(gòu)(structipc_idsmsg_ids)位于內(nèi)核中,系統(tǒng)中的所有消息隊(duì)列都可以在結(jié)構(gòu)msg_ids中中找到訪問入口。56六、消息傳遞通信機(jī)制(11)IPC標(biāo)識(shí)符:每一個(gè)IPC目標(biāo)都有一個(gè)唯一的IPC標(biāo)識(shí)符。這里所指的IPC目標(biāo)是指一個(gè)單獨(dú)的消息隊(duì)列、一個(gè)信號(hào)量集或者一個(gè)共享的內(nèi)存段。系統(tǒng)內(nèi)核使用此標(biāo)識(shí)符在系統(tǒng)內(nèi)核中指明IPC目標(biāo)。IPC關(guān)鍵字:想要獲得唯一的標(biāo)識(shí)

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論