版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p> *******************</p><p><b> 實踐教學</b></p><p> *******************</p><p><b> 計算機與通信學院</b></p><p><b> 2011年秋季學期</b>&
2、lt;/p><p><b> 操作系統(tǒng) 課程設(shè)計</b></p><p> 題 目: 理發(fā)師問題 </p><p> 專業(yè)班級: 軟件一班 </p><p> 姓 名: </p><p> 學 號: </p>
3、<p> 指導教師: </p><p> 成 績:_______________</p><p><b> 目 錄</b></p><p> 目 錄············&
4、#183;····································
5、;·········2</p><p> 摘 要······················
6、83;···································3</p
7、><p> 關(guān) 鍵 字·································
8、·························3</p><p> 設(shè)計思想·······
9、····································
10、3;··············4</p><p> 正 文·················
11、183;····································
12、····4</p><p> 一、數(shù)據(jù)結(jié)構(gòu)···························
13、3;·······················5</p><p> 1、信號量········
14、83;····································&
15、#183;····5</p><p> 2、全局變量···························
16、;·····················5</p><p> 3、函數(shù)···········
17、;····································
18、83;····5</p><p> 二、程序模塊···························&
19、#183;·······················6</p><p> 理發(fā)師模塊流程圖·······
20、83;······························6</p><p> 顧客模塊流程圖·
21、····································
22、3;···7</p><p> 主程序流程圖····························
23、183;··············8</p><p> PV操作偽代碼·················
24、;·························9</p><p> 三、運行結(jié)果······
25、83;····································&
26、#183;······10</p><p> 代碼編輯·························
27、······················10</p><p> 編譯運行··········
28、;····································
29、83;12</p><p> 運行結(jié)果·······························
30、183;···············12</p><p> 設(shè)計總結(jié)················&
31、#183;····································
32、;····13參考文獻· 致謝······························
33、···················14附錄:源代碼················
34、183;····································
35、15</p><p><b> 摘 要</b></p><p> 理發(fā)師問題是一個利用信號量進行PV操作的經(jīng)典問題。設(shè)計程序?qū)崿F(xiàn)此問題,要使得理發(fā)師的活動與顧客的活動得到各自真實的模擬。所執(zhí)行的程序應(yīng)體現(xiàn):理發(fā)師在沒有顧客的時候去睡覺,有顧客則工作;顧客在理發(fā)師工作時坐下等待,無座時離開,直至等到理發(fā)師自己理發(fā)。</p><p> 關(guān)鍵
36、字:理發(fā)師,顧客,PV操作。</p><p><b> 設(shè)計思想</b></p><p> 打瞌睡的理發(fā)師問題是一種同步問題的抽象描述。計算機系統(tǒng)中的每個進程都可以消費或生產(chǎn)某類資源,當系統(tǒng)中某一進程使用某一資源時,可以看作是消耗,且該進程稱為消費者。而當某個進程釋放資源時,則它就相當一個生產(chǎn)者。因此此題可看作是n個生產(chǎn)者和1個消費者問題。顧客作為生產(chǎn)者,每到來一
37、個就使計數(shù)器count增加1,以便讓理發(fā)師理發(fā)(相當于消費)至最后一個顧客(相當于產(chǎn)品)。并且,第1個到來的顧客應(yīng)負責喚醒理發(fā)師;如果不是第1個到達的顧客,則在有空椅子的情況下坐下等待,否則離開理發(fā)店(該消息可由計數(shù)器count獲得)。所以可以通過一個有界緩沖區(qū)把理發(fā)師和顧客聯(lián)系起來。而其中的信號也具有兩種功能:一是跟蹤資源的理發(fā)師和顧客的計數(shù)器;二是協(xié)調(diào)資源的理發(fā)師和顧客之間的同步器。通過對信號進行P、V操作來實現(xiàn)有關(guān)問題和相關(guān)描述。
38、</p><p><b> 數(shù)據(jù)結(jié)構(gòu):</b></p><p> 1、信號量:int Custom;//所有到達的顧客,包括正在被理發(fā)的顧客,所以一般情況下,Custom比Wait_Person大1</p><p> int Mutex;//用于實現(xiàn)全局變量Wait——preson訪問的互斥</p>&l
39、t;p> int Wait_Leave;//等待離開信號量,用來表示幾個顧客等待離開,只要理發(fā)師為其理發(fā)完畢,他就可以離開了</p><p> 全局變量:int * Is_Sleeping;//當前理發(fā)師是否在睡覺</p><p> 3、函數(shù): void print1(int Wait_person)</p><p> void print2(i
40、nt ID)</p><p> 4:Linux 提供的多線程函數(shù):</p><p> int pthread_create(pthread_t *—thread,_const pthread_attr_t *attr,void*(*start_rtn)(void*),void *arg);</p><p> int pthread_join __P ((
41、pthread_t __th, void **__thread_return));pthread_attr_init(&attr);</p><p> pthread_attr_getschedparam(&attr, ¶m);</p><p> param.sched_priority=newprio;</p><p
42、> pthread_attr_setschedparam(&attr, ¶m);</p><p> pthread_create(&tid, &attr, (void *)myfunction, myarg);</p><p> pthread_detach(thread_id);pthread_t pthread_self(void);
43、</p><p><b> 二、程序模塊:</b></p><p> 1、理發(fā)師模塊流程圖:</p><p><b> 顧客模塊流程圖:</b></p><p><b> 3、主程序流程圖:</b></p><p><b> 4、PV
44、操作偽代碼</b></p><p> int waiting=0 ; //等候理發(fā)的顧客數(shù) </p><p> int chairs=n; //為顧客準備的椅子數(shù) </p><p> semaphore customers=0, barbers=0,mutex=1; </p><p><b> barber()
45、</b></p><p><b> { </b></p><p> while(TRUE); //理完一人,還有顧客嗎? </p><p> P(cutomers); //若無顧客,理發(fā)師睡眠 </p><p> P(mutex); //進程互斥 </p><p> wait
46、ing -= 1;//等候顧客數(shù)少一個 </p><p> V(barbers); //理發(fā)師去為一個顧客理發(fā) </p><p> V(mutex); //開放臨界區(qū) </p><p> cut-hair( ); //正在理發(fā)</p><p><b> } </b></p><p> c
47、ustomer() </p><p><b> { </b></p><p> P(mutex); //進程互斥 </p><p> if (waiting) </p><p><b> { </b></p><p> waiting += 1; // 等候顧客數(shù)加
48、1</p><p> V(customers); //必要的話喚醒理發(fā)師 </p><p> V(mutex); //開放臨界區(qū) </p><p> P(barbers); //無理發(fā)師, 顧客坐著養(yǎng)神 </p><p> get-haircut( ); //一個顧客坐下等理/</p><p><b>
49、; } </b></p><p> else V(mutex); //人滿了,離開</p><p><b> }</b></p><p><b> 三、測試結(jié)果:</b></p><p><b> 代碼編輯:</b></p><p>
50、;<b> 2、編譯運行:</b></p><p><b> 3、運行結(jié)果:</b></p><p><b> 設(shè)計總結(jié)</b></p><p> 本次課程設(shè)計完成了多進程同步方法理發(fā)師問題全部過程,結(jié)果滿足設(shè)計要求,驗證無誤。設(shè)計過程中也遇到不少困難,尤其是關(guān)于多進程程序的設(shè)計實現(xiàn)。特別需要
51、注意的是由于進程的數(shù)據(jù)共享會帶來其他一些問題,while循環(huán)中的各個循環(huán)小模塊需要嚴格區(qū)別開來,才能使輸出結(jié)果正確有序。這些正是編寫多進程程序時最需要注意的地方。</p><p> 通過本次設(shè)計,我較好地掌握了通過研究Linux 的進程機制和信號量實現(xiàn)PV操作的全過程,尤其是對多進程程序設(shè)計方法有了更深的理解,開拓了思路,鍛煉了實踐動手能手,達到了課程設(shè)計目的。</p><p><
52、b> 參考文獻·致謝</b></p><p> 1. 湯子瀛,哲鳳屏.《計算機操作系統(tǒng)》.西安電子科技大學學出版社.</p><p> 2. 王清,李光明.《計算機操作系統(tǒng)》.冶金工業(yè)出版社.</p><p> 3.孫鐘秀等. 操作系統(tǒng)教程. 高等教育出版社</p><p> 4.曾明. Li
53、nux操作系統(tǒng)應(yīng)用教程. 陜西科學技術(shù)出版社. </p><p> 5. 張麗芬,劉利雄.《操作系統(tǒng)實驗教程》. 清華大學出版社.</p><p> 6. 孟靜, 操作系統(tǒng)教程--原理和實例分析. 高等教育出版社</p><p> 7. 周長林,計算機操作系統(tǒng)教程. 高等教育出版社</p><p> 8. 張堯?qū)W,計算機操作
54、系統(tǒng)教程,清華大學出版社</p><p> 9. 任滿杰,操作系統(tǒng)原理實用教程,電子工業(yè)出版社</p><p> 在此次課程設(shè)計的過程中,我首先要感謝我的指導老師王旭陽老師,給了我很大的幫助,與此同時感謝宿舍的舍友,對此次課程設(shè)計的程序的調(diào)試工作給予了大力的幫助。</p><p><b> 附錄:源代碼</b></p>&l
55、t;p> #include <sys/mman.h></p><p> #include <sys/types.h></p><p> #include <linux/sem.h></p><p> #include <fcntl.h></p><p> #include <
56、;unistd.h></p><p> #include <stdio.h></p><p> #include <errno.h></p><p> #include <time.h></p><p> #define N 5 </p><p> #defi
57、ne M 20 </p><p> int Custom;</p><p> int Mutex;</p><p> int Wait_Leave;</p><p> int * Is_Sleeping;</p><p> void print1(int Wait_person)</p>&
58、lt;p><b> {</b></p><p> if(!Wait_person)</p><p><b> {</b></p><p> printf("No customer here, go to sleep.\n");</p><p> *Is_Sleep
59、ing=1;</p><p><b> }</b></p><p><b> }</b></p><p> void print2(int ID)</p><p><b> {</b></p><p> if(*Is_Sleeping)<
60、/p><p><b> {</b></p><p> printf("New customer %d comes, weak up the barber.\n",ID);</p><p> *Is_Sleeping=0;</p><p><b> }</b></p>
61、;<p><b> else</b></p><p> printf("New customer %d comes, there are somes chairs free , sits and waites.\n",ID);</p><p><b> }</b></p><p>
62、 int main()</p><p><b> {</b></p><p> struct sembuf P,V;</p><p> union semun arg;</p><p> int Pid,i=0;</p><p> int * Wait_Person;</p>
63、<p> //映射共享內(nèi)存,臨界區(qū)</p><p> Wait_Person=(int * )mmap(NULL,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);</p><p> *Wait_Person=0;</p><p> Is_Sleeping=(int
64、* )mmap(NULL,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);</p><p> *Is_Sleeping=0;</p><p> Custom=semget(IPC_PRIVATE,1,IPC_CREAT|00666);</p><p> Mutex=semget(I
65、PC_PRIVATE,1,IPC_CREAT|00666);</p><p> Wait_Leave=semget(IPC_PRIVATE,1,IPC_CREAT|00666);</p><p> arg.val = 0;</p><p> if(semctl(Custom,0,SETVAL,arg)==-1)</p><p> pe
66、rror("semctl semeval error");</p><p> arg.val = 1;</p><p> if(semctl(Mutex,0,SETVAL,arg)==-1)</p><p> perror("semctl semeval error");</p><p> ar
67、g.val = 0;</p><p> if(semctl(Wait_Leave,0,SETVAL,arg)==-1)</p><p> perror("semctl semeval error");</p><p> V.sem_num=0;</p><p> V.sem_op=1;</p><
68、;p> V.sem_flg=SEM_UNDO;</p><p> P.sem_num=0;</p><p> P.sem_op=-1;</p><p> P.sem_flg=SEM_UNDO;</p><p> Pid=fork();</p><p> if(Pid==0)</p>&l
69、t;p><b> {//理發(fā)師進程</b></p><p><b> while(1)</b></p><p><b> {</b></p><p> semop(Mutex,&P,1);</p><p> print1(*Wait_Person);&l
70、t;/p><p> semop(Mutex,&V,1);</p><p> semop(Custom,&P,1);</p><p> semop(Mutex,&P,1);</p><p> (*Wait_Person)--;</p><p> semop(Mutex,&V,1);&
71、lt;/p><p> printf("Barber is working!\n");</p><p><b> sleep(3);</b></p><p> printf("One job finished.\n");</p><p> semop(Wait_Leave,&am
72、p;V,1);</p><p><b> }</b></p><p> printf("******************Last one is finished, close the dodr.**********************\n");</p><p><b> }</b><
73、/p><p><b> else</b></p><p><b> {</b></p><p><b> while(1)</b></p><p><b> {</b></p><p> if(Pid==0)</p>
74、;<p><b> {</b></p><p> semop(Mutex,&P,1);</p><p> if((*Wait_Person)>=N)</p><p><b> {</b></p><p> semop(Mutex,&V,1);</p
75、><p> printf("New customer %d comes,there is no chair and go away.\n",getpid());</p><p><b> exit(0);</b></p><p><b> }</b></p><p><b
76、> else</b></p><p><b> {</b></p><p> print2(getpid());喚醒理發(fā)師,否則,等待</p><p> (*Wait_Person)++;</p><p> semop(Mutex,&V,1);</p><p>
77、 semop(Custom,&V,1);</p><p> semop(Wait_Leave,&P,1);</p><p> printf("Customer %d finished,get out of here.\n",getpid());</p><p><b> exit(0);</b><
78、;/p><p><b> }</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> sleep(rand()%100/30.0);&l
79、t;/p><p><b> if(i<M)</b></p><p><b> {</b></p><p> Pid=fork();</p><p><b> i++;</b></p><p><b> }</b><
80、/p><p><b> else</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> if(i==M)<
81、/b></p><p><b> {</b></p><p> wait(NULL);</p><p><b> }</b></p><p><b> }</b></p><p><b> return 0;</b>
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計---理發(fā)師問題的實現(xiàn)
- 課程設(shè)計--理發(fā)師系統(tǒng)
- 進程之間的同步互斥與通信理發(fā)師問題操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計說明書(樣板)
- 操作系統(tǒng)課程設(shè)計——操作系統(tǒng)課程設(shè)計模擬操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計-- 操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計說明
- 操作系統(tǒng)課程設(shè)計--蘋果問題
- 理發(fā)師教學設(shè)計
- 操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計報告--蘋果問題
- 操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計
- 理發(fā)師悖論
- 理發(fā)師教學設(shè)計61304
- 理發(fā)師教學設(shè)計61236
- 操作系統(tǒng)課程設(shè)計指導書
評論
0/150
提交評論