版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 題目: 用多線程同步方法解決哲學(xué)家就餐問題(Dining-Philosophers Problem)</p><p><b> 初始條件:</b></p><p> 操作系統(tǒng):Linux</p><p> 程序設(shè)計語言:C語言</p><p> 3.共有5個哲學(xué)家需用餐。只許4個哲學(xué)家入席且
2、桌上有5支筷子。</p><p> 要求完成的主要任務(wù): (包括課程設(shè)計工作量及其技術(shù)要求,以及說明書撰寫等具體要求)</p><p><b> 1.技術(shù)要求:</b></p><p> 1)為每個哲學(xué)家產(chǎn)生一個線程,設(shè)計正確的同步算法</p><p> 2)每個哲學(xué)家取得一雙筷子開始用餐后,即時顯示“Dinin
3、g…”和該哲學(xué)家的自定義標(biāo)識符以及餐桌上所有幾位哲學(xué)家標(biāo)識符及其所坐的位置。</p><p> 3)設(shè)定共有5個哲學(xué)家需用餐。每位用餐耗時10秒鐘以上。</p><p> 4)多個哲學(xué)家須共享操作函數(shù)代碼。</p><p> 2. 設(shè)計說明書內(nèi)容要求:</p><p><b> 1)設(shè)計題目與要求</b><
4、/p><p> 2)總的設(shè)計思想及系統(tǒng)平臺、語言、工具等。</p><p> 3)數(shù)據(jù)結(jié)構(gòu)與模塊說明(功能與流程圖)</p><p> 4)給出用戶名、源程序名、目標(biāo)程序名和源程序及其運行結(jié)果。(要注明存儲各個程序及其運行結(jié)果的Linux主機IP地址和目錄。)</p><p> 5)運行結(jié)果與運行情況</p><p&g
5、t; ?。ㄌ崾? (1)連續(xù)存儲區(qū)可用數(shù)組實現(xiàn)。</p><p> (2)編譯命令可用: cc -lpthread -o 目標(biāo)文件名 源文件名</p><p> (3)多線程編程方法參見附件。)</p><p> 3. 調(diào)試報告:</p><p><b> 1) 調(diào)試記錄</b></p&g
6、t;<p><b> 自我評析和總結(jié)</b></p><p><b> 上機時間安排:</b></p><p> 18周一~ 五 08:0 - 12:00 </p><p> 指導(dǎo)教師簽名: 年 月 日</p><p&g
7、t; 系主任(或責(zé)任教師)簽名: 年 月 日</p><p> 用多線程同步方法解決哲學(xué)家就餐問題</p><p> (Dining-Philosophers Problem)</p><p><b> 1.設(shè)計題目與要求</b></p><p> 1.1設(shè)計題目描述:<
8、/p><p> 用多線程同步方法解決哲學(xué)家就餐問題(Dining-Philosophers Problem)</p><p><b> 1.2要求:</b></p><p> 1)為每個哲學(xué)家產(chǎn)生一個線程,設(shè)計正確的同步算法</p><p> 2)每個哲學(xué)家取得一雙筷子開始用餐后,即時顯示“Dining…”和該哲學(xué)家
9、的自定義標(biāo)識符以及餐桌上所有幾位哲學(xué)家標(biāo)識符及其所坐的位置。</p><p> 3)設(shè)定共有5個哲學(xué)家需用餐。每位用餐耗時10秒鐘以上。</p><p> 4)多個哲學(xué)家須共享操作函數(shù)代碼。</p><p> 2.總體設(shè)計思想及系統(tǒng)平臺、語言、工具</p><p><b> 2.1總體設(shè)計思想</b></p
10、><p> 哲學(xué)家就餐問題,即共有5個哲學(xué)家繞一個圓桌做在5個位置上,他們每2個人中間有一只筷子,共5只筷子,只有當(dāng)每個哲學(xué)家取得他左右兩邊的筷子時,哲學(xué)家才能開始就餐,其它時間,哲學(xué)家只能思考或等待筷子。為避免哲學(xué)家互相等待對方的筷子發(fā)生死鎖,本次課程設(shè)計要求只許4個哲學(xué)家入席,以保證至少有一個哲學(xué)家能夠進(jìn)餐。</p><p> 本課程設(shè)計將room 作為信號量,將其初始化為4,以保證只
11、允許4個哲學(xué)家同時入席就餐,這樣就能保證至少有一個哲學(xué)家可以就餐。針對每個哲學(xué)家,通過共享操作函數(shù)代碼,分別建立5個線程,以實現(xiàn)同步哲學(xué)家就餐,而申請進(jìn)入餐廳的哲學(xué)家進(jìn)入room 的等待隊列,根據(jù)FIFO 的原則,總會進(jìn)入到餐廳就餐,因此不會出現(xiàn)餓死和死鎖的現(xiàn)象,針對5只筷子分別設(shè)置了5個互斥信號量,以保證每只筷子每次只能被取得一次。</p><p> 2.2系統(tǒng)平臺、語言及工具</p><
12、p> ?。?)操作系統(tǒng):Linux</p><p> ?。?)程序設(shè)計語言:C語言</p><p> ?。?)工具:編輯工具Vi、編譯器gcc</p><p> 3.?dāng)?shù)據(jù)結(jié)構(gòu)與模塊說明</p><p> 線程創(chuàng)建函數(shù)pthread_create聲明如下:</p><p> #include <pthr
13、ead.h></p><p> int pthread_create (pthread_t *thread,pthread_attr_t *attr,Void* (*start_routine)(void *),void *arg);</p><p> 等待其它線程結(jié)束函數(shù)pthread_join聲明如下:</p><p> #include <p
14、thread.h></p><p> int pthread_join (pthread_t th,void *thread_return);</p><p> 信號量的數(shù)據(jù)類型為結(jié)構(gòu)sem_t,它本質(zhì)上是一個長整型的數(shù)。</p><p> 初始化信號量函數(shù)sem_init聲明如下: </p><p> #inc
15、lude <semaphore.h></p><p> sem_init (sem_t *sem, int pshared, unsigned int value);</p><p> 增加信號量值函數(shù)sem_post聲明如下:</p><p> #include <semaphore.h></p><p>
16、Sem_post ( sem_t *sem );</p><p> 減少信號量值函數(shù)sem_wait聲明如下</p><p> #include <semaphore.h></p><p> Sem_wait ( sem_t *sem );</p><p><b> 主要數(shù)據(jù)結(jié)構(gòu)聲明:</b><
17、/p><p> #define NUMBERS 5 //將哲學(xué)家人數(shù)NUMBERS定義為5</p><p> sem_t chopstics[NUMBERS] //定義5只筷子的互斥信號量chopstics</p><p> sem_t room //定義避免死鎖的同步信號量room</p><
18、p> 線程共享函數(shù)偽代碼:</p><p> void *Share(int i)</p><p><b> {</b></p><p><b> think();</b></p><p> wait(room); //請求入席進(jìn)餐 </p>
19、<p> wait(chopstick[i]); //請求左手邊的筷子 </p><p> wait(chopstick[(i+1)%5]); //請求右手邊的筷子</p><p><b> eat();</b></p><p> signal(chopstick[i]); //釋放左
20、手邊的筷子</p><p> signal(chopstick[(i+1)%5]); //釋放右手邊的筷子 </p><p> signal(room); //退出席位釋放信號量chairs</p><p><b> } </b></p><p&
21、gt; 4.用戶名、源程序名、目標(biāo)程序名和源程序</p><p> 4.1用戶名、源程序名、目標(biāo)程序名</p><p><b> 用戶名:</b></p><p><b> 源程序名:</b></p><p><b> 目標(biāo)程序名:</b></p>&l
22、t;p><b> 4.2源程序</b></p><p> #include <stdio.h></p><p> #include <unistd.h></p><p> #include <pthread.h></p><p> #include <semaph
23、ore.h></p><p> #define NUMBERS 5 </p><p> sem_t chopstics[NUMBERS];</p><p> sem_t room; </p><p> sem_t mutex;</p><p> int flag[NUMBERS]={0,
24、0,0,0,0};</p><p> int chairs[NUMBERS]={0,1,2,3,4};</p><p><b> int i,j;</b></p><p> void *Share(int threadid);</p><p> int main()</p><p><
25、;b> {</b></p><p> int error;</p><p> pthread_t threads[NUMBERS];</p><p> for(i=0;i<NUMBERS;i++)</p><p><b> {</b></p><p> sem_
26、init(&chopstics[i],0,1);</p><p><b> }</b></p><p> sem_init(&room,0,NUMBERS-1);</p><p> sem_init(&mutex,0,1);</p><p> for(i=0;i<NUMBERS;i+
27、+)</p><p><b> {</b></p><p> error = pthread_create(&threads[i],NULL,(void*)Share,(void *)i);</p><p><b> if(error)</b></p><p><b> {
28、</b></p><p> printf("ERROR: thread create failed!!!");</p><p> //exit(-1);</p><p><b> }</b></p><p><b> }</b></p><
29、;p> for(i=0;i<NUMBERS;i++)</p><p><b> {</b></p><p> pthread_join(threads[i],NULL);</p><p><b> }</b></p><p><b> }</b></
30、p><p> void *Share(int threadid)</p><p><b> {</b></p><p> int i = threadid;</p><p> sem_wait(&room);</p><p> flag[i]=1;</p><p
31、> sem_wait(&chopstics[i]);</p><p> printf("philosopher %d get chopstics %d\n",i,i);</p><p> sem_wait(&chopstics[(i+1)%NUMBERS]);</p><p> printf("philo
32、sopher %d get chopstics %d\n",i,(i+1)%NUMBERS);</p><p> sem_wait(&mutex);</p><p> printf("\n*********************************************\n");</p><p> printf(&
33、quot;Dining...\n");</p><p> printf("philosopher: %d ,on chairs %d and eating\n",i,chairs[i]);</p><p> for(j=0;j<NUMBERS;j++)</p><p><b> {</b></p&
34、gt;<p> if((j!=i)&&flag[j]) </p><p> printf("philosopher %d ,on chairs %d and hungry\n",j,chairs[j]);</p><p><b> }</b></p><p><b> s
35、leep(3);</b></p><p> sem_post(&mutex);</p><p> sem_post(&chopstics[i]);</p><p> sem_post(&chopstics[(i+1)%NUMBERS]);</p><p> printf("philosop
36、her %d is full and put down chopstics %d and %d and left\n",i,i,(i+1)%NUMBERS);</p><p> printf("*********************************************\n\n");</p><p> flag[i]=0;</p>
37、<p> sem_post(&room);</p><p><b> }</b></p><p><b> 5.運行結(jié)果</b></p><p><b> 6.調(diào)試記錄</b></p><p> ?。?)將寫好的代碼進(jìn)行編譯,出現(xiàn)如下錯誤提示:&l
38、t;/p><p> 1.c:(.text+0x37): undefined reference to `sem_init'</p><p> 1.c:(.text+0x6a): undefined reference to `sem_init'</p><p> 1.c:(.text+0x86): undefined reference to `s
39、em_init'</p><p> 1.c:(.text+0xc8): undefined reference to `pthread_create'</p><p> 1.c:(.text+0x108): undefined reference to `pthread_join'</p><p> /tmp/ccq8XD3O.o: I
40、n function `Share':</p><p> 1.c:(.text+0x13f): undefined reference to `sem_wait'</p><p> 1.c:(.text+0x160): undefined reference to `sem_wait'</p><p> 1.c:(.text+0x1b0
41、): undefined reference to `sem_wait'</p><p> 1.c:(.text+0x1f7): undefined reference to `sem_wait'</p><p> 1.c:(.text+0x2ad): undefined reference to `sem_post'</p><p>
42、 1.c:(.text+0x2c0): undefined reference to `sem_post'</p><p> 1.c:(.text+0x2f5): undefined reference to `sem_post'</p><p> 1.c:(.text+0x35d): undefined reference to `sem_post'</
43、p><p> collect2: ld returned 1 exit status檢查發(fā)現(xiàn),pthread庫不是Linux系統(tǒng)默認(rèn)的庫,連接時需要使用庫libpthread.a,所以在使用pthread_create創(chuàng)建線程時,在編譯中 要加-lpthread參數(shù):gcc -lpthread -o 1 1.c</p><p> ?。?)重新編譯代碼,出現(xiàn)如下錯誤提示:</p
44、><p> 1.c:9: error: invalid initializer</p><p> 1.c:10: error: invalid initializer</p><p> 1.c: In function ‘main’:</p><p> 1.c:35: warning: incompatible implicit decl
45、aration of built-in function ‘exit’</p><p> 1.c: In function ‘Share’:</p><p> 1.c:48: error: incompatible types when assigning to type ‘sem_t’ from type ‘int’</p><p> 1.c:71: err
46、or: expected ‘;’ before ‘sem_post’</p><p> 1.c:76: error: incompatible types when assigning to type ‘sem_t’ from type ‘int’</p><p> 仔細(xì)查看代碼,發(fā)是對信號燈初始不能在定義的時候直接初始化,改用sem_init()函數(shù)對room,mutex 和flag
47、[]進(jìn)行初始化,去掉exit()函數(shù),找到缺少‘;’的地方,添加‘;’</p><p> ?。?)重新編譯、連接、運行程序,出現(xiàn)如下錯誤提示:</p><p> 1.c: In function ‘Share’:</p><p> 1.c:48: error: incompatible types when assigning to type ‘sem_t’ f
48、rom type ‘int’</p><p> 1.c:76: error: incompatible types when assigning to type ‘sem_t’ from type ‘int’</p><p> 查看代碼,發(fā)現(xiàn)對信號燈flag[]使用出錯,將flag[i]=1改為sem_wait(&flag[i]);flag[i]=0改為sem_post(&am
49、p;flag[i])</p><p> ?。?)重新編譯、連接、運行程序,沒有錯誤提示,但是結(jié)果有誤:</p><p> philosopher 0 get chopstics 0</p><p> I'm philosopher 0 get chopstics 0</p><p> 程序程出現(xiàn)死鎖,無法正常進(jìn)行,查看代碼,發(fā)現(xiàn)
50、不應(yīng)該把flag[]設(shè)置為信號</p><p> (5)改正后,重新編譯、連接,運行程序,得到正確結(jié)果</p><p> philosopher 0 get chopstics 0</p><p> philosopher 1 get chopstics 1</p><p> philosopher 2 get chopstics 2
51、</p><p> philosopher 3 get chopstics 3</p><p> philosopher 3 get chopstics 4</p><p> *********************************************</p><p><b> Dining...</b&
52、gt;</p><p> philosopher: 3 ,on chairs 3 and eating</p><p> philosopher 0 ,on chairs 0 and hungry</p><p> philosopher 1 ,on chairs 1 and hungry</p><p> philosopher
53、2 ,on chairs 2 and hungry</p><p> philosopher 3 is full and put down chopstics 3 and 4 and left*********************************************</p><p> philosopher 2 get chopstics 3</p>&
54、lt;p> *********************************************</p><p><b> Dining...</b></p><p> philosopher: 2 ,on chairs 2 and eating</p><p> philosopher 0 ,on chairs 0 and
55、 hungry</p><p> philosopher 1 ,on chairs 1 and hungry</p><p> philosopher 4 ,on chairs 4 and hungry</p><p> philosopher 4 get chopstics 4</p><p> philosopher 2 is f
56、ull and put down chopstics 2 and 3 and left</p><p> *********************************************</p><p> philosopher 1 get chopstics 2</p><p> **********************************
57、***********</p><p> Dining...philosopher: 1 ,on chairs 1 and eating</p><p> philosopher 0 ,on chairs 0 and hungry</p><p> philosopher 4 ,on chairs 4 and hungry</p><p&
58、gt; philosopher 1 is full and put down chopstics 1 and 2 and left</p><p> *********************************************</p><p> philosopher 0 get chopstics 1</p><p> ***********
59、**********************************</p><p><b> Dining...</b></p><p> philosopher: 0 ,on chairs 0 and eating</p><p> philosopher 4 ,on chairs 4 and hungry</p>&l
60、t;p> philosopher 0 is full and put down chopstics 0 and 1 and left</p><p> *********************************************</p><p> philosopher 4 get chopstics 0</p><p> *******
61、**************************************</p><p><b> Dining...</b></p><p> philosopher: 4 ,on chairs 4 and eating</p><p> philosopher 4 is full and put down chopstics 4
62、and 0 and left</p><p><b> 7.自我評析與總結(jié)</b></p><p> 通過本次課程設(shè)計,我對哲學(xué)家就餐這一操作系統(tǒng)經(jīng)典問題有了進(jìn)一步的了解,尤其是在設(shè)計進(jìn)程同步算法方面有了新的認(rèn)識。通過親自動手和查詢資料,我知道了通過Linux系統(tǒng)的線程機制和信號量控制來實現(xiàn)哲學(xué)家就餐問題的并發(fā)控制。在這次課程設(shè)計中,由于沒有掌握好進(jìn)程同步中的一些
63、關(guān)鍵知識,導(dǎo)致在實際操作中遇到了很多問題,比如說對信號燈初始化,可以用sem_init函數(shù)來很好的實現(xiàn),而不需要在定義的時候就進(jìn)行初始化。在整個程序設(shè)計和完善中,遇到很多問題,有些是由于對知識不了解引起的,有些是由于粗心引起的。此次課程設(shè)計使我明白,在程序設(shè)計中,我們需要有一個清晰的整體結(jié)構(gòu),然后針對每個模塊逐步實現(xiàn)其功能,在設(shè)計中也需要有嚴(yán)謹(jǐn)和認(rèn)真的態(tài)度,才會更好的完成一項任務(wù)。</p><p><b&g
64、t; 8.參考文獻(xiàn)</b></p><p> [1]《操作系統(tǒng)概念》(第七版) ,Abraham Silberschatz等著,高等教育出版社出版</p><p> [2]《Linux C 編程實踐》,童永清著,人民郵電出版社</p><p> [3]《操作系統(tǒng)》(第3版)(中譯本),OPERATING SYSTEMS(3RD EDITION),
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程設(shè)計哲學(xué)家就餐問題
- 操作系統(tǒng)課程設(shè)計-哲學(xué)家進(jìn)餐問題
- 操作系統(tǒng)課程設(shè)計——哲學(xué)家進(jìn)餐問題
- 操作系統(tǒng)課程設(shè)計——哲學(xué)家進(jìn)餐問題
- 操作系統(tǒng)課程設(shè)計——哲學(xué)家進(jìn)餐問題
- 操作系統(tǒng)課程設(shè)計哲學(xué)家進(jìn)餐問題報告
- 操作系統(tǒng)課程設(shè)計——操作系統(tǒng)課程設(shè)計模擬操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計-頁面置換算法c語言
- 操作系統(tǒng)課程設(shè)計-- 操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計--蘋果問題
- 哲學(xué)家名言
- 操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計報告--蘋果問題
- 操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計
- 哲學(xué)家的幽默
- 內(nèi)存管理(操作系統(tǒng))操作系統(tǒng)課程設(shè)計
評論
0/150
提交評論