




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
課程實(shí)踐報(bào)告書(shū)課程名稱:操作系統(tǒng)原理題目:進(jìn)程通信-共享內(nèi)存學(xué)生姓名:專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)(網(wǎng)絡(luò)方向)班別:計(jì)科本113班學(xué)號(hào):1104402308指導(dǎo)老師:日期:2013年06月25日目錄一、基本要求 3二、流程圖分析 3三、共享內(nèi)存描述和使用 103.1共享內(nèi)存的概述 103.2共享內(nèi)存的原理 113.3共享內(nèi)存的分配 123.4共享內(nèi)存的訪問(wèn) 133.5共享內(nèi)存的應(yīng)用 133.6共享內(nèi)存的意義 14四、實(shí)驗(yàn)構(gòu)思 144.1main()的使用 144.2shmget()調(diào)用 164.3fork()的調(diào)用 164.4子進(jìn)程調(diào)用shmat() 174.5子進(jìn)程調(diào)用shmdt() 174.6父進(jìn)程調(diào)用shmctl() 174.7父進(jìn)程調(diào)用shmat(),shmdt(),shmctl() 18五、實(shí)驗(yàn)的調(diào)試與測(cè)試 18六、實(shí)驗(yàn)結(jié)果 20七、源程序 21八、實(shí)驗(yàn)感受 23九、參考文獻(xiàn) 24一、基本要求1.1實(shí)驗(yàn)題目:進(jìn)程通信共享內(nèi)存1.2實(shí)踐目的:用代碼實(shí)現(xiàn)進(jìn)程通信共享內(nèi)存1.3實(shí)踐內(nèi)容:用C語(yǔ)言代碼創(chuàng)建進(jìn)程,實(shí)現(xiàn)進(jìn)程通信共享內(nèi)存(父進(jìn)程和子進(jìn)程通過(guò)共享內(nèi)存實(shí)現(xiàn)信息的交流)1.4實(shí)驗(yàn)環(huán)境:linux操作系統(tǒng)及gcc工具二、流程圖分析圖1-1如圖1-1首先父進(jìn)程調(diào)用shmget()函數(shù)建立一個(gè)共享內(nèi)存,該函數(shù)返回一內(nèi)存的標(biāo)識(shí)符。圖1-2如圖1-2父進(jìn)程調(diào)用fork()產(chǎn)生一個(gè)子進(jìn)程圖1-3如圖1-3子進(jìn)程調(diào)用shmat()函數(shù)將該共享內(nèi)存連接到自己的虛存空間中圖1-4如圖1-4寫(xiě)完數(shù)據(jù)后,子進(jìn)程調(diào)用shmdt()函數(shù)斷開(kāi)與該進(jìn)程的連接如圖1-5如圖1-5父進(jìn)程調(diào)用shmctl()函數(shù)得到關(guān)于這塊共享內(nèi)存的相關(guān)信息,并打印出來(lái)圖1-6如圖1-6父進(jìn)程調(diào)用shmat()函數(shù)將這塊共享內(nèi)存連接到自己的虛存空間圖1-7如圖1-8父進(jìn)程調(diào)用shmdt()函數(shù)斷開(kāi)與該共享內(nèi)存的連接圖1-8如圖1-8父進(jìn)程調(diào)用shmctl()函數(shù),銷毀該共享進(jìn)程。三、共享內(nèi)存描述和使用3.1共享內(nèi)存的概述針對(duì)消息緩沖需要占用CPU進(jìn)行消息復(fù)制的缺點(diǎn),操作系統(tǒng)提供了一種進(jìn)程間直接進(jìn)行數(shù)據(jù)交換的通信方式——共享內(nèi)存。顧名思義,這種通信方式允許多個(gè)進(jìn)程共享同一塊物理內(nèi)存空間來(lái)實(shí)現(xiàn)進(jìn)程之間的信息交換,其特點(diǎn)是沒(méi)有中間環(huán)節(jié),直接將共享的內(nèi)存頁(yè)面通過(guò)附接,映射到相互通信的進(jìn)程各自的虛擬地址空間中,從而使多個(gè)進(jìn)程可以直接訪問(wèn)同一個(gè)物理內(nèi)存頁(yè)面,如同訪問(wèn)自己的私有空間一樣(但實(shí)質(zhì)上不是私有的而是共享的)。因此這種進(jìn)程間通信方式是在同一個(gè)計(jì)算機(jī)系統(tǒng)中的諸進(jìn)程間實(shí)現(xiàn)通信的最快捷的方法,而它的局限性也在于此,即共享內(nèi)存的諸進(jìn)程必須共處同一個(gè)計(jì)算機(jī)系統(tǒng),有物理內(nèi)存可以共享才行。3.2共享內(nèi)存的原理共享內(nèi)存是由IPC為一個(gè)進(jìn)程所創(chuàng)建并且出現(xiàn)在這個(gè)進(jìn)程的地址空間中的一段特殊的地址序列。其他的進(jìn)程可以將同樣的共享內(nèi)存段關(guān)聯(lián)到他們自己的地址空間中。所有的進(jìn)程都可以訪問(wèn)這段內(nèi)存地址,就如同這段內(nèi)存是由malloc所分配的。如果一個(gè)進(jìn)程寫(xiě)入共享內(nèi)存,這些改變立即就可以為訪問(wèn)相同共享內(nèi)存的其他進(jìn)程所見(jiàn)。就其自身而言,共享內(nèi)存并沒(méi)有提供任何共享方法。并沒(méi)有自動(dòng)的方法來(lái)阻止在第一個(gè)進(jìn)程完成寫(xiě)入共享內(nèi)存之前第二個(gè)進(jìn)程開(kāi)始讀取共享內(nèi)存。3.3共享內(nèi)存的分配要使用一塊共享內(nèi)存,進(jìn)程必須首先分配它。隨后需要訪問(wèn)這個(gè)共享內(nèi)存塊的每一個(gè)進(jìn)程都必須將這個(gè)共享內(nèi)存綁定到自己的地址空間中。當(dāng)完成通信之后,所有進(jìn)程都將脫離共享內(nèi)存,并且由一個(gè)進(jìn)程釋放該共享內(nèi)存塊。盡管每個(gè)進(jìn)程都有自己的內(nèi)存地址,不同的進(jìn)程可以同時(shí)將同一個(gè)內(nèi)存頁(yè)面映射到自己的地址空間中,從而達(dá)到共享內(nèi)存的目的。分配一個(gè)新的共享內(nèi)存塊會(huì)創(chuàng)建新的內(nèi)存頁(yè)面。因?yàn)樗羞M(jìn)程都希望共享對(duì)同一塊內(nèi)存的訪問(wèn),只應(yīng)由一個(gè)進(jìn)程創(chuàng)建一塊新的共享內(nèi)存。再次分配一塊已經(jīng)存在的內(nèi)存塊不會(huì)創(chuàng)建新的頁(yè)面,而只是會(huì)返回一個(gè)標(biāo)識(shí)該內(nèi)存塊的標(biāo)識(shí)符。一個(gè)進(jìn)程如需使用這個(gè)共享內(nèi)存塊,則首先需要將它綁定到自己的地址空間中。這樣會(huì)創(chuàng)建一個(gè)從進(jìn)程本身虛擬地址到共享頁(yè)面的映射關(guān)系。當(dāng)對(duì)共享內(nèi)存的使用結(jié)束之后,這個(gè)映射關(guān)系將被刪除。當(dāng)再也沒(méi)有進(jìn)程需要使用這個(gè)共享內(nèi)存塊的時(shí)候,必須有一個(gè)(且只能是一個(gè))進(jìn)程負(fù)責(zé)釋放這個(gè)被共享的內(nèi)存頁(yè)面。所有共享內(nèi)存塊的大小都必須是系統(tǒng)頁(yè)面大小的整數(shù)倍。系統(tǒng)頁(yè)面大小指的是系統(tǒng)中單個(gè)內(nèi)存頁(yè)面包含的字節(jié)數(shù)。進(jìn)程通過(guò)調(diào)用shmget來(lái)分配一個(gè)共享內(nèi)存塊。該函數(shù)的第二個(gè)參數(shù)指定了所申請(qǐng)的內(nèi)存塊的大小。因?yàn)檫@些內(nèi)存塊是以頁(yè)面為單位進(jìn)行分配的,實(shí)際分配的內(nèi)存塊大小將被擴(kuò)大到頁(yè)面大小的整數(shù)倍。3.4共享內(nèi)存的訪問(wèn)要讓一個(gè)進(jìn)程獲取對(duì)一塊共享內(nèi)存的訪問(wèn),這個(gè)進(jìn)程必須先調(diào)用shmat(SHaredMemoryAttach,綁定到共享內(nèi)存)。將shmget返回的共享內(nèi)存標(biāo)識(shí)符SHMID傳遞給這個(gè)函數(shù)作為第一個(gè)參數(shù)。該函數(shù)的第二個(gè)參數(shù)是一個(gè)指針,指向您希望用于映射該共享內(nèi)存塊的進(jìn)程內(nèi)存地址;如果您指定NULL則Linux會(huì)自動(dòng)選擇一個(gè)合適的地址用于映射。3.5共享內(nèi)存的應(yīng)用共享內(nèi)存的通信方式是通過(guò)將可以共享的內(nèi)存緩沖區(qū)直接附加到進(jìn)程的虛擬地址空間中來(lái)實(shí)現(xiàn)的,因此,這些進(jìn)程之間的讀寫(xiě)操作的同步問(wèn)題操作系統(tǒng)無(wú)法實(shí)現(xiàn),必須由諸共享該內(nèi)存的進(jìn)程去控制。另外,由于內(nèi)存實(shí)體存在于計(jì)算機(jī)系統(tǒng)中,所以只能由處于同一個(gè)計(jì)算機(jī)系統(tǒng)中的諸進(jìn)程共享。以上兩點(diǎn)是共享內(nèi)存通信的缺點(diǎn),但是它提供了諸進(jìn)程直接讀寫(xiě)信息,無(wú)須復(fù)制,因而方便快捷的進(jìn)程間通信方式,適用于信息量大且操作頻繁的場(chǎng)合。3.6共享內(nèi)存的意義共享內(nèi)存是進(jìn)程間通信中最簡(jiǎn)單的方式之一。共享內(nèi)存允許兩個(gè)或更多進(jìn)程訪問(wèn)同一塊內(nèi)存,就如同malloc()函數(shù)向不同進(jìn)程返回了指向同一個(gè)物理內(nèi)存區(qū)域的指針。當(dāng)一個(gè)進(jìn)程改變了這塊地址中的內(nèi)容的時(shí)候,其它進(jìn)程都會(huì)察覺(jué)到這個(gè)更改。所有進(jìn)程共享同一塊內(nèi)存,共享內(nèi)存在各種進(jìn)程間通信方式中具有最高的效率。訪問(wèn)共享內(nèi)存區(qū)域和訪問(wèn)進(jìn)程獨(dú)有的內(nèi)存區(qū)域一樣快,并不需要通過(guò)系統(tǒng)調(diào)用或者其它需要切入內(nèi)核的過(guò)程來(lái)完成。同時(shí)它也避免了對(duì)數(shù)據(jù)的各種不必要的復(fù)制。四、實(shí)驗(yàn)構(gòu)思4.1main()的使用intmain(){intshmid;char*shmaddr;strutshmid_dsbuf;shmid=shmget(KEY,SIZE,IPC_CREAT|0600);if(shmid==-1){printf("createsharememoryfailed:%s",strerror(errno)); return0;}if(fork()==0){ sleep(2); shmaddr=(char*)shmat(shmid,NULL,0); if(shmaddr==(void*)-1) { printf("connecttothesharememoryfailed:%s",strerror(errno)); return0; } strcpy(shmaddr,"hello,thisisshareddata.\n"); shmdt(shmaddr); exit(0);}else{wait(0); shmctl(shmid,IPC_STAT,&buf); printf("sizeofthesharememory:shm_segsz=%dbytes\n",buf.shm_segsz); printf("processidofthelastoperator:shm_lpid=%d\n",buf.shm_cpid); printf("processidofthelastoperator:shm_lpid+%d\n",buf.shm_lpid); shmaddr=(char*)shmat(shmid,NULL,0); if(shmaddr==(void*)-1) { printf("connectthesharememoryfailed:%s",strerror(errno)); return0; } printf("printthecontentofthesharememory:"); printf("%s\n",shmaddr); shmdt(shmaddr); shmctl(shmid,IPC_RMID,NULL);}}4.2shmget()調(diào)用首先調(diào)用shmget()函數(shù)建立一塊共享內(nèi)存,大小為1024個(gè)字節(jié),shmid=shmget(KEY,SIZE,IPC_CREAT|0600)建立共享內(nèi)存,此函數(shù)調(diào)用用于創(chuàng)建一個(gè)新的共享內(nèi)存段或存取一個(gè)已存在的共享內(nèi)存段。函數(shù)調(diào)用成功返回共享內(nèi)存段的標(biāo)識(shí)符,否則返回一1值。shmget的內(nèi)部實(shí)現(xiàn)包含了許多重要的SystemV共享內(nèi)存機(jī)制;shmat在把共享內(nèi)存區(qū)域映射到進(jìn)程空間時(shí),并不真正改變進(jìn)程的頁(yè)表。當(dāng)進(jìn)程第一次訪問(wèn)內(nèi)存映射區(qū)域訪問(wèn)時(shí),會(huì)因?yàn)闆](méi)有物理頁(yè)表的分配而導(dǎo)致一個(gè)缺頁(yè)異常,然后內(nèi)核再根據(jù)相應(yīng)的存儲(chǔ)管理機(jī)制為共享內(nèi)存映射區(qū)域分配相應(yīng)的頁(yè)表。4.3fork()的調(diào)用調(diào)用fork()產(chǎn)生一個(gè)子進(jìn)程(生產(chǎn)者進(jìn)程)。子進(jìn)程調(diào)用shmat()函數(shù)將該共享內(nèi)存連接(attach)到自己的虛存空間,即可通過(guò)普通的內(nèi)存寫(xiě)操作(例如strcpy等),在該共享內(nèi)存寫(xiě)入數(shù)據(jù)。4.4子進(jìn)程調(diào)用shmat()shmaddr=(char*)shmat(shmid,NULL,0)系統(tǒng)自動(dòng)選擇一個(gè)地址連接,shmat()可以創(chuàng)建一個(gè)共享內(nèi)存區(qū),或者獲得已創(chuàng)建的共享內(nèi)存區(qū)的標(biāo)識(shí)符后,將共享內(nèi)存段映射到進(jìn)程的內(nèi)存空間。返回共享內(nèi)存段的地址,否則返回一1值。4.5子進(jìn)程調(diào)用shmdt()寫(xiě)完數(shù)據(jù)生,子進(jìn)程調(diào)用shmdt(shmaddr)斷開(kāi)共享,此函數(shù)調(diào)用可以將映射到進(jìn)程的共享內(nèi)存段撤消。函數(shù)調(diào)用成功返回0值,否則返回一1。一個(gè)共享內(nèi)存與一個(gè)進(jìn)程分離時(shí).共享內(nèi)存段的shmarray結(jié)構(gòu)中的共享計(jì)數(shù)減1,直至計(jì)數(shù)為0,系統(tǒng)才真正刪除這個(gè)共亨內(nèi)存頁(yè)面。4.6父進(jìn)程調(diào)用shmctl()父進(jìn)程sleep,直到子進(jìn)程完成上述操作。shmctl(shmid,IPC_RMID,NULL)取得共享內(nèi)存的相關(guān)信息,并打印出來(lái)shmctl可以用來(lái)查詢一些共享內(nèi)存的使用情況和進(jìn)行一些控制操作。函數(shù)調(diào)用成功后返回0值,否則返回一1值。比如:shmctl(shmid,IPCRMID,0)將刪除shmid指示的共享內(nèi)存。4.7父進(jìn)程調(diào)用shmat(),shmdt(),shmctl()父進(jìn)程調(diào)用shmat()函數(shù)將這塊共享內(nèi)存連接到自己的虛存空間,即可通過(guò)普通的內(nèi)存讀操作(例如printft等),將該共享內(nèi)存中的字符串讀出來(lái)。讀完數(shù)據(jù)后,父進(jìn)程調(diào)用shmctl()函數(shù),銷毀斷開(kāi)與該共享內(nèi)存的連接。最后父進(jìn)程調(diào)用shmectl()函數(shù),銷毀該共享內(nèi)存。五、實(shí)驗(yàn)的調(diào)試與測(cè)試代碼編輯如下圖所示在linux操作系統(tǒng)下,打開(kāi)終端,使用vi工具編寫(xiě)代碼編寫(xiě)如下圖5-1,圖5-2,圖5-3代碼圖5-1圖5-2圖5-3使用gcc–oshareshare.c編譯代碼六、實(shí)驗(yàn)結(jié)果運(yùn)行./share結(jié)果如下圖七、源程序#include<stdio.h>#include<unistd.h>#include<string.h>#include<sys/ipc.h>#include<sys/shm.h>#include<errno.h>#defineKEY1234#defineSIZE1024intmain(){intshmid;char*shmaddr;structshmid_dsbuf;shmid=shmget(KEY,SIZE,IPC_CREAT|0600);if(shmid==-1){printf("createsharememoryfailed:%s",strerror(errno)); return0;}if(fork()==0){ sleep(2); shmaddr=(char*)shmat(shmid,NULL,0); if(shmaddr==(void*)-1) { printf("connecttothesharememoryfailed:%s",strerror(errno)); return0; } strcpy(shmaddr,"hello,thisisshareddata.\n"); shmdt(shmaddr); exit(0);}else{wait(0); shmctl(shmid,IPC_STAT,&buf); printf("sizeofthesharememory:shm_segsz=%dbytes\n",buf.shm_segsz);printf("processidofthelastoperator:shm_lpid=%d\n",buf.shm_cpid); printf("processidofthelastoperator:shm_lpid+%d\n",buf.shm_lpid); shmaddr=(ch
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 浮雕墻施工方案
- 接線盒施工方案
- TSHAEPI 010-2024 污水處理廠溫室氣體排放監(jiān)測(cè)技術(shù)標(biāo)準(zhǔn)
- 2025年度購(gòu)房按揭貸款提前還款合同
- 2025年度智能腳手架租賃及數(shù)據(jù)分析服務(wù)合同
- 二零二五年度生態(tài)農(nóng)業(yè)發(fā)展民間房屋抵押貸款合同范本
- 貴州航天醫(yī)院2025年度保安外包服務(wù)及應(yīng)急預(yù)案合同
- 二零二五年度出租車(chē)租賃與智能車(chē)載系統(tǒng)合作協(xié)議
- 2025年度酒店與企業(yè)年會(huì)住宿優(yōu)惠協(xié)議合同
- 二零二五年度創(chuàng)業(yè)投資資金托管管理合同
- 2 遺傳圖繪制
- 人教部編版二年級(jí)語(yǔ)文下冊(cè)第六單元15古詩(shī)二首精品教案(集體備課)
- 三年級(jí)下冊(cè)數(shù)學(xué)教案-2.1速度、時(shí)間、路程-滬教版
- 400噸汽車(chē)吊性能表
- 煤礦四類材料回收復(fù)用的管理辦法
- 墻面板安裝爬梯驗(yàn)算
- 矢量分析與場(chǎng)論講義
- 繪本《一園青菜成了精》
- 贊美詩(shī)歌400首全集
- 2013河南省政府制定價(jià)格聽(tīng)證辦法實(shí)施細(xì)則
- 水庫(kù)除險(xiǎn)加固初步設(shè)計(jì)工程勘察報(bào)告(共36頁(yè))
評(píng)論
0/150
提交評(píng)論