




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、成績:課程設(shè)計(jì)報(bào)告課程名稱:課程設(shè)計(jì)(UNIX程序設(shè)計(jì))設(shè)計(jì)題目:利用信號(hào)量機(jī)制解決哲學(xué)家進(jìn)餐問題姓 名:專 業(yè):網(wǎng) 絡(luò) 工 程班 級(jí):學(xué) 號(hào):計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院網(wǎng)絡(luò)系2013年 12月 28日哈爾濱理工大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院網(wǎng)絡(luò)系實(shí)驗(yàn)室 實(shí)驗(yàn)報(bào)告設(shè)計(jì)項(xiàng)目: 利用信號(hào)量機(jī)制解決哲學(xué)家進(jìn)餐問題 一、 選題背景 1965年,數(shù)學(xué)家迪杰斯特拉提出,并成為經(jīng)典的IPC問題哲學(xué)家進(jìn)餐問題。該問題的簡單描述如下:五個(gè)哲學(xué)家圍坐在一張圓桌周圍,每個(gè)哲學(xué)家面前都一盤通心粉。由于通心粉很滑,需要兩把叉子才能夾住。哲學(xué)家的生活中有兩種交替活動(dòng)時(shí)段,吃飯(EATING)和思考(THINKING)。當(dāng)一個(gè)哲學(xué)家覺
2、得餓了時(shí),他就試圖分兩次去取左手邊和右手邊的叉子,每次拿一把,但不分次序。如果成功拿到兩把叉子,就進(jìn)入吃飯狀態(tài),吃完后放下叉子繼續(xù)思考。二、 設(shè)計(jì)思路1.每個(gè)哲學(xué)家的行為活動(dòng)狀態(tài)為兩種:進(jìn)餐(EATING)和思考(THINKING)。因此創(chuàng)建一個(gè)有5個(gè)元素的狀態(tài)數(shù)組,每個(gè)數(shù)組元素的狀態(tài)值為EATING或者THINKING。2.五個(gè)哲學(xué)家圍坐成一圈,每兩個(gè)人中間有一個(gè)叉子,即每個(gè)哲學(xué)家的邊和右邊有一個(gè)叉子,但這個(gè)叉子需要和旁邊的鄰居競爭使用。對(duì)于每一個(gè)哲學(xué)家來說,其只有成功獲得兩個(gè)叉子,才能進(jìn)入進(jìn)餐狀態(tài)。在進(jìn)完餐后,需要成功放下手中的兩個(gè)叉子,才能進(jìn)入思考的狀態(tài)。換個(gè)角度的描述就是,每個(gè)哲學(xué)家查
3、詢左右邊的鄰居當(dāng)前狀態(tài),如果左右的鄰居當(dāng)前狀態(tài)都為THINKING,則該哲學(xué)家可以進(jìn)餐;如果左右鄰居當(dāng)前狀態(tài)不都是THINKING,則哲學(xué)家不能進(jìn)餐。因此可以為每一個(gè)哲學(xué)家設(shè)置一個(gè)信號(hào)量,來描述哲學(xué)家的活動(dòng)狀態(tài)。3.因?yàn)槲逯徊孀幼龆嘀荒茉试S兩個(gè)哲學(xué)家進(jìn)餐,所以可以將桌子作為一個(gè)臨界資源。通過設(shè)置一個(gè)互斥信號(hào)量來限制對(duì)臨界資源的訪問數(shù)。4.創(chuàng)建兩個(gè)動(dòng)作函數(shù),對(duì)應(yīng)于每個(gè)哲學(xué)家的獲取兩把叉子和放下兩把叉子的動(dòng)作。而每個(gè)動(dòng)作都需要對(duì)互斥信號(hào)量和哲學(xué)家信號(hào)量進(jìn)行訪問操作,因此創(chuàng)建原子操作P和原子操作V,來執(zhí)行對(duì)信號(hào)量的消耗和釋放操作。5.利用父進(jìn)程創(chuàng)建五個(gè)子進(jìn)程來模擬五個(gè)哲學(xué)家,在每個(gè)子進(jìn)程中執(zhí)行PHI
4、LOSOPHER(phi_num)函數(shù)來模擬每個(gè)哲學(xué)家進(jìn)入哲學(xué)家進(jìn)餐問題活動(dòng)。三、 主要問題的解決方法和關(guān)鍵技術(shù)1.共享狀態(tài)數(shù)組問題。問題描述:因?yàn)闋顟B(tài)數(shù)組是共享的,而每個(gè)模擬哲學(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)建一個(gè)共享內(nèi)存區(qū),并將狀態(tài)數(shù)組地址鏈接到進(jìn)程地址空間,成功的解決了該問題。2.信號(hào)量創(chuàng)建及初始化問題問題描述:整個(gè)程序使用兩個(gè)不同的信號(hào)量,一個(gè)是記錄型信號(hào)量數(shù)組,一個(gè)是互斥信號(hào)量,并且在信號(hào)量創(chuàng)建初就需要對(duì)信號(hào)量進(jìn)行初始化,這樣才能保證接
5、下來的子進(jìn)程運(yùn)行時(shí),五個(gè)子進(jìn)程面對(duì)的是相同值的信號(hào)量數(shù)組。解決方法:父進(jìn)程通過利用UNIX系統(tǒng)進(jìn)程通信機(jī)制中信號(hào)量機(jī)制的semget()系統(tǒng)調(diào)用和semctl()系統(tǒng)調(diào)用,成功創(chuàng)建一個(gè)五元素的信號(hào)量數(shù)組和一個(gè)元素的信號(hào)量數(shù)組,并將其在初始為設(shè)計(jì)的初始值,保證了程序后續(xù)操作的正確。3.P和V原子操作問題問題描述:在子進(jìn)程中的對(duì)信號(hào)量的操作必須是原子操作P和V,而且由于在動(dòng)作函數(shù)中需要調(diào)用P和V原子操作,所以必須保證P和V操作的原子性,否則函數(shù)之間參數(shù)的傳遞將出現(xiàn)不一致。解決方法:利用UNIX系統(tǒng)進(jìn)程通信機(jī)制中信號(hào)量機(jī)制的semop()系統(tǒng)調(diào)用,封裝P和V操作函數(shù),保證了函數(shù)的原子性。4.進(jìn)程創(chuàng)建
6、的準(zhǔn)確時(shí)刻問題問題描述:根據(jù)設(shè)計(jì)的描述,程序是通過五個(gè)子進(jìn)程來模擬五個(gè)哲學(xué)家,但對(duì)進(jìn)程創(chuàng)建的先后順序沒有要求,又由于進(jìn)程分配到時(shí)間片是有限的,并且在創(chuàng)建的過程中要保證五個(gè)子進(jìn)程都是統(tǒng)一父進(jìn)程創(chuàng)建的,所以對(duì)于進(jìn)程的創(chuàng)建時(shí)刻不太容易確定。解決方法:利用的UNIX系統(tǒng)的進(jìn)程創(chuàng)建fork()系統(tǒng)調(diào)用,創(chuàng)建一個(gè)有五個(gè)子進(jìn)程的進(jìn)程扇,成功的解決創(chuàng)建準(zhǔn)確時(shí)刻問題 5.哲學(xué)家動(dòng)作函數(shù)編譯問題 問題描述:在哲學(xué)家的三個(gè)動(dòng)作函數(shù)中需要對(duì)兩個(gè)類型的信號(hào)量進(jìn)行操作,所以不可避免的需要調(diào)用P和V原子操作。盡管在動(dòng)作函數(shù)定義之前,已經(jīng)聲明了P和V函數(shù)。但是由于其原子性,在動(dòng)作函數(shù)中直接使用P,V函數(shù)導(dǎo)致了嚴(yán)重的編譯錯(cuò)誤問
7、題。 解決方法:通過在各個(gè)函數(shù)參數(shù)列表中添加需要指向?qū)⑹褂玫腜和V函數(shù)指針,并在使用時(shí)采用(*P)和(*V)形式來解除引用操作,成功的解決了編譯錯(cuò)誤問題。四、 程序流程圖約定: Take_forks 函數(shù)動(dòng)作 TKFK Put_forks 函數(shù)動(dòng)作 PTFK Test 函數(shù)動(dòng)作 TEST THINKING 思考狀態(tài) THINK EATING 進(jìn)餐狀態(tài) EAT THINKTKFK ? N YTEST ? N Y EATPTFK ? Y N五、 原程序清單#include<stdio.h>#include<unistd.h>#include<assert.h>#
8、include<sys/types.h>#include<sys/ipc.h>#include<sys/sem.h>#include<assert.h>#include<sys/shm.h>#include<signal.h>#include<stdlib.h>#define N 5#define LEFT(i) (i+N-1)%N#define RIGHT(i) (i+1)%N#define THINKING 0#define EATING 1/#include"behavior_philosoph
9、y.h"void philosopher(int , char*, int , int , void (*)(int, int), void (*)(int, int);void take_forks(int , char* , int , int ,void (*)(int, int), void (*)(int, int);void put_forks(int , char* , int , int ,void (*)(int, int), void (*)(int, int);void test(int , char* , int ,void (*)(int, int);voi
10、d think(int );void eat(int );void P(int , int );void V(int , int );/*-哲學(xué)家動(dòng)作-*/void philosopher(int i, char* state, int sem_phiid, int sem_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
11、_phiid, sem_mutexid, P, V); think(i); void take_forks(int i, char* state, int sem_phiid, int sem_mutexid, void (*P)(int, int) , void (*V)(int, int) (*P)(sem_mutexid, 0); statei = THINKING; test(i, state, sem_phiid, V); (*V)(sem_mutexid, 0); (*P)(sem_phiid, i);void put_forks(int i, char* state, int s
12、em_phiid, int sem_mutexid,void (*P)(int, int), void (*V)(int, int) (*P)(sem_mutexid, 0); statei = THINKING; test(LEFT(i), state, sem_phiid, V); test(RIGHT(i), state, sem_phiid, V); (*V)(sem_mutexid, 0);void test(int i, char* state, int sem_phiid,void (*V)(int, int) if(statei = THINKING && st
13、ateLEFT(i) != EATING && stateRIGHT(i)!=EATING) statei = EATING; (*V)(sem_phiid, i); void think(int i) printf("philosopher:%d>>>>>is THINKING.n", i);void eat(int i) printf("I'm philosopher:%d>>>>>is EATING.and will eating %d seconds!n", i,
14、 sleep(2);/*-P,V原子操作-*/void P(int semid, int index) struct sembuf sema_buffer; sema_buffer.sem_num = index; sema_buffer.sem_op = -1; sema_buffer.sem_flg = SEM_UNDO; semop(semid, &sema_buffer, 1);void V(int semid, int index) struct sembuf sema_buf; sema_buf.sem_num = index; sema_buf.sem_op = 1; s
15、ema_buf.sem_flg = SEM_UNDO; semop(semid, &sema_buf, 1);/*-*/int main( )/*-創(chuàng)建信號(hào)量操作-*/int sem_phiid;sem_phiid = semget(1008, 5, 0666|IPC_CREAT);assert(sem_phiid>=0);unsigned short array5 = 0, 0, 0, 0, 0;union semunint val;unsigned short *array;semopts;semopts.array=array;int ret1 = semctl(sem_p
16、hiid, 0, SETALL, semopts);assert(ret1 = 0);int sem_mutexid;sem_mutexid = semget(0x225, 1, 0666|IPC_CREAT);assert(sem_mutexid >= 0);semopts.val = 1;int ret2 = semctl(sem_mutexid, 0, SETVAL, semopts);assert(ret2 = 0);/*-初始化共享內(nèi)存-*/int shmid;char* state;if(shmid = shmget(IPC_PRIVATE, N, 0600|IPC_CREA
17、T) = -1) semctl(sem_phiid, 0, IPC_RMID, 0);semctl(sem_mutexid, 0, IPC_RMID, 0);perror("shmget faild!");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("shmat faild!");exit(1);/*-*/ int i, phinum; pid_t pid; 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,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年注冊(cè)會(huì)計(jì)師考試《會(huì)計(jì)》財(cái)務(wù)報(bào)表分析解題思路與技巧試題
- 2025年消防安全設(shè)施維護(hù)與管理標(biāo)準(zhǔn)試題庫
- 2025年澳門特別行政區(qū)事業(yè)單位招聘考試綜合類公共基礎(chǔ)知識(shí)真題試卷
- 2025年小學(xué)英語畢業(yè)考試模擬卷(詞匯拓展運(yùn)用)-詞匯運(yùn)用與閱讀理解試題
- 環(huán)保意識(shí)議論文作文4篇
- 職務(wù)晉升工作表現(xiàn)證明書(8篇)
- 2025年禮儀主持人(初級(jí))形象設(shè)計(jì)與化妝技巧考試試卷
- 歡樂的端午節(jié)活動(dòng)事件類作文13篇
- 模具制造數(shù)字化設(shè)計(jì)仿真在2025年汽車電子控制系統(tǒng)制造中的應(yīng)用與優(yōu)化報(bào)告
- 稀土資源戰(zhàn)略儲(chǔ)備與全球產(chǎn)業(yè)鏈風(fēng)險(xiǎn)分析報(bào)告
- 2025年 中國南水北調(diào)集團(tuán)新能源投資公司第一批中層及考試筆試試卷附答案
- 期末試卷(五)(含答案含聽力原文無聽力音頻)-2024-2025學(xué)年人教PEP版英語(新教材)三年級(jí)下冊(cè)
- 湖南2024生地會(huì)考試卷及答案
- 廣東省深圳市2024年中考英語真題(含答案)
- 敘事護(hù)理學(xué)智慧樹知到答案2024年中國人民解放軍海軍軍醫(yī)大學(xué)
- 六年級(jí)主題班隊(duì)會(huì)記錄表(6個(gè)表)
- 雙柏縣工業(yè)用大麻開發(fā)種植實(shí)施計(jì)劃方案
- 租賃房屋交接清單
- 設(shè)計(jì)加熱爐推料機(jī)傳動(dòng)裝置
- 電梯維保人員管理制度
- 吊頂檢驗(yàn)報(bào)告(共5頁)
評(píng)論
0/150
提交評(píng)論