《操作系統(tǒng)》實訓報告課件_第1頁
《操作系統(tǒng)》實訓報告課件_第2頁
《操作系統(tǒng)》實訓報告課件_第3頁
《操作系統(tǒng)》實訓報告課件_第4頁
《操作系統(tǒng)》實訓報告課件_第5頁
已閱讀5頁,還剩16頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

PAGE19實訓一、模擬進程操作原語實訓目的:通過設計并調(diào)試創(chuàng)建、終止、阻塞、喚醒原語功能,有助于對操作系統(tǒng)中進程控制功能的理解,掌握操作系統(tǒng)模塊的設計方法和工作原理。實訓內(nèi)容:設計創(chuàng)建、終止、阻塞、喚醒原語功能函數(shù)。設計主函數(shù),采用菜單結構(參見后面給出的流程圖)。設計“顯示隊列”函數(shù),目的能將就緒、阻塞隊列中的進程信息顯示在屏幕上,以供隨時查看各隊列中進程的變化情況。實訓步驟:1、系統(tǒng)總體結構:開始開始系統(tǒng)主菜單1…創(chuàng)建2…阻塞3…喚醒4…終止5…顯示0…退出請輸入您需要的功能(0-5):輸入選擇輸入選擇=?543210543210退出創(chuàng)建阻塞喚醒終止顯示退出創(chuàng)建阻塞喚醒終止顯示結束結束其中:進程名用P1,P2標識。優(yōu)先級及運行時間:為實訓題目二做準備。其中:進程名用P1,P2標識。優(yōu)先級及運行時間:為實訓題目二做準備。狀態(tài)為:就緒、運行、阻塞,三種基本狀態(tài)。指針:指向下一個PCB。進程名優(yōu)先級運行時間狀態(tài)指針實訓代碼:#include<stdio.h>#include<string.h>structPCB{ charname[4]; intpriority; intruntime;};voidmain(){ intx,t; inta=0; intk=0,r=1,i=0,j=0;//k為就緒隊列總數(shù),r堵塞隊列總數(shù) charname[4]; structPCBpcb[10]; structPCBpcb1[10];structPCBpcb2[10]; printf("菜單\n\n\n");printf("0退出系統(tǒng)\n");printf("1創(chuàng)建進程\n");printf("2堵塞進程\n"); printf("3喚醒進程\n"); printf("4終止進程\n"); printf("5顯示進程\n");printf("\n"); strcpy(pcb1[0].name,"s");//堵塞隊列 pcb1[0].priority=2; pcb1[0].runtime=3; while(1) { printf("請輸入你的選擇:"); scanf("%d",&x); if(x==0) break; if(x==1) { printf("創(chuàng)建進程\n"); printf("進程名:"); scanf("%s",&pcb[k].name); printf("優(yōu)先級:"); scanf("%d",&pcb[k].priority); printf("運行時間:"); scanf("%d",&pcb[k].runtime); k=k+1; } if(x==2) { printf("堵塞進程\n"); printf("請輸入要查找的進程:"); scanf("%s",name); for(j=0;j<=k;j++) { if(strcmp(pcb[j].name,name)==0) { t=j; strcpy(pcb2[a].name,pcb[t].name); pcb2[a].priority=pcb[t].priority; pcb2[a].runtime=pcb[t].runtime;strcpy(pcb1[r].name,pcb2[a].name); pcb1[r].priority=pcb2[a].priority; pcb1[r].runtime=pcb2[a].runtime; r=r+1; a=a+1; for(i=t;i<=k;i++) { strcpy(pcb[i].name,pcb[i+1].name); pcb[i].priority=pcb[i+1].priority; pcb[i].runtime=pcb[i+1].runtime; } k=k-1; printf("將就緒序列調(diào)度為運行:"); for(i=0;i<a;i++) printf("%s%d%d\n",pcb2[i].name,pcb2[i].priority,pcb2[i].runtime); printf("堵塞進程:\n"); for(j=0;j<r;j++) printf("%s%d%d\n",pcb1[j].name,pcb1[j].priority,pcb1[j].runtime); break; } else printf("該進程已是堵塞進程!\n"); break; } } if(x==3) { printf("喚醒進程\n"); printf("請輸入要喚醒的進程:"); scanf("%s",name); for(i=0;i<r;i++) { if(strcmp(pcb1[i].name,name)==0) { t=i; strcpy(pcb[k].name,pcb1[t].name); pcb[k].priority=pcb1[t].priority; pcb[k].runtime=pcb1[t].runtime; k=k+1; for(j=t;j<r;j++) { strcpy(pcb1[j].name,pcb1[j+1].name); pcb1[j].priority=pcb1[j+1].priority; pcb1[j].runtime=pcb1[j+1].runtime; } r=r-1; printf("就緒進程:\n"); for(j=0;j<k;j++) printf("%s%d%d\n",pcb[j].name,pcb[j].priority,pcb[j].runtime); printf("堵塞進程:\n"); for(j=0;j<r;j++) printf("%s%d%d\n",pcb1[j].name,pcb1[j].priority,pcb1[j].runtime); break; } else printf("該堵塞進程為空,不能喚醒進程!\n"); break; } } if(x==4) { printf("終止進程\n");printf("請輸入你要終止的進程:"); scanf("%s",name); for(i=0;i<k;i++) { if(strcmp(pcb[i].name,name)==0) { t=i; for(j=t;j<k;j++) { strcpy(pcb[j].name,pcb[j+1].name); pcb[j].priority=pcb[j+1].priority; pcb[j].runtime=pcb[j+1].runtime; } k=k-1; } if(strcmp(pcb1[i].name,name)==0) { t=i; for(j=t;j<r;j++) { strcpy(pcb1[j].name,pcb1[j+1].name); pcb1[j].priority=pcb1[j+1].priority; pcb1[j].runtime=pcb1[j+1].runtime; } r=r-1; } } printf("就緒進程:\n"); for(j=0;j<k;j++) printf("%s%d%d\n",pcb[j].name,pcb[j].priority,pcb[j].runtime); printf("堵塞進程:\n"); for(j=0;j<r;j++) printf("%s%d%d\n",pcb1[j].name,pcb1[j].priority,pcb1[j].runtime); } if(x==5) { printf("顯示進程\n"); printf("就緒進程:\n"); for(j=0;j<k;j++) printf("%s%d%d\n",pcb[j].name,pcb[j].priority,pcb[j].runtime); printf("堵塞進程:\n"); for(j=0;j<r;j++) printf("%s%d%d\n",pcb1[j].name,pcb1[j].priority,pcb1[j].runtime); } }}程序運行結果實訓小結:通過設計并調(diào)試創(chuàng)建、終止、阻塞、喚醒原語功能,加深了對操作系統(tǒng)中進程控制功能的理解,并且掌握操作系統(tǒng)模塊的設計方法和工作原理。更重要的是理解了操作系統(tǒng)的調(diào)度方法是就緒-運行-堵塞-喚醒-結束的過程。

實訓二:模擬動態(tài)分區(qū)首次適應分配和回收算法實訓目的:通過本實訓,可加深理解動態(tài)分區(qū)分配、回收程序的功能和具體實現(xiàn),特別是對回收分區(qū)的合并的理解。實訓內(nèi)容:1、設計動態(tài)分區(qū)首次適應分配、回收算法。2、設計“未分配區(qū)說明表”,格式為:序號始址長度狀態(tài)160k200103、設計“已分配區(qū)說明表”,格式為:作業(yè)名始址長度狀態(tài)004、設計顯示程序,將“未分配區(qū)說明表”和“已分配區(qū)說明表”的內(nèi)容顯示在屏幕上。初始分配從一個空閑區(qū)分配起,回收時要合并空區(qū)。實訓步驟:1、系統(tǒng)要求分配一個分區(qū)時,應輸入:作業(yè)名、作業(yè)長度。2、回收一個分區(qū)時,應輸入:回收的作業(yè)名?;厥盏姆謪^(qū)請注意是否需要進行合并。實訓代碼:#include<STDIO.H>#include<STDLIB.H>intMAX_SEGMENT=10;//最大碎片值structPartition //分區(qū)表目{ intPar_Size; //分區(qū)大小 intPar_No; //分區(qū)序號或者名字 intAddr; //分區(qū)地址 intIsUse; //分區(qū)使用情況,0表示空閑,1表示使用 Partition*pri; //前向指針 Partition*next; //后向指針};Partition*Int()//函數(shù),返回Partition類型指針{ //初始化空閑分區(qū)表 Partition*list,*H,*H1; list=(structPartition*)malloc(sizeof(structPartition));//malloc申請動態(tài)分配空間 list->next=NULL; H=list; if(!list) { printf("\n錯誤,內(nèi)存初始化分配失??!程序結束"); exit(1); } H1=(structPartition*)malloc(sizeof(structPartition)); printf("請預先輸入分區(qū)總大小(以KB為單位):"); scanf("%d",&H1->Par_Size); H1->Addr=0; H1->Par_No=0; H1->IsUse=0; H1->pri=H; H1->next=NULL; H->next=H1;////list>H1 returnlist;}Partition*InitFP(){ //初始化已分配分區(qū)表 Partition*FP,*F,*H; inti; FP=(structPartition*)malloc(sizeof(structPartition)); FP->next=NULL; H=FP; for(i=0;i<10;i++) //已分配區(qū)先暫定分配十個表目 { F=(structPartition*)malloc(sizeof(structPartition)); if(!F) { printf("\n錯誤,內(nèi)存分配失敗!程序結束"); exit(1); } F->Par_Size=0; F->Addr=0; F->Par_No=0; F->IsUse=0; F->next=NULL; H->next=F; F->pri=H; H=H->next; } returnFP;}Partition*New_Process(Partition*list,Partition*FP){ //為新的進程分配資源 Partition*H,*P,*H1; intSize,Name,L; H=list; H1=FP->next; H=H->next; printf("請輸入新作業(yè)的名稱和大小(整數(shù))\n"); printf("作業(yè)名稱:"); scanf("%d",&Name); printf("作業(yè)大小(整數(shù)):"); scanf("%d",&Size); while(H) { if(!H) //表目已查完,無法分配 { printf("\n已無空閑分區(qū),本次無法分配!"); returnlist; } else{ if(H->IsUse==0) //空表目 //if(H->Par_Size>=Size) //大小滿足,空閑分區(qū)大小》要分配的大小 if(H->Par_Size>=Size) //大小滿足, { booltemp=false;//空閑分區(qū)大小-要分配的大小<碎片值//會產(chǎn)生碎片,將整塊內(nèi)存大小分配出去, if((H->Par_Size-Size)<=MAX_SEGMENT){ Size=H->Par_Size;//分配的大小為整塊內(nèi)存 temp=true;//會產(chǎn)生碎片 } //其他情況就分配大小為請求大小,不會產(chǎn)生碎片, L=H->Addr;//保存空閑分地址 if(temp) printf("該次分配會產(chǎn)生碎片,大小為%d的內(nèi)存分配出去!",Size);else printf("該次內(nèi)存分配不會產(chǎn)生碎片"); break; } } H=H->next; //否則,繼續(xù)往下查找 } if(H) { if(H->Par_Size>Size) //大小滿足,空閑分區(qū)大小》要分配的大小 {//分配新的表目,處理一條數(shù)據(jù),分配一次內(nèi)存 P=(structPartition*)malloc(sizeof(structPartition)); P->IsUse=1; P->Addr=L;//指向空閑分區(qū)地址 P->next=H; //修改指針 H->pri->next=P; P->pri=H->pri; H->pri=P; P->Par_Size=Size;//分配大小為要請求分配的大小 P->Par_No=Name;//名稱 H->Par_Size-=Size; //修改空閑分區(qū),H所指區(qū)塊大小減Size H->Addr+=Size;//H所指區(qū)塊地址加Size }else { H->IsUse=1; //大小相等的,把當前表項設置空表目 } while(H1) { if(H1->IsUse==0) { H1->Par_No=Name; H1->Par_Size=Size; H1->Addr=L;//保存已分配地址 H1->IsUse=1;//在已分配表中設置為已分配 break; } H1=H1->next; } }else printf("所申請資源已大過系統(tǒng)所擁有的,請重新輸入!\n"); returnlist;}Partition*Reclaim(Partition*list,Partition*FP){ //結束作業(yè),資源回收,No為作業(yè)名,回收內(nèi)存Partition*H1,*H2,*H3,*HF;//H1為釋放區(qū),H2為后分區(qū),H3為前分區(qū) intNo; //作業(yè)名 H1=list; HF=FP;//可有可無? H1=H1->next; HF=FP->next; printf("請輸入您想結束的作業(yè)名:"); scanf("%D",&No); while(HF)//對已分配表進行操作 { if(HF->Par_No==No) { HF->IsUse=0; //標志為空表目 break;//這時保存著HF所指分區(qū)的信息 } HF=HF->next; } if(!HF) //如果找不到該作業(yè),則提示出錯 printf("所輸入的作業(yè)名稱不正確,請重新輸入!"); else{ while(H1)//對空閑表進行操作 { if(H1->Par_No==No) { H1->IsUse=0; //標志為空表目 printf("內(nèi)存回收成功"); break; } H1=H1->next; } H2=H1->next;//后分區(qū) H3=H1->pri;//前分區(qū) if(H2&&H2->IsUse==0) //后接分區(qū)為空閑 { if(H2->next==NULL) //判斷后接分區(qū)是否為尾結點 { H1->Par_Size+=H2->Par_Size; //把H2合并到H1 H1->next=NULL; free(H2); printf("已回收%d大小內(nèi)存",H1->Par_Size); }else //后分區(qū)不為空閑,表示已經(jīng)被使用 { H1->Par_Size+=H2->Par_Size; H1->next=H2->next; H2->next->pri=H1; free(H2); printf("已回收%d大小內(nèi)存",H1->Par_Size); } } if(H3&&H3->IsUse==0) //前分區(qū)為空閑分區(qū),則合并去前分區(qū) { H3->Par_Size+=H1->Par_Size; H3->next=H1->next; if(H1->next!=NULL) //若H1為尾結點 H1->next->pri=H3; free(H1); printf("已回收%d大小內(nèi)存",H1->Par_Size); } } returnlist;}voidPrint(Partition*list,Partition*FP){ //輸出已分配分區(qū)和空閑分區(qū) Partition*H1,*H2; H1=list->next; H2=FP; H2=H2->next; printf("**************************************************\n"); printf("****************總分配分區(qū)表*******************\n"); printf("分區(qū)序號 大小 開始地址狀態(tài)\n"); while(H1) { printf("%d %d %d",H1->Par_No,H1->Par_Size,H1->Addr); if(H1->IsUse==1) printf(" 已分配\n"); else printf(" 空表目\n"); H1=H1->next; } printf("**************************************************\n");}voidMain_Print(Partition*list,Partition*FP){ //程序主入口函數(shù),進行菜單選擇 intop; while(1) { printf("\n主菜單\n"); printf("\n"); printf("1.申請新的作業(yè),分配內(nèi)存\n"); printf("2.結束作業(yè),回收內(nèi)存\n"); printf("3.查看內(nèi)存表\n"); printf("4.退出系統(tǒng)\n"); printf("\n請選擇<1-4>:"); scanf("%d",&op); switch(op) //根據(jù)輸入,選擇分支方向 { case1: New_Process(list,FP); break; case2: Reclaim(list,FP); break; case3: Print(list,FP); break; case4: break; default: printf("\n選擇錯誤,請重新選擇!"); break; } if(op==4) break; //退出循環(huán) }}voidmain(){ //主函數(shù)入口 structPartition*list,*FP; list=Int(); FP=InitFP(); Main_Print(list,FP);}程序運行結果實訓小結:通過本實訓,加深了對動態(tài)分區(qū)分配、回收程序的功能和具體實現(xiàn),特別是對回收分區(qū)的合并的理解,同時對于內(nèi)存碎片的產(chǎn)生和整理有了更為深入的了解。實訓三:模擬實現(xiàn)銀行家算法判斷系統(tǒng)的狀態(tài)實訓目的:了解進程管理的實現(xiàn)方法,理解和掌握處理進程同步問題的方法。實訓內(nèi)容:實現(xiàn)銀行家算法、進程調(diào)度過程的模擬、消費者--供應商的供應商優(yōu)先算法。實訓步驟:1、理解安全性算法和銀行家算法的核心機制。2、理解進程的三狀態(tài)調(diào)度過程,及各狀態(tài)間的轉(zhuǎn)換關系。3、設計消費者--供應商的供應商優(yōu)先算法。實訓代碼:#include<stdio.h>#include<stdlib.h>#include<conio.h>#definem50intno1;//進程數(shù)intno2;//資源數(shù)intr;intallocation[m][m],need[m][m],available[m],max[m][m];charname1[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ù):"); scanf("%d",&no1); printf("請輸入資源種類數(shù):"); scanf("%d",&no2);printf("請輸入最大需求矩陣:\n"); for(i=0;i<no1;i++) for(j=0;j<no2;j++) scanf("%d",&max[i][j]);//輸入已知進程最大資源需求量 printf("請輸入當前分配矩陣:\n"); for(i=0;i<no1;i++) for(j=0;j<no2;j++) scanf("%d",&allocation[i][j]);//輸入已知的進程已分配的資源數(shù) for(i=0;i<no1;i++) for(j=0;j<no2;j++) need[i][j]=max[i][j]-allocation[i][j];//根據(jù)輸入的兩個數(shù)組計算出need矩陣的值 printf("請輸入可利用資源矩陣\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請輸入請求資源的進程號(0~4):\n"); for(j=0;j<=10;j++) { scanf("%d",&i); if(i>=no1) { printf("輸入錯誤,請重新輸入:\n"); continue; } elsebreak; } printf("\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; //判斷請求是否超過該進程所需要的資源數(shù) if(p) printf("請求資源超過該進程資源需求量,請求失敗!\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)嘗試把資源分配給請求的進程 } 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ù)分配嗎?YorN?\n"); //判斷是否繼續(xù)進行資源分配 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;//初始化進程均沒得到足夠資源數(shù)并完成 for(i=0;i<no2;i++) work[i]=available[i];//work[i]表示可提供進程繼續(xù)運行的各類資源數(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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論