操作系統(tǒng)實(shí)驗(yàn)報(bào)告-27_第1頁(yè)
操作系統(tǒng)實(shí)驗(yàn)報(bào)告-27_第2頁(yè)
操作系統(tǒng)實(shí)驗(yàn)報(bào)告-27_第3頁(yè)
操作系統(tǒng)實(shí)驗(yàn)報(bào)告-27_第4頁(yè)
操作系統(tǒng)實(shí)驗(yàn)報(bào)告-27_第5頁(yè)
已閱讀5頁(yè),還剩23頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院實(shí)驗(yàn)報(bào)告(2010~2011學(xué)年度第二學(xué)期)課程名稱計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)報(bào)告姓名學(xué)號(hào)專業(yè)計(jì)算機(jī)班級(jí)地點(diǎn)教師 2011.6.24實(shí)驗(yàn)一進(jìn)程調(diào)度(一)實(shí)驗(yàn)?zāi)康倪M(jìn)程是操作系統(tǒng)中最基本、最重要的概念,進(jìn)程調(diào)度又是操作系統(tǒng)的核心模塊。本實(shí)驗(yàn)要求學(xué)生獨(dú)立地用C或C++語(yǔ)言編寫一個(gè)簡(jiǎn)單的進(jìn)程管理程序,其主要部分是進(jìn)程調(diào)度。調(diào)度算法可由學(xué)生自行選擇,如基于動(dòng)態(tài)優(yōu)先級(jí)的調(diào)度算法或多級(jí)反饋隊(duì)列調(diào)度算法。通過(guò)本實(shí)驗(yàn)可加深學(xué)生對(duì)進(jìn)程各種狀態(tài)的轉(zhuǎn)化和各種調(diào)度算法的理解,提高系統(tǒng)程序設(shè)計(jì)能力。(二)實(shí)驗(yàn)代碼#include<cstdlib>#include<iostream>#include<iomanip>#include<string>usingnamespacestd;structfcfs{//先來(lái)先服務(wù)算法從這里開始 charname[10]; floatarrivetime; floatservicetime; floatstarttime; floatfinishtime; floatzztime; floatdqzztime;};//定義一個(gè)結(jié)構(gòu)體,里面包含的有一個(gè)進(jìn)程相關(guān)的信息fcfsa[100];voidinput(fcfs*p,intN){ inti;cout<<endl; printf("請(qǐng)您依次輸入:進(jìn)程的名字,到達(dá)時(shí)間,服務(wù)時(shí)間:(例如:a0100)\n\n"); for(i=0;i<=N-1;i++) { printf("請(qǐng)您輸入進(jìn)程%d的信息:\t",i+1); scanf("\t\t\t%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime); }}voidPrint(fcfs*p,floatarrivetime,floatservicetime,floatstarttime,floatfinishtime,floatzztime,floatdqzztime,intN){ intk;printf("\n\n調(diào)用先來(lái)先服務(wù)算法以后進(jìn)程運(yùn)行的順序是:");printf("%s",p[0].name); for(k=1;k<N;k++) { printf("-->%s",p[k].name); }cout<<endl; printf("\n具體進(jìn)程調(diào)度信息:\n");printf("\t進(jìn)程名到達(dá)時(shí)間服務(wù)時(shí)間開始時(shí)間結(jié)束時(shí)間周轉(zhuǎn)時(shí)間帶權(quán)周轉(zhuǎn)時(shí)間\n");for(k=0;k<=N-1;k++){ printf("\t%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\n",p[k].name,p[k].arrivetime, p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime);}getchar();//此處必須要有這個(gè)函數(shù),否則就看不到顯示器上面的輸出,可以看到的結(jié)果只是一閃而過(guò)的一個(gè)框剪}voidsort(fcfs*p,intN)//排序{for(inti=0;i<=N-1;i++)for(intj=0;j<=i;j++)if(p[i].arrivetime<p[j].arrivetime){fcfstemp;temp=p[i];p[i]=p[j];p[j]=temp;}}voiddeal(fcfs*p,floatarrivetime,floatservicetime,floatstarttime,floatfinishtime,float&zztime,float&dqzztime,intN)//運(yùn)行階段{ intk;for(k=0;k<=N-1;k++){if(k==0) { p[k].starttime=p[k].arrivetime; p[k].finishtime=p[k].arrivetime+p[k].servicetime;}else { p[k].starttime=p[k-1].finishtime;p[k].finishtime=p[k-1].finishtime+p[k].servicetime;}}for(k=0;k<=N-1;k++){ p[k].zztime=p[k].finishtime-p[k].arrivetime; p[k].dqzztime=p[k].zztime/p[k].servicetime;}}voidFCFS(fcfs*p,intN){floatarrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;sort(p,N);deal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);Print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);getchar();}//先來(lái)先服務(wù)算法到此結(jié)束structsjf{ //最短進(jìn)程優(yōu)先調(diào)度算法從這里開始 charname[10]; floatarrivetime;//到達(dá)時(shí)間 floatservicetime;//運(yùn)行時(shí)間 floatstarttime;//開始時(shí)間 floatfinishtime;//完成時(shí)間 floatzztime; floatdqzztime;};sjfa1[100];voidinput(sjf*p,intN1)//進(jìn)程信息輸入{ inti; cout<<endl;printf("請(qǐng)您依次輸入進(jìn)程的名字,到達(dá)時(shí)間,服務(wù)時(shí)間:(例如:a0100)\n");for(i=0;i<=N1-1;i++) {printf("請(qǐng)您輸入進(jìn)程%d的信息:\t",i+1);scanf("\t\t\t%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime); }}voidPrint(sjf*p,floatarrivetime,floatservicetime,floatstarttime,floatfinishtime,intN1)//最終結(jié)果輸出{intk;printf("\n\t調(diào)用最短進(jìn)程優(yōu)先調(diào)度算法以后進(jìn)程的調(diào)度順序?yàn)?");printf("%s",p[0].name);for(k=1;k<N1;k++) {printf("-->%s",p[k].name);} cout<<endl;printf("\n給個(gè)進(jìn)程具體調(diào)度信息如下:\n");printf("\n\t進(jìn)程名到達(dá)時(shí)間運(yùn)行時(shí)間開始時(shí)間完成時(shí)間周轉(zhuǎn)時(shí)間帶權(quán)周轉(zhuǎn)時(shí)間\n");for(k=0;k<=N1-1;k++){ p[k].zztime=p[k].finishtime-p[k].arrivetime; p[k].dqzztime=p[k].zztime/p[k].servicetime;}for(k=0;k<=N1-1;k++){printf("\t%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\n",p[k].name,p[k].arrivetime, p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime);} getchar(); }voidsort(sjf*p,intN1)//排序{for(inti=0;i<=N1-1;i++)for(intj=0;j<=i;j++)if(p[i].arrivetime<p[j].arrivetime){sjftemp;temp=p[i];p[i]=p[j];p[j]=temp;}}voiddeal(sjf*p,floatarrivetime,floatservicetime,floatstarttime,floatfinishtime,intN1)//運(yùn)行階段{intk;for(k=0;k<=N1-1;k++){if(k==0){p[k].starttime=p[k].arrivetime;p[k].finishtime=p[k].arrivetime+float(p[k].servicetime);}else{p[k].starttime=p[k-1].finishtime;p[k].finishtime=p[k-1].finishtime+float(p[k].servicetime);}}}voidsjff(sjf*p,intN1){ floatarrivetime=0,servicetime=0,starttime=0,finishtime=0;sort(p,N1);for(intm=0;m<N1-1;m++){if(m==0)p[m].finishtime=p[m].arrivetime+float(p[m].servicetime);elsep[m].finishtime=p[m-1].finishtime+float(p[m].servicetime);inti=0;for(intn=m+1;n<=N1-1;n++) { if(p[n].arrivetime<=p[m].finishtime)i++; }floatmin=p[m+1].servicetime;intnext=m+1;for(intk=m+1;k<m+i;k++){if(p[k+1].servicetime<min){min=p[k+1].servicetime;next=k+1;}}sjftemp;temp=p[m+1];p[m+1]=p[next];p[next]=temp;}deal(p,arrivetime,servicetime,starttime,finishtime,N1);Print(p,arrivetime,servicetime,starttime,finishtime,N1);getchar();}//最短進(jìn)程優(yōu)先調(diào)度算法到這里結(jié)束intmenu()//用來(lái)輸出相關(guān)信息的函數(shù){intcse1;while(1){system("cls");fflush(stdin);cout<<endl;cout<<endl;cout<<"\t"<<"\t實(shí)驗(yàn)一處理機(jī)調(diào)度算法實(shí)驗(yàn)"<<"\t\t"<<endl;cout<<endl;cout<<"\t"<<"\t\t1.先來(lái)先服務(wù)調(diào)度算法"<<"\t\t"<<endl;cout<<endl;cout<<"\t"<<"\t\t2.最短進(jìn)程優(yōu)先調(diào)度算法"<<"\t\t"<<endl;cout<<endl;cout<<endl;cout<<"\t\t請(qǐng)輸入您的選擇(1或2):"; cin>>cse1;//cse1=getchar();if(cse1<1||cse1>2) cout<<"你的輸入有錯(cuò)!"<<endl;elsebreak;}returncse1;}intmain(intargc,char*argv[]){while(1){switch(menu()){case1:intN;cout<<endl;cout<<endl;printf("\t\t先來(lái)先服務(wù)調(diào)度算法\n");cout<<endl;printf("輸入進(jìn)程數(shù)目:");scanf("%d",&N);input(a,N);FCFS(a,N);case2:intN1;cout<<endl;cout<<endl;printf("\t\t最短進(jìn)程優(yōu)先調(diào)度算法\n");cout<<endl;printf("輸入進(jìn)程數(shù)目:");scanf("%d",&N1);input(a1,N1);sjf*b=a1;sjf*c=a1;sjff(b,N1);getchar();}}//system("PAUSE");return0;}(三)實(shí)驗(yàn)流程圖(四)實(shí)驗(yàn)結(jié)果(五)實(shí)驗(yàn)體會(huì)實(shí)驗(yàn)二可變分區(qū)存儲(chǔ)管理(一)實(shí)驗(yàn)?zāi)康?.加深對(duì)可變分區(qū)的存儲(chǔ)管理的理解;2.提高用C語(yǔ)言編制大型系統(tǒng)程序的能力,特別是掌握C語(yǔ)言編程的難點(diǎn):指針和指針作為函數(shù)參數(shù);3.掌握用指針實(shí)現(xiàn)鏈表和在鏈表上的基本操作。(二)實(shí)驗(yàn)代碼#include<iostream>#include<string>usingnamespacestd;structBlock//空閑鏈結(jié)構(gòu)體{stringname;//作業(yè)名intaddress;//分區(qū)首地址intsize;//分區(qū)大小intstate;//分區(qū)轉(zhuǎn)態(tài)structBlock*next;//前向指針structBlock*front;//后向指針};structUsed//已分配分區(qū)結(jié)構(gòu)體{Block*usedArea;Used*next;};Block*freeHead;//帶表頭附加節(jié)點(diǎn)的空閑鏈頭指針Used*usedHead;//帶表頭附加結(jié)點(diǎn)的已分配分區(qū)頭指針boolInitValue()//初始化函數(shù){cout<<"本程序設(shè)立的操作功能:1-申請(qǐng)資源2-釋放資源3-打印信息"<<endl;freeHead=newBlock;freeHead->size=0;freeHead->next=NULL;freeHead->state=1;usedHead=newUsed;Block*p=newBlock;p->address=0;usedHead->usedArea=p;usedHead->next=NULL;Block*temp=newBlock;cout<<"請(qǐng)先輸入主存大小(k):"<<endl;cin>>temp->size;temp->address=0;temp->state=0;temp->next=freeHead;temp->front=NULL;freeHead->front=temp;returntrue;}voidDisplay(Block*p,Used*q)//打印信息的函數(shù){cout<<"已分配分區(qū)信息(作業(yè),始址,大小):"<<endl;while(q!=NULL){cout<<q->usedArea->name<<','<<q->usedArea->address<<','<<q->usedArea->size<<endl;q=q->next;}cout<<"空閑鏈分區(qū)信息(始址,大小):"<<endl;while(p!=NULL){cout<<p->address<<',';cout<<p->size<<endl;p=p->front;}}voidAllocate(stringreqName,intreqSize)//分配函數(shù){Block*p=freeHead->front;Used*r1,*r2;while(p!=NULL){if(reqSize<p->size)//如果請(qǐng)求的分區(qū)的大小小于一個(gè)空閑分區(qū)的大小{Used*temp=newUsed;temp->usedArea=p;Block*q=newBlock;*q=*p;temp->usedArea->name=reqName;temp->usedArea->size=reqSize;temp->usedArea->front=q;temp->usedArea->state=1;q->size=q->size-reqSize;q->address=q->address+reqSize;q->next->front=q;if(q->front!=NULL)q->front->next=q;r1=usedHead;r2=usedHead->next;while(r2!=NULL&&r2->usedArea->address<temp->usedArea->address){r1=r2;r2=r2->next;}r1->next=temp;temp->next=r2;break;}elseif(reqSize==p->size)//如果請(qǐng)求的分區(qū)的大小等于一個(gè)空閑分區(qū)的大小{Used*temp=newUsed;temp->usedArea=p;temp->usedArea->name=reqName;temp->usedArea->state=1;p->next->front=p->front;if(p->front!=NULL)p->front->next=p->next;r1=usedHead;r2=usedHead->next;while(r2!=NULL&&r2->usedArea->address<temp->usedArea->address){r1=r2;r2=r2->next;}r1->next=temp;temp->next=r2;break;}p=p->front;}if(p==NULL)cout<<"資源不足請(qǐng)等待"<<endl;}voidRecycle(stringfreeName)//回收分區(qū)的函數(shù){Used*p=usedHead->next,*r=usedHead;Block*q;while(p!=NULL){if(p->usedArea->name==freeName)//找到同名的作業(yè)后,再分四種情況討論{q=p->usedArea;intflag1=1,flag2=1;Block*p1=freeHead->front;Block*pfront,*pnext;while(p1->address<q->address){if(p1->address+p1->size==q->address){flag1=0;pnext=p1;}p1=p1->front;}if(q->address+q->size==p1->address){flag2=0;pfront=p1;}if(flag1==0){if(flag2==0){pnext->front=pfront->front;pnext->size=pnext->size+q->size+pfront->size;if(pfront->front!=NULL)pfront->front->next=pnext;r->next=p->next;}else{pnext->size+=q->size;r->next=p->next;}}else{if(flag2==0){pfront->address-=q->size;pfront->size+=q->size;r->next=p->next;}else{Block*temp=freeHead;while(temp->address<=q->address)temp=temp->front;q->front=temp;q->next=temp->next;q->next->front=q;temp->next=q;q->state=0;r->next=p->next;}}break;}r=p;p=p->next;}}intmain(){InitValue();intoperate;//操作符1-申請(qǐng)資源2-釋放資源3-打印信息stringname;intsize;while(1){cout<<"請(qǐng)選擇操作功能"<<endl;cin>>operate;if(operate==1){cout<<"請(qǐng)依次輸入作業(yè)名(字符串),空間大小(正整數(shù))(例如a100)"<<endl;cin>>name>>size;Allocate(name,size);}elseif(operate==2){cout<<"請(qǐng)輸入作業(yè)名(字符串)(例如abc)"<<endl;cin>>name;Recycle(name);}elseif(operate==3)Display(freeHead->front,usedHead->next);}return0;}(三)實(shí)驗(yàn)流程圖(四)實(shí)驗(yàn)結(jié)果(五)實(shí)驗(yàn)體會(huì)實(shí)驗(yàn)四死鎖(一)實(shí)驗(yàn)?zāi)康?二)實(shí)驗(yàn)代碼#include<iostream.h>#include"stdio.h"constunsignedshortc=3;//資源類數(shù)constunsignedshortt=5;//進(jìn)程數(shù)voidPrint();//用于打印輸出表格的函數(shù)voidInput();//用于輸入的函數(shù)voidtryfenpei(inti);//試分配函數(shù)voidrefenpei(inti);//恢復(fù)數(shù)據(jù)函數(shù)voidchecksafe(ints);//安全檢測(cè)函數(shù)//定義初始化數(shù)組intAvailable[c],Max[t][c],Allocation[t][c],Need[t][c],Request[c];intin;//用戶選擇的進(jìn)程號(hào)intmain(intargc,char*argv[]){inti;charch='Y';cout<<"初始化數(shù)據(jù)"<<endl;Input();//輸入相關(guān)數(shù)據(jù)函數(shù)Print();//打印輸出相關(guān)數(shù)據(jù)表函數(shù)cout<<"初始化完成!..."<<endl<<endl<<endl;do{if(ch=='Y'||ch=='y'){cout<<"歡迎進(jìn)入實(shí)驗(yàn)!請(qǐng)稍后..."<<endl;//Sleep(1000);cout<<"已順利進(jìn)入實(shí)驗(yàn)..."<<endl;cout<<"請(qǐng)輸入發(fā)起請(qǐng)求的進(jìn)程號(hào)(0-4):";while(cin>>in){if(!(0<=in&&in<=4)){cout<<"不存在該進(jìn)程,請(qǐng)重新輸入"<<endl;}elsebreak;};cout<<"您輸入的是"<<"p["<<in<<"]"<<"進(jìn)程"<<endl;cout<<"該進(jìn)程需求量為:";for(i=0;i<c;i++)cout<<Need[in][i]<<"";cout<<endl;cout<<"請(qǐng)輸入請(qǐng)求資源的數(shù)目:";//輸入格式為Xfor(i=0;i<c;i++){while(cin>>Request[i]){if(Request[i]<0)cout<<"錯(cuò)誤!輸入的數(shù)字無(wú)效."<<endl;elseif(Request[i]>Need[in][i])cout<<"錯(cuò)誤!超出進(jìn)程需求量"<<endl<<endl;if(Request[i]>Available[i])cout<<"錯(cuò)誤!系統(tǒng)還沒(méi)有足夠的可用資源量滿足進(jìn)程需要"<<endl<<endl;elsebreak;}}cout<<"輸入成功,您輸入的是:"<<Request[0]<<""<<Request[1]<<""<<Request[2];cout<<endl;cout<<"開始執(zhí)行銀行家算法,下面進(jìn)行試分配..."<<endl;tryfenpei(in);//分配函數(shù)//Sleep(1000);cout<<"試分配完成!"<<endl;cout<<"進(jìn)入安全性檢測(cè)..."<<endl;//Sleep(1000);checksafe(in);//安全性檢測(cè)函數(shù)cout<<"需要繼續(xù)實(shí)驗(yàn)嗎?(y-繼續(xù)n終止)";}elseif(ch=='N'||ch=='n'){cout<<"感謝您的使用,祝您愉快!"<<endl<<"正在退出..."<<endl;break;}elsecout<<"輸入無(wú)效!請(qǐng)重新輸入."<<endl;}while(cin>>ch);return0;}//main函數(shù)結(jié)束voidPrint()//輸出函數(shù){inti,j;cout<<"進(jìn)程個(gè)數(shù):"<<t<<"資源個(gè)數(shù):"<<c<<endl;cout<<"正在更新數(shù)據(jù)..."<<endl;//Sleep(1500);cout<<"|-----|----------|------------|----------|-----------|"<<endl;cout<<"|----|最大需求矩陣|已分配矩陣-|-需求矩陣-可用資源向量|"<<endl;cout<<"|\資源|Max|Allocation|Need|Available|"<<endl;cout<<"|\|ABC|ABC|ABC|ABC|"<<endl;cout<<"|進(jìn)程\|||||"<<endl;cout<<"|-----|----------|------------|----------|-----------|"<<endl;for(i=0;i<5;i++){cout<<"|p"<<i<<"|";for(j=0;j<3;j++){cout<<Max[i][j]<<"";}cout<<"|";for(j=0;j<3;j++){cout<<""<<Allocation[i][j];}cout<<"|";for(j=0;j<3;j++){cout<<""<<Need[i][j];}cout<<"|";if(i==0){for(j=0;j<3;j++){cout<<""<<Available[j];}cout<<"|";}if(i>0){cout<<"|";}cout<<endl;}cout<<"|-----|----------|------------|----------|-----------|"<<endl;}//輸出函數(shù)結(jié)束///輸入函數(shù)/voidInput(){for(intj=0;j<c;j++){cout<<"請(qǐng)輸入Available["<<j<<"]:";while(cin>>Available[j]){if(Available[j]<0)cout<<"輸入數(shù)字無(wú)效,請(qǐng)重新輸入"<<endl;elsebreak;};}for(intk=1;k<4;k++)//其他三個(gè)屬性和一次打印輸出表{for(intl=0;l<t;l++)//五個(gè)進(jìn)程循環(huán)輸入{for(intm=0;m<c;m++)//三個(gè)類資源ABC循環(huán)輸入{if(k==1&&m<t){cout<<"請(qǐng)輸入Max["<<l<<"]["<<m<<"]:";while(cin>>Max[l][m]){if(Max[l][m]<0)cout<<"輸入數(shù)字無(wú)效,請(qǐng)重新輸入"<<endl;elsebreak;};}if(k==2&&m<t){cout<<"請(qǐng)輸入Allocation["<<l<<"]["<<m<<"]:";while(cin>>Allocation[l][m])if(Allocation[l][m]<0)cout<<"輸入數(shù)字無(wú)效,請(qǐng)重新輸入"<<endl;elsebreak;//cout<<"Allocation["<<l<<"]["<<m<<"]="<<Allocation[l][m]<<endl;}if(k==3&&m<t)Need[l][m]=Max[l][m]-Allocation[l][m];}}}}//輸入函數(shù)結(jié)束//試分配函數(shù)voidtryfenpei(inti){for(intf=0;f<c;f++){Available[f]=Available[f]-Request[f];Allocation[i][f]=Allocati

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論