




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、課程實踐報告書課程名稱: 操作系統原理 題 目: 進程通信-共享內存 學生姓名: 專 業: 計算機科學與技術(網絡方向) 班 別: 計科本113班 學 號: 1104402308 指導老師: 日 期: 2013 年 06 月 25 日目錄一、基本要求3二、流程圖分析3三、共享內存描述和使用103.1共享內存的概述103.2共享內存的原理113.3共享內存的分配123.4 共享內存的訪問133.5共享內存的應用133.6共享內存的意義14四、實驗構思144.1 main()的使用144.2 shmget()調用164.3 fork()的調用164.4 子進程調用shmat()174.5子進程調用
2、shmdt()174.6 父進程調用 shmctl()174.7父進程調用shmat(),shmdt(),shmctl()18五、實驗的調試與測試18六、實驗結果20七、源程序21八、實驗感受23九、參考文獻24一、基本要求1.1實驗題目:進程通信共享內存1.2實踐目的:用代碼實現進程通信共享內存1.3實踐內容:用C語言代碼創建進程,實現進程通信共享內存(父進程和子進程通過共享內存實現信息的交流)1.4實驗環境:linux操作系統及gcc工具二、流程圖分析 圖1-1如圖1-1首先父進程調用shmget()函數建立一個共享內存,該函數返回一內存的標識符。 圖1-2如圖1-2父進程調用fork()
3、產生一個子進程 圖1-3如圖1-3子進程調用shmat()函數將該共享內存連接到自己的虛存空間中 圖1-4如圖1-4寫完數據后,子進程調用shmdt()函數斷開與該進程的連接 如圖1-5如圖1-5父進程調用shmctl()函數得到關于這塊共享內存的相關信息,并打印出來 圖1-6如圖1-6父進程調用shmat()函數將這塊共享內存連接到自己的虛存空間圖1-7如圖1-8父進程調用shmdt()函數斷開與該共享內存的連接 圖1-8如圖1-8父進程調用shmctl()函數,銷毀該共享進程。三、共享內存描述和使用3.1共享內存的概述 針對消息緩沖需要占用CPU進行消息復制的缺點,操作系統提供了一種進程間
4、直接進行數據交換的通信方式共享內存。顧名思義,這種通信方式允許多個進程共享同一塊物理內存空間來實現進程之間的信息交換,其特點是沒有中間環節,直接將共享的內存頁面通過附接,映射到相互通信的進程各自的虛擬地址空間中,從而使多個進程可以直接訪問同一個物理內存頁面,如同訪問自己的私有空間一樣(但實質上不是私有的而是共享的)。因此這種進程間通信方式是在同一個計算機系統中的諸進程間實現通信的最快捷的方法,而它的局限性也在于此,即共享內存的諸進程必須共處同一個計算機系統,有物理內存可以共享才行。 3.2共享內存的原理共享內存是由IPC為一個進程所創建并且出現在這個進程的地址空間中的一段特殊的地址序列。其他的
5、進程可以將同樣的共享內存段關聯到他們自己的地址空間中。所有的進程都可以訪問這段內存地址,就如同這段內存是由malloc所分配的。如果一個進程寫入共享內存,這些改變立即就可以為訪問相同共享內存的其他進程所見。 就其自身而言,共享內存并沒有提供任何共享方法。并沒有自動的方法來阻止在第一個進程完成寫入共享內存之前第二個進程開始讀取共享內存。 3.3共享內存的分配要使用一塊共享內存,進程必須首先分配它。隨后需要訪問這個共享內存塊的每一個進程都必須將這個共享內存綁定到自己的地址空間中。當完成通信之后,所有進程都將脫離共享內存,并且由一個進程釋放該共享內存塊。 盡管每個進程都有自己的內存地址,不同的進程可
6、以同時將同一個內存頁面映射到自己的地址空間中,從而達到共享內存的目的。分配一個新的共享內存塊會創建新的內存頁面。因為所有進程都希望共享對同一塊內存的訪問,只應由一個進程創建一塊新的共享內存。再次分配一塊已經存在的內存塊不會創建新的頁面,而只是會返回一個標識該內存塊的標識符。一個進程如需使用這個共享內存塊,則首先需要將它綁定到自己的地址空間中。這樣會創建一個從進程本身虛擬地址到共享頁面的映射關系。當對共享內存的使用結束之后,這個映射關系將被刪除。當再也沒有進程需要使用這個共享內存塊的時候,必須有一個(且只能是一個)進程負責釋放這個被共享的內存頁面。 所有共享內存塊的大小都必須是系統頁面大小的整數
7、倍。系統頁面大小指的是系統中單個內存頁面包含的字節數。進程通過調用shmget來分配一個共享內存塊。該函數的第二個參數指定了所申請的內存塊的大小。因為這些內存塊是以頁面為單位進行分配的,實際分配的內存塊大小將被擴大到頁面大小的整數倍。 3.4 共享內存的訪問要讓一個進程獲取對一塊共享內存的訪問,這個進程必須先調用 shmat(SHared Memory Attach,綁定到共享內存)。將 shmget 返回的共享內存標識符 SHMID 傳遞給這個函數作為第一個參數。該函數的第二個參數是一個指針,指向您希望用于映射該共享內存塊的進程內存地址;如果您指定NULL則Linux會自動選擇一個合適的地址
8、用于映射。 3.5共享內存的應用共享內存的通信方式是通過將可以共享的內存緩沖區直接附加到進程的虛擬地址空間中來實現的,因此,這些進程之間的讀寫操作的同步問題操作系統無法實現,必須由諸共享該內存的進程去控制。另外,由于內存實體存在于計算機系統中,所以只能由處于同一個計算機系統中的諸進程共享。以上兩點是共享內存通信的缺點,但是它提供了諸進程直接讀寫信息,無須復制,因而方便快捷的進程間通信方式,適用于信息量大且操作頻繁的場合。3.6共享內存的意義共享內存是進程間通信中最簡單的方式之一。共享內存允許兩個或更多進程訪問同一塊內存,就如同 malloc() 函數向不同進程返回了指向同一個物理內存區域的指針
9、。當一個進程改變了這塊地址中的內容的時候,其它進程都會察覺到這個更改。所有進程共享同一塊內存,共享內存在各種進程間通信方式中具有最高的效率。訪問共享內存區域和訪問進程獨有的內存區域一樣快,并不需要通過系統調用或者其它需要切入內核的過程來完成。同時它也避免了對數據的各種不必要的復制。 四、實驗構思4.1 main()的使用 int main() int shmid; char *shmaddr; strut shmid_ds buf; shmid=shmget(KEY,SIZE,IPC_CREAT | 0600); if(shmid=-1) printf("create share m
10、emory failed:%s",strerror(errno); return 0; if(fork()=0) sleep(2); shmaddr=(char *)shmat(shmid,NULL,0); if(shmaddr=(void*)-1) printf("connect to the share memory failed:%s",strerror(errno); return 0; strcpy(shmaddr,"hello,this is shared data.n"); shmdt(shmaddr); exit(0); els
11、e wait(0); shmctl(shmid,IPC_STAT,&buf); printf("size of the share memory:shm_segsz=%dbytesn",buf.shm_segsz); printf("process id of the last operator:shm_lpid=%dn",buf.shm_cpid); printf("process id of the last operator:shm_lpid+%dn",buf.shm_lpid); shmaddr=(char *)shm
12、at(shmid,NULL,0); if(shmaddr=(void *)-1) printf("connectthe share memory failed:%s",strerror(errno); return 0; printf("print the content of the share memory:"); printf("%sn",shmaddr); shmdt(shmaddr); shmctl(shmid,IPC_RMID,NULL); 4.2 shmget()調用 首先調用shmget()函數建立一塊共享內存,大小為
13、1024個字節,shmid=shmget(KEY,SIZE,IPC_CREAT | 0600)建立共享內存,此函數調用用于創建一個新的共享內存段或存取一個已存在的共享內存段 。 函數調用成功返回共享內存段的標識符 ,否則返回一 1值。s h mg e t的內部實現包含了許多重要的S y s t e m V共享內存機制;s h ma t 在把共享內存區域映射到進程空間時 , 并不真正改變進程的頁表 。 當進程第一次訪 問內存映射區域訪問時, 會 因為沒有物理頁表 的分配而導致一個缺頁異常, 然后 內核再根據相應 的存儲管理機制為共享內存映射區域分配相應的頁表。 4.3 fork()的調用調用fo
14、rk()產生一個子進程(生產者進程)。子進程調用shmat()函數將該共享內存連接(attach)到自己的虛存空間,即可通過普通的內存寫操作(例如strcpy等),在該共享內存寫入數據。4.4 子進程調用shmat() shmaddr=(char *)shmat(shmid,NULL,0) 系統自動選擇一個地址連接,s h ma t ( ) 可以創建一個共享內存區,或者獲得已創建的共享內存區的標識符后,將共享內存段映射到進程的內存空間。返回共享內存段的地址, 否則返 回一 1值。 4.5子進程調用shmdt() 寫完數據生,子進程調用shmdt(shmaddr)斷開共享,此函數調用可以將映射到
15、進程的共享內存段撤消。函數調用成功返回0值, 否則返回一 1 。一個共享內存與一個進程分離時 共享內存段的s h m a r r a y結構中的共享計數減 1 ,直至計數為 0 ,系統才真正刪除這個共亨內存頁面。 4.6 父進程調用 shmctl() 父進程sleep,直到子進程完成上述操作。shmctl(shmid,IPC_RMID,NULL)取得共享內存的相關信息,并打印出來s h mct l 可以用來查詢一些共享內存的使用情況和進行一些控制操作。 函數調用成功后返回0值, 否則返回一 1 值。比如: s h mc t l ( s h m i d , I P C RMI D, 0 ) 將刪
16、除s h m i d指示的共享內存。 4.7父進程調用shmat(),shmdt(),shmctl()父進程調用shmat()函數將這塊共享內存連接到自己的虛存空間,即可通過普通的內存讀操作(例如printft等),將該共享內存中的字符串讀出來。讀完數據后,父進程調用shmctl()函數,銷毀斷開與該共享內存的連接。最后父進程調用shmectl()函數,銷毀該共享內存。 五、實驗的調試與測試代碼編輯如下圖所示在linux操作系統下,打開終端,使用vi工具編寫代碼 編寫如下圖5-1,圖5-2,圖5-3代碼 圖5-1 圖5-2圖5-3 使用gcc o share share.c編譯代碼 六、實驗結
17、果運行./share 結果如下圖七、源程序#include<stdio.h>#include<unistd.h>#include<string.h>#include<sys/ipc.h>#include<sys/shm.h>#include<errno.h>#define KEY 1234 #define SIZE 1024 int main() int shmid; char *shmaddr; struct shmid_ds buf; shmid=shmget(KEY,SIZE,IPC_CREAT | 0600); i
18、f(shmid=-1) printf("create share memory failed:%s",strerror(errno); return 0; if(fork()=0) sleep(2); shmaddr=(char *)shmat(shmid,NULL,0); if(shmaddr=(void*)-1) printf("connect to the share memory failed:%s",strerror(errno); return 0; strcpy(shmaddr,"hello,this is shared data
19、.n"); shmdt(shmaddr); exit(0); else wait(0); shmctl(shmid,IPC_STAT,&buf); printf("size of the share memory:shm_segsz=%dbytesn",buf.shm_segsz); printf("process id of the last operator:shm_lpid=%dn",buf.shm_cpid); printf("process id of the last operator:shm_lpid+%dn",buf.shm_lpid); shmaddr=(char *)shmat(shmid,NULL,0); if(shmaddr=(void *)-1) printf("connect the share memory failed:%s",strerror(errno); return 0; printf("print the content of the share memory:"); printf("%sn",shmaddr); shmdt(shmaddr); shmctl(shmid,IP
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 重慶市巴南區2025年物理高二第二學期期末質量跟蹤監視模擬試題含解析
- 口岸閉環生活區管理辦法
- 云南省延時攝影管理辦法
- 甘肅省嘉峪關市酒鋼三中2025年高二物理第二學期期末調研模擬試題含解析
- 隧道動態設計管理辦法
- 永州市掛職干部管理辦法
- 集團財務印章管理辦法
- 北京市房山區4中2025屆高二物理第二學期期末檢測模擬試題含解析
- 困難殘疾人生活補貼申請書
- 四上《雅魯藏布大峽谷》教學反思
- 招商大使選聘管理辦法
- 2025年中國鐵路集團招聘筆試備考題庫(帶答案詳解)
- DLT 5035-2016 發電廠供暖通風與空氣調節設計規范
- DZ∕T 0201-2020 礦產地質勘查規范 鎢、錫、汞、銻(正式版)
- 小小科學家《物理》模擬試卷A(附答案)
- 《風電場項目經濟評價規范》(NB-T 31085-2016)
- 反恐C-TPAT程序文件整套(通用)
- ma600學員座艙圖冊用戶培訓中心
- 液壓過濾器的設計和制造
- 《義務教育英語課程標準(2022年版)》自測題、綜合測試題、初中英語新課標過關抽測試卷及優秀答卷(共17套附答案)
- TCAREI 001-2021 民用醇基液體燃料安全技術規范
評論
0/150
提交評論