




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)驗(yàn)四:同步機(jī)構(gòu)實(shí)驗(yàn)報(bào)告學(xué) 院: 專業(yè)班級(jí): 姓 名: 學(xué) 號(hào):一、實(shí)驗(yàn)內(nèi)容:模擬實(shí)現(xiàn)用同步機(jī)構(gòu)避免發(fā)生進(jìn)程執(zhí)行時(shí)可能出現(xiàn)的與時(shí)間有關(guān)的錯(cuò)誤。二、實(shí)驗(yàn)?zāi)康模哼M(jìn)程是程序在一個(gè)數(shù)據(jù)集合上運(yùn)行的過(guò)程,進(jìn)程是并發(fā)執(zhí)行的,也即系統(tǒng)中的多個(gè)進(jìn)程輪流地占用處理器運(yùn)行。我們把若干個(gè)進(jìn)程都能進(jìn)行訪問(wèn)和修改的那些變量稱為公共變量。由于進(jìn)程是并發(fā)地執(zhí)行的,所以,如果對(duì)進(jìn)程訪問(wèn)公共變量不加限制,那么就會(huì)產(chǎn)生“與時(shí)間有關(guān)”的錯(cuò)誤,即進(jìn)程執(zhí)行后所得到的結(jié)果與訪問(wèn)公共變量的時(shí)間有關(guān)。為了防止這類錯(cuò)誤,系統(tǒng)必須要用同步機(jī)構(gòu)來(lái)控制進(jìn)程對(duì)公共變量的訪問(wèn)。一般說(shuō),同步機(jī)構(gòu)是由若干條原語(yǔ)同步原語(yǔ)所組成。本實(shí)驗(yàn)要求學(xué)生模擬PV操作同步
2、機(jī)構(gòu)的實(shí)現(xiàn),模擬進(jìn)程的并發(fā)執(zhí)行,了解進(jìn)程并發(fā)執(zhí)行時(shí)同步機(jī)構(gòu)的作用。三、實(shí)驗(yàn)題目:模擬PV操作同步機(jī)構(gòu),且用PV操作解決生產(chǎn)者消費(fèi)者問(wèn)題。四、此次用到的數(shù)據(jù)結(jié)構(gòu)知識(shí)如下: typedef struct Pcb char name10; /進(jìn)程名char state10; /運(yùn)行狀態(tài)char reason10; /若阻塞,其原因int breakp; /斷點(diǎn)保護(hù)struct Pcb *next; /阻塞時(shí)的順序進(jìn)程名狀態(tài)等待原因斷點(diǎn)后繼進(jìn)程 Pcb,*link; 進(jìn)程控制塊結(jié)構(gòu) 定義兩個(gè)進(jìn)程: link p1;/生產(chǎn)者進(jìn)程,link c1;/消費(fèi)者進(jìn)程。pc程序計(jì)數(shù)器和link ready; 就緒
3、隊(duì)列,link b_s1; s1阻塞隊(duì)列,link b_s2; s2阻塞隊(duì)列。五、實(shí)驗(yàn)源代碼:分為四個(gè)頭文件。1、a.h頭文件代碼如下:#include #include #include /* malloc()等 */ #include /* INT_MAX等 */ #include /* EOF(=Z或F6),NULL */ #include /* atoi() */ #include /* eof() */ #include /* floor(),ceil(),abs() */ #include /* exit() */ #include using namespace std; #in
4、clude #define BUF 10 /緩存的大小 #define MAX 20 /最大可以輸入的字符2、b.h頭文件代碼如下:/數(shù)據(jù)結(jié)構(gòu)的定義和全局變量typedef struct Pcb char name10; /進(jìn)程名char state10; /運(yùn)行狀態(tài)char reason10; /若阻塞,其原因int breakp; /斷點(diǎn)保護(hù)struct Pcb *next; /阻塞時(shí)的順序Pcb,*link;int s1,s2; /信號(hào)量link p1;/生產(chǎn)者進(jìn)程link c1;/消費(fèi)者進(jìn)程char strMAX; /輸入的字符串char bufferBUF; /緩沖池int len;
5、 /輸入長(zhǎng)度int sp=0; /string的指針int in=0; /生產(chǎn)者指針int out=0; /消費(fèi)者指針char temp; /供打印的臨時(shí)產(chǎn)品char rec_pMAX;/生產(chǎn)記錄int rp1=0;/生產(chǎn)記錄指針char rec_cMAX;/消費(fèi)記錄int rp2=0;/消費(fèi)記錄指針link ready; /就緒隊(duì)列l(wèi)ink b_s1; /s1阻塞隊(duì)列l(wèi)ink b_s2; /s2阻塞隊(duì)列int pc; /程序計(jì)數(shù)器int count; /字符計(jì)數(shù)器int con_cnt; /消費(fèi)計(jì)數(shù)器3、c.h頭文件代碼如下:void init(); /初始化void p(int s); /
6、P操作void v(int s); /V操作void block(int s);/阻塞函數(shù)void wakeup(int s);/喚醒函數(shù)void control(); /處理機(jī)調(diào)度void processor();/處理機(jī)執(zhí)行void print(); /打印函數(shù)void init() /初始化s1=BUF;s2=0;p1=(link)malloc(sizeof(Pcb);/建立新的結(jié)點(diǎn),并初始化為生產(chǎn)者strcpy(p1-name,Producer);strcpy(p1-state,Ready);strcpy(p1-reason,Null);p1-breakp=0;p1-next=NULL
7、;c1=(link)malloc(sizeof(Pcb);/建立新的結(jié)點(diǎn),并初始化為消費(fèi)者strcpy(c1-name,Consumer);strcpy(c1-state,Ready);strcpy(c1-reason,Null);c1-breakp=0;c1-next=NULL;ready=p1;ready-next=c1;/初始化為生產(chǎn)進(jìn)程在前,消費(fèi)進(jìn)程在后c1-next=NULL;b_s1=NULL;b_s2=NULL;/阻塞進(jìn)程為NULLpc=0;con_cnt=0; /消費(fèi)計(jì)數(shù)器void p(int s)if(s=1) /p(s1)s1-;if(s1breakp=pc; /保存斷點(diǎn)e
8、lse /p(s2)s2-;if(s2breakp=pc; /保存斷點(diǎn)void v(int s)if(s=1) /v(s1)s1+;if(s1breakp=pc; /保存斷點(diǎn)else /v(s2)s2+;if(s2breakp=pc; /保存斷點(diǎn)void block(int s)/阻塞函數(shù)的定義link p;int num1=0;int num2=0;if(s=1)/生產(chǎn)進(jìn)程strcpy(p1-state,Block);/改變狀態(tài)strcpy(p1-reason,S1);/說(shuō)明原因p=b_s1;while(p)num1+;p=p-next;/p的值為NULL,表示隊(duì)尾if(!b_s1)b_s1
9、=p1;elsep=p1;p1-next=NULL;printf(t* p1生產(chǎn)進(jìn)程阻塞了!n);ready-breakp=pc; /保存斷點(diǎn)ready=ready-next;/在就緒隊(duì)列中去掉,指向下一個(gè)num1+;else/消費(fèi)進(jìn)程strcpy(c1-state,Block);strcpy(c1-reason,S2);p=b_s2;while(p)num2+;p=p-next;/p的值為NULL,表示隊(duì)尾if(!b_s2)b_s2=c1;elsep=c1;ready-breakp=pc; /保存斷點(diǎn)ready=ready-next;/在就緒隊(duì)列中去掉,指向下一個(gè)c1-next=NULL;p
10、rintf(t* c1消費(fèi)進(jìn)程阻塞了!n);num2+;printf(t* 阻塞的生產(chǎn)進(jìn)程個(gè)數(shù)為:%dn,num1);printf(t* 阻塞的消費(fèi)進(jìn)程個(gè)數(shù)為:%dn,num2);void wakeup(int s)/喚醒函數(shù)的定義link p;link q=ready;if(s=1) /喚醒b_s1隊(duì)首進(jìn)程,生產(chǎn)進(jìn)程隊(duì)列p=b_s1;b_s1=b_s1-next;/阻塞指針指向下一個(gè)阻塞進(jìn)程strcpy(p-state,Ready);strcpy(p-reason,Null);while(q)/插入就緒隊(duì)列q=q-next;q=p;p-next=NULL;printf(t* p1生產(chǎn)進(jìn)程喚醒
11、了!n);else /喚醒b_s2隊(duì)首進(jìn)程,消費(fèi)進(jìn)程隊(duì)列p=b_s2;b_s2=b_s2-next;/阻塞指針指向下一個(gè)阻塞進(jìn)程strcpy(p-state,Ready);strcpy(p-reason,Null);while(q-next)/插入就緒隊(duì)列q=q-next;q-next=p;p-next=NULL;printf(t* c1消費(fèi)進(jìn)程喚醒了!n);void control() /處理器調(diào)度程序int rd;int num=0;link p=ready; if(ready=NULL) /若無(wú)就緒進(jìn)程,結(jié)束return;while(p) /統(tǒng)計(jì)就緒進(jìn)程個(gè)數(shù)num+;p=p-next;/
12、最終p變?yōu)镹ULLprintf(t* 就緒進(jìn)程個(gè)數(shù)為:%dn,num);time_t t; srand(unsigned) time(&t);rd=rand()%num;/隨機(jī)函數(shù)產(chǎn)生隨機(jī)數(shù)if(rd=1)p=ready;ready=ready-next;ready-next=p;p-next=NULL;strcpy(ready-state,Run);strcpy(ready-next-state,Ready);else strcpy(ready-state,Run);pc=ready-breakp;void processor() /模擬處理器指令執(zhí)行if(strcmp(ready-name
13、,Producer)=0) /當(dāng)前進(jìn)程為生產(chǎn)者switch(pc) case 0:/produceprintf(t* 生產(chǎn)者生產(chǎn)了字符%cn,strsp);rec_prp1=strsp;/添加到生產(chǎn)記錄 sp=(sp+1)%len;pc+;ready-breakp=pc; /保存斷點(diǎn)break;case 1: /p(s1)pc+;p(1);break;case 2: /putbufferin=rec_prp1; /放到緩沖區(qū)printf(t* %c字符成功入駐空緩存!n,bufferin);rp1+; in=(in+1)%BUF;pc+;ready-breakp=pc; /保存斷點(diǎn)break;
14、case 3: /v(s2)pc+;printf(t* 釋放一個(gè)s2信號(hào)n);v(2);break;case 4:/goto01 printf(t* 生產(chǎn)進(jìn)程goto 0 操作n);pc=0;count-; /剩余字符個(gè)數(shù)減1printf(t* 剩余字符count=%d個(gè)n,count);ready-breakp=pc; /保存斷點(diǎn)if(countstate,Stop);strcpy(p1-reason,Null);ready-breakp=-1;ready=ready-next;/在就緒隊(duì)列中去掉 else /當(dāng)前進(jìn)程為消費(fèi)者switch(pc)case 0: /p(s2)pc+;p(2);
15、 break;case 1: /getprintf(t* 消費(fèi)者取字符!n);temp=bufferout;out=(out+1)%BUF;pc+;ready-breakp=pc; /保存斷點(diǎn)break;case 2: /v(s1)pc+;printf(t* 釋放一個(gè)s1n);v(1);break;case 3: /consumeprintf(t* 消費(fèi)了字符%cn,temp);rec_crp2=temp;/添加到消費(fèi)記錄rp2+;con_cnt+;if(con_cnt=len)strcpy(c1-state,Stop);/完成態(tài)c1-breakp=-1;return;pc+;ready-br
16、eakp=pc; /保存斷點(diǎn)break;case 4: /goto0printf(t* 消費(fèi)進(jìn)程goto 0 操作n);pc=0;ready-breakp=pc; /保存斷點(diǎn)void print()int i,j;printf(生產(chǎn)者消費(fèi)者模擬n);printf(* 模擬過(guò)程的字符串為:t);printf(%sn,&str);printf(* 已生產(chǎn):);for(j=0;j=rp1;j+)printf(%c,rec_pj);printf(n* 空緩存:);for(j=rp2;j=rp1;j+)printf(%c,bufferj);printf(n* 已消費(fèi):);for(j=0;jname,p1-state,p1-reason,p1-breakp);printf(%st%st%stt%dn,c1-name,c1-state,c1-reason,c1-breakp);printf(n);printf(1.繼續(xù) 0.退出n);scanf(%d,&i);if(i=0)exit(0);4、main頭文件代碼如下:#include a.h#include b.h#include c.hvoid main()printf(*生產(chǎn)者消
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- DB4228T 025-2018 北美紅杉輕基質(zhì)容器扦插育苗技術(shù)規(guī)程
- 合肥職業(yè)技術(shù)學(xué)院《土地統(tǒng)計(jì)與R語(yǔ)言》2023-2024學(xué)年第一學(xué)期期末試卷
- 南通科技職業(yè)學(xué)院《園林寫景詩(shī)文鑒賞》2023-2024學(xué)年第一學(xué)期期末試卷
- 安康職業(yè)技術(shù)學(xué)院《食品學(xué)科專業(yè)英語(yǔ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 神木職業(yè)技術(shù)學(xué)院《員工招聘(英語(yǔ))》2023-2024學(xué)年第一學(xué)期期末試卷
- 世界洗手日活動(dòng)方案
- 地產(chǎn)送彩票活動(dòng)方案
- 2025-2030中國(guó)液壓自動(dòng)翻模機(jī)行業(yè)市場(chǎng)發(fā)展分析與發(fā)展趨勢(shì)及投資風(fēng)險(xiǎn)研究報(bào)告
- 夏季公司內(nèi)部活動(dòng)方案
- 大學(xué)在校活動(dòng)方案
- 中建2024裝配式建筑+鋁模一體化施工技術(shù)手冊(cè)
- 農(nóng)作物四級(jí)種子生產(chǎn)技術(shù)規(guī)程 第1部分:小麥DB41-T 293.1-2014
- TSG ZF001-2006《安全閥安全技術(shù)監(jiān)察規(guī)程》
- 自動(dòng)尋優(yōu)控制系統(tǒng)在生料立磨中的應(yīng)用實(shí)踐
- 土地延期合同范本
- 四川省綿陽(yáng)市涪城區(qū)2024-2025學(xué)年七年級(jí)上學(xué)期開學(xué)考試語(yǔ)文試題(解析版)
- DL∕T 796-2012 風(fēng)力發(fā)電場(chǎng)安全規(guī)程
- 部編版八年級(jí)升九年級(jí)歷史暑假預(yù)習(xí)知識(shí)清單(填空+答案)
- 四川省自貢市2023-2024學(xué)年七年級(jí)下學(xué)期期末數(shù)學(xué)試題(解析版)
- (正式版)JB∕T 11108-2024 建筑施工機(jī)械與設(shè)備 筒式柴油打樁錘
- 大型分析儀器原理與應(yīng)用智慧樹知到期末考試答案章節(jié)答案2024年山東第一醫(yī)科大學(xué)
評(píng)論
0/150
提交評(píng)論