進(jìn)程間通信就是在不同進(jìn)程之間傳播或交換信息,那么不同進(jìn)程之間存在著什么雙方都可以訪問的介質(zhì)呢?進(jìn)程的用戶空間是互相獨(dú)立的,一般而言是不能互相訪問的,唯一的例外是共享內(nèi)存區(qū)。但是,系統(tǒng)空間卻是"公共場所",所以內(nèi)核顯然可以提供這樣的條件。除此以外,那就是雙方都可以訪問的外設(shè)了。在這個(gè)意義上,兩個(gè)進(jìn)程當(dāng)然也可以通過磁盤上的普通文件交換信息,或者通過"注冊(cè)表"或其它數(shù)據(jù)庫中的某些表項(xiàng)和記錄交換信息。廣義上這也是進(jìn)程間通信的手段,但是一般都不把這算作"進(jìn)程間通信"。
進(jìn)程間通信管道
普通的Linux shell都允許重定向,而重定向使用的就是管道。例如:
$ ls | pr | lpr
把命令ls(列出目錄中的文件)的輸出通過管道連接到命令pr的標(biāo)準(zhǔn)輸入上進(jìn)行分頁。最后,命令pr的標(biāo)準(zhǔn)輸出通過管道連接到命令lpr的標(biāo)準(zhǔn)輸入上,從而在缺省打印機(jī)上打印出結(jié)果。進(jìn)程感覺不到這種重定向,它們和平常一樣地工作。正是shell建立了進(jìn)程之間的臨時(shí)管道。
管道是單向的、先進(jìn)先出的、無結(jié)構(gòu)的、固定大小的字節(jié)流,它把一個(gè)進(jìn)程的標(biāo)準(zhǔn)輸出和另一個(gè)進(jìn)程的標(biāo)準(zhǔn)輸入連接在一起。寫進(jìn)程在管道的尾端寫入數(shù)據(jù),讀進(jìn)程在管道的首端讀出數(shù)據(jù)。數(shù)據(jù)讀出后將從管道中移走,其它讀進(jìn)程都不能再讀到這些數(shù)據(jù)。管道提供了簡單的流控制機(jī)制。進(jìn)程試圖讀空管道時(shí),在有數(shù)據(jù)寫入管道前,進(jìn)程將一直阻塞。同樣,管道已經(jīng)滿時(shí),進(jìn)程再試圖寫管道,在其它進(jìn)程從管道中移走數(shù)據(jù)之前,寫進(jìn)程將一直阻塞。
傳統(tǒng)上有很多種實(shí)現(xiàn)管道的方法,如利用文件系統(tǒng)、利用套接字(sockets)、利用流等。在Linux中,使用兩個(gè)file數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn)管道。這兩個(gè)file數(shù)據(jù)結(jié)構(gòu)中的f_inode(f_dentry)指針指向同一個(gè)臨時(shí)創(chuàng)建的VFS I節(jié)點(diǎn),而該VFS I節(jié)點(diǎn)本身又指向內(nèi)存中的一個(gè)物理頁,如圖5.1所示。兩個(gè)file數(shù)據(jù)結(jié)構(gòu)中的f_op指針指向不同的文件操作例程向量表:一個(gè)用于向管道中寫,另一個(gè)用于從管道中讀。這種實(shí)現(xiàn)方法掩蓋了底層實(shí)現(xiàn)的差異,從進(jìn)程的角度來看,讀寫管道的系統(tǒng)調(diào)用和讀寫普通文件的普通系統(tǒng)調(diào)用沒什么不同。當(dāng)寫進(jìn)程向管道中寫時(shí),字節(jié)被拷貝到了共享數(shù)據(jù)頁,當(dāng)讀進(jìn)程從管道中讀時(shí),字節(jié)被從共享頁中拷貝出來。Linux必須同步對(duì)于管道的存取,必須保證管道的寫和讀步調(diào)一致。Linux使用鎖、等待隊(duì)列和信號(hào)(locks,wait queues and signals)來實(shí)現(xiàn)同步。
右圖 --管道示意圖所示
參見include/linux/inode_fs.h
當(dāng)寫進(jìn)程向管道寫的時(shí)候,它使用標(biāo)準(zhǔn)的write庫函數(shù)。這些庫函數(shù)(read、write等)要求傳遞一個(gè)文件描述符作為參數(shù)。文件描述符是該文件對(duì)應(yīng)的file數(shù)據(jù)結(jié)構(gòu)在進(jìn)程的file數(shù)據(jù)結(jié)構(gòu)數(shù)組中的索引,每一個(gè)都表示一個(gè)打開的文件,在這種情況下,是打開的管道。Linux系統(tǒng)調(diào)用使用描述這個(gè)管道的file數(shù)據(jù)結(jié)構(gòu)中f_op所指的write例程,該write例程使用表示管道的VFS I 節(jié)點(diǎn)中存放的信息,來管理寫請(qǐng)求。如果共享數(shù)據(jù)頁中有足夠的空間能把所有的字節(jié)都寫到管道中,而且管道沒有被讀進(jìn)程鎖定,則Linux就在管道上為寫進(jìn)程加鎖,并把字節(jié)從進(jìn)程的地址空間拷貝到共享數(shù)據(jù)頁。如果管道被讀進(jìn)程鎖定或者共享數(shù)據(jù)頁中沒有足夠的空間,則當(dāng)前進(jìn)程被迫睡眠,它被掛在管道I節(jié)點(diǎn)的等待隊(duì)列中等待,而后調(diào)用調(diào)度程序,讓另外一個(gè)進(jìn)程運(yùn)行。睡眠的寫進(jìn)程是可以中斷的(interruptible),所以它可以接收信號(hào)。當(dāng)管道中有了足夠的空間可以寫數(shù)據(jù),或者當(dāng)鎖定解除時(shí),寫進(jìn)程就會(huì)被讀進(jìn)程喚醒。當(dāng)數(shù)據(jù)寫完之后,管道的VFS I 節(jié)點(diǎn)上的鎖定解除,在管道I節(jié)點(diǎn)的等待隊(duì)列中等待的所有讀進(jìn)程都會(huì)被喚醒。
參見fs/pipe.c pipe_write()
從管道中讀取數(shù)據(jù)和寫數(shù)據(jù)非常相似。Linux允許進(jìn)程無阻塞地讀文件或管道(依賴于它們打開文件或者管道的模式),這時(shí),如果沒有數(shù)據(jù)可讀或者管道被鎖定,系統(tǒng)調(diào)用會(huì)返回一個(gè)錯(cuò)誤。這意味著進(jìn)程會(huì)繼續(xù)運(yùn)行。另一種方式是阻塞讀,即進(jìn)程在管道I節(jié)點(diǎn)的等待隊(duì)列中等待,直到寫進(jìn)程完成。
如果所有的進(jìn)程都完成了它們的管道操作,則管道的I節(jié)點(diǎn)和相應(yīng)的共享數(shù)據(jù)頁會(huì)被廢棄。
參見fs/pipe.c pipe_read()
Linux也支持命名管道(也叫FIFO,因?yàn)楣艿拦ぷ髟谙热胂瘸龅脑瓌t下,第一個(gè)寫入管道的數(shù)據(jù)也是第一個(gè)被讀出的數(shù)據(jù))。與管道不同,F(xiàn)IFO不是臨時(shí)的對(duì)象,它們是文件系統(tǒng)中真正的實(shí)體,可以用mkfifo命令創(chuàng)建。只要有合適的訪問權(quán)限,進(jìn)程就可以使用FIFO。FIFO的打開方式和管道稍微不同。一個(gè)管道(它的兩個(gè)file數(shù)據(jù)結(jié)構(gòu)、VFS I節(jié)點(diǎn)和共享數(shù)據(jù)頁)是一次性創(chuàng)建的,而FIFO已經(jīng)存在,可以由它的用戶打開和關(guān)閉。Linux必須處理在寫進(jìn)程打開FIFO之前讀進(jìn)程對(duì)它的打開,也必須處理在寫進(jìn)程寫數(shù)據(jù)之前讀進(jìn)程對(duì)管道的讀。除此以外,F(xiàn)IFO幾乎和管道的處理完全一樣,而且它們使用一樣的數(shù)據(jù)結(jié)構(gòu)和操作。
從IPC的角度看,管道提供了從一個(gè)進(jìn)程向另一個(gè)進(jìn)程傳輸數(shù)據(jù)的有效方法。但是,管道有一些固有的局限性:
l 因?yàn)樽x數(shù)據(jù)的同時(shí)也將數(shù)據(jù)從管道移去,因此,管道不能用來對(duì)多個(gè)接收者廣播數(shù)據(jù)。
l 管道中的數(shù)據(jù)被當(dāng)作字節(jié)流,因此無法識(shí)別信息的邊界。
l 如果一個(gè)管道有多個(gè)讀進(jìn)程,那么寫進(jìn)程不能發(fā)送數(shù)據(jù)到指定的讀進(jìn)程。同樣,如果有多個(gè)寫進(jìn)程,那么沒有辦法判斷是它們中那一個(gè)發(fā)送的數(shù)據(jù)。
首先上網(wǎng)找到進(jìn)程掃把軟件,然后下載到電腦,安裝好就可以用了。 一款系統(tǒng)殘留進(jìn)程清理軟件 進(jìn)程掃把是一款系統(tǒng)殘留進(jìn)程清理...
進(jìn)程掃把還可以對(duì)系統(tǒng)進(jìn)程進(jìn)行監(jiān)測,自動(dòng)監(jiān)測系統(tǒng)進(jìn)程的變化,一旦發(fā)現(xiàn)有新的軟件啟動(dòng)或者退出,就會(huì)對(duì)內(nèi)存進(jìn)行一次清理,最大限度的發(fā)揮了內(nèi)存掃把的清理效果。并且還有清理內(nèi)存和剪貼板的熱鍵,可以使您隨時(shí)方便的...
萬能掃把價(jià)格120--230元,萬能掃把:歐洲、亞洲以及世界上的大部分地區(qū),廣泛應(yīng)用一種用高粱稈做的掃把。美國總統(tǒng)富蘭克林為了發(fā)展農(nóng)業(yè)提倡種高粱,于是,高粱的栽植遍及美國。有一天,哈得里的一個(gè)老農(nóng)夫需...
格式:pdf
大?。?span id="ud4b3al" class="single-tag-height">187KB
頁數(shù): 12頁
評(píng)分: 4.3
《操作系統(tǒng)原理與 Linux》 課程設(shè)計(jì)報(bào)告 專 業(yè) 計(jì)算機(jī)科學(xué)與技術(shù) 班 級(jí) 學(xué) 號(hào) 姓 名 指導(dǎo)教師 完成時(shí)間 2012年 9月 14日 成 績 操作系統(tǒng)課程設(shè)計(jì) 一、設(shè)計(jì)題目 進(jìn)程間通信模擬 二、設(shè)計(jì)目的 通過該題目的設(shè)計(jì)過程,了解了進(jìn)程通訊的兩種方式,管道通信以及消息通 信。熟悉操作系統(tǒng)支持的進(jìn)程通信方式 三、設(shè)計(jì)要求 (1)要求實(shí)現(xiàn)管道通信與消息通信兩種方式. (2)要求界面簡單,易懂,關(guān)鍵代碼部分要注釋. (3)編程語言可以采用自己任意精通的語言 四、設(shè)計(jì)思想說明 創(chuàng)建一個(gè)內(nèi)存共享區(qū),實(shí)現(xiàn)消息管道的進(jìn)程間通訊。 五、系統(tǒng)結(jié)構(gòu)的說明 本程序是采用 MFC 框架所編寫的 win32應(yīng)用程序 采用 C++語言。 六、數(shù)據(jù)結(jié)構(gòu)的說明 管道通信定義了一個(gè)結(jié)構(gòu)體,存放管道基礎(chǔ)信息: struct PipeStruct// 定義管道基礎(chǔ)信息 { int UseProCount;// 當(dāng)
格式:pdf
大小:187KB
頁數(shù): 6頁
評(píng)分: 4.5
進(jìn)程間通信作為操作系統(tǒng)中最重要的原語之一,提供了在多個(gè)隔離的進(jìn)程之間相互通信交流的可能性.提出了一種適用于微內(nèi)核操作系統(tǒng)的進(jìn)程間通信系統(tǒng),并在具體的Minix操作系統(tǒng)平臺(tái)之上予以實(shí)現(xiàn),解決了Minix系統(tǒng)中由于進(jìn)程間通信模塊的缺失而導(dǎo)致開發(fā)人員無法順利移植其他平臺(tái)的實(shí)用程序的問題。實(shí)驗(yàn)數(shù)據(jù)表明,該進(jìn)程間通信系統(tǒng)具有高效的特點(diǎn);同時(shí)由于該系統(tǒng)的設(shè)計(jì)原則,它保持著易擴(kuò)展的特點(diǎn)。該系統(tǒng)的實(shí)現(xiàn)雖然是基于Minix平臺(tái),但該設(shè)計(jì)同樣適用于其他微內(nèi)核的系統(tǒng),對(duì)其他操作系統(tǒng)具有借鑒意義。
?COM是微軟自1993年便提出的組件式軟件平臺(tái),用來做進(jìn)程間通信(Inter-process communication, IPC)以及當(dāng)作組件式軟件開發(fā)的平臺(tái)。COM提供跟編程語言無關(guān)的方法實(shí)現(xiàn)一個(gè)軟件對(duì)象,因此可以在其他環(huán)境中運(yùn)行。COM要求軟件組件必須遵照一個(gè)共同的接口,該接口與實(shí)現(xiàn)無關(guān),因此可以隱藏實(shí)現(xiàn)屬性,并且被其他對(duì)象在不知道其內(nèi)部實(shí)現(xiàn)的情形下正確的使用。
COM并被實(shí)現(xiàn)于多個(gè)平臺(tái)之上,并不限于Windows操作系統(tǒng)之上。但還是只有Windows最常使用COM,且某些功能已被目前的.NET平臺(tái)取代。
《建筑智能化系統(tǒng)及工程應(yīng)用》中介紹了Windows NT網(wǎng)絡(luò)操作系統(tǒng)的原理及應(yīng)用,重點(diǎn)討論了Windows NT網(wǎng)絡(luò)協(xié)議、網(wǎng)絡(luò)邊界層、進(jìn)程間通信機(jī)制,及對(duì)Win32/Win16和MS"_blank" href="/item/電氣信息類/5294336" data-lemmaid="5294336">電氣信息類、儀器儀表以及機(jī)電類各專業(yè)本科教學(xué)使用,也可供相關(guān)工程技術(shù)人員參考。
《建筑智能化系統(tǒng)及工程應(yīng)用》是近些年來編者從事智能建筑教學(xué)實(shí)踐、科研及實(shí)際智能建筑工程項(xiàng)目的經(jīng)驗(yàn)總結(jié)??紤]各院校專業(yè)基礎(chǔ)課安排側(cè)重點(diǎn)及體系結(jié)構(gòu)的差異,以及教學(xué)側(cè)重點(diǎn)不同,課堂的理論教學(xué)學(xué)時(shí)少,教學(xué)內(nèi)容多,又要加強(qiáng)工程實(shí)踐環(huán)節(jié)的需要,因此,在教材處理上,各章節(jié)安排相對(duì)獨(dú)立,但又注意相對(duì)完整性、系統(tǒng)性,使之通俗易懂便于自學(xué),給實(shí)施課堂教學(xué)的主講老師以更多的靈活性,不講授部分可以指定學(xué)生自學(xué)或供學(xué)生參考閱讀?!督ㄖ悄芑到y(tǒng)及工程應(yīng)用》第1~9章為基本內(nèi)容,第10章是一個(gè)實(shí)際工程項(xiàng)目的設(shè)計(jì)范例,較完整地討論了一個(gè)中央集成管理系統(tǒng),有一定可操作性,可供學(xué)生參考。2100433B
管道是Linux/UNIX系統(tǒng)中比較原始的進(jìn)程間通信形式,它實(shí)現(xiàn)數(shù)據(jù)以一種數(shù)據(jù)流的方式,在多進(jìn)程間流動(dòng)。在系統(tǒng)中其相當(dāng)于文件系統(tǒng)上的一個(gè)文件,來緩存所要傳輸?shù)臄?shù)據(jù)。管道通信是最常見的通信方式之一,其是在兩個(gè)進(jìn)程之間實(shí)現(xiàn)一個(gè)數(shù)據(jù)流通的管道,該管道可以是雙向或單向的。
我們將僅能在一個(gè)方向上傳遞信息的管道稱為半雙工管道,將可在兩個(gè)方向上傳遞信息的管道稱為全雙工管道。管道是一種很經(jīng)典的進(jìn)程之間的通信方式,其優(yōu)點(diǎn)在于簡單易用,其缺點(diǎn)在于功能簡單,有很多限制。