版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
淮陰工學院實驗報告___-____年第__1__學期學院___計算機工程學院__課程名稱_____操作系統(tǒng)__班級_____軟件1101_____學號_________姓名_______王祥______指導教師_______嚴云洋______實驗一:進程調度1.實驗目的:通過這次實驗,加深對進程概念的理解,進一步掌握進程狀態(tài)的轉變、進程調度的方略及對系統(tǒng)性能的評價辦法。2.實驗內容:設計程序模擬進程的輪轉法調度過程。假設初始狀態(tài)為:有n個進程處在就緒狀態(tài),有m個進程處在阻塞狀態(tài)。采用輪轉法進程調度算法進行調度(調度過程中,假設處在執(zhí)行狀態(tài)的進程不會阻塞),且每過t個時間片系統(tǒng)釋放資源,喚醒處在阻塞隊列隊首的進程。程序規(guī)定以下:1).輸出系統(tǒng)中進程的調度次序;2).計算CPU運用率。3.實驗環(huán)境:硬件環(huán)境:GhostXPSP3純凈版Y6.0Pentium(R)Dual-CoreCPUE6700@3.20GHz3.19GHz,1.96GB的內存物理地址擴展軟件環(huán)境:MicrosoftWindowsXP,VisualStudio4.源代碼:#include<iostream>#include<algorithm>#include<queue>usingnamespacestd;onstintMaxNum=100;structNode{intindex;intarriveTime;intrest;};boolNodeCmp(constNode&a,constNode&b){returna.arriveTime<b.arriveTime;}intn;//進程數(shù)intArrivalTime[MaxNum];intServiceTime[MaxNum];intPServiceTime[MaxNum];intFinishTime[MaxNum];intWholeTime[MaxNum];doubleWeightWholeTime[MaxNum];boolFinished[MaxNum];doubleAverageWT,AverageWWT;boolisEnterQue[MaxNum];intcntTimes[MaxNum];voidinit(){memset(PServiceTime,0,sizeof(PServiceTime));memset(Finished,0,sizeof(Finished));memset(FinishTime,0,sizeof(FinishTime));memset(WholeTime,0,sizeof(WholeTime));memset(WeightWholeTime,0,sizeof(WeightWholeTime));}intsum(intarray[],intn){intsum=0;inti;for(i=0;i<n;i++){sum+=array[i];}returnsum;}doublesum(doublearray[],intn){doublesum=0;inti;for(i=0;i<n;i++){sum+=array[i];}returnsum;}voidprint(){inti=0;cout<<"進程完畢時間:";for(i=0;i<n;i++){cout<<FinishTime[i]<<'';}cout<<endl;cout<<"周轉時間:";for(i=0;i<n;i++){cout<<WholeTime[i]<<'';}cout<<endl;cout<<"帶權周轉時間:";for(i=0;i<n;i++){printf("%.2f",WeightWholeTime[i]);}cout<<endl;}voidSearchToEnterQue(queue<Node>&que,Node*pArr,intmaxArrivalTime){inti;for(i=0;i<n;i++){if(pArr[i].arriveTime>maxArrivalTime)break;if(isEnterQue[pArr[i].index]==false){que.push(pArr[i]);isEnterQue[pArr[i].index]=true;}}}voidWork(intq){init();memset(isEnterQue,0,sizeof(isEnterQue));memset(cntTimes,0,sizeof(cntTimes));Node*pNodeArr=newNode[n];inti;for(i=0;i<n;i++){pNodeArr[i].index=i;pNodeArr[i].arriveTime=ArrivalTime[i];pNodeArr[i].rest=ServiceTime[i];}sort(pNodeArr,pNodeArr+n,NodeCmp);inttotalTime=sum(ServiceTime,n);inttime=pNodeArr[0].arriveTime;queue<Node>que;que.push(pNodeArr[0]);isEnterQue[pNodeArr[0].index]=true;Nodecur;cout<<"================================================="<<endl;while(!que.empty()) {cur=que.front();que.pop();cntTimes[cur.index]++;if(cntTimes[cur.index]==1)printf("在%d時刻,進程%d開始執(zhí)行。。。\n",time,cur.index);if(cur.rest>q){time+=q;cur.rest-=q;}else{time+=cur.rest;Finished[cur.index]=true;FinishTime[cur.index]=time;cur.rest=0;printf("在%d時刻,進程%d執(zhí)行結束。\n",time,cur.index);}SearchToEnterQue(que,pNodeArr,time);if(cur.rest!=0)que.push(cur);if(que.empty())//若隊列為空,則在time之后才達成的進程找最早達成的進程入隊列{for(i=0;i<n;i++){if(isEnterQue[i]==false)//找到了{que.push(pNodeArr[i]);//入隊列time=pNodeArr[i].arriveTime; break;}}}}for(i=0;i<n;i++){WholeTime[i]=FinishTime[i]-ArrivalTime[i];WeightWholeTime[i]=(double)WholeTime[i]/(double)ServiceTime[i];}AverageWT=(double)sum(WholeTime,n)/(double)n;AverageWWT=(double)sum(WeightWholeTime,n)/(double)n; cout<<"================================================="<<endl;print();cout<<endl<<endl; cout<<"================================================="<<endl;printf("平均周轉時間:%.2f,平均帶權周轉時間:%.2f\n",AverageWT,AverageWWT);delete[]pNodeArr;}intmain(){// freopen("test.txt","rw",stdin);intq;//時間片大小inti;cout<<"輸入進程數(shù):";cin>>n;;cout<<"輸入每個進程的達成時間:"<<endl;for(i=0;i<n;i++)cin>>ArrivalTime[i];cout<<"輸入每個進程的服務時間:"<<endl;for(i=0;i<n;i++)cin>>ServiceTime[i];cout<<"輸入時間片大小"<<endl;cin>>q;Work(q);return0;}5.實驗成果: 6.實驗分析和體會:實驗二分區(qū)式存儲管理1.實驗目的:通過這次實驗,加深對內存管理的認識,進一步掌握內存的分派、回收算法的思想。2.實驗內容:設計程序模擬內存的動態(tài)分區(qū)法存儲管理。內存空閑區(qū)使用自由鏈管理,采用最壞適應算法從自由鏈中尋找空閑區(qū)進行分派,內存回收時假定不做與相鄰空閑區(qū)的合并。假定系統(tǒng)的內存共640K,初始狀態(tài)為操作系統(tǒng)本身占用64K。在t1時間之后,有作業(yè)A、B、C、D分別請求8K、16K、64K、124K的內存空間;在t2時間之后,作業(yè)C完畢;在t3時間之后,作業(yè)E請求50K的內存空間;在t4時間之后,作業(yè)D完畢。規(guī)定編程序分別輸出t1、t2、t3、t4時刻內存的空閑區(qū)的狀態(tài)。3.實驗環(huán)境:硬件環(huán)境:GhostXPSP3純凈版Y6.0Pentium(R)Dual-CoreCPUE6700@3.20GHz3.19GHz,1.96GB的內存物理地址擴展軟件環(huán)境:MicrosoftWindowsXP,VisualStudio4.源代碼:#include"stdafx.h"#include<stdio.h>#include<stdlib.h>structfreelink{intlen,address;//len為分區(qū)長度;address為分區(qū)起始地址structfreelink*next;};//內存占用區(qū)用鏈表描述,其結點類型描述以下:structbusylink{charname;//作業(yè)或進程名name='S'表達OS占用intlen,address;structbusylink*next;};//并設全程量:structfreelink*free_head=NULL;//自由鏈隊列帶頭結點)隊首指針?structbusylink*busy_head=NULL,*busy_tail=NULL;//占用區(qū)隊列隊(帶頭結點)首指針//占用區(qū)隊列隊尾指針//設計子函數(shù):voidstart(void)/*設立系統(tǒng)初始狀態(tài)*/{structfreelink*p;structbusylink*q;free_head=(structfreelink*)malloc(sizeof(structfreelink));free_head->next=NULL;//創(chuàng)立自由鏈頭結點busy_head=busy_tail=(structbusylink*)malloc(sizeof(structbusylink));busy_head->next=NULL;//創(chuàng)立占用鏈頭結點p=(structfreelink*)malloc(sizeof(structfreelink));p->address=64;p->len=640-64;//(OS占用了K)p->next=NULL;free_head->next=p;q=(structbusylink*)malloc(sizeof(structbusylink));q->name='S';/*S表達操作系統(tǒng)占用*/q->len=64;q->address=0;q->next=NULL;busy_head->next=q;busy_tail=q;}voidrequireMemo(charname,intrequire)/*模擬內存分派*/{structfreelink*w,*u,*v,*x,*y;structbusylink*p;x=free_head;y=free_head->next;while((y!=NULL)&&(y->len<require))//找到第一種滿足條件的空閑區(qū){x=y;y=y->next;}if(y!=NULL){p=(structbusylink*)malloc(sizeof(busylink));p->name=name;p->address=y->address;p->len=require;p->next=NULL;busy_tail->next=p;//把p插入到busy_head的尾部busy_tail=p;w=x->next;x->next=w->next;if(w->len==require){free(w);}else{w->address=w->address+require;w->len=w->len-require;u=free_head;v=free_head->next;while((v!=NULL)&&(v->len<w->len))//如果此結點尚有多出,就此又重新插入到空閑區(qū)域鏈中(按照長度由小到大的次序排列){u=v;v=v->next;}u->next=w;w->next=v;}}elseprintf("can'tallocate!\n");}voidfreeMemo(charname)/*模擬內存回收*/{structbusylink*p,*q;structfreelink*w,*u,*v,*s1=NULL,*s2=NULL;intlen,address;intflag1=1,flag2=1;p=busy_head->next;while((p!=NULL)&&(p->name!=name))//找到要回收的結點{q=p;p=p->next;}if(p==NULL){printf("%cisnotexist\n",name);}else{if(p==busy_tail)busy_tail=q;q->next=p->next;len=p->len;address=p->address;free(p);w=(structfreelink*)malloc(sizeof(freelink));w->len=len;w->address=address;u=free_head;v=free_head->next;while((v!=NULL)&&(flag1==1||flag2==1))//歸并算法{if((w->address==(v->address+v->len))&&flag1){s1=v;u->next=s1->next;w->address=v->address;w->len+=v->len;v=v->next;flag1=0;}elseif(((w->address+w->len)==v->address)&&flag2){s2=v;u->next=s2->next;w->len+=v->len;v=v->next;flag2=0;}else{u=v;v=v->next;} }if(s1!=NULL)free(s1);if(s2!=NULL)free(s2);u=free_head;v=free_head->next;if(v!=NULL){while((v!=NULL)&&(v->len<w->len)){u=v;v=v->next;}}u->next=w;w->next=v;}}voidpast(inttime)/*模擬系統(tǒng)過了時間time,用sleep(),或者用個空循環(huán)*/{printf("時間%d后:\n",time);}voidprintlink()/*輸出內存空閑狀況(自由鏈的結點)*/{structfreelink*p;p=free_head->next;if(p==NULL)printf("無空閑區(qū)!\n");else{while(p!=NULL){printf("首地址:%d\t長度:%d\n",p->address,p->len);p=p->next;}}printf("\n");}voidprintlink1()/*輸出內存占用的狀況*/{structbusylink*p;p=busy_head->next;if(p==NULL)printf("無內存占有區(qū)!\n");else{while(p!=NULL){printf("名字:%c\t首地址:%d\t長度:%d\n",p->name,p->address,p->len);p=p->next;}}}// 設計主函數(shù):intmain(){start();past(1);requireMemo('A',8);requireMemo('B',16);requireMemo('C',64);requireMemo('D',124);printf("內存占用區(qū)為:\n");printlink1();printf("內存空閑區(qū)為:\n");printlink();past(2);freeMemo('C');printf("內存占用區(qū)為:\n");printlink1();printf("內存空閑區(qū)為:\n");printlink();past(3);requireMemo('E',50);printf("內存占用區(qū)為:\n");printlink1();printf("內存空閑區(qū)為:\n");printlink();return0;}5.實驗成果:6.實驗分析和體會:首先,對鏈表又有進一步的理解,尚有就是加深理解內存的分派與回收,分派與回收的方略,并掌握動態(tài)分區(qū)這種內存管理的具體實施辦法。再者,就是在編程中碰到的困難,在編寫歸并程序首先是自己考慮問題不全方面,寫的程序就只顧及到一種結點,而沒有實現(xiàn)有兩個結點的狀況,于是后來再加了一條else語句,就沒有出現(xiàn)問題。尚有一種問題就是將多出的結點free時也出現(xiàn)問題,加了一條if(s==NULL),成立就釋放掉。一開始把free語句寫在while循環(huán)內,一旦把找到的結點釋放掉,則找不到下一種結點,也會出錯,因此應當把free放到while循環(huán)外。實驗三虛擬存儲管理1.實驗目的:存儲管理的重要功效之一是合理的分派空間。請求頁式管理是一種慣用的虛擬存儲管理技術。本實驗的目的是請求頁式存儲管理中頁面置換算法模擬設計,理解虛擬存儲技術的特點,掌握請求頁式存儲管理的頁面置換辦法。2.實驗內容:(1)通過隨機數(shù)產生一種指令序列,共320條指令。指令的地址按下述原則生成:50%的指令是次序執(zhí)行的;25%的指令是均勻分布在前地址部分;25%的指令是均勻分布在后地址部分。具體的實施辦法是:在[0,319]的指令地址之間隨機選用一起點m;次序執(zhí)行一條指令,即執(zhí)行地址為m+1的指令;在前地址[0,m+1]中隨機選用一條指令并執(zhí)行,該指令的地址為m’;次序執(zhí)行一條指令,其地址為m’+1;在后地址[m’+2,319]中隨機選用一條指令并執(zhí)行;重復上述環(huán)節(jié),直至執(zhí)行320次指令。將指令序列變換成頁地址流設:①頁面大小為1K;②顧客內存容量為4頁到32頁;③顧客虛存容量為32K;在顧客虛存中,按每K寄存10條指令排列虛存地址,即320條指令在虛存中的寄存方式為:第0條~第9條指令為第0頁(對應的虛存地址為[0,9]);第10條~第19條指令為第1頁(對應的虛存地址為[10,19]);.第310條~第319條指令為第31頁(對應的虛存地址為[310,319]);按以上方式,顧客指令可構成32頁。計算并輸出下述多種算法在不同的內存容量下的命中率。先進先出的算法(FIFO);近來最少使用算法(LRR);最佳裁減法(OPT):先裁減最不慣用的頁地址;最少訪問頁面算法(LFR);近來不經常使用算法(NUR)。其中③和④為選擇內容。命中率=1-(頁面失效次數(shù))/(頁地址流長度)在本實驗中,頁地址流的長度為320,頁面失效次數(shù)為每次訪問對應指令時,該指令所對應的頁不在內存的次數(shù)。隨機數(shù)產生措施有關隨機書產生措施,能夠使用系統(tǒng)提供函數(shù)rand(),分別進行初始化和產生隨機數(shù)。例如:srand();語句可初始化的一種隨機數(shù);a[0]=10*rand()/32767*319+1;a[1]=10*rand()/32767*a[0];語句可用來產生a[0]與a[1]中的隨機數(shù)。3.實驗環(huán)境:硬件環(huán)境:GhostXPSP3純凈版Y6.0Pentium(R)Dual-CoreCPUE6700@3.20GHz3.19GHz,1.96GB的內存物理地址擴展軟件環(huán)境:MicrosoftWindowsXP,VisualStudio4.源代碼:#defineTRUE1#defineFALSE0#defineINVALID-1#defineNULL0#definetotal_instruction320/*指令流長*/#definetotal_vp32/*虛頁長*/#defineclear_period50/*清周期*/typedefstruct/*頁面構造*/{intpn,pfn,counter,time;}pl_type;pl_typepl[total_vp];/*頁面構造數(shù)組*/structpfc_struct{/*頁面控制構造*/intpn,pfn;structpfc_struct*next;};typedefstructpfc_structpfc_type;pfc_typepfc[total_vp],*freepf_head,*busypf_head,*busypf_tail;intdiseffect,a[total_instruction];intpage[total_instruction],offset[total_instruction];intinitialize(int);intFIFO(int);/*先進先出法(FisrtInFirstOut)*/intLRU(int);/*近來最久未使用(LeastRecentlyUsed)*/intLFU(int);/*最不經常使使用方法(LeastFrequentlyUsed)*/intNUR(int);/*近來未使使用方法(NoUsedRecently)*/intOPT(int);/*最佳置換算法(Optimal)*//*主函數(shù)*/intmain(){ints,i,j;srand(10*getpid());/*由于每次運行時進程號不同,故可用來作為初始化隨機數(shù)隊列的“種子”*/s=(float)319*rand()/32767/32767/2+1;//for(i=0;i<total_instruction;i+=4)/*產生指令隊列*/{if(s<0||s>319){printf("Wheni==%d,Error,s==%d\n",i,s);exit(0);}a[i]=s;/*任選一指令訪問點m*/a[i+1]=a[i]+1;/*次序執(zhí)行一條指令*/a[i+2]=(float)a[i]*rand()/32767/32767/2;/*執(zhí)行前地址指令m'*/a[i+3]=a[i+2]+1;/*次序執(zhí)行一條指令*/s=(float)(318-a[i+2])*rand()/32767/32767/2+a[i+2]+2;if((a[i+2]>318)||(s>319))printf("a[%d+2],anumberwhichis:%dands==%d\n",i,a[i+2],s);}for(i=0;i<total_instruction;i++)/*將指令序列變換成頁地址流*/{page[i]=a[i]/10;offset[i]=a[i]%10;}for(i=4;i<=32;i++)/*顧客內存工作區(qū)從個頁面到個頁面*/{printf("%2dpageframes\n",i);FIFO(i);LRU(i);LFU(i);NUR(i);OPT(i);}return0;}intinitialize(total_pf)/*初始化有關數(shù)據構造*/inttotal_pf;/*顧客進程的內存頁面數(shù)*/{inti;diseffect=0;for(i=0;i<total_vp;i++){pl[i].pn=i;pl[i].pfn=INVALID;/*置頁面控制構造中的頁號,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廠房室外電纜施工方案
- 鄭州黃河生態(tài)廊道施工方案
- 常州景區(qū)仿木護欄施工方案
- 宣城交通標識標牌施工方案
- 鐵皮管道保溫現(xiàn)場施工方案
- 植被清理施工方案
- 西雙版納廚房防水施工方案
- 輸電線路綠色施工方案
- 莆田防盜鑄鐵井蓋施工方案
- 天津生態(tài)餐廳溫室施工方案
- DB-T29-74-2018天津市城市道路工程施工及驗收標準
- 小學一年級20以內加減法混合運算3000題(已排版)
- 智慧工廠數(shù)字孿生解決方案
- 病機-基本病機 邪正盛衰講解
- 品管圈知識 課件
- 非誠不找小品臺詞
- 2024年3月江蘇省考公務員面試題(B類)及參考答案
- 患者信息保密法律法規(guī)解讀
- 老年人護理風險防控PPT
- 充電樁采購安裝投標方案(技術方案)
- 醫(yī)院科室考勤表
評論
0/150
提交評論