版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
課程設(shè)計實驗報告書科目:操作系統(tǒng)課程設(shè)計
實驗一:銀行家算法目的和要求銀行家算法是一種避免死鎖的重要方法,本實驗要求用高級語言編寫和調(diào)試一個簡單的銀行家算法。加深了解有關(guān)資源申請、避免死鎖等概念,并體會了解死鎖和避免死鎖的具體實施方式。實驗內(nèi)容1).設(shè)計進程對各類資源最大申請表示及初值確定。2).設(shè)定系統(tǒng)提供資源初始狀況。3).設(shè)定每次某個進程對各類資源的申請表示。4).編制程序,依據(jù)銀行家算法,決定其申請是否得到滿足。實驗代碼 voidmain(){intmaxneed[5][3]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};intallocation[5][3]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};intreq[3];inti,j,k,l,c=0,count=0;intneed[5][3]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}};intresult[5]={-1,-1,-1,-1,-1};intwork[3]={3,3,2};printf("AllSources:\nABC\n1057\n");printf("AvailableSources:\nABC\n332\n");printf("Everyprocessmaxneedsources:\nABC\n");for(i=0;i<5;i++){printf("P%d:",i+1);for(j=0;j<3;j++) {printf("%d",maxneed[i][j]);need[i][j]=maxneed[i][j]-allocation[i][j]; }printf("\n");}for(l=0;l<5;l++)for(k=0;k<5;k++) {if(result[k]==-1&&need[k][0]<=work[0]&&need[k][1]<=work[1]&&need[k][2]<=work[2]) {work[0]=work[0]+allocation[k][0];work[1]=work[1]+allocation[k][1];work[2]=work[2]+allocation[k][2];result[k]=l;count++;printf("P%d->",k+1); } }if(count==5)printf("\nItissafe!\n");elseprintf("\nItisdangerous.\n"); work[0]=3; work[1]=3; work[2]=2;printf("PleaseinputP1requestsources:\n");scanf("%d,%d,%d",&req[0],&req[1],&req[2]); if(req[0]<=need[0][0]&&req[1]<=need[0][1]&&req[2]<=need[0][2]) printf("Therequestisreasonable.\n"); else printf("Therequestisbeyondneed.\n"); if(req[0]<=work[0]&&req[1]<=work[1]&&req[2]<=work[2]) { work[0]=work[0]-req[0]; work[1]=work[1]-req[1]; work[2]=work[2]-req[2]; need[0][0]=need[0][0]-req[0]; need[0][1]=need[0][1]-req[1]; need[0][2]=need[0][2]-req[2];allocation[0][0]=allocation[0][0]+req[0]; allocation[0][1]=allocation[0][1]+req[1]; allocation[0][2]=allocation[0][2]+req[2]; } //printf("%d%d%d",work[0],work[1],work[2]); for(k=0;k<5;k++) {result[k]=-1; } for(l=0;l<5;l++)for(k=0;k<5;k++) {if(result[k]==-1&&need[k][0]<=work[0]&&need[k][1]<=work[1]&&need[k][2]<=work[2]) {work[0]=work[0]+allocation[k][0];work[1]=work[1]+allocation[k][1];work[2]=work[2]+allocation[k][2];result[k]=l;c++;printf("P%d->",k+1); } }if(c==5)printf("\nItissafe!\n");elseprintf("\nItisdangerous.\n");}實驗結(jié)果結(jié)果分析Maxneed-request的值是執(zhí)行這個進程所還需要的資源,用need來表示W(wǎng)ork數(shù)組表示分配的序列,如果need<=work表示這個進程可以被運行,就把進程所對應(yīng)的result的值改成1,如果result中所有值都為1,就生出一個正確的序列。實驗二:時間片輪轉(zhuǎn)算法目的和要求加深對時間片大小不一樣,影響處理機的開銷的理解。實驗類容時間分配的多,執(zhí)行的任務(wù)數(shù)量就大。所需要輪轉(zhuǎn)的次數(shù)就少。用循環(huán)次數(shù)來模擬時間片,每個進程用一定大小的數(shù)字來表示,每當(dāng)循環(huán)的時間片值變成0時,就切換進程,對應(yīng)的數(shù)字就減去時間片大小的數(shù)字。沒執(zhí)行一次進程,就輸出這個進程。假定進程是固定的幾個,只需在創(chuàng)建一個進程隊列,進程按fcfs方式出對,和進對,直到進程中最大的數(shù)字的值變?yōu)?。我們用一個值Time來記錄所有進程參加循環(huán)的次數(shù),這個值如果越大,則表示處理機調(diào)度次數(shù)越多。選取不同的時間片,對于相同的幾個進程,最后得出不同的程序執(zhí)行時間Time,直觀的知道不同的時間片,可能性能不一樣。實驗代碼T/*****時間片輪轉(zhuǎn)法進行CPU調(diào)度算法********/#include<stdio.h>#include<malloc.h>#include<string.h>#defineN10//定義最大進程數(shù)#defineTIME2//定義時間片大小typedefstructpcb{charid[10];//進程標識數(shù)intarrivetime;//到達時間intruntime;//進程已經(jīng)占用的cpu時間intneedtime;//進程還需要的時間charstate[12];//進程運行狀態(tài):waitorruningstructpcb*next;}pcb,*PCB;PCBhead;//設(shè)置全局變量用來修改就緒隊列PCBtail;intcount=0;//記錄就緒隊列中進程數(shù)voidCreatProcess(){//創(chuàng)建進程PCBp,q;//進程的頭尾指針都有intnum;//記錄要創(chuàng)建的進程數(shù)inti,j;intarrive[N];head=tail=(PCB)malloc(sizeof(pcb));head->next=NULL;p=head;printf("輸入你要創(chuàng)建的進程數(shù):");scanf("%d",&num);count=num;printf("********按照進程到達時間從小到大創(chuàng)建就緒隊列******\n");//初始對其排序來創(chuàng)建就緒隊列for(i=1;i<=num;i++){p->next=(PCB)malloc(sizeof(pcb));p=p->next;tail=p;printf("輸入進程%d的標示符:",i);scanf("%s",p->id);printf("輸入進程%d的到達時間:",i);scanf("%d",&p->arrivetime);printf("輸入進程%d已占用的cpu時間:",i);scanf("%d",&p->runtime);printf("輸入進程%d還需要的cpu時間:",i);scanf("%d",&p->needtime);printf("輸入進程%d當(dāng)前狀態(tài):(run或者wait):",i);scanf("%s",p->state);}tail->next=p->next=NULL;}voidRR_RunProcess(){//運行進程,簡單輪轉(zhuǎn)法RoundRobinPCBp,q,temp;p=head->next;while(1){if(head->next==NULL){printf("此時就緒隊列中已無進程!\n");return;}else{while(p){if((p->needtime>0)&&!(strcmp(p->state,"wait"))){printf("進程%s開始,\n",p->id);strcpy(p->state,"run");p->runtime+=TIME;p->needtime-=TIME;if(p->needtime<0)p->needtime=0;}temp=p;//把該時間片內(nèi)運行完的進程存到臨時temp中//把temp接到鏈表尾部,銷毀P;if(temp->needtime>0){//把該時間片內(nèi)運行完的進程接到就緒隊列的尾部if(count>1){head->next=temp->next;tail->next=temp;tail=tail->next;strcpy(tail->state,"wait");tail->next=NULL;}elseif(count==1){//當(dāng)只有一個進程等待時,分開討論head->next=temp;tail=temp;strcpy(tail->state,"wait");tail->next=NULL;}}if(temp->needtime==0){//銷毀就緒隊列中已經(jīng)結(jié)束的進程count--;//此時就緒隊列中進程數(shù)減1printf("進程%s結(jié)束.\n",p->id);head->next=temp->next;free(temp);//撤銷就緒隊列中已經(jīng)結(jié)束的進程}p=head->next;}}}}voidmain(){printf("**************進程的初始狀態(tài)!**************\n");CreatProcess();printf("*******************************************\n\t\t程序運行結(jié)果如下:\n\n");printf("*******************************************\n");RR_RunProcess();//簡單輪轉(zhuǎn)法RoundRobin}4實驗結(jié)果5.結(jié)果分析這里的時間片是2。進程a需要5個處理機時間,需要3個時間片。進程b需要6個處理機時間,需要時間片3個。a、b進程交替執(zhí)行,當(dāng)a結(jié)束后,只剩下b進程了,當(dāng)b進程執(zhí)行完了時,所有進程都執(zhí)行完畢。實驗三:靜態(tài)優(yōu)先級調(diào)度算法實驗?zāi)康暮鸵筮M程是操作系統(tǒng)最重要的概念之一,進程調(diào)度又是操作系統(tǒng)核心的重要類容。通過該實驗,加深對靜態(tài)搶占式優(yōu)先級調(diào)度算法的理解。實驗類容創(chuàng)建進程,設(shè)置優(yōu)先級。設(shè)置進程的狀態(tài)(就緒,執(zhí)行,阻塞)之一。設(shè)置信號量。編寫程序。實驗代碼//通過按序分配資源預(yù)防死鎖的初始化程序{pt=psorted->next;psorted=pt;}elseap->next=pt->next;}ap=pt;pt=pt->next;}if(psorted->next==NULL)break;getchar();}}structPCB*SortList(PCB*HL){structPCB*SL;SL=(structPCB*)malloc(sizeof(structPCB));SL=NULL;structPCB*r=HL;while(r!=NULL){structPCB*t=r->next;structPCB*cp=SL;structPCB*ap=NULL;while(cp!=NULL){if(r->p_priority>cp->p_priority)break;else{ap=cp;cp=cp->next;}}if(ap==NULL){r->next=SL;SL=r;}else{r->next=cp;ap->next=r;}r=t;}returnSL;}//HANDLEh_mutex_chopsticks[MAX_PHILOSOPHERS];//互斥體數(shù)組,每根筷子需要一個互斥體intthread_number[MAX_PHILOSOPHERS]={1,2,3};//定義死鎖的個數(shù)//會產(chǎn)生死鎖的哲學(xué)家線程intdeadlock_philosopher(LPVOIDdata){intphilosopher_number=*(int*)(data);//哲學(xué)家編號for(;;){srand((unsigned)time(NULL)*(philosopher_number+1));Sleep(DELAY);printf("%s%c%s%c\n","Philosopher",ZERO+philosopher_number,"iswaitingchopstick",(ZERO+philosopher_number));WaitForSingleObject(h_mutex_chopsticks[philosopher_number],INFINITE);printf("%s%c%s%c\n","Philosopher",ZERO+philosopher_number,"gotchopstick",(ZERO+philosopher_number));Sleep(DELAY/4);printf("%s%c%s%c\n","Philosopher",ZERO+philosopher_number,"iswaitingchopstick",(ZERO+(1+philosopher_number)%MAX_PHILOSOPHERS));WaitForSingleObject(h_mutex_chopsticks[((1+philosopher_number)%MAX_PHILOSOPHERS)],INFINITE);printf("%s%c%s%c\n","Philosopher",ZERO+philosopher_number,"gotchopstick",(ZERO+(1+philosopher_number)%MAX_PHILOSOPHERS));printf("%s%c%s\n","Philosopher",ZERO+philosopher_number,"iseating.");Sleep(DELAY);ReleaseMutex(h_mutex_chopsticks[philosopher_number]);printf("%s%c%s%c\n","Philosopher",ZERO+philosopher_number,"releasedchopstick",ZERO+philosopher_number);ReleaseMutex(h_mutex_chopsticks[(1+philosopher_number)%MAX_PHILOSOPHERS]);printf("%s%c%s%c\n","Philosopher",ZERO+philosopher_number,"releasedchopstick",(ZERO+(1+philosopher_number)%MAX_PHILOSOPHERS));Sleep(DELAY);}//endforreturn0;}//死鎖時的初始化程序voiddeadlock(){charchoice;inti=0;HANDLEh_thread[MAX_PHILOSOPHERS];printf("可能出現(xiàn)死鎖的哲學(xué)家就餐問題\n");for(i=0;i<MAX_PHILOSOPHERS;i++){h_mutex_chopsticks[i]=CreateMutex(NULL,FALSE,NULL);};for(i=0;i<MAX_PHILOSOPHERS;i++){h_thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(deadlock_philosopher),&thread_number[i],0,NULL);};WaitForMultipleObjects(MAX_PHILOSOPHERS,h_thread,TRUE,-1);do{choice=(char)getch();}while(choice!='2');system("cls");deadlock();printf("\nPressanykeytoreturntomainmenu.");getch();system("cls");}//通過按序分配資源預(yù)防死鎖的哲學(xué)家線程intordered_allocation_philosopher(LPVOIDdata){intphilosopher_number=*(int*)(data);for(;;){srand((unsigned)time(NULL)*(philosopher_number+1));Sleep(DELAY);if(philosopher_number==MAX_PHILOSOPHERS-1){printf("%s%c%s%c\n","Philosopher",ZERO+philosopher_number,"iswaitingchopstick",(ZERO+(1+philosopher_number)%MAX_PHILOSOPHERS));WaitForSingleObject(h_mutex_chopsticks[(1+philosopher_number)%MAX_PHILOSOPHERS],INFINITE);Sleep(DELAY/4);printf("%s%c%s%c\n","Philosopher",ZERO+philosopher_number,"iswaitingchopstick",ZERO+philosopher_number);WaitForSingleObject(h_mutex_chopsticks[philosopher_number],INFINITE);}else{printf("%s%c%s%c\n","Philosopher",ZERO+philosopher_number,"iswaitingchopstick",ZERO+philosopher_number);WaitForSingleObject(h_mutex_chopsticks[philosopher_number],INFINITE);Sleep(DELAY/4);printf("%s%c%s%c\n","Philosopher",ZERO+philosopher_number,"iswaitingchopstick",ZERO+(1+philosopher_number)%MAX_PHILOSOPHERS);WaitForSingleObject(h_mutex_chopsticks[(1+philosopher_number)%MAX_PHILOSOPHERS],INFINITE);}printf("%s%c%s\n","Philosopher
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度生態(tài)農(nóng)業(yè)科技園承包經(jīng)營合同范本3篇
- 2025年度綠色能源儲藏室建設(shè)與維護合同3篇
- 二零二五版城市綜合體建設(shè)項目建筑垃圾清運及環(huán)保處理合同3篇
- 2025年度體育場館租賃與賽事組織合同3篇
- 二零二五年高性能保溫施工合同補充條款及驗收標準3篇
- 2025年水電暖安裝與節(jié)能改造項目總承包合同3篇
- 2025年度醫(yī)院窗簾定制及消毒防菌合同3篇
- 2025年度智能化倉庫場地租賃服務(wù)合同范本3篇
- 2025年度拍賣物品售后服務(wù)反饋合同范本
- 2025年度智能租賃平臺廠房租賃居間協(xié)議3篇
- 2024-2030年中國電子郵箱行業(yè)市場運營模式及投資前景預(yù)測報告
- 基礎(chǔ)設(shè)施零星維修 投標方案(技術(shù)方案)
- 人力資源 -人效評估指導(dǎo)手冊
- 大疆80分鐘在線測評題
- 2024屆廣東省廣州市高三上學(xué)期調(diào)研測試英語試題及答案
- 中煤平朔集團有限公司招聘筆試題庫2024
- 2023年成都市青白江區(qū)村(社區(qū))“兩委”后備人才考試真題
- 不付租金解除合同通知書
- 區(qū)域合作伙伴合作協(xié)議書范本
- 中學(xué)數(shù)學(xué)教學(xué)設(shè)計全套教學(xué)課件
- 環(huán)衛(wèi)公司年終工作總結(jié)
評論
0/150
提交評論