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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

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

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

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

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

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

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

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

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

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

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ù)調用一次,返回兩次:在子進程中返回0;在父進程中返回子進程的進程ID;出錯則返回-1*/ printf(“Error:fork”); exit(1); 27 if(childpid=0)/*子進程是管道的寫進程*/ close(files0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論