




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
實驗2進程狀態轉換及其PCB的變化實驗2進程狀態轉換及其PCB的變化1.目的自行編制模擬程序,通過形象化的狀態顯示,使學生理解進程的概念、進程之間的狀態轉換及其所帶來的PCB內容、組織的變化,理解進程與其PCB間的一一對應關系。內容及要求1)設計并實現一個模擬進程狀態轉換及其相應PCB內容、組織結構變化的程序。2)獨立編寫、調試程序。進程的數目、進程的狀態模型(三狀態、五狀態、七狀態或其它)以及PCB的組織形式可自行選擇。3)合理設計與進程PCB相對應的數據結構。PCB的內容要涵蓋進程的基本信息、控制信息、資源需求及現場信息。4)設計出可視性較好的界面,應能反映出進程狀態的變化引起的對應PCB內容、組織結構的變化。5)代碼書寫要規范,要適當地加入注釋。6)鼓勵在實驗中加入新的觀點或想法,并加以實現。7)認真進行預習,完成預習報告。8)實驗完成后,要認真總結,完成實驗報告。程序流程圖進程的三種基本狀態及其轉換如下圖所示。開始輸入要執行的指令創建進程就緒隊列己NY滿,1,Y提示就緒隊列已滿N該進程執行一個時間片后放回就緒隊列Y有進程處于Y2,運行狀態?N將就緒隊列中優先級最高的進程放入運行隊列N該進程所需執有進程處于行時間減1,并Cputime++Y3,運行狀態?回到就緒隊列N將該進程放入阻塞隊列Y有進程處于Y4,運行狀態,N提示無運行的進程N將該進程放入就緒隊列Y輸入事件發生阻塞隊列中有該5,的進程名稱進程,N提示該進程并未阻塞N提示輸入錯誤N0,Y結束數據結構及說明在本實驗中,主要的數據結構是PCB的數據結構,具體如下:structprocess(charname;//進程名稱intneedtime;〃進程所需要的運行時間intpriority;//進程的優先級};源程序#include<stdio.h>#include<stdlib.h>#include<string.h>structprocess(charname;intneedtime;intpriority;};structprocessreadyQueue[5];structprocessrun;structprocessblockedQueue[5];conststructprocessnull={NULL,0,0};intreadyQueueHead=0;intblockedQueueHead=0;intcpuState=0;intcpuTime=0;voidOrder(structprocessparameter口,inthead);//將隊列中的進程按優先級排列intCreat();voidDispath();intTimeout();intEventWait();intEventOccur();voidOrder(structprocessparameter口,inthead)(intk,i;structprocesstemp;for(k=0;k<head-1;k++){for(i=0;i<head-k-1;i++){if(parameter[i].priority>=parameter[i+1].priority){temp二parameter[i];parameter[i]=parameter[i+1];parameter[i+1]=temp;}}}}intCreat()(if(readyQueueHead>=5){printf("TheReadyQueuehasbeenfull\n");return0;}label1:printf("inputnewprocessname(mustbealetter):\n");scanf(〃%c〃,&(readyQueue[readyQueueHead].name));getchar();intk;for(k=0;k<readyQueueHead;k++)if(readyQueue[readyQueueHead].name==readyQueue[k].name||readyQueue[readyQueueHead].name==readyQueue[k].name+32||readyQueue[readyQueueHead].name==readyQueue[k].name-32)(printf("theprocessisalreadyexist!\n〃);gotolabel1;}for(k=0;k<blockedQueueHead;k++)if(readyQueue[readyQueueHead].name==blockedQueue[k].name||readyQueue[readyQueueHead].name==blockedQueue[k].name+32||readyQueue[readyQueueHead].name==blockedQueue[k].name-32)(printf("theprocessisalreadyexist!\n");gotolabel1;}if(readyQueue[readyQueueHead].name==||readyQueue[readyQueueHead].name==+32||readyQueue[readyQueueHead].name==-32)(printf("theprocessisalreadyexist!\n〃);gotolabel1;}printf("inputneedtime(inputaintnumber):\n");label2:scanf(〃%d〃,&(readyQueue[readyQueueHead].needtime));getchar();if(readyQueue[readyQueueHead].needtime<1||readyQueue[readyQueueHead].needtime>100)(printf("pleaseinputthetrueneedtime(1--100)\n");gotolabel2;}printf("inputthepriority(1--10):\n");label3:scanf("%d",&(readyQueue[readyQueueHead].priority));getchar();if(readyQueue[readyQueueHead].priority<1||readyQueue[readyQueueHead].priority>10)(printf("please1--10!\n");gotolabel3;}readyQueueHead++;Order(readyQueue,readyQueueHead);return0;}voidDispath(){if(cpuState==0){readyQueueHead--;if(readyQueue[readyQueueHead].needtime>0){Order(readyQueue,readyQueueHead);run二readyQueue[readyQueueHead];readyQueue[readyQueueHead]=null;cpuState=1;}elseprintf("noprocessintheReadyQueue\n");}else(Timeout();Dispath();}}intTimeout()(cpuTime++;if(==NULL)return0;readyQueue[readyQueueHead]=run;run=null;cpuState=0;readyQueue[readyQueueHead].needtime--;if(readyQueue[readyQueueHead].needtime==0){printf("Theprocess'%c'hasfinished”,readyQueue[readyQueueHead].name);readyQueue[readyQueueHead]=null;return0;}readyQueueHead++;Order(readyQueue,readyQueueHead);return0;}intEventWait()(if(blockedQueueHead>=5){printf("error:TheBlockedQueuehasbeenfull\n");return0;}if(cpuState==0){printf("error:noprocessinCPU");return0;}run.needtime--;blockedQueue[blockedQueueHead]=run;blockedQueueHead++;run=null;cpuState=0;cpuTime++;printf("Theprocessisblocked!\n〃);return0;}intEventOccur()(if(readyQueueHead>=5){printf("TheReadyQueuehasbeenfull\n");return0;}printf("Pleaseinputtheprocessnamewhoseeventoccured!\n");charname二getchar();getchar();inti;structprocesstemp;for(i=0;i<blockedQueueHead;i++){if(name==blockedQueue[i].name){blockedQueueHead--;readyQueue[readyQueueHead]=blockedQueue[i];readyQueueHead++;blockedQueue[i]=blockedQueue[blockedQueueHead];blockedQueue[blockedQueueHead]=null;Order(readyQueue,readyQueueHead);printf("Theprocess%cisready!\n”,name);return0;}}if(i==blockedQueueHead){printf("error:Thisprocesshasnotbeenblocked!\n");}return0;}intShow()(printf("\nCPUtime:%d\n”,cpuTime);printf("nameneedtimepriority\n");printf("ReadyQueue:");inti;if(readyQueue[0].name!二NULL)for(i=readyQueueHead;i>0;i--)printf("%c%d%d\n〃,readyQueue[iT].name,readyQueue[i-1].needtime,readyQueue[i-1].priority);elseprintf("null");printf("\nRunningProcess:");if(==NULL)printf("null");elseprintf("%c%d%d\n〃,,run.needtime,run.priority);printf("\nBlockQueue:");if(blockedQueue[0].name==NULL)printf(〃null〃);elsefor(i=blockedQueueHead;i>0;i--)printf("%c%d%d\n〃,blockedQueue[iT].name,blockedQueue[i-1].needtime,blockedQueue[i-1].priority);}intmain()(SELECT:printf("\n\n1:inputnewprocess\n2:Dispath\n3:Timeout\n4:EventWait\n5:EventOccurs\n0:exit\n);intselect二getchar();getchar();switch(select)(case'1':Creat();Show();break;case'2':Dispath();Show();break;case'3':Timeout();Show();break;case'4':EventWait();Show();break;case'5':EventOccur();Show();break;case'0':exit(0);default:printf("Pleaseselectfrom0to5\n");}gotoSELECT;return0;6.運行結果及其說明
(1)創建進程:按‘1’創建進程,進程被放入就緒隊列,并按優先級從高到低排列。就緒隊列最多容納5個進程,當創建第6個進程時,程序會提示。nullnulli\nnln.frfIaeI兇用nullnulli\nnln.frfIaeI兇用wifinxukhhwDrn-reiiE-G-Tinnnute遍母MueijiE=inp?Jt-ncB^dt-inis-<inpiit-eiint=1tlw=inGPU[in:刑mmBrierleyI^ZiAv^uQ-ii£;L11U4Riimnin^『pogaw砂nullU14&h*)UE41*=null1=inputn-cuproceas-S:H1iK^MXtgJlineout4"Fum-uLUribL;:Ji*ent/)c-cursClit.LiiijiiiiEimiwi|inmi-EHairBJirBl"CaKivI,】n,id]|;Lliir^iC1Jli|iuEaii'OdLJFit:-IiaijiiLEa£ratniJi:i<ipii.E1trtj'iir£ait-ttlyl<l1:GCTOHi睥mure-nee-di:Incprl?*rl.cvC&■J4nullnulLl3tuniriin-iPrac=cs5=nullnulLl-B1.IX;k■tju.CL4W"izlfiputitou'■!in£?niut-日5E<ic-ntU-iL-iI:5"E*itnItCh:uillhb=Bxlt!±fullItISHoM坪岫。「1full⑵Dispath:按‘2’將就緒隊列中的進程轉移到運行隊列中,如果運行隊列中已有進程則該進程先執行一個時間片,然后回到就緒隊列中,最后將新就緒隊列中優先級最大的進程放到運行隊列中
lia5IInislMd上必NEh421priiaritjiTlwsirneeeerlia5IInislMd上必NEh421priiaritjiTlwsirneeeer_bpHUtdrin=1Re啊珈iehubW?iii|iM(yzmoasisZUi!l|lr.El|l|y;TiH^n-iiE;luontUait7EvtniOccult:exitBloc3k4heile=nullRunralnrrfroceai;c5null22BIddIcCfllDILC;1:inputnewpcp^cecs項認
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 勞動力市場扭曲的成因機制及其影響效應研究與對策探討
- 高中物理案例教學科學思維培養
- 橋頭飯堂管理辦法細則
- 幼兒園衛生保健人才隊伍建設與培訓體系
- 大氣光學湍流廓線的探測與預測技術研究
- 昭通盆景栽培管理辦法
- 國家安全學習體會
- 機械作業安全管理
- 兼職講師管理辦法宣導
- 安全生產監督工作情況報告
- GB/T 307.4-2017滾動軸承推力軸承 產品幾何技術規范(GPS)和公差值
- GB 29415-2013耐火電纜槽盒
- 《密碼法》培訓只是講座PPT課件(帶內容)
- 建筑工程文件歸檔管理明細表
- 如何解讀血常規報告
- 區域消防安全風險評估規程DB50-T 1114-2021
- 免疫調節治療在腦卒中的運用課件
- 機關檔案管理工作培訓PPT課件
- 25T汽車吊檢驗報告
- 變頻空調中的永磁電機電感分析
- 高考常考語法填空詞性轉換匯總
評論
0/150
提交評論