版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
..操作系統(tǒng)課程設(shè)計(jì)報(bào)告題目:一個小型的操作系統(tǒng)班級:計(jì)122〔杏〕學(xué)號:1213023075:賈日期:2014/06/23實(shí)驗(yàn)平臺〔1〕軟件平臺:開發(fā)系統(tǒng)平臺:Windows7〔64〕Microsoftvisualc++6.0測試系統(tǒng)平臺:Windows7〔64〕硬件平臺:cpu:AMDA6-3420APU存:4GB硬盤:500G2.所需實(shí)現(xiàn)的功能及相應(yīng)的闡述:〔1〕進(jìn)程調(diào)度管理為了貼切現(xiàn)實(shí)中的os,采用RR〔輪轉(zhuǎn)調(diào)度算法〕,且不提供用戶顯式的選擇調(diào)度算法,即對用戶是透明的?,F(xiàn)實(shí)中的處理器主頻為1Ghz~3Ghz,選取中間點(diǎn)為1.5Ghz,得時間片大小為0.7ns,為方便計(jì)算*10,那么時間片大小定為7ns。假設(shè)進(jìn)程之間的調(diào)度和切換不消耗cpu時間?!?〕死鎖的檢測與處理檢測當(dāng)然采用的是銀行家算法處理:讓用戶選擇kill一個進(jìn)程,釋放他所占有的所有資源?!?〕虛擬分頁調(diào)度管理虛擬分頁:給出的是邏輯值訪問磁盤將那個數(shù)據(jù)塊放入到存中存中的地址采用一定的算法相對應(yīng)于磁盤的地址。特規(guī)定訪存采用的是按字節(jié)尋址存的大小128KB外存的大小1MB即整個系統(tǒng)可以提供1MB的邏輯地址空間供進(jìn)程進(jìn)展訪問〔在地址總線足夠掃描存的情況下〕。虛擬地址映射采用:直接映射法規(guī)定的8kB為一個頁面,故存有16個頁面,外存有128個頁面。如果產(chǎn)生了存已滿,便會產(chǎn)生缺頁中斷,淘汰采用FIFO算法,利用一個隊(duì)列來做。局部外存的對應(yīng)表00,128,2*128+0.......11,129,2*128+1.......22,130,2*128+2.......16127,128+16,2*128+16.........〔4〕I/O中斷處理設(shè)中斷來自兩個方面:1.DMA輸送開場和完畢時的中斷設(shè)定一個宏定義為DMA一次傳輸?shù)臄?shù)據(jù)量的大小->DmaNum假定為10kb每次DMA開場:消耗1nscpu時間進(jìn)展中斷處理DMA完畢:消耗2nscpu時間進(jìn)展中斷處理由操作系統(tǒng)課程知,DMA傳輸數(shù)據(jù)時不需要CPU的干預(yù)。隨機(jī)的中斷發(fā)生外部隨機(jī)中斷,cpu無條件的立即響應(yīng),并執(zhí)行中斷處理程序,同樣的假設(shè)中斷處理程序的調(diào)度和切換不消耗cpu時間?!?〕存地址越界或存缺乏進(jìn)程訪問存時超過了進(jìn)程所要的最大值,此時發(fā)生中斷,已到達(dá)存保護(hù)的功能。存缺乏時即為當(dāng)前的動態(tài)地址重定位存放器中的值+進(jìn)程所需的存大小超過了存的上限,此時進(jìn)展存緊湊,同時修改被移動的進(jìn)程中的各個有關(guān)參數(shù)。3.總體設(shè)計(jì)開場開場內(nèi)存管理查看運(yùn)行情況開場運(yùn)行外存空間查看查看cpu運(yùn)行內(nèi)存空間查看死鎖檢測與解除進(jìn)程信息查看內(nèi)存管理查看運(yùn)行情況開場運(yùn)行外存空間查看查看cpu運(yùn)行內(nèi)存空間查看死鎖檢測與解除進(jìn)程信息查看4.程序所需的數(shù)據(jù)構(gòu)造及其抽象過程先定義本次操作系統(tǒng)外設(shè)的資源,假設(shè)有A類資源10個,B類資源5個,C類資源6個->NeedRescourse;作業(yè)中的各個進(jìn)程都需要一個代號->ProcessName,各個進(jìn)程到來的時間不同,故需要記錄一下->ArriveTime,每個進(jìn)程所需要的cpu時間是不夠的->NeedCpuTime,每個進(jìn)程所需的存空間大小是不一樣的->NeedMem。各個進(jìn)程中的任務(wù)是不同的故需要預(yù)先設(shè)定本進(jìn)程中所要執(zhí)行的操作類型->OpKind,如果是計(jì)算型的直接給出所需要的cpu時間即可,如果是I/O型的還需要給出所傳輸?shù)臄?shù)據(jù)量的大小->NeedTranDataNum,在此可以給OpKind做一個union型的構(gòu)造。多道程序程序在運(yùn)行的過程中需要對進(jìn)程所需存的地址進(jìn)展動態(tài)地址重定位,故在系統(tǒng)之中需要設(shè)置一個動態(tài)地址重定位存放器,其中的容是下次進(jìn)程可以使用的存始址->DynReg。抽象結(jié)果:structProcess{ charProcessName[10];//進(jìn)程的名字 intArriveTime;//ns級別 intNeedCpuTime;//此進(jìn)程所需要的時間 intNeedMem;//所需要的cpu時間 FlagForOpOpKind;//用于指示是何種操作 intNeedTranDataNum;//給IO用的數(shù)據(jù)塊 intOpCpus;//計(jì)算類型的操作所需的cpu時間 intNeedRescourse[3];//需要資源的數(shù)目NULL代表不需要使用 Process*next;};5.詳細(xì)設(shè)計(jì)1.進(jìn)程信息查看依次遍歷全部的鏈表,并將它們的信息依次打印出來。實(shí)現(xiàn)函數(shù)名:voidShowProcessInfo()2.死鎖的檢測和解除假定本系統(tǒng)中的各個所需資源均是獨(dú)占型資源,在進(jìn)程運(yùn)行的過程中不再釋放,故只需要遍歷鏈表將各個進(jìn)程中所需的資源統(tǒng)計(jì)出來,只要不大于系統(tǒng)中預(yù)設(shè)的即可,一旦進(jìn)程所需的資源大于系統(tǒng)中的最大量,給予用戶選擇kill一進(jìn)程,已到達(dá)釋放資源的目的。死鎖檢測函數(shù):voidDeedLock()voidDeedLock_LookNeedRescourse()死鎖解除函數(shù):voidDeedLock_KillProcess()存空間查看查看各個進(jìn)程所占用的存的空間,借助于DynReg這個全局變量實(shí)行存空間的動態(tài)重定位。實(shí)現(xiàn)函數(shù):voidLookMem()查看CPU運(yùn)行以CPU的角度,查看作業(yè)的運(yùn)行情況,實(shí)現(xiàn)函數(shù):voidLookCpu()voidLookCpu_ShowRunningProcess()外存空間查看外存空間是用戶的工作區(qū)間,故只要遍歷整個進(jìn)程鏈表,統(tǒng)計(jì)出所有進(jìn)程占有的全部空間即可。實(shí)現(xiàn)函數(shù):voidLookDiskMem()查看運(yùn)行查看系統(tǒng)運(yùn)行中各個資源的使用情況:實(shí)現(xiàn)函數(shù): voidShowRunningProcess()voidShowRunningProcess_CalculateCpuNeed(int*,int)存管理缺頁調(diào)度算法:FIFO〔借助于循環(huán)隊(duì)列實(shí)現(xiàn)〕實(shí)現(xiàn)函數(shù):voidMemToDiskMem()6.程序運(yùn)行和調(diào)試1.翻開程序的初始界面:按系統(tǒng)提示輸入進(jìn)程數(shù),及其相關(guān)的各個參數(shù)2.輸入完成后的主界面:用戶可以按下相關(guān)的選擇鍵實(shí)施有關(guān)的各個操作。按下1查看各個進(jìn)程的信息可以看到剛剛輸入的各個進(jìn)程的有關(guān)信息4.按下2按下3查看運(yùn)行時CPU的使用情況可見此時系統(tǒng)是平安的。系統(tǒng)出差提示按下1顯示當(dāng)前各個進(jìn)程所需的資源然后kill進(jìn)程1后在查看一下作業(yè)中的進(jìn)程,發(fā)現(xiàn)被kill的進(jìn)程沒有的,實(shí)現(xiàn)了此功能。按下4查看存的使用情況按下5查看外存空間按下6查看運(yùn)行情況按下7產(chǎn)看存使用情況沒有產(chǎn)生缺頁產(chǎn)生缺頁10.按下9退出此系統(tǒng)7.遇到的問題自己編寫映射表相當(dāng)?shù)睦щy,一度想改用Java語言,在于對C++語言的了解不夠。出錯處理沒有完全做完,做的不夠精細(xì),很多地方直接完畢對用戶輸入的數(shù)據(jù)做的類型檢查不夠充分deletejob時總是出現(xiàn)系統(tǒng)錯誤,后debug發(fā)現(xiàn),由于對象之中存在不為空的指針,導(dǎo)致出錯,故再釋放指針?biāo)伎臻g后系統(tǒng)正常運(yùn)行。源代碼#include<iostream>#include<cstring>#include<windows.h>#include<cstdlib>#include"CirQueue.h"http://循環(huán)隊(duì)列的頭文件usingnamespacestd;#defineMAXMEM128//定義本次操作系統(tǒng)的最大存容量#defineMAXDISKMEM1024//定義本次操作系統(tǒng)的最大外存容量#defineYE10//定義本次操作系統(tǒng)的分頁大小并以此實(shí)現(xiàn)虛擬存儲intUsedMAXMEM=0;intUsedMAXDISKMEM=0;//定義進(jìn)程可能用到的外部資源#defineA10#defineB5#defineC6//cpu#defineRR7//定義時間片大小為7ns#defineBEFOREDMA1//DMA之前所需的cpu時間#defineAFTERDMA2//DMA之后所需的cpu時間#defineONEDMANUM10//DMA一次最多傳送10kb的數(shù)據(jù)enumFlagForOp{ IO,Calculate,others};intDynReg=0;//定義用于描述動態(tài)地址重定位存放器的全局變量structProcess{ charProcessName[10];//進(jìn)程的名字 intArriveTime;//ns級別 intNeedCpuTime;//此進(jìn)程所需要的時間 intNeedMem;//所需要的cpu時間 FlagForOpOpKind;//用于指示是何種操作 intNeedTranDataNum;//給IO用的數(shù)據(jù)塊 intOpCpus;//計(jì)算類型的操作所需的cpu時間 //假設(shè)others不需要其他的各個操作。 intNeedRescourse[3];//需要資源的數(shù)目NULL代表不需要使用0——a.... Process*next;};classJOB{ Process*p; Process*head; Process*head1;//建立一個備用的鏈表 // Process*wait,*runing;//wait為等待鏈表running是正在運(yùn)行的進(jìn)程public: JOB(){ head1=p=head=NULL;//初始化為空 cout<<"Pleasewaiting.TheSystemisinitial."<<endl; Sleep(2000);//暫停一秒maybeSleep〔〕 cout<<"Systemisalready.Nowyoushouldenterinformationofyoujob."<<endl; intn; cout<<"enteryourjob'sprocessnum."<<endl; cin>>n; while(n){ p=newProcess(); cout<<"pleaseenterthenameofprocess."<<endl; cin>>p->ProcessName; cout<<"pleaseenterthearrivetimeofprocess."<<endl; cin>>p->ArriveTime; cout<<"pleaseentertheNeedCpuTimeofprocess."<<endl; cin>>p->NeedCpuTime; cout<<"pleaseentertheNeedMemofprocess."<<endl; cin>>p->NeedMem; while(p->NeedMem>128){ cout<<"ThisSystemcan'tnotacceptyourjob!Maybeyourjobistoolarge!Pleaseenteranum<128"<<endl; cin>>p->NeedMem; } cout<<"pleaseentertheoperationofprocess.0toTranDiskNum,1tocpu"<<endl; intnn; cin>>nn; if(nn==0){ cout<<"pleaseentertheNeedTranDataNum."<<endl; cin>>p->NeedTranDataNum; p->OpKind=IO; }else{ cout<<"pleaseentertheOpCpus."<<endl; cin>>p->OpCpus; p->OpKind=Calculate; } cout<<"PLeaseentertheA,BorCyouneed"<<endl; for(inti=0;i<3;i++){ cin>>p->NeedRescourse[i]; } p->next=NULL;//尾結(jié)點(diǎn)為空表示一個節(jié)點(diǎn)的完成下面進(jìn)展插入鏈表的工作 head=SortLinkTable(head,p); n--; }//while LinkCopy();//將本次整理好的鏈表依次賦值賦給備用鏈表 Provide_Same_Process_Name();//檢查重名現(xiàn)象 } voidProvide_Same_Process_Name(); voidVisitLinkTable(); Process*SortLinkTable(Process*,Process*); voidBeginRunning(); voidShowProcessInfo(); voidDeedLock(); voidDeedLock_KillProcess(); voidDeedLock_LookNeedRescourse(); voidLookCpu(); voidLookCpu_ShowRunningProcess(); voidLookMem(); voidShowRunningProcess(); voidShowRunningProcess_CalculateCpuNeed(int*,int); voidLookDiskMem(); voidLookMem_ChangeMem(); boolCheckMem(); voidLookDiskMem_Change(); voidLinkCopy();voidMemToDiskMem();~JOB(){ deletehead; deletehead1; deletep;}};JOB*job;//設(shè)置全局變量voidJOB::Provide_Same_Process_Name(){system("cls");charbuffer[10];Process*temp=head1;Process*temp1=head1;while(temp){ temp1=temp->next; while(temp1){ if(strcmp(temp->ProcessName,temp1->ProcessName)==0){ cout<<"Mini_OperationSystemhaddetectthesamenameprocessinyourjob!"<<endl; cout<<"ThisSystemcan'tacceptthissitution.PleaseRenameyourProcess!\nThanksforyourcorporation!"<<endl;cout<<"ThisisALLyourprocessname:"<<endl;VisitLinkTable(); cout<<"Enter1torenametheformer,0torenamethelater!"<<endl; intn=0; cin>>n; cout<<"NowEnternewName:"<<endl; if(n==0){ cin>>buffer; strcpy(temp1->ProcessName,buffer); }else{cin>>buffer; strcpy(temp->ProcessName,buffer); } }//endif temp1=temp1->next; }//endwhiletemp1 temp=temp->next;}//while}voidAgainEnterJOB(){ system("cls"); deletejob; job=newJOB();}voidJOB::VisitLinkTable(){//不加JOB前綴的時候編譯不過加上代表此函數(shù)是JOBclass之中的 while(head1){ cout<<head1->ProcessName<<endl; head1=head1->next;}cout<<"\nNow,YoucanseeTheListtocheckout."<<endl;}voidJOB::LinkCopy(){Process*temp=NULL,*temp2=head;if(head1==NULL){cout<<"LinkCopy()isHere!"<<endl;}if(head1)//不為空時將其下一個置為空head1->next=NULL;head1=NULL;while(temp2){ //applyanewnode temp=newProcess();strcpy(temp->ProcessName,temp2->ProcessName); temp->ArriveTime=temp2->ArriveTime;temp->NeedCpuTime=temp2->NeedCpuTime; temp->NeedMem=temp2->NeedMem; if(temp2->OpKind==IO){ temp->OpKind=IO;temp->NeedTranDataNum=temp2->NeedTranDataNum; }else{ temp->OpKind=Calculate;temp->OpCpus=temp2->OpCpus; } for(inti=0;i<3;i++){temp->NeedRescourse[i]=temp2->NeedRescourse[i]; } //applyendtemp->next=NULL; //cout<<"copyisright!"<<endl;if(head1==NULL){head1=temp; }else{ Process*k=head1;while(k->next){//尋找到最后一個節(jié)點(diǎn)不斷的循環(huán)退不出去 k=k->next; } k->next=temp; } //cout<<"copyisright!"<<endl;temp2=temp2->next;}//whileif(head1==NULL)cout<<"LinkCopy()isout!"<<endl;system("pause");}voidJOB::MemToDiskMem(){ system("cls");CirQueue<int>q(16);//一共定義的16個頁面q.EnQueue(e); int*Mem; intcount=0;//記錄下進(jìn)程的數(shù)目 Process*temp_head1=head1; while(temp_head1){count++; temp_head1=temp_head1->next; }temp_head1=head1;Mem=newint[count];inttemp_count=0; while(temp_head1){intBegin=0; cout<<"Process:"<<temp_head1->ProcessName<<"memeryusesituation:"<<endl;Begin+=temp_head1->NeedMem; intk=0;//所需的頁面數(shù)目 if(Begin%YE==0){k=Begin/YE; }else{k=Begin/YE+1; }Mem[temp_count++]=k; cout<<k<<"頁被占用!"<<endl; temp_head1=temp_head1->next; }//endwhilecout<<endl; temp_head1=head1; cout<<"Wanttosee缺頁調(diào)度過程Y/N."<<endl; charoption; inttotal=0,AllTotal=0; cin>>option; if(option=='y'||option=='Y'){ for(inti=0;i<count;i++){ AllTotal+=Mem[i]; for(intj=0;j<Mem[i];j++){if(q.EnQueue(true)){ temp_count=0; while(temp_count<i){temp_head1=temp_head1->next; temp_count++; }cout<<"Process:"<<temp_head1->ProcessName<<"needmemisloading.ok"<<endl; temp_head1=head1; }else{temp_count=0; while(temp_count<i){temp_head1=temp_head1->next; temp_count++; }cout<<"Process:"<<temp_head1->ProcessName<<"needmemisloadingerror缺頁調(diào)度"<<endl; temp_head1=head1; total++;boolflag=q.DeQueue(); if(q.EnQueue(true)){cout<<"Process:"<<temp_head1->ProcessName<<"needmemisloadingok缺頁調(diào)度"<<endl; } } }//for2 cout<<endl; }//for1} cout<<"一共產(chǎn)生了:"<<total<<"次缺頁中斷.\n"<<"缺頁中斷率為:"<<(float)total/AllTotal<<"%"<<endl; system("pause");}voidJOB::LookCpu_ShowRunningProcess(){ system("cls"); intNowTime=0; Process*run=head1;//臨時試用一下最終需要?dú)w還為NULL Process*wait=head1;//dsvrfgvregrefswgvregegsdgre intcount=0; while(run){//計(jì)算等待運(yùn)行的進(jìn)程的個數(shù)count++; run=run->next; } run=head1;//復(fù)原運(yùn)行鏈表 //建立一個映射表 char**Run_Process_Name=newchar*[count];//申請一個動態(tài)的二維表 for(inti=0;i<count;i++){//響應(yīng)的二維空間申請完畢Run_Process_Name[i]=newchar[10]; strcpy(Run_Process_Name[i],run->ProcessName); run=run->next; } run=NULL;int*Run_Process_CpuNeed=newint[count]; //映射表建立完畢//計(jì)算各個進(jìn)程中所需的cpu時間 ShowRunningProcess_CalculateCpuNeed(Run_Process_CpuNeed,count); Process*priorNode=NULL; //Process*tail=head; while(true){ //inttime11=wait->ArriveTime; if(wait&&NowTime>=wait->ArriveTime){ if(run==NULL){ run=wait; priorNode=run; }else{//連接到尾部Process*temp=run; while(temp->next!=priorNode){//尋找到前驅(qū)節(jié)點(diǎn) temp=temp->next; } temp->next=wait;//將結(jié)點(diǎn)連接上鏈表 priorNode=wait; //wait->next=run; } wait=wait->next;//釋放一個結(jié)點(diǎn) priorNode->next=run;//連接上頭部形成循環(huán)鏈表 } if(run){ run=run->next;//重新調(diào)度 cout<<NowTime<<"->"<<NowTime+RR<<"Process:"<<run->ProcessName<<"isRunning"<<endl; cout<<"cpu調(diào)度下一個運(yùn)行的進(jìn)程。"<<endl; NowTime+=RR; //依據(jù)上面建立的映射 按名取出所需運(yùn)行的時間 intALLNeedCpu; for(inti=0;i<count;i++){if(strcmp(Run_Process_Name[i],run->ProcessName)==0) break; } ALLNeedCpu=Run_Process_CpuNeed[i];ALLNeedCpu-=RR;//減去本次運(yùn)行的時間 if(ALLNeedCpu>0){ Run_Process_CpuNeed[i]=ALLNeedCpu;//重新寫回到數(shù)組中保持一致性 }else{//此節(jié)點(diǎn)已經(jīng)做完了請直接釋放 if(run->next==run){ run=NULL; }else{ Process*k=run; while(k->next!=run){//尋找當(dāng)前運(yùn)行節(jié)點(diǎn)的前一個結(jié)點(diǎn) k=k->next; } k->next=k->next->next; run=k; } } }//endif(run) if(wait==NULL&&run==NULL)//沒有等待CPU的進(jìn)程了和沒有正在運(yùn)行的進(jìn)程滿足退出的要求->退出 break; NowTime++; }//while system("pause"); LinkCopy();////將受損的鏈表修復(fù)}voidJOB::ShowRunningProcess(){ system("cls"); intNowTime=0; Process*run=head1;//臨時試用一下最終需要?dú)w還為NULL Process*wait=head1;//dsvrfgvregrefswgvregegsdgre intcount=0; while(run){//計(jì)算等待運(yùn)行的進(jìn)程的個數(shù)count++; run=run->next; } run=head1;//復(fù)原運(yùn)行鏈表 //建立一個映射表 char**Run_Process_Name=newchar*[count];//申請一個動態(tài)的二維表 for(inti=0;i<count;i++){//響應(yīng)的二維空間申請完畢Run_Process_Name[i]=newchar[10]; strcpy(Run_Process_Name[i],run->ProcessName); run=run->next; } run=NULL;int*Run_Process_CpuNeed=newint[count]; //映射表建立完畢 ShowRunningProcess_CalculateCpuNeed(Run_Process_CpuNeed,count); Process*priorNode=NULL; while(true){ //inttime11=wait->ArriveTime; if(wait&&NowTime>=wait->ArriveTime){ if(run==NULL){ run=wait; priorNode=run; }else{//連接到尾部Process*temp=run; while(temp->next!=priorNode){//尋找到前驅(qū)節(jié)點(diǎn) temp=temp->next; } temp->next=wait;//將結(jié)點(diǎn)連接上鏈表 priorNode=wait; //wait->next=run; } wait=wait->next;//釋放一個結(jié)點(diǎn) priorNode->next=run;//連接上頭部形成循環(huán)鏈表 } if(run){ run=run->next;//重新調(diào)度 cout<<NowTime<<"->"<<NowTime+RR<<"Process:"<<run->ProcessName<<"isRunning"<<endl; cout<<"NeedRescourse:A"<<run->NeedRescourse[0]<<"B"<<run->NeedRescourse[1]<<"c"<<run->NeedRescourse[2]<<"isusing."<<endl; cout<<"cpu調(diào)度下一個運(yùn)行的進(jìn)程。"<<endl; NowTime+=RR; //依據(jù)上面建立的映射 按名取出所需運(yùn)行的時間 intALLNeedCpu; for(inti=0;i<count;i++){if(strcmp(Run_Process_Name[i],run->ProcessName)==0) break; } ALLNeedCpu=Run_Process_CpuNeed[i];ALLNeedCpu-=RR;//減去本次運(yùn)行的時間 if(ALLNeedCpu>0){ Run_Process_CpuNeed[i]=ALLNeedCpu;//重新寫回到數(shù)組中保持一致性 }else{//此節(jié)點(diǎn)已經(jīng)做完了請直接釋放 if(run->next==run){ run=NULL; }else{ Process*k=run; while(k->next!=run){//尋找當(dāng)前運(yùn)行節(jié)點(diǎn)的前一個結(jié)點(diǎn) k=k->next; } k->next=k->next->next; run=k; } } }//endif(run) if(wait==NULL&&run==NULL)//沒有等待CPU的進(jìn)程了和沒有正在運(yùn)行的進(jìn)程滿足退出的要求->退出 break; NowTime++; }//while system("pause"); LinkCopy();////將受損的鏈表修復(fù)}voidJOB::ShowRunningProcess_CalculateCpuNeed(int*Run_Process_CpuNeed,intcount){Process*temp=head1;for(inti=0;i<count;i++){intALLNeedCpu=temp->NeedCpuTime; if(temp->OpKind==IO){ if(temp->NeedTranDataNum%ONEDMANUM==0){ ALLNeedCpu+=(temp->NeedTranDataNum/ONEDMANUM)*(BEFOREDMA+AFTERDMA); }else{ ALLNeedCpu+=(temp->NeedTranDataNum/ONEDMANUM+1)*(BEFOREDMA+AFTERDMA); } }else{ ALLNeedCpu+=temp->OpCpus; } Run_Process_CpuNeed[i]=ALLNeedCpu; temp=temp->next; }}voidJOB::ShowProcessInfo(){system("cls"); Process*temp=head1; intcount=0; while(temp){ cout<<"------The"<<count+1<<"processinfo"<<endl; cout<<"Name:"<<temp->ProcessName<<'.'<<endl; cout<<"ArriveTime:"<<temp->ArriveTime<<'.'<<endl; cout<<"NeedCpuTime:"<<temp->NeedCpuTime<<'.'<<endl; cout<<"NeedMem:"<<temp->NeedMem<<'.'<<endl; cout<<"OpKind:"<<temp->OpKind<<'.'<<endl; cout<<"NeedRescourse:"<<"A:"<<temp->NeedRescourse[0]<<",B:"<<p->NeedRescourse[1] <<",C:"<<p->NeedRescourse[2]<<endl; temp=temp->next; cout<<'\n'; count++; } cout<<"enteranykeyreturnmain()."<<endl; getchar(); getchar();}voidJOB::DeedLock(){ system("cls");Process*temp=head1; intLocalA=0,LocalB=0,LocalC=0; while(temp){LocalA+=temp->NeedRescourse[0]; LocalB+=temp->NeedRescourse[1];LocalB+=temp->NeedRescourse[2]; temp=temp->next; } if(LocalA>A||LocalB>B||LocalC>C){cout<<"NeedRescourseisover!"<<endl;cout<<"Enter1toSeeNeedRescourse,elsetomain()!"<<endl; intn; cin>>n; if(n==1){DeedLock_LookNeedRescourse(); } }else{cout<<"YourJObisok!SystemNowissafe!"<<endl; } system("pause");}voidJOB::DeedLock_LookNeedRescourse(){Process*temp=head1; cout<<"\nNeedRescourse:ABC\n";while(temp){cout<<temp->ProcessName<<""<<temp->NeedRescourse[0]<<""<<temp->NeedRescourse[1]<<""<<temp->NeedRescourse[2]<<endl; temp=temp->next; } system("pause"); cout<<"AreyouwanttoKilloneProcesstoReleaseNeedRescourse.Y/N"<<endl; charoption;cin>>option; if(option=='Y'||option=='y'){DeedLock_KillProcess(); }}voidJOB::DeedLock_KillProcess(){Process*temp=head;cout<<"Enter1,2,....toKill1th,2th,....Process."<<endl;intn;cin>>n;intcount=1;while(count<n){count++; temp=temp->next;}if(count==1){head=head->next;}else{Process*temp2=head;n=1; while((n+1)<count){ n++; temp2=temp2->next; } temp2->next=temp->next;//刪除temp結(jié)點(diǎn)}LinkCopy();}voidJOB::LookCpu(){ system("cls");LookCpu_ShowRunningProcess();}voidJOB::LookMem(){intMem[128];intDiskMem[1024]; memset(Mem,0,128); memset(DiskMem,0,1024); DynReg=0; Process*temp=head1; while(temp&&DynReg<=128){ cout<<"MemeryFrom"<<DynReg<<"to"<<DynReg+temp->NeedMem-1<<"giveto"<<temp->ProcessName<<endl; DynReg+=temp->NeedMem; temp=temp->next; } cout<<"EnterAnyKeytoReturnMain()."<<endl; getchar(); getchar();}boolJOB::CheckMem(){//檢查虛擬存儲器是否可以接納 intsum=0; Process*temp=head; while(temp){ sum+=temp->NeedMem; } if(sum>=1024) returnfalse; else returntrue;}voidJOB::LookDiskMem(){ intsum=0; Process*temp=head; while(temp){ sum+=temp->NeedMem; temp=temp->next; } if(sum>1024){ cout<<"ThissystemDiskMemeryisout!\npleaseenter1tochangeyouprocessNeedMem\nelsesystemmayhavesomethingwrong"<<endl; intn; cout<<"Enter1toChangeMemerysizeelseSystemwillexit."<<endl; cin>>n; if(n==1){ LookDiskMem_Change(); }else{exit(0); } }else{ cout<<"\nJOBtotaluse:"<<sum<<"Memery!"<<endl; } cout<<"enteranykeyreturnmain()."<<endl; getchar(); getchar(); }voidJOB::LookDiskMem_Change(){ Process*temp=head; while(temp){ cout<<"Process:"<<temp->ProcessName<<"need"<<temp->NeedMem<<endl; temp=temp->next; } temp=head; while(temp){ charn; cout<<"Change"<<temp->ProcessName<<"NeedMem"Y/N(y/n)"<<endl; cin>>n; if(n=='Y'||n=='y'){ cout<<"EnteryouNewNeedMem:"<<endl; cin>>temp->NeedMem; }elseif(n=='N'||n=='n'){ }els
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年飾品商鋪?zhàn)赓U與品牌合作與市場拓展合同3篇
- 2025版互聯(lián)網(wǎng)數(shù)據(jù)中心相關(guān)方環(huán)境管理協(xié)議3篇
- 二零二五版鋼筋焊接工藝用工合同模板范文2篇
- 二零二五版模具維修改型與產(chǎn)業(yè)融合合同4篇
- 2025年道路工程質(zhì)量檢測與驗(yàn)收合同3篇
- 2025年度個人股份代持及轉(zhuǎn)讓法律文件3篇
- 2025年度采礦權(quán)出讓合同范本:礦產(chǎn)資源勘查開發(fā)技術(shù)規(guī)范3篇
- 2025年度冰箱智能互聯(lián)技術(shù)合作協(xié)議3篇
- 二零二五年度新能源用地抵押借款合同3篇
- 二零二五版定制家具銷售與售后服務(wù)協(xié)議7篇
- 2024年社區(qū)警務(wù)規(guī)范考試題庫
- 2024年食用牛脂項(xiàng)目可行性研究報(bào)告
- 消防安全隱患等級
- 溫室氣體(二氧化碳和甲烷)走航監(jiān)測技術(shù)規(guī)范
- 部編版一年級語文下冊第一單元大單元教學(xué)設(shè)計(jì)
- 《保單檢視專題》課件
- 北京地鐵13號線
- 2023山東春季高考數(shù)學(xué)真題(含答案)
- 職業(yè)衛(wèi)生法律法規(guī)和標(biāo)準(zhǔn)培訓(xùn)課件
- 高二下學(xué)期英語閱讀提升練習(xí)(二)
- 民事訴訟證據(jù)清單模板
評論
0/150
提交評論