版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
PAGE2成績:成績:課程設(shè)計報告課程名稱:課程設(shè)計(UNIX程序設(shè)計)設(shè)計題目:利用信號量機(jī)制解決哲學(xué)家進(jìn)餐問題姓名:專業(yè):網(wǎng)絡(luò)工程班級:學(xué)號:計算機(jī)科學(xué)與技術(shù)學(xué)院網(wǎng)絡(luò)系2013年12月28日哈爾濱理工大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院網(wǎng)絡(luò)系實(shí)驗室實(shí)驗報告哈爾濱理工大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院網(wǎng)絡(luò)系課程設(shè)計報告設(shè)計項目:利用信號量機(jī)制解決哲學(xué)家進(jìn)餐問題選題背景1965年,數(shù)學(xué)家迪杰斯特拉提出,并成為經(jīng)典的IPC問題—哲學(xué)家進(jìn)餐問題。該問題的簡單描述如下:五個哲學(xué)家圍坐在一張圓桌周圍,每個哲學(xué)家面前都一盤通心粉。由于通心粉很滑,需要兩把叉子才能夾住。哲學(xué)家的生活中有兩種交替活動時段,吃飯(EATING)和思考(THINKING)。當(dāng)一個哲學(xué)家覺得餓了時,他就試圖分兩次去取左手邊和右手邊的叉子,每次拿一把,但不分次序。如果成功拿到兩把叉子,就進(jìn)入吃飯狀態(tài),吃完后放下叉子繼續(xù)思考。設(shè)計思路1.每個哲學(xué)家的行為活動狀態(tài)為兩種:進(jìn)餐(EATING)和思考(THINKING)。因此創(chuàng)建一個有5個元素的狀態(tài)數(shù)組,每個數(shù)組元素的狀態(tài)值為EATING或者THINKING。2.五個哲學(xué)家圍坐成一圈,每兩個人中間有一個叉子,即每個哲學(xué)家的邊和右邊有一個叉子,但這個叉子需要和旁邊的鄰居競爭使用。對于每一個哲學(xué)家來說,其只有成功獲得兩個叉子,才能進(jìn)入進(jìn)餐狀態(tài)。在進(jìn)完餐后,需要成功放下手中的兩個叉子,才能進(jìn)入思考的狀態(tài)。換個角度的描述就是,每個哲學(xué)家查詢左右邊的鄰居當(dāng)前狀態(tài),如果左右的鄰居當(dāng)前狀態(tài)都為THINKING,則該哲學(xué)家可以進(jìn)餐;如果左右鄰居當(dāng)前狀態(tài)不都是THINKING,則哲學(xué)家不能進(jìn)餐。因此可以為每一個哲學(xué)家設(shè)置一個信號量,來描述哲學(xué)家的活動狀態(tài)。3.因為五只叉子做多只能允許兩個哲學(xué)家進(jìn)餐,所以可以將桌子作為一個臨界資源。通過設(shè)置一個互斥信號量來限制對臨界資源的訪問數(shù)。4.創(chuàng)建兩個動作函數(shù),對應(yīng)于每個哲學(xué)家的獲取兩把叉子和放下兩把叉子的動作。而每個動作都需要對互斥信號量和哲學(xué)家信號量進(jìn)行訪問操作,因此創(chuàng)建原子操作P和原子操作V,來執(zhí)行對信號量的消耗和釋放操作。5.利用父進(jìn)程創(chuàng)建五個子進(jìn)程來模擬五個哲學(xué)家,在每個子進(jìn)程中執(zhí)行PHILOSOPHER(phi_num)函數(shù)來模擬每個哲學(xué)家進(jìn)入哲學(xué)家進(jìn)餐問題活動。主要問題的解決方法和關(guān)鍵技術(shù)1.共享狀態(tài)數(shù)組問題。問題描述:因為狀態(tài)數(shù)組是共享的,而每個模擬哲學(xué)家的子進(jìn)程是相互獨(dú)立的,有自己的地址空間,在進(jìn)程之間共享使用狀態(tài)數(shù)組出現(xiàn)問題。解決方法:父進(jìn)程通過利用UNIX系統(tǒng)進(jìn)程通信機(jī)制中共享內(nèi)存機(jī)制的shmget()和shmat系統(tǒng)調(diào)用創(chuàng)建一個共享內(nèi)存區(qū),并將狀態(tài)數(shù)組地址鏈接到進(jìn)程地址空間,成功的解決了該問題。#include<stdlib.h>#defineN5#defineLEFT(i)(i+N-1)%N#defineRIGHT(i)(i+1)%N#defineTHINKING0#defineEATING1//#include"behavior_philosophy.h"voidphilosopher(int,char*,int,int,void(*)(int,int),void(*)(int,int));voidtake_forks(int,char*,int,int,void(*)(int,int),void(*)(int,int));voidput_forks(int,char*,int,int,void(*)(int,int),void(*)(int,int));voidtest(int,char*,int,void(*)(int,int));voidthink(int);voideat(int);voidP(int,int);voidV(int,int);/*哲學(xué)家動作*/voidphilosopher(inti,char*state,intsem_phiid,intsem_mutexid,void(*P)(int,int),void(*V)(int,int)){sleep(1);think(i);while(1){take_forks(i,state,sem_phiid,sem_mutexid,P,V);eat(i);put_forks(i,state,sem_phiid,sem_mutexid,P,V);think(i);}}voidtake_forks(inti,char*state,intsem_phiid,intsem_mutexid,void(*P)(int,int),void(*V)(int,int)){(*P)(sem_mutexid,0);state[i]=THINKING;test(i,state,sem_phiid,V);(*V)(sem_mutexid,0);(*P)(sem_phiid,i);}voidput_forks(inti,char*state,intsem_phiid,intsem_mutexid,void(*P)(int,int),void(*V)(int,int)){(*P)(sem_mutexid,0);state[i]=THINKING;test(LEFT(i),state,sem_phiid,V);test(RIGHT(i),state,sem_phiid,V);(*V)(sem_mutexid,0);}voidtest(inti,char*state,intsem_phiid,void(*V)(int,int)){if(state[i]==THINKING&&state[LEFT(i)]!=EATING&&state[RIGHT(i)]!=EATING){state[i]=EATING;(*V)(sem_phiid,i);}}voidthink(inti){printf("philosopher:%d>>>>>isTHINKING.\n",i);}voideat(inti){printf("I'mphilosopher:%d>>>>>isEATING.andwilleating%dseconds!\n",i,sleep(2));}/*P,V原子操作*/voidP(intsemid,intindex){structsembufsema_buffer;sema_buffer.sem_num=index;sema_buffer.sem_op=-1;sema_buffer.sem_flg=SEM_UNDO;semop(semid,&sema_buffer,1);}voidV(intsemid,intindex){structsembufsema_buf;sema_buf.sem_num=index;sema_buf.sem_op=1;sema_buf.sem_flg=SEM_UNDO;semop(semid,&sema_buf,1);}/**/intmain(){/*創(chuàng)建信號量操作*/intsem_phiid;sem_phiid=semget(1008,5,0666|IPC_CREAT);assert(sem_phiid>=0);unsignedshortarray[5]={0,0,0,0,0};unionsemun{intval;unsignedshort*array;}semopts;semopts.array=array;intret1=semctl(sem_phiid,0,SETALL,semopts);assert(ret1==0);intsem_mutexid;sem_mutexid=semget(0x225,1,0666|IPC_CREAT);assert(sem_mutexid>=0);semopts.val=1;intret2=semctl(sem_mutexid,0,SETVAL,semopts);assert(ret2==0);/*初始化共享內(nèi)存*/intshmid;char*state;if((shmid=shmget(IPC_PRIVATE,N,0600|IPC_CREAT))==-1){semctl(sem_phiid,0,IPC_RMID,0); semctl(sem_mutexid,0,IPC_RMID,0); perror("shmgetfaild!"); exit(1);}if((state=shmat(shmid,0,0))==(char*)-1){semctl(sem_phiid,0,IPC_RMID,0); semctl(sem_mutexid,0,IPC_RMID,0); perror("shmatfaild!"); exit(1);}/**/inti,phinum;pid_tpid;for(i=0;i<5;i++){while((pid=fork())==-1); if(!pid){ phinum=i; signal(SIGINT,SIG_DFL); break; }}if(pid>0){while(wait((int*)0)==-1); semctl(sem_phiid,0,IPC_RMID,0); semctl(sem_mutexid,0,IPC_RMID,0); shmdt(state); printf("Hi,GAMEOVER!");}elsephilosopher(phinum,state,sem_phiid,sem_mutexid,P,V);}程序運(yùn)行結(jié)果
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度股權(quán)投資合同:甲方投資乙方公司的投資金額、股權(quán)比例等3篇
- 二零二五年度車輛包車保險合同規(guī)范3篇
- 二零二五版專業(yè)環(huán)保印刷保密合同3篇
- 二零二五版文化衍生品開發(fā)及銷售合同范本3篇
- 二零二五年度高空作業(yè)安全員資質(zhì)認(rèn)證及作業(yè)指導(dǎo)合同2篇
- 二零二五年駕校學(xué)員智能駕駛培訓(xùn)合同3篇
- 2024電商企業(yè)品牌形象授權(quán)合同2篇
- 云南混凝土井蓋施工方案
- 咸寧醇酸磁漆施工方案
- 路面砂礫底基層施工方案
- 2025年中國高純生鐵行業(yè)政策、市場規(guī)模及投資前景研究報告(智研咨詢發(fā)布)
- 2022-2024年浙江中考英語試題匯編:完形填空(學(xué)生版)
- 2025年廣東省廣州市荔灣區(qū)各街道辦事處招聘90人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 中試部培訓(xùn)資料
- 硝化棉是天然纖維素硝化棉制造行業(yè)分析報告
- 央視網(wǎng)2025亞冬會營銷方案
- 北師大版數(shù)學(xué)三年級下冊豎式計算題100道
- 計算機(jī)網(wǎng)絡(luò)技術(shù)全套教學(xué)課件
- 屋頂分布式光伏發(fā)電項目施工重點(diǎn)難點(diǎn)分析及應(yīng)對措施
- 胃鏡下超聲穿刺護(hù)理配合
- 2024解析:第三章物態(tài)變化-基礎(chǔ)練(原卷版)
評論
0/150
提交評論