版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
銀行家算法等課內(nèi)實(shí)驗(yàn)報告課程名: 操作系統(tǒng)任課教師: 沈超專 業(yè): 信息管理與信息系統(tǒng)學(xué) 號:姓 名:二○一六至二○一七 年度第一學(xué)期南京郵電大學(xué) 經(jīng)濟(jì)與管理學(xué)院《操作系統(tǒng) 》課程實(shí)驗(yàn)第 一次實(shí)驗(yàn)報告實(shí)驗(yàn)內(nèi)容及基本要求:實(shí)驗(yàn)項(xiàng)目名稱:調(diào)度系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)實(shí)驗(yàn)類型:設(shè)計(jì)每組人數(shù): 1實(shí)驗(yàn)內(nèi)容及要求:實(shí)驗(yàn)內(nèi)容:本次實(shí)驗(yàn)的主要內(nèi)容是模擬調(diào)度系統(tǒng)的實(shí)現(xiàn),包括高級、中級和低級調(diào)度的管理系統(tǒng)實(shí)現(xiàn),調(diào)度算法的設(shè)計(jì)與實(shí)現(xiàn)以及銀行家算法的設(shè)計(jì)設(shè)計(jì)與實(shí)現(xiàn)。本次實(shí)驗(yàn)主要包括兩部分內(nèi)容:1、模擬具有三級調(diào)度的計(jì)算機(jī)系統(tǒng)進(jìn)程運(yùn)行過程,設(shè)計(jì)進(jìn)程調(diào)度算法,將其存入進(jìn)程文件中。如:進(jìn)程1:運(yùn)行5秒后有3秒的I/O操作,之后有10秒的運(yùn)行,結(jié)束??梢詫懗桑骸眕1:r5,io3,r3e;”。編程實(shí)現(xiàn)調(diào)度算法函數(shù),設(shè)計(jì)優(yōu)先級、時間片大小和并發(fā)進(jìn)程個數(shù),系統(tǒng)不斷從進(jìn)程文件中讀出進(jìn)程信息,選擇一種進(jìn)程調(diào)度算法,模擬進(jìn)程的運(yùn)行及調(diào)度過程,比較不同算法在周轉(zhuǎn)時間和平均周轉(zhuǎn)時間上的差異。針對進(jìn)程文件里面的數(shù)據(jù)為正常、缺項(xiàng)、格式不正確等各種情況,檢測程序的執(zhí)行結(jié)果。2、理解安全性算法和銀行家算法的核心機(jī)制:針對3類資源、5個進(jìn)程的情況,設(shè)計(jì)相應(yīng)的數(shù)據(jù)結(jié)構(gòu),分別表示每個進(jìn)程占用各類資源的情況;編程實(shí)現(xiàn)安全性算法函數(shù),編制主函數(shù),動態(tài)輸入資源的占用情況,進(jìn)程的資源申請,調(diào)用安全性函數(shù),實(shí)現(xiàn)銀行家算法;輸入可分配和不可分配的請求,測試系統(tǒng)的正確性。實(shí)驗(yàn)要求:進(jìn)程調(diào)度模擬程序根據(jù)一個進(jìn)程調(diào)度文件,模擬進(jìn)程的各種調(diào)度過程,用適合的表達(dá)方式表示出來。銀行家算法程序提供一個用戶界面,可以在上邊發(fā)出資源申請命令,系統(tǒng)應(yīng)能給出是否可以接受申請,并且有結(jié)論輸出。思考:1、終端型進(jìn)程流適合使用哪種調(diào)度算法?長批處理作業(yè)適合使用哪種調(diào)度算法?2、動態(tài)優(yōu)先級調(diào)度算法的優(yōu)先級變化率應(yīng)該如何設(shè)置?實(shí)驗(yàn)結(jié)果:進(jìn)程調(diào)度過程的模擬(1)概述選擇一個調(diào)度算法,實(shí)現(xiàn)處理機(jī)調(diào)度。設(shè)計(jì)要求:1)進(jìn)程調(diào)度算法包括:先來先服務(wù)算法,時間片輪轉(zhuǎn)算法,最高優(yōu)先數(shù)優(yōu)先優(yōu)先算法,動態(tài)優(yōu)先級算法。2)可選擇進(jìn)程數(shù)量3)本程序包括四種算法,用C或C++語言實(shí)現(xiàn),執(zhí)行時在主界面選擇算法(可用函數(shù)實(shí)現(xiàn)),進(jìn)入子頁面后輸入進(jìn)程數(shù),(運(yùn)行時間,優(yōu)先數(shù)由隨機(jī)函數(shù)產(chǎn)生),執(zhí)行,顯示結(jié)果。(2)設(shè)計(jì)原理1)先來先服務(wù)算法 FCFS每次調(diào)度都是從后備作業(yè)隊(duì)列中選擇一個或多個最先進(jìn)入該隊(duì)列的作業(yè),將它們調(diào)入內(nèi)存,為它們分配資源創(chuàng)建進(jìn)程,然后放入就緒隊(duì)列。2)時間片輪轉(zhuǎn)法 RR系統(tǒng)將所有的就緒進(jìn)程按先來先服務(wù)的原則排成一個隊(duì)列,每次調(diào)度時,把CPU分配給隊(duì)首進(jìn)程,并令其執(zhí)行一個時間片。當(dāng)執(zhí)行的時間片用完時,由一個計(jì)時器發(fā)出時鐘中斷請求,調(diào)度程序便據(jù)此信號來停止該進(jìn)程的執(zhí)行,并將它送往就緒隊(duì)列的末尾;然后,再把處理機(jī)分配給就緒隊(duì)列中新的隊(duì)首進(jìn)程,同時也讓它執(zhí)行一個時間片。最高優(yōu)先數(shù)優(yōu)先優(yōu)先算法SPF短進(jìn)程優(yōu)先調(diào)度算法是從就緒隊(duì)列中選出一個估計(jì)運(yùn)行時間最短的進(jìn)程,將處理機(jī)分配給它,使它立即執(zhí)行并一直執(zhí)行到完成,或發(fā)生某事件而被阻塞放棄處理機(jī)時再重新調(diào)度。#include<windows.h>#include<iostream>#include<string.h>usingnamespacestd;#defineP_NUM3//進(jìn)程數(shù)#defineP_TIME2//時間片長度#defineMIN-9999enumstate//進(jìn)程狀態(tài){ready, //就緒run, //執(zhí)行wait, //阻塞finish //完成};classPcb{public:staticvoidprint(){};~Pcb();protected:char*name;
//進(jìn)程名intallTime;intcpuTime;
//需要運(yùn)行時間//已用cpu時間stateprocess;
//進(jìn)程狀態(tài)};classHPcb:publicPcb{public:staticvoidprint();staticvoidhighS();staticintgetFirst();private:intfirstNum;};HPcbhpcb[P_NUM];classFPcb:publicPcb{public:staticvoidprint();staticvoidfcfs();private:intcomeTime;};FPcbfpcb[P_NUM];classRPcb:publicPcb{public:staticvoidprint();staticvoidrr();};RPcbrpcb[P_NUM];voidRPcb::rr(){intii,i=0;intk=0;for(;i<P_NUM;i++){char*ch;ch=newchar[1];cout<<"請輸入第"<<i+1<<"個進(jìn)程的進(jìn)程名、需要運(yùn)行的時間:"<<endl;cin>>ch;rpcb[i].name=newchar[strlen(ch)+1];strcpy(rpcb[i].name,ch);cin>>rpcb[i].allTime;rpcb[i].cpuTime=0;rpcb[i].process=ready;}do{for(i=0;i<P_NUM;i++){if(rpcb[i].process==ready){ rpcb[i].cpuTime+=P_TIME;rpcb[i].process=run;if(rpcb[i].cpuTime>=rpcb[i].allTime)//該進(jìn)程執(zhí)行完成{rpcb[i].cpuTime-=P_TIME;system("cls");print();Sleep(1000);rpcb[i].process=finish;rpcb[i].cpuTime=rpcb[i].allTime;//防止所用時間超過總的時間system("cls");print();Sleep(1000);}else{rpcb[i].cpuTime-=P_TIME;system("cls");print();Sleep(1000);rpcb[i].cpuTime+=P_TIME;rpcb[i].process=ready;}}}for(i=0;i<P_NUM;i++)if(rpcb[i].process!=ready)k++;if(k==2){for(i=0;i<P_NUM;i++)if(rpcb[i].process==run)break;rpcb[i].cpuTime+=P_TIME;rpcb[i].process=run;if(rpcb[i].cpuTime>=rpcb[i].allTime)//該進(jìn)程執(zhí)行完成{rpcb[i].process=finish;rpcb[i].cpuTime=rpcb[i].allTime;//防止所用時間超過總的時間system("cls");print();Sleep(1000);}else{system("cls");print();Sleep(1000);rpcb[i].process=run;}}for(ii=0;ii<P_NUM;ii++)// 用于判斷是否還有進(jìn)程未完成if(rpcb[ii].process!=finish)break;}while(ii<P_NUM);// 還有進(jìn)程未完成cout<<"所有進(jìn)程已運(yùn)行完成! "<<endl;}voidHPcb::highS()//最高優(yōu)先數(shù)優(yōu)先的調(diào)度算法{intii,f,i=0;for(;i<P_NUM;i++){char*ch;ch=newchar[1];cout<<"請輸入第"<<i+1<<"個進(jìn)程的進(jìn)程名優(yōu)先、需要運(yùn)行的時間:"<<endl;cin>>ch;hpcb[i].name=newchar[strlen(ch)+1];strcpy(hpcb[i].name,ch);cin>>hpcb[i].firstNum>>hpcb[i].allTime;hpcb[i].cpuTime=0;hpcb[i].process=ready;}do{f=getFirst();hpcb[f].cpuTime+=P_TIME;hpcb[f].firstNum--;hpcb[f].process=run;if(hpcb[f].cpuTime>=hpcb[f].allTime)// 該進(jìn)程執(zhí)行完成{hpcb[f].cpuTime-=P_TIME;system("cls");print();Sleep(1000);hpcb[f].firstNum=MIN;hpcb[f].process=finish;hpcb[f].cpuTime=hpcb[f].allTime;// 防止所用時間超過總的時間system("cls");print();Sleep(1000);}else{hpcb[f].cpuTime-=P_TIME;//為了輸出改變前的相關(guān)信息hpcb[f].firstNum++;//為了輸出改變前的相關(guān)信息system("cls");print();Sleep(1000);hpcb[f].cpuTime+=P_TIME;hpcb[f].firstNum--;hpcb[f].process=ready;}for(ii=0;ii<P_NUM;ii++)// 用于判斷是否還有進(jìn)程未完成if(hpcb[ii].firstNum!=MIN)break;}while(ii<P_NUM);// 還有進(jìn)程未完成cout<<"所有進(jìn)程已運(yùn)行完成! "<<endl;}Pcb::~Pcb(){delete[]name;}voidFPcb::fcfs() //先來先服務(wù)算法{inti=0;for(;i<P_NUM;i++){char*ch;ch=newchar[1];cout<<"請輸入第"<<i+1<<"個進(jìn)程的進(jìn)程名,需要運(yùn)行的時間:"<<endl;cin>>ch;fpcb[i].name=newchar[strlen(ch)+1];strcpy(fpcb[i].name,ch);cin>>fpcb[i].allTime;fpcb[i].comeTime=i+1;fpcb[i].cpuTime=0;fpcb[i].process=ready;}for(i=0;i<P_NUM;i++)//P_NUM 個進(jìn)程{for(int j=0;j<fpcb[i].allTime;j+=P_TIME)//每個進(jìn)程所用時間{fpcb[i].cpuTime+=P_TIME; //第i個進(jìn)程所用時間加個時間片if(fpcb[i].cpuTime<fpcb[i].allTime)// 第i個進(jìn)程還未完成fpcb[i].process=run; //將其狀態(tài)設(shè)為就緒態(tài)if(fpcb[i].cpuTime>=fpcb[i].allTime){if((i+1)!=P_NUM)//
如果第i+1個進(jìn)程不是最后一個進(jìn)程 ,便于下一個程序從就緒狀態(tài)到運(yùn)行狀態(tài){fpcb[i].cpuTime-=P_TIME;system("cls");print();Sleep(1000);fpcb[i].cpuTime+=P_TIME;fpcb[i].cpuTime=fpcb[i].allTime;fpcb[i].process=finish;fpcb[i+1].process=run;system("cls");print();Sleep(1000);}else{fpcb[i].cpuTime-=P_TIME;system("cls");print();Sleep(1000);fpcb[i].process=finish;fpcb[i].cpuTime=fpcb[i].allTime;system("cls");print();Sleep(1000);}}else{fpcb[i].cpuTime-=P_TIME;system("cls");print();Sleep(1000);fpcb[i].cpuTime+=P_TIME;}}}cout<<"所有進(jìn)程已運(yùn)行完成! "<<endl;}intHPcb::getFirst()// 得到優(yōu)先級最高的進(jìn)程{intk=0;for(inti=1;i<P_NUM;i++)if(hpcb[k].firstNum<hpcb[i].firstNum)k=i;returnk;}voidHPcb::print(){cout<<"**********************************************"<<endl;cout<<"進(jìn)程名"<<"\t"<<"還需運(yùn)行時間\t"<<"已用CPU時間"<<"\t"<<"優(yōu)先級"<<"\t"<<"狀態(tài)"<<endl;for(inti=0;i<P_NUM;i++){cout<<hpcb[i].name<<"\t\t"<<hpcb[i].allTime-hpcb[i].cpuTime<<"\t\t"<<hpcb[i].cpuTime<<"\t"<<hpcb[i].firstNum<<"\t";switch(hpcb[i].process){阻 塞 態(tài)"<<endl;break;case
ready:cout<<"
就 緒 態(tài)"<<endl;break;case
run:cout<<"
運(yùn) 行 態(tài)"<<endl;break;case
finish:cout<<"
完 成
態(tài)"<<endl;break;}}cout<<""<<endl;cout<<endl;}voidRPcb::print(){cout<<"********************************************"<<endl;cout<<"進(jìn)程名"<<"\t"<<"還需運(yùn)行時間\t"<<"已用CPU時間"<<"\t"<<"狀態(tài)"<<endl;for(inti=0;i<P_NUM;i++){cout<<rpcb[i].name<<"\t\t"<<rpcb[i].allTime-rpcb[i].cpuTime<<"\t\t"<<rpcb[i].cpuTime<<"\t";switch(rpcb[i].process){case
wait:cout<<"
阻 塞 態(tài)"<<endl;break;case
ready:cout<<"
就 緒 態(tài)"<<endl;break;case
run:cout<<"
運(yùn) 行 態(tài)"<<endl;break;case
finish:cout<<"
完 成 態(tài)"<<endl;break;}}cout<<""<<endl;cout<<endl;}voidFPcb::print(){cout<<"***********************************************"<<endl;cout<<"進(jìn)程名"<<"\t"<<"還需運(yùn)行時間\t"<<"已用CPU時間"<<"\t"<<" 狀態(tài)"<<endl;for(inti=0;i<P_NUM;i++){cout<<fpcb[i].name<<"\t\t"<<fpcb[i].allTime-fpcb[i].cpuTime<<"\t\t"<<fpcb[i].cpuTime<<"\t";switch(fpcb[i].process){case wait:cout<<" 阻 塞 態(tài)"<<endl;break;case ready:cout<<" 就 緒 態(tài)"<<endl;break;case run:cout<<" 運(yùn) 行 態(tài)"<<endl;break;case finish:cout<<" 完 成 態(tài)"<<endl;break;}}cout<<""<<endl;cout<<endl;}voidmain(){charch;cout<<"請選擇算法:\n1.先來先服務(wù)算法\n2.時間片輪轉(zhuǎn)調(diào)度算法\n3.最高優(yōu)先數(shù)優(yōu)先的調(diào)度算法\n"<<endl;cin>>ch;if(ch=='1')FPcb::fcfs();elseif(ch=='2')RPcb::rr();elseif(ch=='3')HPcb::highS();}安全性算法和銀行家算法的核心機(jī)制銀行家算法原理:我們可以把操作系統(tǒng)看作是銀行家,操作系統(tǒng)管理的資源相當(dāng)于銀行家管理的資金,進(jìn)程向操作系統(tǒng)請求分配資源相當(dāng)于用戶向銀行家貸款。為保證資金的安全,銀行家規(guī)定:當(dāng)一個顧客對資金的最大需求量不超過銀行家現(xiàn)有的資金時就可接納該顧客;顧客可以分期貸款,但貸款的總數(shù)不能超過最大需求量;當(dāng)銀行家現(xiàn)有的資金不能滿足顧客尚需的貸款數(shù)額時,對顧客的貸款可推遲支付,但總能使顧客在有限的時間里得到貸款;當(dāng)顧客得到所需的全部資金后,一定能在有限的時間里歸還所有的資金.操作系統(tǒng)按照銀行家制定的規(guī)則為進(jìn)程分配資源,當(dāng)進(jìn)程首次申請資源時,要測試該進(jìn)程對資源的最大需求量,如果系統(tǒng)現(xiàn)存的資源可以滿足它的最大需求量則按當(dāng)前的申請量分配資源,否則就推遲分配。當(dāng)進(jìn)程在執(zhí)行中繼續(xù)申請資源時,先測試該進(jìn)程本次申請的資源數(shù)是否超過了該資源所剩余的總量。若超過則拒絕分配資源,若能滿足則按當(dāng)前的申請量分配資源,否則也要推遲分配。銀行家算法進(jìn)程i發(fā)出請求資源申請,(1)如果Request[j]<=need[i,j],轉(zhuǎn)向步驟(2),否則認(rèn)為出錯,因?yàn)樗枰馁Y源數(shù)已經(jīng)超過它所宣布的最大值。(2)如果:Requesti[j]<=available[i,j],轉(zhuǎn)向步驟(3),否則表示尚無足夠資源,進(jìn)程i需等待。(3)若以上兩個條件都滿足,則系統(tǒng)試探著將資源分配給申請的進(jìn)程,并修改下面數(shù)據(jù)結(jié)構(gòu)中的數(shù)值:可利用資源向量 Available[i,j]=Available[i,j]- 最大需求矩陣Request[j];分配矩陣
Allocation[i][j]=Allocation[i][j]+Request[j]
;需求矩陣
need[i][j]=need[i][j]-Request[j]
;(4)試分配后,執(zhí)行安全性檢查,調(diào)用check()函數(shù)檢查此次資源分配后系統(tǒng)是否處于安全狀態(tài)。若安全,才正式將資源分配給進(jìn)程;否則本次試探分配作廢,恢復(fù)原來的資源分配狀態(tài),讓該進(jìn)程等待。(5)用do{?}while 循環(huán)語句實(shí)現(xiàn)輸入字符 y/n判斷是否繼續(xù)進(jìn)行資源申請。安全性檢測算法設(shè)置兩個向量:工作向量Work,它表示系統(tǒng)可提供給進(jìn)程繼續(xù)運(yùn)行所需的各類資源數(shù)目,在執(zhí)行安全性算法開始時,Work=Available。工作向量Finish,它表示系統(tǒng)是否有足夠的資源分配給進(jìn)程,使之運(yùn)行完成。開始時先做Finish[i]=false;當(dāng)有足夠的資源分配給進(jìn)程時, 再令Finish[i]=true。(2)在進(jìn)程中查找符合以下條件的進(jìn)程:條件1:Finish[i]=false;條件2:need[i][j]<=Work[j] 若找到,則執(zhí)行步驟(3)否則,執(zhí)行步驟(4)(3)當(dāng)進(jìn)程獲得資源后,可順利執(zhí)行,直至完成,并釋放出分配給它的資源,故應(yīng)執(zhí)行:Work[j]=Work[j]+Allocation[i][j];Finish[i]=true;gotostep(2);(4)如果所有的Finish[i]=true 都滿足,則表示系統(tǒng)處于安全狀態(tài),否則,處于不安全狀態(tài)。流程圖程序源代碼#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<iostream.h>#definem50intno1; //進(jìn)程數(shù)intno2; //資源數(shù)intr;intallocation[m][m],need[m][m],available[m],max[m][m];char
name1[m],name2[m];//定義全局變量voidmain(){voidcheck();voidprint();inti,j,p=0,q=0;charc;intrequest[m],allocation1[m][m],need1[m][m],available1[m];printf("**********************************************\n");printf("* 銀行家算法的設(shè)計(jì)與實(shí)現(xiàn) *\n");printf("**********************************************\n");printf("請輸入進(jìn)程總數(shù):\n");scanf("%d",&no1);printf("請輸入資源種類數(shù):\n");scanf("%d",&no2);printf("請輸入Max矩陣:\n");for(i=0;i<no1;i++)for(j=0;j<no2;j++)scanf("%d",&max[i][j]); //輸入已知進(jìn)程最大資源需求量printf("請輸入Allocation矩陣:\n");for(i=0;i<no1;i++)for(j=0;j<no2;j++)scanf("%d",&allocation[i][j]); //輸入已知的進(jìn)程已分配的資源數(shù)for(i=0;i<no1;i++)for(j=0;j<no2;j++)need[i][j]=max[i][j]-allocation[i][j]; //根據(jù)輸入的兩個數(shù)組計(jì)算出 need矩陣的值printf("請輸入Available矩陣\n");for(i=0;i<no2;i++)scanf("%d",&available[i]); //輸入已知的可用資源數(shù)print(); //輸出已知條件check();//檢測T0時刻已知條件的安全狀態(tài)if(r==1)//如果安全則執(zhí)行以下代碼{do{q=0;p=0;printf("\n 請輸入請求資源的進(jìn)程號(0~4):\n");for(j=0;j<=10;j++)scanf("%d",&i);if(i>=no1){printf("輸入錯誤,請重新輸入:\n");continue;}elsebreak;}while(i)printf("\n請輸入該進(jìn)程所請求的資源數(shù)request[j]:\n");for(j=0;j<no2;j++)scanf("%d",&request[j]);for(j=0;j<no2;j++)if(request[j]>need[i][j])p=1;
//判斷請求是否超過該進(jìn)程所需要的資源數(shù)if(p)printf("請求資源超過該進(jìn)程資源需求量,請求失??!\n");else{for(j=0;j<no2;j++)if(request[j]>available[j])q=1;//判斷請求是否超過可用資源數(shù)if(q)printf("沒有做夠的資源分配,請求失敗!\n");else //請求滿足條件{for(j=0;j<no2;j++){available1[j]=available[j];allocation1[i][j]=allocation[i][j];need1[i][j]=need[i][j]; //保存原已分配的資源數(shù),仍需要的資源數(shù)和可用的資源數(shù)available[j]=available[j]-request[j];allocation[i][j]+=request[j];need[i][j]=need[i][j]-request[j];// 系統(tǒng)嘗試把資源分配給請求的進(jìn)程}print();check(); //檢測分配后的安全性if(r==0) //如果分配后系統(tǒng)不安全{for(j=0;j<no2;j++){available[j]=available1[j];allocation[i][j]=allocation1[i][j];need[i][j]=need1[i][j]; //還原已分配的資源數(shù),仍需要的資源數(shù)和可用的資源數(shù)}printf("返回分配前資源數(shù)\n");print();}}}printf("\n 你還要繼續(xù)分配嗎?Y orN?\n");//判斷是否繼續(xù)進(jìn)行資源分配c=getche();}while(c=='y'||c=='Y');}voidcheck() //安全算法函數(shù){intk,f,v=0,i,j;intwork[m],a[m];boolfinish[m];r=1;for(i=0;i<no1;i++)finish[i]=false;//初始化進(jìn)程均沒得到足夠資源數(shù)并完成for(i=0;i<no2;i++)work[i]=available[i];//work[i] 表示可提供進(jìn)程繼續(xù)運(yùn)行的各類資源數(shù)k=no1;do{for(i=0;i<no1;i++){if(finish[i]==false){f=1;for(j=0;j<no2;j++)if(need[i][j]>work[j])f=0;if(f==1) //找到還沒有完成且需求數(shù)小于可提供進(jìn)程繼續(xù)運(yùn)行的資源數(shù)的進(jìn)程{finish[i]=true;a[v++]=i; //記錄安全序列號for(j=0;j<no2;j++)work[j]+=allocation[i][j]; //釋放該進(jìn)程已分配的資源}}}k--; //每完成一個進(jìn)程分配,未完成的進(jìn)程數(shù)就減1}while(k>0);f=1;for(i=0;i<no1;i++) //判斷是否所有的進(jìn)程都完成{if(finish[i]==false){f=0;break;}}if(f==0) //若有進(jìn)程沒完成,則為不安全狀態(tài){printf("系統(tǒng)處在不安全狀態(tài)! ");r=0;}else{printf("\n 系統(tǒng)當(dāng)前為安全狀態(tài),安全序列為:\n");for(i=0;i<no1;i++)printf("p%d ",a[i]); //輸出安全序列}}voidprint() //輸出函數(shù){inti,j;printf("\n");printf("************* 此時刻資源分配情況*********************\n");printf("進(jìn)程名/號|Need |\n");for(i=0;i<no1;
i++){printf(" p%d/%d ",i,i);for(j=0;j<no2;j++){printf("%d ",max[i][j]);}for(j=0;j<no2;j++){printf("%d ",allocation[i][j]);}for(j=0;j<no2;j++){printf("%d ",need[i][j]);}printf("\n");}printf("\n");printf("各類資源可利用的資源數(shù)為 :");for(j=0;j<no2;j++){printf("%d",available[j]);}printf("\n");}小結(jié):深刻學(xué)習(xí)了進(jìn)程調(diào)度的三種算法和銀行家算法,對其有了更深程度的理解,并且更深的理解了操作系統(tǒng)內(nèi)部的運(yùn)算方法,對此產(chǎn)生了濃厚的興趣,課下也會深入去學(xué)習(xí)。成績評定:該生對待本次實(shí)驗(yàn)的態(tài)度□認(rèn)真□良好□一般□比較差。本次實(shí)驗(yàn)的過程情況□很好□較好□一般□比較差對實(shí)驗(yàn)結(jié)果的分析□很好□良好□一般□比較差文檔書寫符合規(guī)范程度□很好□良好□一般□比較差綜合意見:成績
指導(dǎo)教師簽名
日期
12.2《操作系統(tǒng) 》課程實(shí)驗(yàn)第 二次實(shí)驗(yàn)報告實(shí)驗(yàn)內(nèi)容及基本要求:實(shí)驗(yàn)項(xiàng)目名稱:內(nèi)存分配算法模擬實(shí)現(xiàn)實(shí)驗(yàn)類型:操作每組人數(shù): 1實(shí)驗(yàn)內(nèi)容及要求:實(shí)驗(yàn)內(nèi)容:本實(shí)驗(yàn)的主要內(nèi)容是實(shí)現(xiàn)存儲管理系統(tǒng)中的內(nèi)存分配、地址變換和虛擬存儲管理中的頁面置換。具體內(nèi)容包括三個方面:1、掌握動態(tài)分區(qū)分配的基本原理,設(shè)計(jì)動態(tài)分區(qū)分配系統(tǒng),可以實(shí)現(xiàn)首次適應(yīng)算法、最壞適應(yīng)算法和最佳適應(yīng)算法進(jìn)行分區(qū)分配。2、理解虛擬存儲器的地址變換過程,設(shè)計(jì)用于模擬快表、頁表、地址變換所用的寄存器的數(shù)據(jù)結(jié)構(gòu)。編制頁表的初始信息文件,舉例說明文件中具有的信息:共有5塊,每塊的狀態(tài)、在內(nèi)存和外存的起始地址等。編程實(shí)現(xiàn)虛擬存儲器地址變換算法程序,動態(tài)輸入所要訪問的邏輯地址,變換過程文字描述以及變換后的物理地址;檢查輸入有效、無效地址,測試程序的正確性和錯誤處理能力。3、編程實(shí)現(xiàn)LRU算法或CLOCK/改進(jìn)算法等置換算法(二選一),模擬實(shí)現(xiàn)虛擬存儲器的地址變換過程。理解LRU或CLOCK改進(jìn)算法等置換算法;設(shè)計(jì)與算法相關(guān)的數(shù)據(jù)結(jié)構(gòu),如:LRU的堆?;駽LOCK改進(jìn)算法中的循環(huán)結(jié)構(gòu);按照最多塊的內(nèi)存分配情況,編程實(shí)現(xiàn)所選算法,動態(tài)輸入訪問內(nèi)存的塊號序列,輸出置換結(jié)果;輸入合法、非法的訪問序列數(shù)據(jù),檢查程序的正確性和健壯性。實(shí)驗(yàn)要求:虛擬地址變換程序提供邏輯地址輸入界面,形象地表示出變換成物理地址的過程與最后變換成的物理地址。置換算法程序提供內(nèi)存訪問序列的輸入界面,輸出正確的置換過程描述和置換結(jié)果。思考:1、地址變換產(chǎn)生錯誤的原因有哪些?2、在頁面置換過程中,為什么會出現(xiàn)抖動的情況?實(shí)驗(yàn)結(jié)果:Clock算法的思想:當(dāng)某一頁首次裝入內(nèi)存中時,則將該頁框的使用位設(shè)置為1;當(dāng)該頁隨后被訪問到時(在訪問產(chǎn)生缺頁中斷之后),它的使用位也會被設(shè)置為1。對于頁面置換算法,用于置換算法,用于置換的候選頁框集合(當(dāng)前進(jìn)程:局部范圍;整個內(nèi)存;全局范圍)被看做是一個循環(huán)緩沖區(qū),并且有一個指針與之相關(guān)聯(lián)。當(dāng)一頁被置換時,該指針被設(shè)置成指向緩沖區(qū)中的下一頁框。當(dāng)需要置換一頁時,操作系統(tǒng)掃描緩沖區(qū),以查找使用位被置為0的一頁框。每當(dāng)遇到一個使用位為1的頁框時,操作系統(tǒng)就將該位重新置為0;如果在這個過程開始時,緩沖區(qū)中所有頁框的使用位均為0時,則選擇遇到的第一個頁框置換;如果所有頁框的使用位均為 1時,則指針在緩沖區(qū)中完整地循環(huán)一周, 把所有使用位都置為0,并且停留在最初的位置上,置換該頁框中的頁。主函數(shù)模塊函數(shù)名稱:
intmain()
功能:顯示主菜單,調(diào)用函數(shù)檢測模塊函 數(shù) 名
稱 :
boolinblock(intnum)
、boolinblock2(intnum)
功能:檢測讀入的頁號是否存在內(nèi)存中、檢測頁號是否在內(nèi)存中并把訪問位和修改位置1修改模塊函數(shù)名稱:boolchange()、intwhichpage() 功能:判斷頁面是否已經(jīng)被修改、判斷內(nèi)存中第幾個需要被置換 Clock 模塊 函數(shù)名稱:voidCLOCK(intnum)
功能:實(shí)現(xiàn)
Clo
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 云南警官學(xué)院《柳琴戲藝術(shù)概論》2023-2024學(xué)年第一學(xué)期期末試卷
- 配電設(shè)施運(yùn)行安全與事故預(yù)防制度
- 餐廳業(yè)績月度總結(jié)模板
- 業(yè)務(wù)操作-房地產(chǎn)經(jīng)紀(jì)人《業(yè)務(wù)操作》真題匯編3
- 全球旅游業(yè)年度總結(jié)模板
- 三育人先進(jìn)個人主要事跡
- 二零二五年飯店員工勞動合同及員工培訓(xùn)經(jīng)費(fèi)保障合同2篇
- 人教版三年級數(shù)學(xué)下冊第四單元兩位數(shù)乘兩位數(shù)綜合卷(含答案)
- 二零二五版小學(xué)教師崗位績效評價與激勵機(jī)制合同3篇
- 煙臺南山學(xué)院《工程管理專業(yè)概論》2023-2024學(xué)年第一學(xué)期期末試卷
- 愛的五種語言--課件
- 農(nóng)村共建房屋協(xié)議書(2篇)
- 公路工程施工現(xiàn)場安全檢查手冊
- 公司組織架構(gòu)圖(可編輯模版)
- 陜西省銅川市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細(xì)
- 禮品(禮金)上交登記臺賬
- 北師大版七年級數(shù)學(xué)上冊教案(全冊完整版)教學(xué)設(shè)計(jì)含教學(xué)反思
- 2023高中物理步步高大一輪 第五章 第1講 萬有引力定律及應(yīng)用
- 青少年軟件編程(Scratch)練習(xí)題及答案
- 浙江省公務(wù)員考試面試真題答案及解析精選
- 系統(tǒng)性紅斑狼瘡-第九版內(nèi)科學(xué)
評論
0/150
提交評論