版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、*實(shí)踐教學(xué)* 蘭州理工大學(xué)計(jì)算機(jī)與通信學(xué)院2011年秋季學(xué)期 操作系統(tǒng) 課程設(shè)計(jì)題 目:理發(fā)師問題的實(shí)現(xiàn) 專業(yè)班級:計(jì)算機(jī)科學(xué)與技術(shù)姓 名: 學(xué) 號: 指導(dǎo)教師: 成 績: 摘 要 理發(fā)師問題是一個(gè)利用信號量進(jìn)行PV操作的經(jīng)典問題。設(shè)計(jì)程序?qū)崿F(xiàn)此問題,要使得理發(fā)師的活動與顧客的活動得到各自真實(shí)的模擬。所執(zhí)行的程序應(yīng)體現(xiàn):理發(fā)師在沒有顧客的時(shí)候去睡覺,有顧客則工作;顧客在理發(fā)師工作時(shí)坐下等待,無座時(shí)離開,直至等到理發(fā)師自己理發(fā)。關(guān)鍵字:理發(fā)師,顧客,PV操作。目錄摘 要21 設(shè)計(jì)要求41.1初始條件41.2技術(shù)要求42 總體設(shè)計(jì)思想及開發(fā)環(huán)境與工具42.1 總體設(shè)計(jì)思想42.2 多線程編程原理5
2、2.2.1 創(chuàng)建一個(gè)線程52.2.2 等待一個(gè)線程結(jié)束52.2.3 信號量62.3 偽碼實(shí)現(xiàn)62.4 開發(fā)環(huán)境與工具83數(shù)據(jù)結(jié)構(gòu)與模塊說明83.1 數(shù)據(jù)結(jié)構(gòu)83.2函數(shù)的調(diào)用關(guān)系圖83.2.1主函數(shù)模塊83.2.2 理發(fā)師模塊93.2.3 顧客模塊105運(yùn)行結(jié)果105.1運(yùn)行步驟105.2測試結(jié)果115.2.1 編輯,編譯和運(yùn)行的過程圖115.2.2 錯(cuò)誤部分截圖125.2.3 正確運(yùn)行結(jié)果圖12設(shè)計(jì)總結(jié)16參考文獻(xiàn)17致謝18附錄(源程序代碼)191 設(shè)計(jì)要求1.1初始條件(1)操作系統(tǒng):Linux(2)程序設(shè)計(jì)語言:C語言(3)設(shè)有一個(gè)理發(fā)師,5把椅子(另外還有一把理發(fā)椅),幾把椅子可用連
3、續(xù)存儲單元。1.2技術(shù)要求(1)為每個(gè)理發(fā)師顧客產(chǎn)生一個(gè)線程,設(shè)計(jì)正確的同步算法(2)每個(gè)顧客進(jìn)入理發(fā)室后,即時(shí)顯示“Entered” 及其線程自定義標(biāo)識,還同時(shí)顯示理發(fā)室共有幾名顧客及其所坐的位置。(3)至少有10個(gè)顧客,每人理發(fā)至少3秒鐘。(4)多個(gè)顧客須共享操作函數(shù)代碼。2 總體設(shè)計(jì)思想及開發(fā)環(huán)境與工具2.1 總體設(shè)計(jì)思想題目中要求描述理發(fā)師和顧客的行為,因此需要兩類線程barber()和customer ()分別描述理發(fā)師和顧客的行為。其中,理發(fā)師有活動有理發(fā)和睡覺兩個(gè)事件;等待和理發(fā)二個(gè)事件。店里有固定的椅子數(shù),上面坐著等待的顧客,顧客在到來這個(gè)事件時(shí),需判斷有沒有空閑的椅子,理發(fā)師
4、決定要理發(fā)或睡覺時(shí),也要判斷椅子上有沒有顧客。所以,顧客和理發(fā)師之間的關(guān)系表現(xiàn)為:(1)理發(fā)師和顧客之間同步關(guān)系:當(dāng)理發(fā)師睡覺時(shí)顧客近來需要喚醒理發(fā)師為其理發(fā),當(dāng)有顧客時(shí)理發(fā)師為其理發(fā),沒有的時(shí)候理發(fā)師睡覺。(2)理發(fā)師和顧客之間互斥關(guān)系:由于每次理發(fā)師只能為一個(gè)人理發(fā),且可供等侯的椅子有限只有n把,即理發(fā)師和椅子是臨界資源,所以顧客之間是互斥的關(guān)系。(3)故引入3個(gè)信號量和一個(gè)控制變量:控制變量waiting用來記錄等候理發(fā)的顧客數(shù),初值為0;信號量customers用來記錄等候理發(fā)的顧客數(shù),并用作阻塞理發(fā)師進(jìn)程,初值為0;信號量barbers用來記錄正在等候顧客的理發(fā)師數(shù),并用作阻塞顧客進(jìn)
5、程,初值為1; 信號量mutex用于互斥,初值為1 2.2 多線程編程原理此次在Linux下進(jìn)行多線程編程需要用到pthread_create和pthread_join這兩個(gè)函數(shù)。2.2.1 創(chuàng)建一個(gè)線程pthread_create用來創(chuàng)建一個(gè)線程,原型為:extern int pthread_create(pthread_t *_thread, _const pthread_attr_t *_attr,void *(*_start_routine) (void *), void *_arg)第一個(gè)參數(shù)為指向線程標(biāo)識符的指針,第二個(gè)參數(shù)用來設(shè)置線程屬性,第三個(gè)參數(shù)是線程運(yùn)行函數(shù)的起始地址,最后
6、一個(gè)參數(shù)是運(yùn)行函數(shù)的參數(shù)。函數(shù)thread不需要參數(shù)時(shí),最后一個(gè)參數(shù)設(shè)為空指針。第二個(gè)參數(shù)設(shè)為空指針時(shí),將生成默認(rèn)屬性的線程。創(chuàng)建線程成功后,新創(chuàng)建的線程則運(yùn)行參數(shù)三和參數(shù)四確定的函數(shù),原來的線程則繼續(xù)運(yùn)行下一行代碼。2.2.2 等待一個(gè)線程結(jié)束pthread_join用來等待一個(gè)線程的結(jié)束,函數(shù)原型為:extern int pthread_join _P (pthread_t _th, void *_thread_return);第一個(gè)參數(shù)為被等待的線程標(biāo)識符,第二個(gè)參數(shù)為一個(gè)用戶定義的指針,它可以用來存儲被等待線程的返回值。這個(gè)函數(shù)是一個(gè)線程阻塞的函數(shù),調(diào)用它的函數(shù)將一直等待到被等待的線程
7、結(jié)束為止,當(dāng)函數(shù)返回時(shí),被等待線程的資源被收回。2.2.3 信號量(1)函數(shù)sem_init()用來初始化一個(gè)信號量,函數(shù)原型為: extern int sem_init _P (sem_t *_sem, int _pshared, unsigned int _value);sem為指向信號量結(jié)構(gòu)的一個(gè)指針;pshared不為時(shí)此信號量在進(jìn)程間共享,否則只能為當(dāng)前進(jìn)程的所有線程共享;value給出了信號量的初始值。(2)函數(shù)sem_post( sem_t *sem )用來增加信號量的值。當(dāng)有線程阻塞在這個(gè)信號量上時(shí),調(diào)用這個(gè)函數(shù)會使其中的一個(gè)線程不在阻塞,選擇機(jī)制同樣是由線程的調(diào)度策略決定的。
8、(3)函數(shù)sem_wait( sem_t *sem )被用來阻塞當(dāng)前線程直到信號量sem的值大于0,解除阻塞后將sem的值減一,表明公共資源經(jīng)使用后減少。函數(shù)sem_trywait ( sem_t *sem )是函數(shù)sem_wait()的非阻塞版本,它直接將信號量sem的值減一。2.3 偽碼實(shí)現(xiàn) difine n 5; /為顧客準(zhǔn)備的椅子數(shù)為5 semaphore mutex=1; /用于互斥 semaphore customers=0;/等候理發(fā)的顧客數(shù) semaphore barbers=1;/正在等候顧客的理發(fā)師數(shù) int waiting=0; /等候理發(fā)的顧客數(shù) /理發(fā)師線程 void
9、 barber() while(true) /判斷有無顧客 wait(customers); /若無顧客,理發(fā)師睡眠 wait(mutex); /互斥 waiting-; /等候顧客數(shù)少一個(gè) signal(mutex); /釋放臨界資源signal(barber); /理發(fā)師去為一個(gè)顧客理發(fā)cut_hair; /正在理發(fā) /顧客線程void customer() wait(mutex); /互斥 if (waitingn) /如果有空椅子,則等待 waiting+; /等候顧客數(shù)加1 signal(mutex); /釋放臨界資源signal(customers); /如果理發(fā)師睡覺,喚醒理發(fā)師
10、 wait(barber); /理發(fā)師在理發(fā), 顧客等候 get_haircut; /顧客坐下等理發(fā)師 else signal(mutex); /店里人滿了,顧客離開 2.4 開發(fā)環(huán)境與工具系統(tǒng)平臺:LINUX環(huán)境實(shí)現(xiàn)語言:C語言開發(fā)工具:NANO編輯器3數(shù)據(jù)結(jié)構(gòu)與模塊說明3.1 數(shù)據(jù)結(jié)構(gòu)通過分析課程設(shè)計(jì)要求,定義以下的數(shù)據(jù):sem_t mutex,customers,barbers; /design three semaphores: mutex,customer,barbersint waiting=0; /the number of waiting customersint chair5
11、;3.2函數(shù)的調(diào)用關(guān)系圖3.2.1主函數(shù)模塊主函數(shù)流程圖如下:3.2.2 理發(fā)師模塊 理發(fā)師模塊函數(shù)流程圖如下:3.2.3 顧客模塊顧客模塊函數(shù)流程圖如下:5運(yùn)行結(jié)果5.1運(yùn)行步驟(1) 打開桌面上的putty.exe,輸入IP地址192.168.1.254,進(jìn)入開發(fā)環(huán)境。創(chuàng)建一個(gè)用來寫程序的文件,這里用的是nano編輯器來編寫c程序。創(chuàng)建SleepingBarber.c的命令為:nano 進(jìn)入編輯環(huán)境,輸入代碼,結(jié)束后按ctrl+x保存為SleepingBarber.c,進(jìn)入文件的命令為:nano SleepingBarber.c,然后可以對其進(jìn)行修改。(2) 編譯源程序,編譯命令為:cc
12、-lpthread -o SleepingBarber SleepingBarber.c(3) 編譯無錯(cuò)誤后,運(yùn)行程序,命令為: ./ SleepingBarber5.2測試結(jié)果5.2.1 編輯,編譯和運(yùn)行的過程圖5.2.2 錯(cuò)誤部分截圖5.2.3 正確運(yùn)行結(jié)果圖第一次運(yùn)行結(jié)果如下圖:第二次運(yùn)行結(jié)果如下圖:第三次運(yùn)行結(jié)果如下圖;設(shè)計(jì)總結(jié)兩周的的操作系統(tǒng)課程設(shè)計(jì)終于完成了,回想這兩周的努力,感觸良多。拿到題目時(shí)我不知從何下手,想想自己對Liunx一無所知,無奈,只好去查閱相關(guān)書籍,并在網(wǎng)上查找了相關(guān)資料,了解了linux多線程編程的原理,應(yīng)注意的問題,及一些常用命令第一周先設(shè)計(jì)出了該程序的偽代碼
13、即其wait、signal操作。然后,根據(jù)其要求進(jìn)行編程,由于使用的是多線程編程,開始進(jìn)行編譯的時(shí)候,編譯命令輸入錯(cuò)誤,沒有輸入-lpthread,程序總是出現(xiàn)錯(cuò)誤。同時(shí),創(chuàng)建線程函數(shù)時(shí),由于對其格式輸入錯(cuò)誤導(dǎo)致程序無法運(yùn)行。例如sb.c,sb1.c等都為本次調(diào)試時(shí)的程序。第二周主要是不斷的調(diào)試并完善程序。程序可以運(yùn)行,但與要求總有些不符,故不斷的進(jìn)行修改,并對其輸出的格式進(jìn)行完善,使其輸出看起來美觀一些,容易觀察一些。例如s.c,b.c等程序?yàn)榇舜握{(diào)試結(jié)果。然后是在原有代碼的基礎(chǔ)上,使程序更完整些。并進(jìn)行結(jié)果的截圖,開始設(shè)計(jì)并編寫課程設(shè)計(jì)說明書。通過本次編程我熟悉了linux 下的多線程編程
14、和信號量實(shí)現(xiàn)wait、signal操作的全過程,對同步和互斥問題也有了更深一步的理解,同時(shí),也使我對linux編程有了更多的了解,在很多方面,它與在windows下編程有著很大的不同,對與多線程來說更方便一些。 設(shè)計(jì)過程中也遇到不少困難,尤其是對于多線程的實(shí)現(xiàn),結(jié)果總是不如想象中完美。比如其顧客編號的輸出有時(shí)會不按順序,輸入有點(diǎn)亂。另外,有時(shí),輸出結(jié)束后,程序仍無法結(jié)束,必須強(qiáng)制性關(guān)閉終端才可以結(jié)束程序,這是本程序的一個(gè)不足之處。在本次課程設(shè)計(jì)中我深深感覺到自己掌握的知識還遠(yuǎn)遠(yuǎn)不夠,我明白光是知道書本上的知識是遠(yuǎn)遠(yuǎn)不夠的,一定要把理論知識和實(shí)踐結(jié)合起來。同時(shí),要多多學(xué)習(xí)linux的操作。參考文
15、獻(xiàn)1. 湯子瀛,哲鳳屏.計(jì)算機(jī)操作系統(tǒng).西安電子科技大學(xué)學(xué)出版社.2. 王清,李光明.計(jì)算機(jī)操作系統(tǒng).冶金工業(yè)出版社.3.孫鐘秀等. 操作系統(tǒng)教程. 高等教育出版社4.曾明. Linux操作系統(tǒng)應(yīng)用教程. 陜西科學(xué)技術(shù)出版社. 5. 張麗芬,劉利雄.操作系統(tǒng)實(shí)驗(yàn)教程. 清華大學(xué)出版社.6. 孟靜,操作系統(tǒng)教程原理和實(shí)例分析. 高等教育出版社7. 周長林,計(jì)算機(jī)操作系統(tǒng)教程. 高等教育出版社8. 張堯?qū)W,計(jì)算機(jī)操作系統(tǒng)教程,清華大學(xué)出版社9. 任滿杰,操作系統(tǒng)原理實(shí)用教程,電子工業(yè)出版社致謝在此次課程設(shè)計(jì)的過程中,我首先要感謝我的指導(dǎo)老師張永老師,給了我很大的幫助,與此同時(shí)感謝宿舍的舍友,對此次
16、課程設(shè)計(jì)的程序的調(diào)試工作給予了大力的幫助。附錄(源程序代碼)#include#include#include#include#include#include#include#define n 5 /the shop have five chairs/design three semaphores: mutex,customer,barberssem_t mutex,customers,barbers;int waiting=0; /the number of waiting customersint chair5; void * barber();void * customer(void *a
17、rg);int main(int argc,char *argv) /create 10 semaphores and one Barber semaphore pthread_t Customer_id10,Barber_id; int i; sem_init(&mutex,0,1); /init mutex semaphore to 1 sem_init(&customers,0,0);/init semaphore customers to 0 sem_init(&barbers,0,1); for(i=0;i5;i+) pthread_create(&Barber_id,NULL,(v
18、oid*)barber,NULL); for (i=0;i10;i+) pthread_create(&Customer_idi,NULL,(void*)customer,(void*)(i+1); for (i=0;i10;i+) pthread_join(Customer_idi,NULL); for(i=0;i5;i+) pthread_join(Barber_id,NULL); return 0;/creat barber pthreadvoid * barber() int i; int next; /wait(customers),if no customers,barber sl
19、eeping sem_wait(&customers); sem_wait(&mutex); /wait(mutex) waiting-; /the numer of waiting reduce one for(i=0;i5;i+) if (chairi!=0) next= chairi; chairi=0; break; printf(The barber is cutting %dth customers hairn,next); sleep(3); sem_post(&mutex); sem_post(&barbers); /creat customer pthreadvoid * custo
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026福建三明九中臨聘教師2人筆試參考題庫及答案解析
- 2026年心理普查考試題庫附答案
- 2026廣東廣州市越秀區(qū)建設(shè)街招聘勞動保障監(jiān)察協(xié)管員1人筆試模擬試題及答案解析
- 2026年浙江藝術(shù)職業(yè)學(xué)院單招職業(yè)傾向性測試模擬測試卷附答案
- 2026年江蘇農(nóng)牧科技職業(yè)學(xué)院單招職業(yè)適應(yīng)性考試題庫及答案1套
- 2026年心理咨詢期末試題及答案參考
- 2026福建廈門市集美區(qū)樂海幼兒園頂崗教職工招聘2人筆試備考試題及答案解析
- 2025廣東廣州市中山大學(xué)孫逸仙紀(jì)念醫(yī)院中醫(yī)科專職科研人員招聘1人備考題庫附答案
- 2025年甘肅省平?jīng)鍪兄写罂萍技脊W(xué)校招聘20人考試題庫附答案
- 2025年龍江森工集團(tuán)權(quán)屬林業(yè)局有限公司專技型人才公開招聘382人備考題庫附答案
- 2026春招:中國煙草真題及答案
- 急性酒精中毒急救護(hù)理2026
- 2021-2022學(xué)年天津市濱海新區(qū)九年級上學(xué)期物理期末試題及答案
- 江蘇省蘇州市、南京市九校2025-2026學(xué)年高三上學(xué)期一輪復(fù)習(xí)學(xué)情聯(lián)合調(diào)研數(shù)學(xué)試題(解析版)
- 2026年護(hù)理部工作計(jì)劃
- 期末水平綜合練習(xí)(試題)新思維小學(xué)英語一年級上冊
- 初中語文 送別詩練習(xí)題(含答案)
- 人教A版高中數(shù)學(xué)選擇性必修第二冊全冊各章節(jié)課時(shí)練習(xí)題含答案解析(第四章數(shù)列、第五章一元函數(shù)的導(dǎo)數(shù)及其應(yīng)用)
- 六年級下冊小升初全復(fù)習(xí)-第12講 工程問題-北師大 (含答案)
- 烹飪原料知識 水產(chǎn)品蝦蟹類
- 考勤抽查記錄表
評論
0/150
提交評論