版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
實驗二時間片輪轉【實驗目的】通過這次實驗,加深對進程概念的理解,進一步掌握進程狀態(tài)的轉變、進程調(diào)度的策略及對系統(tǒng)性能的評價方法?!緦嶒瀮?nèi)容】問題描述:設計程序模擬進程的時間片輪轉RR調(diào)度過程。假設有n個進程分別在T1,…,Tn時刻到達系統(tǒng),它們需要的服務時間分別為S1,…,Sn。分別利用不同的時間片大小q,采用時間片輪轉RR進程調(diào)度算法進行調(diào)度,計算每個進程的完成時間,周轉時間和帶權周轉時間,并且統(tǒng)計n個進程的平均周轉時間和平均帶權周轉時間。程序要求如下:1)進程個數(shù)n;每個進程的到達時間T1,…,Tn和服務時間S1,…,Sn;輸入時間片大小q。2)要求時間片輪轉法RR調(diào)度進程運行,計算每個進程的周轉時間,帶權周轉時間,并且計算所有進程的平均周轉時間,帶權平均周轉時間;3)輸出:要求模擬整個調(diào)度過程,輸出每個時刻的進程運行狀態(tài),如“時刻3:進程B開始運行”等等;4)輸出:要求輸出計算出來的每個進程的周轉時間,帶權周轉時間,所有進程的平均周轉時間,帶權平均周轉時間。源程序在VisualC++6.0中實現(xiàn)//RR算法#include<iostream.h>#include<iomanip.h>#include<stdio.h>#include<conio.h>#include<malloc.h>#include<stdlib.h>typedefintQElemType;#defineOK1#defineERROR0#defineOVERFLOW-1typedefintStatus;typedefstructQNode{ QElemTypedata; structQNode*next;}QNode,*QueuePtr;typedefstruct{ QueuePtrfront; QueuePtrrear;}LinkQueue;StatusInitQueue(LinkQueue&Q);StatusDestroyQueue(LinkQueue&Q);StatusEnQueue(LinkQueue&Q,QElemTypee);intDeQueue(LinkQueue&Q,QElemTypee);boolQueueEmpty(LinkQueue&Q);staticconstintMaxNum=100;intn,q,ArrivalTime[MaxNum],ServiceTime[MaxNum],FinishedTime[MaxNum],WholeTime[MaxNum];doubleWeightWholeTime[MaxNum],Average_WT=0,Average_WWT=0;LinkQueueQ;voidRR(int*ArrivalTime,int*ServiceTime,intn,intq,LinkQueue&Q);voidmain(){cout<<"請輸入進程總數(shù)n的值(0<n<=100):"<<endl;cin>>n;while(n<0||n>100){ cout<<"你輸入的n的值不正確,請重新輸入!"<<endl; cin>>n;}cout<<"請依次輸入各個進程的到達時間:"<<endl;for(inti=0;i<n;i++)cin>>ArrivalTime[i];cout<<"請依次輸入各個進程的服務時間:"<<endl;for(i=0;i<n;i++)cin>>ServiceTime[i];cout<<"請輸入時間片q的值(0<q<=200):"<<endl;cin>>q;while(q<0||q>200){ cout<<"你輸入的q值不正確,請重新輸入!"<<endl; cin>>q;}RR(ArrivalTime,ServiceTime,n,q,Q);//調(diào)用RR算法}//RR算法的具體實現(xiàn)voidRR(int*ArrivalTime,int*ServiceTime,intn,intq,LinkQueue&Q){intcountTime=0,e;intSTime[MaxNum],pushed[MaxNum];for(inti=0;i<n;i++){STime[i]=ServiceTime[i];pushed[i]=0;}InitQueue(Q);EnQueue(Q,0);pushed[0]=1;inttime=0;while(QueueEmpty(Q)==false){ e=DeQueue(Q,e); if(STime[e]>q) {STime[e]=STime[e]-q; countTime+=q;} else {countTime+=STime[e];STime[e]=0;FinishedTime[e]=countTime; } while(time<countTime){ if(STime>0){ cout<<"時刻"<<setw(2)<<time<<":進程"<<e<<"正在運行"<<endl; } time++; } for(i=1;i<n;i++) { if(STime!=0&&i!=e&&ArrivalTime[i]<countTime&&pushed[i]==0||STime!=0&&i!=e&&ArrivalTime[i]==countTime) { EnQueue(Q,i);pushed[i]=1; } } if(STime[e]>0)//判斷進程e是否已執(zhí)行完 { EnQueue(Q,e); } }for(i=0;i<n;i++){//求周轉時間和帶權周轉時間 WholeTime[i]=FinishedTime[i]-ArrivalTime[i]; WeightWholeTime[i]=(double)(WholeTime[i]*1.000000/ServiceTime[i]);Average_WT+=WholeTime[i]; Average_WWT+=WeightWholeTime[i];}Average_WT/=n;//求平均周轉時間Average_WWT/=n;//求平均帶權周轉時間//----------------輸出----------------cout<<"完成:"<<"";for(i=0;i<n;i++)cout<<setw(8)<<FinishedTime[i]<<"";cout<<endl;cout<<"周轉:"<<"";for(i=0;i<n;i++)cout<<setw(8)<<WholeTime[i]<<"";cout<<endl;cout<<"帶權:"<<"";for(i=0;i<n;i++)cout<<setw(8)<<setiosflags(ios::fixed)<<setprecision(2)<<WeightWholeTime[i]<<"";cout<<endl;cout<<"平均周轉時間為:"<<Average_WT<<endl;cout<<"平均帶權周轉時間為:"<<Average_WWT<<endl;DestroyQueue(Q);}//初始化鏈隊列QStatusInitQueue(LinkQueue&Q){ Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)); if(!Q.front)exit(OVERFLOW); Q.front->next=NULL; returnOK;}//銷毀鏈隊列QStatusDestroyQueue(LinkQueue&Q){ while(Q.front){ Q.rear=Q.front->next; free(Q.front); Q.front=Q.rear; } returnOK;}//入隊StatusEnQueue(LinkQueue&Q,QElemTypee){QueuePtr p=(QueuePtr)malloc(sizeof(QNode)); if(!p)exit(OVERFLOW); p->data=e;p->next=NULL; Q.rear->next=p; Q.rear=p; returnOK;}//出隊,并用e返回出隊節(jié)點的元素值intDeQueue(LinkQueue&Q,QElemTypee){ QueuePtrp; if(Q.front==Q.rear)returnERROR; p=Q.front->next; e=p->data; Q.front->next=p->next; if(Q.rear==p){Q.rear=Q.front;} free(p); returne;}//判斷鏈隊列Q是否為空boolQueueEmpty(LinkQueue&Q){ if(Q.front==Q.rear) returntrue; elsereturnfalse;}實例運行截圖實驗三銀行家算法【實驗目的】通過這次實驗,加深對進程死鎖的理解,進一步掌握進程資源的分配、死鎖的檢測和安全序列的生成方法?!緦嶒瀮?nèi)容】問題描述:設計程序模擬預防進程死鎖的銀行家算法的工作過程。假設有系統(tǒng)中有n個進程P1,…,Pn,有m類可分配的資源R1,…,Rm,在T0時刻,進程Pi分配到的j類資源為Allocationij個,它還需要j類資源Needij個,系統(tǒng)目前剩余j類資源Workj個,現(xiàn)采用銀行家算法進行進程資源分配預防死鎖的發(fā)生。程序要求如下:1)判斷當前狀態(tài)是否安全,如果安全,給出安全序列;如果不安全給出理由。2)對于下一個時刻T1,某個進程Pk會提出請求Request(R1,…,Rm),判斷分配給Pk進程請求的資源之后。3)輸入:進程個數(shù)n,資源種類m,T0時刻各個進程的資源分配情況(可以運行輸入,也可以在程序中設置);4)輸出:如果安全輸出安全的進程序列,不安全提示信息。源程序在VisualC++6.0中實現(xiàn)#include<stdio.h>#include<stdlib.h>/*----------------------常量定義--------------------*/#defineF0#defineT1#definen5//進程數(shù)量#definem3//資源種類數(shù)量/*--------------------------------------------------*//*--------------------數(shù)據(jù)結構定義------------------*/intAvailable[m]={3,5,2};//可用資源intWork[m];//工作向量intFinish[n];//用以判斷系統(tǒng)是否有足夠資源分給相應進程voidRecycle();//若進程運行完資源回收intbackDos();//判斷所有進程是否運行完,完后返回操作系統(tǒng)/*--------------------------------------------------*//*-----------------------進程-----------------------*/structPCB{intflag;//狀態(tài)標志,是否運行完intMax[m];//資源最大需求量intAllocation[m];//已分配資源intNeed[m];//還需要的資源intRequest[m];//請求資源量}P[n];/*-----------------------函數(shù)聲明--------------------*/inttryAdminister(intnum);//試分配voidsafeCheck(intnum);//安全性檢查voidPrint();//狀態(tài)輸出/*主函數(shù)(只需改變n、m和下面的初始數(shù)組便可形成新的進程量,資源量和狀態(tài))*/intmain(){inti,j,num;inttotal[n][m]={{4,3,1},{3,3,2},{4,1,7},{7,4,3},{5,3,3}};inthave[n][m]={{0,2,1},{1,0,1},{0,1,3},{3,2,1},{0,2,0}};intwant[n][m]={{4,1,0},{2,3,1},{4,0,4},{4,2,2},{5,1,3}};for(i=0;i<n;i++)//初始化進程資源分配狀態(tài)for(j=0;j<m;j++){P[i].flag=F;P[i].Max[j]=total[i][j];P[i].Allocation[j]=have[i][j];P[i].Need[j]=want[i][j];}Print();//狀態(tài)輸出while(scanf("%d",&num)!=EOF){printf("輸入進程%d對這三類資源的需求向量(用空格隔開):\n",num); scanf("%d%d%d",&P[num].Request[0],&P[num].Request[1],&P[num].Request[2]); if(&P[num].Request[0]<0||&P[num].Request[1]<0||&P[num].Request[2]<0){ printf("非法請求!\n\n"); returnF; }if(tryAdminister(num)==T)safeCheck(num);Recycle();//資源回收if(backDos()==T)//所有進程完則返回操作系統(tǒng)return0;Print();}return0;}/*--------------------------------------------------------------------*//*----------------------------試分配函數(shù)-----------------------------*/inttryAdminister(intnum)//試分配{intj;for(j=0;j<m;j++)if(P[num].Request[j]>P[num].Need[j]){printf("非法請求!\n\n");returnF;}elseif(P[num].Request[j]>Available[j]){printf("%d號資源不夠,無法分配,進程%d等待。\n\n",j,num);returnF;}for(j=0;j<m;j++){Available[j]=Available[j]-P[num].Request[j];P[num].Allocation[j]=P[num].Allocation[j]+P[num].Request[j];P[num].Need[j]=P[num].Need[j]-P[num].Request[j];}returnT;}/*-------------------------------安全性檢查函數(shù)-------------------------------*/voidsafeCheck(intnum){inti,j;intl[n],k;//安全序列for(j=0;j<m;j++)//初始化工作向量Work[j]=Available[j];for(i=0;i<n;i++)//初始化判斷向量{Finish[i]=F;l[i]=0;}k=0;for(i=0;i<n;i++){if(Finish[i]==F){for(j=0;j<m;j++)if(P[i].Need[j]>Work[j])break;if(j==m)//如果分配成功{for(j=0;j<m;j++)Work[j]=Work[j]+P[i].Allocation[j];Finish[i]=T;l[k]=i;k++;//安全序列i=-1;//就重新查找下一個可分配成功的進程}}}for(i=0;i<n;i++)if(Finish[i]==F){printf("分配不成功,系統(tǒng)將處于不安全狀態(tài).\n\n");for(j=0;j<m;j++)//若分配不成功將進程num恢復到初始時刻狀態(tài){Available[j]=Available[j]+P[num].Request[j];P[num].Allocation[j]=P[num].Allocation[j]-P[num].Request[j];P[num].Need[j]=P[num].Need[j]+P[num].Request[j];}break;}if(i==n){printf("系統(tǒng)安全,一個進程安全序列如下:\n");for(i=0;i<n;i++)if(i!=n-1)printf("P%d——>",l[i]);elseprintf("P%d\n\n",l[i]);}}/*------------------------------------狀態(tài)輸出-----------------------------*/voidPrint(){inti;printf("此時資源分配情況:\n");printf("********************************************************************\n");printf("\t最大需求\t已分配\t\t需要分配\t可用資源\n");for(i=0;i<n;i++)//輸出進程資源分配狀態(tài){printf("P%d\t%d%d%d\t\t",i,P[i].Max[0],P[i].Max[1],P[i].Max[2]);printf("%d%d%d\t\t",P[i].Allocation[0],P[i].Allocation[1],P[i].Allocation[2]);printf("%d%d%d\t\t",P[i].Need[0],P[i].Need[1],P[i].Need[2]);if(i==0)pr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 核磁科護理工作總結
- 教育培訓行業(yè)工程師工作總結
- 電商供應鏈管理總結
- 初中班主任工作感悟與反思
- 婚紗店前臺工作心得
- 教育科研行業(yè)教學改革建議
- 2024年度企事業(yè)單位聘用司機及車輛安全培訓服務合同3篇
- 得壽山石默想語文閱讀理解
- 白鵝微課程設計
- 波形發(fā)生器的課程設計
- 《銷售人員回款培訓》課件
- GB/T 45008-2024稀土熱障涂層材料鋯酸釓鐿粉末
- 全國第三屆職業(yè)技能大賽(數(shù)字孿生應用技術)選拔賽理論考試題庫(含答案)
- 保險公司2024年工作總結(34篇)
- 物理實驗知到智慧樹章節(jié)測試課后答案2024年秋沈陽理工大學
- 應用數(shù)理統(tǒng)計知到智慧樹章節(jié)測試課后答案2024年秋中國農(nóng)業(yè)大學
- 文藝復興史學習通超星期末考試答案章節(jié)答案2024年
- 創(chuàng)新轉化管理智慧樹知到期末考試答案章節(jié)答案2024年山東大學
- 二級公立醫(yī)院績效考核三級手術目錄(2020版)
- 6人小品《沒有學習的人不傷心》臺詞完整版
- 壓力容器耐壓試驗
評論
0/150
提交評論