2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

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

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

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

4、t;<p>  1.3題目的要求如下:</p><p>  1.3.1.哲學家進餐問題描述:</p><p>  設有5個哲學家,共享一張放有5把椅子和5把叉子的圓桌,每人分得一把椅子。哲學家們在肚子饑餓時才試圖分兩次從兩邊撿起兩把叉子就餐。</p><p><b>  條件:</b></p><p>  

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

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

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

8、當哲學家的左右兩只叉子均可用時,才允許他拿起叉子進餐;</p><p>  3.規(guī)定奇數(shù)號的哲學家先拿他左邊的叉子,然后再去拿他右邊的叉子,而偶數(shù)號哲學家則相反。五位哲學家都先競爭奇數(shù)號叉子,獲得后再競爭偶數(shù)號叉子,最終總有一位哲學家會因為獲得兩只叉子而進餐。</p><p>  1.3.4我采用的解決死鎖問題的方法</p><p>  我采用的解決死鎖的方法是第二

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

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

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

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

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

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

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

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

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

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

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

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

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

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

23、t;p>  (4)信號量操作模板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>  當sem_op.sem_op為-1時表示執(zhí)行P操作,sem_op為1時表示執(zhí)行V操作</p><p>  3.4.2申請共享內(nèi)存區(qū)</p><p>  3.4.3連接共享內(nèi)存區(qū)和進程</p><p>  3.4.4創(chuàng)建信號量集并初始化信號量</p><p>  3.5 實現(xiàn)P、V操

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

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

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

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

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

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

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

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

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論