linux進(jìn)程間通信-共享內(nèi)存

linux進(jìn)程間通信-共享內(nèi)存

ID:8805068

大小:144.61 KB

頁(yè)數(shù):11頁(yè)

時(shí)間:2018-04-08

linux進(jìn)程間通信-共享內(nèi)存_第1頁(yè)
linux進(jìn)程間通信-共享內(nèi)存_第2頁(yè)
linux進(jìn)程間通信-共享內(nèi)存_第3頁(yè)
linux進(jìn)程間通信-共享內(nèi)存_第4頁(yè)
linux進(jìn)程間通信-共享內(nèi)存_第5頁(yè)
資源描述:

《linux進(jìn)程間通信-共享內(nèi)存》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫(kù)

1、共享內(nèi)存可以說(shuō)是最有用的進(jìn)程間通信方式,也是最快的IPC形式。兩個(gè)不同進(jìn)程A、B共享內(nèi)存的意思是,同一塊物理內(nèi)存被映射到進(jìn)程A、B各自的進(jìn)程地址空間。進(jìn)程A可以即時(shí)看到進(jìn)程B對(duì)共享內(nèi)存中數(shù)據(jù)的更新,反之亦然。由于多個(gè)進(jìn)程共享同一塊內(nèi)存區(qū)域,必然需要某種同步機(jī)制,互斥鎖和信號(hào)量都可以。采用共享內(nèi)存通信的一個(gè)顯而易見(jiàn)的好處是效率高,因?yàn)檫M(jìn)程可以直接讀寫(xiě)內(nèi)存,而不需要任何數(shù)據(jù)的拷貝。對(duì)于像管道和消息隊(duì)列等通信方式,則需要在內(nèi)核和用戶空間進(jìn)行四次的數(shù)據(jù)拷貝,而共享內(nèi)存則只拷貝兩次數(shù)據(jù)[1]:一次從輸入文件到共

2、享內(nèi)存區(qū),另一次從共享內(nèi)存區(qū)到輸出文件。實(shí)際上,進(jìn)程之間在共享內(nèi)存時(shí),并不總是讀寫(xiě)少量數(shù)據(jù)后就解除映射,有新的通信時(shí),再重新建立共享內(nèi)存區(qū)域。而是保持共享區(qū)域,直到通信完畢為止,這樣,數(shù)據(jù)內(nèi)容一直保存在共享內(nèi)存中,并沒(méi)有寫(xiě)回文件。共享內(nèi)存中的內(nèi)容往往是在解除映射時(shí)才寫(xiě)回文件的。因此,采用共享內(nèi)存的通信方式效率是非常高的。Linux的2.2.x內(nèi)核支持多種共享內(nèi)存方式,如mmap()系統(tǒng)調(diào)用,Posix共享內(nèi)存,以及系統(tǒng)V共享內(nèi)存。linux發(fā)行版本如Redhat8.0支持mmap()系統(tǒng)調(diào)用及系統(tǒng)V共

3、享內(nèi)存,但還沒(méi)實(shí)現(xiàn)Posix共享內(nèi)存,本文將主要介紹mmap()系統(tǒng)調(diào)用及系統(tǒng)V共享內(nèi)存API的原理及應(yīng)用。一、內(nèi)核怎樣保證各個(gè)進(jìn)程尋址到同一個(gè)共享內(nèi)存區(qū)域的內(nèi)存頁(yè)面1、pagecache及swapcache中頁(yè)面的區(qū)分:一個(gè)被訪問(wèn)文件的物理頁(yè)面都駐留在pagecache或swapcache中,一個(gè)頁(yè)面的所有信息由structpage來(lái)描述。structpage中有一個(gè)域?yàn)橹羔榤apping,它指向一個(gè)structaddress_space類型結(jié)構(gòu)。pagecache或swapcache中的所有頁(yè)面就

4、是根據(jù)address_space結(jié)構(gòu)以及一個(gè)偏移量來(lái)區(qū)分的。2、文件與address_space結(jié)構(gòu)的對(duì)應(yīng):一個(gè)具體的文件在打開(kāi)后,內(nèi)核會(huì)在內(nèi)存中為之建立一個(gè)structinode結(jié)構(gòu),其中的i_mapping域指向一個(gè)address_space結(jié)構(gòu)。這樣,一個(gè)文件就對(duì)應(yīng)一個(gè)address_space結(jié)構(gòu),一個(gè)address_space與一個(gè)偏移量能夠確定一個(gè)pagecache或swapcache中的一個(gè)頁(yè)面。因此,當(dāng)要尋址某個(gè)數(shù)據(jù)時(shí),很容易根據(jù)給定的文件及數(shù)據(jù)在文件內(nèi)的偏移量而找到相應(yīng)的頁(yè)面。3、進(jìn)

5、程調(diào)用mmap()時(shí),只是在進(jìn)程空間內(nèi)新增了一塊相應(yīng)大小的緩沖區(qū),并設(shè)置了相應(yīng)的訪問(wèn)標(biāo)識(shí),但并沒(méi)有建立進(jìn)程空間到物理頁(yè)面的映射。因此,第一次訪問(wèn)該空間時(shí),會(huì)引發(fā)一個(gè)缺頁(yè)異常。4、對(duì)于共享內(nèi)存映射情況,缺頁(yè)異常處理程序首先在swapcache中尋找目標(biāo)頁(yè)(符合address_space以及偏移量的物理頁(yè)),如果找到,則直接返回地址;如果沒(méi)有找到,則判斷該頁(yè)是否在交換區(qū)(swaparea),如果在,則執(zhí)行一個(gè)換入操作;如果上述兩種情況都不滿足,處理程序?qū)⒎峙湫碌奈锢眄?yè)面,并把它插入到pagecache中。

6、進(jìn)程最終將更新進(jìn)程頁(yè)表。注:對(duì)于映射普通文件情況(非共享映射),缺頁(yè)異常處理程序首先會(huì)在pagecache中根據(jù)address_space以及數(shù)據(jù)偏移量尋找相應(yīng)的頁(yè)面。如果沒(méi)有找到,則說(shuō)明文件數(shù)據(jù)還沒(méi)有讀入內(nèi)存,處理程序會(huì)從磁盤(pán)讀入相應(yīng)的頁(yè)面,并返回相應(yīng)地址,同時(shí),進(jìn)程頁(yè)表也會(huì)更新。5、所有進(jìn)程在映射同一個(gè)共享內(nèi)存區(qū)域時(shí),情況都一樣,在建立線性地址與物理地址之間的映射之后,不論進(jìn)程各自的返回地址如何,實(shí)際訪問(wèn)的必然是同一個(gè)共享內(nèi)存區(qū)域?qū)?yīng)的物理頁(yè)面。注:一個(gè)共享內(nèi)存區(qū)域可以看作是特殊文件系統(tǒng)shm中的

7、一個(gè)文件,shm的安裝點(diǎn)在交換區(qū)上。上面涉及到了一些數(shù)據(jù)結(jié)構(gòu),圍繞數(shù)據(jù)結(jié)構(gòu)理解問(wèn)題會(huì)容易一些。二、mmap()及其相關(guān)系統(tǒng)調(diào)用mmap()系統(tǒng)調(diào)用使得進(jìn)程之間通過(guò)映射同一個(gè)普通文件實(shí)現(xiàn)共享內(nèi)存。普通文件被映射到進(jìn)程地址空間后,進(jìn)程可以向訪問(wèn)普通內(nèi)存一樣對(duì)文件進(jìn)行訪問(wèn),不必再調(diào)用read(),write()等操作。注:實(shí)際上,mmap()系統(tǒng)調(diào)用并不是完全為了用于共享內(nèi)存而設(shè)計(jì)的。它本身提供了不同于一般對(duì)普通文件的訪問(wèn)方式,進(jìn)程可以像讀寫(xiě)內(nèi)存一樣對(duì)普通文件的操作。而Posix或系統(tǒng)V的共享內(nèi)存IPC則純

8、粹用于共享目的,當(dāng)然mmap()實(shí)現(xiàn)共享內(nèi)存也是其主要應(yīng)用之一。1、mmap()系統(tǒng)調(diào)用形式如下:void*mmap(void*addr,size_tlen,intprot,intflags,intfd,off_toffset)參數(shù)fd為即將映射到進(jìn)程空間的文件描述字,一般由open()返回,同時(shí),fd可以指定為-1,此時(shí)須指定flags參數(shù)中的MAP_ANON,表明進(jìn)行的是匿名映射(不涉及具體的文件名,避免了文件的創(chuàng)建及打開(kāi),很顯然只能用于具有親緣關(guān)系

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫(huà)的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問(wèn)題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。