操作系統(tǒng)課程設(shè)計(jì)說(shuō)明書--基于linux的進(jìn)程之間通信_(tái)第1頁(yè)
已閱讀1頁(yè),還剩19頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  操作系統(tǒng)課程設(shè)計(jì)</b></p><p><b>  說(shuō) 明 書</b></p><p>  2015 年12月25日</p><p><b>  需求分析</b></p><p>  1.1小組的拿到的任務(wù)是:</p><p&

2、gt;<b>  設(shè)計(jì)內(nèi)容:</b></p><p>  (1)實(shí)現(xiàn)管道通信,要求見P183習(xí)題(3)。</p><p>  (2)實(shí)現(xiàn)信號(hào)量通信機(jī)制,要求見P191習(xí)題(3)。</p><p>  (3)實(shí)現(xiàn)消息緩沖通信機(jī)制,要求見P197習(xí)題。</p><p>  (4)實(shí)現(xiàn)共享內(nèi)存區(qū)通信機(jī)制,要求見P201

3、習(xí)題(2)。</p><p><b>  要求:</b></p><p>  (1)用Linux中進(jìn)程控制系統(tǒng)調(diào)用函數(shù)來(lái)創(chuàng)建進(jìn)程(線程)。</p><p>  (2)輸出進(jìn)程通信時(shí)同步的說(shuō)明信息。</p><p>  1.2小組分工我拿到的題目是:(2)實(shí)現(xiàn)信號(hào)量通信機(jī)制,要求見P191習(xí)題(3)。</p&g

4、t;<p>  1.3題目的要求如下:</p><p>  1.3.1.哲學(xué)家進(jìn)餐問(wèn)題描述:</p><p>  設(shè)有5個(gè)哲學(xué)家,共享一張放有5把椅子和5把叉子的圓桌,每人分得一把椅子。哲學(xué)家們?cè)诙亲羽囸I時(shí)才試圖分兩次從兩邊撿起兩把叉子就餐。</p><p><b>  條件:</b></p><p>  

5、1.每個(gè)人只有拿到兩把叉子時(shí),哲學(xué)家才能吃飯</p><p>  2.如果叉子已在他人手上,則哲學(xué)家必須等到他人吃完后才能拿起叉子</p><p>  3.任性的哲學(xué)家在自己未拿到兩把叉子吃飯之前,絕不放下自己手中的叉子</p><p><b>  1.3.2問(wèn)題:</b></p><p>  1.什么情況下5個(gè)哲學(xué)家全

6、部都吃不上飯?</p><p>  答:當(dāng)5個(gè)哲學(xué)家每人手中都拿到了1把叉子(共5把),即不肯放下自己手中的叉子又想要得到左右鄰居的叉子時(shí),每個(gè)哲學(xué)家永遠(yuǎn)拿不到兩把叉子,所有哲學(xué)家都在等待另一把叉子,就會(huì)導(dǎo)致這5個(gè)哲學(xué)家誰(shuí)都吃不上飯。也就是產(chǎn)生死鎖后的情況。</p><p>  2.編程實(shí)現(xiàn)沒有人餓死(永遠(yuǎn)拿不到兩個(gè)叉子)的算法。</p><p>  答:程序請(qǐng)看代

7、碼實(shí)現(xiàn)。</p><p>  分析:沒有人餓死,就是不允許出現(xiàn)死鎖的情況(5個(gè)哲學(xué)家每人1把叉子)</p><p>  1.3.3解決死鎖的方法有三種:</p><p>  1.至多允許四位哲學(xué)家同時(shí)去拿左邊的叉子,最終保證至少有一位哲學(xué)家能夠進(jìn)餐,并且在用畢時(shí)能釋放出他用過(guò)的兩只叉子,從而使更多哲學(xué)家能夠進(jìn)餐;</p><p>  2.規(guī)定

8、當(dāng)哲學(xué)家的左右兩只叉子均可用時(shí),才允許他拿起叉子進(jìn)餐;</p><p>  3.規(guī)定奇數(shù)號(hào)的哲學(xué)家先拿他左邊的叉子,然后再去拿他右邊的叉子,而偶數(shù)號(hào)哲學(xué)家則相反。五位哲學(xué)家都先競(jìng)爭(zhēng)奇數(shù)號(hào)叉子,獲得后再競(jìng)爭(zhēng)偶數(shù)號(hào)叉子,最終總有一位哲學(xué)家會(huì)因?yàn)楂@得兩只叉子而進(jìn)餐。</p><p>  1.3.4我采用的解決死鎖問(wèn)題的方法</p><p>  我采用的解決死鎖的方法是第二

9、種,即在哲學(xué)家拿起叉子前先判斷他左右鄰居的情況,只要左右鄰居中有一位正在進(jìn)餐(叉子已經(jīng)被鄰居拿到,鄰居進(jìn)餐結(jié)束前自己無(wú)法獲得其叉子),就不允許其拿起叉子進(jìn)餐,這就可以預(yù)防死鎖的情況發(fā)生。</p><p>  1.4軟件需要完成的功能:</p><p>  按照題目要求,需要調(diào)用Linux操作系統(tǒng)函數(shù)使用信號(hào)量機(jī)制完成對(duì)哲學(xué)家進(jìn)餐問(wèn)題的求解,要求所有哲學(xué)家都能吃到食物,并且要防止哲學(xué)家在競(jìng)爭(zhēng)

10、叉子過(guò)程發(fā)生死鎖。</p><p>  程序應(yīng)該包含如下功能:</p><p>  1.哲學(xué)家思考功能:哲學(xué)家在進(jìn)餐前和進(jìn)餐后處于思考狀態(tài);</p><p>  2.哲學(xué)家拿起叉子動(dòng)能:哲學(xué)家進(jìn)餐前需要拿起叉子,在這個(gè)過(guò)程中可能發(fā)生死鎖,所以要在這個(gè)功能中編寫防止死鎖的方法;</p><p>  3.哲學(xué)家進(jìn)餐功能:哲學(xué)家拿起叉子后開始進(jìn)餐;

11、</p><p>  4.哲學(xué)家放下叉子功能:哲學(xué)家用餐完畢,放下叉子,并通知其左右鄰居;</p><p>  5.執(zhí)行P、V操作功能:由于要使用信號(hào)量機(jī)制,肯定會(huì)涉及到P、V操作</p><p>  6.創(chuàng)建工作環(huán)境功能:包括建立共享內(nèi)存區(qū)、連接進(jìn)程和共享內(nèi)存區(qū)、創(chuàng)建并初始化信號(hào)量集、創(chuàng)建子進(jìn)程模擬5個(gè)哲學(xué)家等。</p><p>  1.5

12、軟件設(shè)計(jì)的目的:</p><p>  完成對(duì)哲學(xué)家進(jìn)餐問(wèn)題的求解,解決死鎖問(wèn)題。 </p><p><b>  1.6最終成果:</b></p><p>  最終要提交的成果是:說(shuō)明書、源程序(cpp文件)</p><p><b>  總體設(shè)計(jì)</b></p><p>  2

13、.1程序模塊結(jié)構(gòu)圖:</p><p>  圖1 哲學(xué)家進(jìn)餐問(wèn)題程序模塊結(jié)構(gòu)圖</p><p><b>  2.2程序流程圖</b></p><p>  2.2.1 總體流程圖</p><p>  圖2 總體程序流程圖</p><p>  2.2.2哲學(xué)家進(jìn)餐問(wèn)題解決方案流程圖</p>

14、<p>  圖3 哲學(xué)家進(jìn)餐問(wèn)題解決方案流程圖</p><p><b>  3.詳細(xì)設(shè)計(jì)</b></p><p>  3.1 包含必要的頭文件</p><p>  由于要調(diào)用Linux系統(tǒng)函數(shù),所以要導(dǎo)入必要的頭文件,需要導(dǎo)入的頭文件如下:</p><p>  3.2所有用到的常量、全局變量及宏定義</

15、p><p>  3.3聯(lián)合體semun的定義</p><p>  聯(lián)合體semun用于在對(duì)信號(hào)量設(shè)置和修改值的時(shí)候作為semctl函數(shù)的最后一個(gè)參數(shù)。</p><p>  3.4創(chuàng)建并初始化工作環(huán)境模塊</p><p>  3.4.1涉及到的Linux系統(tǒng)函數(shù)</p><p>  在這個(gè)模塊中,涉及到很多Linux系統(tǒng)函數(shù)

16、的調(diào)用,以下是這些重要函數(shù)的解釋:</p><p> ?。?)shmget函數(shù)說(shuō)明:</p><p>  函數(shù)原型:int shmget(key_t key, size_t size, int shmflg)</p><p>  函數(shù)作用:得到一個(gè)共享內(nèi)存標(biāo)識(shí)符或創(chuàng)建一個(gè)共享內(nèi)存對(duì)象并返回共享內(nèi)存標(biāo)識(shí)符。</p><p><b> 

17、 參數(shù)含義:</b></p><p>  key:0(IPC_PRIVATE):會(huì)建立新共享內(nèi)存對(duì)象</p><p>  大于0的32位整數(shù):視參數(shù)shmflg來(lái)確定操作。 </p><p>  size:大于0的整數(shù):新建的共享內(nèi)存大小,以字節(jié)為單位</p><p>  0:只獲取共享內(nèi)存時(shí)指定為0</p><

18、;p>  shmflg:0:取共享內(nèi)存標(biāo)識(shí)符,若不存在則函數(shù)會(huì)報(bào)錯(cuò)</p><p>  IPC_CREAT:當(dāng)shmflg&IPC_CREAT為真時(shí),如果內(nèi)核中不存在鍵值與key相等的共享內(nèi)存,則新建一個(gè)共享內(nèi)存;如果存在這樣的共享內(nèi)存,返回此共享內(nèi)存的標(biāo)識(shí)符</p><p>  IPC_CREAT|IPC_EXCL:如果內(nèi)核中不存在鍵值與key相等的共享內(nèi)存,則新建一個(gè)共享

19、內(nèi)存;如果存在這樣的共享內(nèi)存則報(bào)錯(cuò)</p><p>  返回值:成功:返回共享內(nèi)存的標(biāo)識(shí)符 出錯(cuò):-1,錯(cuò)誤原因存于error中</p><p> ?。?)shmat函數(shù)說(shuō)明:</p><p>  函數(shù)原型:void *shmat(int shmid, const void *shmaddr, int shmflg)</p><p>  

20、函數(shù)作用:連接共享內(nèi)存標(biāo)識(shí)符為shmid的共享內(nèi)存,連接成功后把共享內(nèi)存區(qū)對(duì)象映射到調(diào)用進(jìn)程的地址空間,隨后可像本地空間一樣訪問(wèn)</p><p>  參數(shù)含義:shmid 共享內(nèi)存標(biāo)識(shí)符</p><p>  shmaddr 指定共享內(nèi)存出現(xiàn)在進(jìn)程內(nèi)存地址的什么位置,直接指定為NULL讓內(nèi)核自己決定一個(gè)合適的地址位置</p><p>  shmflg SHM_R

21、DONLY:為只讀模式,其他為讀寫模式</p><p>  返回值 :成功:附加好的共享內(nèi)存地址 出錯(cuò):-1,錯(cuò)誤原因存于errno中</p><p> ?。?)semget函數(shù)說(shuō)明:</p><p>  函數(shù)原型:int semget(key_t key,int nsems,int semflg);</p><p>  函數(shù)作用:獲取與

22、某個(gè)鍵關(guān)聯(lián)的信號(hào)量集標(biāo)識(shí)</p><p>  參數(shù)含義:key:所創(chuàng)建或打開信號(hào)量集的鍵值。</p><p>  nsems:創(chuàng)建的信號(hào)量集中的信號(hào)量的個(gè)數(shù),該參數(shù)只在創(chuàng)建信號(hào)量集時(shí)有效。</p><p>  semflg:調(diào)用函數(shù)的操作類型</p><p>  返回值:成功返回信號(hào)量集的IPC標(biāo)識(shí)符,失敗返回-1</p>&l

23、t;p> ?。?)信號(hào)量操作模板sem_op定義:</p><p>  struct sembuf{</p><p>  unsigned short sem_num;</p><p>  short sem_op;</p><p>  short sem_flg;</p><p><b>  };&l

24、t;/b></p><p>  當(dāng)sem_op.sem_op為-1時(shí)表示執(zhí)行P操作,sem_op為1時(shí)表示執(zhí)行V操作</p><p>  3.4.2申請(qǐng)共享內(nèi)存區(qū)</p><p>  3.4.3連接共享內(nèi)存區(qū)和進(jìn)程</p><p>  3.4.4創(chuàng)建信號(hào)量集并初始化信號(hào)量</p><p>  3.5 實(shí)現(xiàn)P、V操

25、作</p><p>  3.5.1涉及到的Linux系統(tǒng)函數(shù)</p><p> ?。?)semop函數(shù)說(shuō)明:</p><p>  函數(shù)原型:int semop(int semid, struct sembuf *sops, unsigned nsops);</p><p>  函數(shù)作用:對(duì)信號(hào)量執(zhí)行P、V操作</p><p

26、>  參數(shù)含義:semid:信號(hào)集的識(shí)別碼,可通過(guò)semget獲?。╯emget返回值)。</p><p>  sops: 信號(hào)量操作模板</p><p>  nsops:信號(hào)操作結(jié)構(gòu)的數(shù)量,恒大于或等于1</p><p>  返回值含義:操作結(jié)果,正常返回值為0,錯(cuò)誤返回-1</p><p>  3.5.2實(shí)現(xiàn)P操作</p>

27、;<p>  3.5.3實(shí)現(xiàn)V操作</p><p>  3.6實(shí)現(xiàn)哲學(xué)家進(jìn)餐問(wèn)題解決方案的主要算法</p><p>  3.6.1涉及到的linux系統(tǒng)函數(shù)</p><p> ?。?)sleep函數(shù)</p><p>  函數(shù)原型:sleep(unsigned long);</p><p>  函數(shù)作用:執(zhí)

28、行掛起一段時(shí)間</p><p>  注意:sleep()單位為秒</p><p>  3.6.2實(shí)現(xiàn)哲學(xué)家思考功能</p><p>  3.6.2實(shí)現(xiàn)哲學(xué)家進(jìn)餐功能</p><p>  3.6.3實(shí)現(xiàn)哲學(xué)家拿起叉子功能</p><p>  3.6.3.1實(shí)現(xiàn)拿起叉子前的試探操作(防止死鎖算法)</p>&

29、lt;p>  3.6.3.2實(shí)現(xiàn)拿起叉子功能</p><p>  3.6.4實(shí)現(xiàn)放下叉子功能</p><p>  3.6.5將上述功能整合起來(lái)</p><p>  3.7將所有模塊連接在一起,形成一套完整的程序</p><p>  為了方便最終的整合,將所有模塊的整合調(diào)用放進(jìn)一個(gè)單獨(dú)的函數(shù),供主函數(shù)調(diào)用,最終程序整合只需調(diào)用這個(gè)方法。&

30、lt;/p><p><b>  3.8編寫主函數(shù)</b></p><p><b>  3.9編寫菜單</b></p><p><b>  3.10運(yùn)行結(jié)果</b></p><p>  使用終端編譯,結(jié)果如下:</p><p><b>  4.心得體

31、會(huì)</b></p><p>  通過(guò)本次課程設(shè)計(jì)我學(xué)到了很多,下面談一談我的收獲:</p><p> ?。?)團(tuán)隊(duì)合作方面:本次課程設(shè)計(jì)過(guò)程中由于我們分工明確,任務(wù)下達(dá)清楚,大家都知道自己該做什么,都朝著正確的方向在努力,所以收到了比較好的效果,效率也較高,這使我明白了,在以后的分工合作過(guò)程中,合理的分工和明確的任務(wù)的重要性。</p><p> ?。?)

32、程序設(shè)計(jì)方面:本次課程設(shè)計(jì)過(guò)程中我遇到了很多挑戰(zhàn):</p><p>  首先是來(lái)自題目的挑戰(zhàn),因?yàn)樽约簭膩?lái)沒用過(guò)Linux操作系統(tǒng),所以看到題目后很擔(dān)心自己會(huì)完不成任務(wù),但是最后我還是下決心從0開始,網(wǎng)上的Linux版本花樣繁多,不知道該選擇那個(gè)號(hào),歷經(jīng)很多次失敗后,終于成功從網(wǎng)上下載了Red Hat Enterprise Linux 6版本并安裝成功了程序的編譯環(huán)境(gcc)和運(yùn)行環(huán)境(Eclipse C++)

33、,并成功編譯了Linux上的第一個(gè)C++程序。這次經(jīng)歷使我感受到了自學(xué)能力的重要性。在如今的環(huán)境下,IT技術(shù)更新速度飛快,所以自學(xué)能力就顯得尤為重要,這次自學(xué)安裝配置Linux環(huán)境,編譯自己寫的源代碼的過(guò)程中我感覺到Linux的用法和Mac OS X操作系統(tǒng)十分相似,很多操作是相通的,這也體現(xiàn)了知識(shí)之間是相互聯(lián)系的,因?yàn)長(zhǎng)inux和Mac OS X操作系統(tǒng)使用的都是UNIX內(nèi)核,所以有所相似很正常。</p><p&g

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論