版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
《操作系統(tǒng)》實驗指導書紹興文理學院計算機系
前言1.實驗總體目的通過學生自己動手設計實驗驗證理論知識,使學生掌握操作系統(tǒng)特性和功能,掌握不同調度算法下進程調度、進程控制、進程調度與死鎖,并必要掌握作業(yè)管理、存儲器管理、設備管理和文獻管理重要原理。加深對操作系統(tǒng)基本原理理解。⒉合用專業(yè)計算機科學與技術⒊先修課程C語言程序設計、計算機構成原理、數據構造⒋實驗學時分派序號實驗名稱學時實驗規(guī)定實驗類型1分析操作系統(tǒng)所面臨操作需求2必修驗證2進程管理4必修設計3存儲管理4必修設計4設備管理2必修設計5文獻管理4必修設計⒌實驗環(huán)境有70臺中檔配備計算機構成小型局域網實驗室環(huán)境。計算機詳細規(guī)定:(1)Pentium133Hz以上CPU;(2)建議至少256MB內存;(3)建議硬盤至少2GB,并有1GB空閑空間。(4)安裝Windows操作系統(tǒng)及C語言編譯程序或Linux虛擬環(huán)境。⒍實驗總體規(guī)定培養(yǎng)計算機專業(yè)學生系統(tǒng)程序設計能力,是操作系統(tǒng)課程一種非常重要環(huán)節(jié)。通過操作系統(tǒng)上機實驗,可以培養(yǎng)學生程序設計辦法和技巧,提高學生編制清晰、合理、可讀性好系統(tǒng)程序能力,加深對操作系統(tǒng)課程理解。使學生更好地掌握操作系統(tǒng)基本概念、基本原理、及基本功能,具備分析實際操作系統(tǒng)、設計、構造和開發(fā)當代操作系統(tǒng)基本能力。實驗規(guī)定做到:詳細描述實驗設計思想、程序構造及各模塊設計思路;詳細描述程序所用數據構造及算法;明確給出測試用例和實驗成果;為增長程序可讀性,在程序中進行恰當注釋闡明;認真進行實驗總結,涉及:設計中遇到問題、解決辦法與收獲等;實驗報告撰寫規(guī)定構造清晰、描述精確邏輯性強;實驗過程中,同窗之間可以進行討論互相提高,但絕對禁止抄襲。⒎本實驗重點、難點及教學辦法建議重點:理解進程調度中PCB設計,以實現對進程調度。難點:進程調度程序設計,設備管理程序設計。教學辦法建議:力求在本指引書協助下,獨立設計程序以加深理解。
實驗一分析操作系統(tǒng)所面臨操作需求(一)實驗目使學生理解操作系統(tǒng)所面臨操作需求,掌握操作系統(tǒng)中進程管理、存儲管理、設備管理和文獻管理等功能。(二)實驗內容1.
分析操作系統(tǒng)所面臨操作需求;2.
熟悉實驗環(huán)境;3.
資料收集與整頓,進行實驗前期準備。熟悉編程環(huán)境
本課程中實驗題目既可以在windows下用控制臺應用程序實現,也可以在linux下用全屏幕程序實現。這里咱們一方面簡介在windows下用vc++6.0設計控制臺應用程序環(huán)節(jié),然后簡介在linux下用C語言編寫全屏幕程序環(huán)節(jié)。windows控制臺應用程序
圖1-1圖1-2圖1-3環(huán)節(jié)1:開機,單擊“開始”按鈕,選取“程序
->Microsoft
Visual
Studio
6.0->Microsoft
Visual
C++6.0”進入Microsoft
Visual
環(huán)節(jié)2:在Microsoft
Visual
C++6.0中,單擊“File”菜單,選取“New”菜單命令,見圖1-2。
環(huán)節(jié)3:在“Files”選項卡中選取“C++
Source
File”,見圖1-32.
linuxvi應用編程登錄Linux是一種多顧客多任務操作系統(tǒng),各種顧客可以擁有自己獨立顧客賬號登錄提示:RedHatLinuxrelease6.0(Hedwing)Kernel2.2.5-15onani686Login:此時輸入顧客戶名(賬號)并鍵入回車,則系統(tǒng)顯示“passward”。在輸入密碼和回車。登錄后:[root@hawk/root]##表達是按root方式登錄,$表達是普通顧客。Linux大小寫敏感,用“-”加參數zlinux:~#ls–FHowTo/HowToMin/linux@nag/sag/獲取協助:Linux帶有聯機手冊,可以用man命令來閱讀Zlinux:~$manls虛擬終端Linux可有各種顧客登錄到同一種計算機,但普通微機只有一種終端難以體現。可以使用各種虛擬終端,用Alt+F1、Alt+F2等來切換。退出系統(tǒng)在停止使用系統(tǒng)時,要退出系統(tǒng)。詳細辦法:exit或logout,或Ctrl+D關機如果沒有顧客在使用系統(tǒng),可以關機。但是不能直接關閉電源,而要按正常順序關機。普通顧客是不能關機,只有root顧客可以關機。辦法:可以使用halt或shutdown命令,也可以同步鍵入Ctrl+Alt+Del。Windows虛擬機環(huán)境:登錄到系統(tǒng)點擊桌面“VMware”圖標——>VmwareWorkstation窗口——>Commands——>Startthisvirtualmachine進入fedora后,顧客名:root口令:123456使用編輯器vi編輯文獻進入linux文本模式之后,在命令行鍵入vifilename.c然后回車。下面作某些簡樸解釋:一方面vi命令是打開vi編輯器。背面filename.c是顧客即將編輯c文獻名字,注意擴展名字是.c;固然,vi編輯器功能很強,可以用它來編輯其他格式文獻,例如匯編文獻,其擴展名字是.s;也可以直接用vi打開一種新未命名文獻,當保存時候再給它命名,只是這樣做不很以便。最基本命令I:當進入剛打開文獻時,不能寫入信息,這時按一下鍵盤上I鍵(insert),插入意思,就可以進入編輯模式了。如下圖所示:a與i是相似用法當文獻編輯完后,需要保存退出,這時需要通過如下幾種環(huán)節(jié):1)按一下鍵盤上Esc鍵;2)鍵入冒號(:),緊跟在冒號背面是wq(意思是保存并退出)。如果不想保存退出,則在第二步鍵入冒號之后,鍵入!q(不帶w,機尾部保存)。如下圖所示:退出vi編輯器編輯模式之后,要對剛才編寫程序進行編譯。編譯命令是:gccfilename.c[-ooutputfilename],其中gcc是c編譯器。參數:filename.c是剛才編輯c文獻(固然也可以是此前編寫好c文獻);背面中括號里面參數是可選,它是一種輸出文獻。如果不選,默認輸出文獻是a.out,選了之后輸出文獻就是outputfilename.out.最后一步是運營程序,辦法如下:./outputfilename.out
實驗二進程管理(一)實驗目掌握臨界區(qū)概念及臨界區(qū)設計原則;掌握信號量概念、PV操作含義以及應用PV操作實現進程同步與互斥;分析進程爭用資源現象,學習解決進程互斥辦法;掌握進程狀態(tài)及狀態(tài)轉換;掌握慣用進程調度算法。(二)實驗內容1.分析進程同步與互斥現象,編程實現典型進程同步問題——生產者消費者問題模仿;2.
編寫容許進程并行執(zhí)行進程調度程序,在慣用進程(作業(yè))調度算法:先來先服務算法、短作業(yè)優(yōu)先算法、最高響應比優(yōu)先算法、高優(yōu)先權優(yōu)先算法等調度算法中至少選取三種調度算法進行模仿,并輸出平均周轉時間和平均帶權周轉時間。本實驗涉及內容較多,可以在兩個題目里選取一種完畢。編程實現典型進程同步問題——生產者消費者問題模仿模仿實現用同步機構避免發(fā)生進程執(zhí)行時也許浮現與時間關于錯誤。進程是程序在一種數據集合上運營過程,進程是并發(fā)執(zhí)行,也即系統(tǒng)中各種進程輪流地占用解決器運營。咱們把若干個進程都能進行訪問和修改那些變量稱為公共變量。由于進程是并發(fā)地執(zhí)行,因此,如果對進程訪問公共變量不加限制,那么就會產生“與時間關于”錯誤,即進程執(zhí)行后所得到成果與訪問公共變量時間關于。為了防止此類錯誤,系統(tǒng)必要要用同步機構來控制進程對公共變量訪問。普通說,同步機構是由若干條原語——同步原語——所構成。本實驗規(guī)定模仿PV操作同步機構實現,模仿進程并發(fā)執(zhí)行,理解進程并發(fā)執(zhí)行時同步機構作用。本次用到數據構造知識如下:typedefstructPcb{ charname[10];//進程名 charstate[10];//運營狀態(tài) charreason[10];//若阻塞,其因素 intbreakp;//斷點保護 structPcb*next;//阻塞時順序}Pcb,*link;進程名狀態(tài)等待因素斷點后繼進程進程控制塊構造定義兩個進程:linkp1;//生產者進程,linkc1;//消費者進程。pc程序計數器和linkready;就緒隊列,linkb_s1;s1阻塞隊列,linkb_s2;s2阻塞隊列。實驗指引:h頭文獻#include<string.h>#include<ctype.h>#include<malloc.h>/*malloc()等*/#include<limits.h>/*INT_MAX等*/#include<stdio.h>/*EOF(=^Z或F6),NULL*/#include<stdlib.h>/*atoi()*/#include<io.h>/*eof()*/#include<math.h>/*floor(),ceil(),abs()*/#include<process.h>/*exit()*/#include<iostream>usingnamespacestd;#include<time.h>#defineBUF10//緩存大小#defineMAX20//最大可以輸入字符h頭文獻//數據構造定義和全局變量typedefstructPcb{ charname[10];//進程名 charstate[10];//運營狀態(tài) charreason[10];//若阻塞,其因素 intbreakp;//斷點保護 structPcb*next;//阻塞時順序}Pcb,*link;ints1,s2;//信號量linkp1;//生產者進程linkc1;//消費者進程charstr[MAX];//輸入字符串charbuffer[BUF];//緩沖池intlen;//輸入長度intsp=0;//string指針intin=0;//生產者指針intout=0;//消費者指針chartemp;//供打印暫時產品charrec_p[MAX];//生產記錄intrp1=0;//生產記錄指針charrec_c[MAX];//消費記錄intrp2=0;//消費記錄指針linkready;//就緒隊列l(wèi)inkb_s1;//s1阻塞隊列l(wèi)inkb_s2;//s2阻塞隊列intpc;//程序計數器intcount;//字符計數器intcon_cnt;//消費計數器h頭文獻voidinit();//初始化voidp(ints);//P操作voidv(ints);//V操作voidblock(ints);//阻塞函數voidwakeup(ints);//喚醒函數voidcontrol();//解決機調度voidprocessor();//解決機執(zhí)行voidprint();//打印函數voidinit(){//初始化 s1=BUF; s2=0; p1=(link)malloc(sizeof(Pcb));//建立新結點,并初始化為生產者 strcpy(p1->name,"Producer"); strcpy(p1->state,"Ready"); strcpy(p1->reason,"Null"); p1->breakp=0; p1->next=NULL; c1=(link)malloc(sizeof(Pcb));//建立新結點,并初始化為消費者 strcpy(c1->name,"Consumer"); strcpy(c1->state,"Ready"); strcpy(c1->reason,"Null"); c1->breakp=0; c1->next=NULL; ready=p1; ready->next=c1;//初始化為生產進程在前,消費進程在后 c1->next=NULL; b_s1=NULL; b_s2=NULL;//阻塞進程為NULL pc=0; con_cnt=0;//消費計數器}voidp(ints){ if(s==1){//p(s1) s1--; if(s1<0) block(1);//阻塞當前生產進程 else{ printf("\t*s1信號申請成功!\n"); ready->breakp=pc;//保存斷點 } } else{//p(s2) s2--; if(s2<0) block(2);//阻塞當前消費進程 else{ printf("\t*s2信號申請成功!\n"); ready->breakp=pc;//保存斷點 } }}voidv(ints){ if(s==1){//v(s1) s1++; if(s1<=0) wakeup(1);//喚醒生產進程 ready->breakp=pc;//保存斷點 } else{//v(s2) s2++; if(s2<=0) wakeup(2);//喚醒消費進程 ready->breakp=pc;//保存斷點 }}voidblock(ints){//阻塞函數定義 linkp; intnum1=0; intnum2=0; if(s==1){//生產進程 strcpy(p1->state,"Block");//變化狀態(tài) strcpy(p1->reason,"S1");//闡明因素 p=b_s1; while(p){ num1++; p=p->next;//p值為NULL,表達隊尾 } if(!b_s1) b_s1=p1; else p=p1; p1->next=NULL; printf("\t*p1生產進程阻塞了!\n"); ready->breakp=pc;//保存斷點 ready=ready->next;//在就緒隊列中去掉,指向下一種 num1++; } else{//消費進程 strcpy(c1->state,"Block"); strcpy(c1->reason,"S2"); p=b_s2; while(p){ num2++; p=p->next;//p值為NULL,表達隊尾 } if(!b_s2) b_s2=c1; else p=c1; ready->breakp=pc;//保存斷點 ready=ready->next;//在就緒隊列中去掉,指向下一種 c1->next=NULL; printf("\t*c1消費進程阻塞了!\n"); num2++; } printf("\t*阻塞生產進程個數為:%d\n",num1); printf("\t*阻塞消費進程個數為:%d\n",num2);}voidwakeup(ints){//喚醒函數定義 linkp; linkq=ready; if(s==1){//喚醒b_s1隊首進程,生產進程隊列 p=b_s1; b_s1=b_s1->next;//阻塞指針指向下一種阻塞進程 strcpy(p->state,"Ready"); strcpy(p->reason,"Null"); while(q)//插入就緒隊列 q=q->next; q=p; p->next=NULL; printf("\t*p1生產進程喚醒了!\n"); } else{//喚醒b_s2隊首進程,消費進程隊列 p=b_s2; b_s2=b_s2->next;//阻塞指針指向下一種阻塞進程 strcpy(p->state,"Ready"); strcpy(p->reason,"Null"); while(q->next)//插入就緒隊列 q=q->next; q->next=p; p->next=NULL; printf("\t*c1消費進程喚醒了!\n"); }}voidcontrol()//解決器調度程序{ intrd; intnum=0; linkp=ready;if(ready==NULL)//若無就緒進程,結束 return; while(p)//記錄就緒進程個數 { num++; p=p->next;//最后p變?yōu)镹ULL } printf("\t*就緒進程個數為:%d\n",num); time_tt; srand((unsigned)time(&t)); rd=rand()%num;//隨機函數產生隨機數 if(rd==1){ p=ready; ready=ready->next; ready->next=p; p->next=NULL; strcpy(ready->state,"Run"); strcpy(ready->next->state,"Ready"); } else strcpy(ready->state,"Run"); pc=ready->breakp;}voidprocessor(){//模仿解決器指令執(zhí)行 if(strcmp(ready->name,"Producer")==0)//當邁進程為生產者 switch(pc) {case0://produce printf("\t*生產者生產了字符%c\n",str[sp]); rec_p[rp1]=str[sp];//添加到生產記錄 sp=(sp+1)%len; pc++; ready->breakp=pc;//保存斷點 break; case1://p(s1) pc++; p(1); break; case2://put buffer[in]=rec_p[rp1];//放到緩沖區(qū) printf("\t*%c字符成功入駐空緩存!\n",buffer[in]); rp1++; in=(in+1)%BUF; pc++; ready->breakp=pc;//保存斷點 break; case3://v(s2) pc++; printf("\t*釋放一種s2信號\n"); v(2); break; case4://goto01 printf("\t*生產進程goto0操作\n"); pc=0; count--;//剩余字符個數減1 printf("\t*剩余字符count=%d個\n",count); ready->breakp=pc;//保存斷點 if(count<=0){//生產結束 printf("\t*生產者結束生產!\n"); strcpy(p1->state,"Stop"); strcpy(p1->reason,"Null"); ready->breakp=-1; ready=ready->next;//在就緒隊列中去掉 } } else//當邁進程為消費者 switch(pc) { case0://p(s2) pc++; p(2); break; case1://get printf("\t*消費者取字符!\n"); temp=buffer[out]; out=(out+1)%BUF; pc++; ready->breakp=pc;//保存斷點 break; case2://v(s1) pc++; printf("\t*釋放一種s1\n"); v(1); break; case3://consume printf("\t*消費了字符%c\n",temp); rec_c[rp2]=temp;//添加到消費記錄 rp2++; con_cnt++; if(con_cnt>=len){ strcpy(c1->state,"Stop");//完畢態(tài) c1->breakp=-1; return; } pc++; ready->breakp=pc;//保存斷點 break; case4://goto0 printf("\t*消費進程goto0操作\n"); pc=0; ready->breakp=pc;//保存斷點 }}voidprint(){ inti,j; printf("生產者消費者模仿\n"); printf("*模仿過程字符串為:\t"); printf("%s\n",&str); printf("*已生產:"); for(j=0;j<=rp1;j++) printf("%c",rec_p[j]); printf("\n*空緩存:"); for(j=rp2;j<=rp1;j++) printf("%c",buffer[j]); printf("\n*已消費:"); for(j=0;j<=rp2;j++) printf("%c",rec_c[j]); printf("\n進程控制塊信息\n"); printf("進程名\t\t狀態(tài)\t等待因素\t斷點\n"); printf("%s\t%s\t%s\t\t%d\n\n",p1->name,p1->state,p1->reason,p1->breakp); printf("%s\t%s\t%s\t\t%d\n",c1->name,c1->state,c1->reason,c1->breakp); printf("\n"); printf("1.繼續(xù)0.退出\n"); scanf("%d",&i); if(i==0){ exit(0); }}主程序#include"a.h"#include"b.h"#include"c.h"voidmain(){ printf("*生產者消費者模仿\n"); printf("\n"); printf("*請輸入字符串:\n"); scanf("%s",str);//string數組存儲將要產生字符 len=strlen(str); count=len;//輸入字符個數 init();//初始化 while(con_cnt<len)//消費完所有字符為結束 { system("cls");//清屏操作 printf("模仿指令流程\n"); control();//解決器調度程序 processor();//模仿解決器指令執(zhí)行 print();//輸出顯示各個信息 } printf("\n程序結束!\n");}
進程調度算法模仿進程管理是操作系統(tǒng)中重要功能,用來創(chuàng)立進程、撤除進程、實現進程狀態(tài)轉換,它提供了在可運營進程之間復用CPU辦法。在進程管理中,進程調度是核心,由于在采用多道程序設計系統(tǒng)中,往往有若干個進程同步處在就緒狀態(tài),當就緒進程個數不不大于解決器數目時,就必要依照某種方略決定哪些進程優(yōu)先占用解決器。本實驗模仿在單解決器狀況下進程調度,目是加深對進程調度工作理解,掌握不同調度算法優(yōu)缺陷。設計一種按先來先服務、時間片輪轉法、優(yōu)先數調度算法實現解決器調度程序。實驗指引:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>typedefstructnode{ charname[10];/*進程標記符*/ intprio;/*進程優(yōu)先數*/ intround;/*進程時間輪轉時間片*/ intcputime;/*進程占用CPU時間*/ intneedtime;/*進程到完畢還要時間*/ intarrivetime;/*進程到達時間*/ intstarttime;/*進程開始時間*/ intfinishtime;/*進程完畢時間*/ intservicetime;/*進程服務時間*/floatturnaroundtime;/*進程周轉時間*/floatweightedturnaroundtime;/*進程帶權周轉時間*/ intcount;/*計數器*/ charstate;/*進程狀態(tài)*/ structnode*next;/*鏈指針*/}PCB; PCB*finish,*ready,*tail,*run;/*隊列指針*/ intN;/*進程數*//*將就緒隊列中第一種進程投入運營*/voidfirstin(){ run=ready;/*就緒隊列頭指針賦值給運營頭指針*/ run->state='R';/*進程狀態(tài)變?yōu)檫\營態(tài)*/ ready=ready->next;/*就緒對列頭指針后移到下一進程*/}/*****標題輸出函數*****/voidprt1(chara){ switch(a) { case1:/*優(yōu)先數法*/ printf("名字進程占用CPU時間進程到完畢還要時間優(yōu)先級數狀態(tài)\n");break; case2:/*時間片算法*/ printf("名字進程占用CPU時間進程到完畢還要時間計數器時間片狀態(tài)\n");break; case3:/*先來先服務算法*/ printf("名字到達時間開始時間服務時間完畢時間周轉時間帶權周轉時間狀態(tài)\n");break; default:break; }}/*****進程PCB輸出*****/voidprt2(chara,PCB*q){ switch(a) { case1:/*優(yōu)先數法輸出*/ printf("%-10s\t%-10d\t%-10d\t%-10d\t%c\n",q->name, q->cputime,q->needtime,q->prio,q->state);break; case2:/*輪轉法輸出*/ printf("%-10s%-20d%-15d%-10d%-10d%-c\n",q->name, q->cputime,q->needtime,q->count,q->round,q->state);break; case3:/*先來先服務算法輸出*/ printf("%s%10d%10d%10d%10d%10.1f%10.2f\t\t%c\n",q->name,q->arrivetime,q->starttime,q->servicetime,q->finishtime, q->turnaroundtime,q->weightedturnaroundtime,q->state);break; default:break; }}/*****輸出函數*****/voidprt(charalgo){ PCB*p; prt1(algo);/*輸出標題*/ if(run!=NULL)/*如果運營指針不空*/ prt2(algo,run);/*輸出當前正在運營PCB*/ p=ready;/*輸出就緒隊列PCB*/ while(p!=NULL){ prt2(algo,p); p=p->next;} p=finish;/*輸出完畢隊列PCB*/ while(p!=NULL){ prt2(algo,p); p=p->next;} getch();/*壓任意鍵繼續(xù)*/}/*****優(yōu)先數插入算法*****/voidinsert1(PCB*q){ PCB*p1,*s,*r; intb; s=q;/*待插入PCB指針*/ p1=ready;/*就緒隊列頭指針*/ r=p1;/*r做p1前驅指針*/ b=1;while((p1!=NULL)&&b)/*依照優(yōu)先數擬定插入位置*/if(p1->prio>=s->prio){ r=p1; p1=p1->next;}else b=0; if(r!=p1)/*如果條件成立闡明插入在r與p1之間*/{ r->next=s; s->next=p1;} else{ s->next=p1;/*否則插入在就緒隊列頭*/ ready=s;}}/*****輪轉法插入函數*****/voidinsert2(PCB*p2){tail->next=p2;/*將新PCB插入在當前就緒隊列尾*/tail=p2;p2->next=NULL;}/*****先來先服務插入函數*****/voidinsert3(PCB*q){ PCB*p1,*s,*r; intb; s=q;/*指針s指向新要插入進程*/ p1=ready;/*指針p1指向本來進程對首*/ r=p1;/*使用指針r指向p1前面進程*/ b=1; while((p1!=NULL)&&b) if(p1->arrivetime<s->arrivetime) { r=p1; p1=p1->next; } else b=0; if(r!=p1) { r->next=s; s->next=p1; } else { s->next=p1; ready=s; }}/*****優(yōu)先數創(chuàng)立初始PCB信息*****/voidcreate1(charalg){ PCB*p; inti,time; charna[10]; ready=NULL;/*就緒隊列頭指針*/ finish=NULL;/*完畢隊列頭指針*/ run=NULL;/*運營隊列頭指針*/ printf("請輸入進程名字和運營所需要時間\n");/*輸入進程標記和所需時間創(chuàng)立PCB*/ for(i=1;i<=N;i++){ p=(PCB*)malloc(sizeof(PCB)); scanf("%s",na); scanf("%d",&time); strcpy(p->name,na); p->cputime=0; p->needtime=time; p->state='W'; p->prio=50-time; if(ready!=NULL)/*就緒隊列不空則調用插入函數插入*/ insert1(p); else{ p->next=ready;/*創(chuàng)立就緒隊列第一種PCB*/ ready=p;}} voidclrscr(void); printf("優(yōu)先級調度算法模仿輸出成果:\n"); printf("*******************************************************************\n"); prt(alg);/*輸出進程PCB信息*/ run=ready;/*將就緒隊列第一種進程投入運營*/ ready=ready->next; run->state='R';}/*****輪轉法創(chuàng)立進程PCB*****/voidcreate2(charalg){ PCB*p; inti,time; charna[10]; ready=NULL; finish=NULL; run=NULL; printf("請輸入進程名字和運營所需要時間\n"); for(i=1;i<=N;i++){ p=(PCB*)malloc(sizeof(PCB)); scanf("%s",na); scanf("%d",&time); strcpy(p->name,na); p->cputime=0; p->needtime=time; p->count=0;/*計數器*/ p->state='W'; p->round=2;/*時間片*/ if(ready!=NULL) insert2(p); else{ p->next=ready; ready=p; tail=p;}} voidclrscr(void); printf("時間片輪轉法模仿輸出成果:\n"); printf("********************************************************************\n"); prt(alg);/*輸出進程PCB信息*/ run=ready;/*將就緒隊列第一種進程投入運營*/ ready=ready->next; run->state='R';}/*****先來先服務算法創(chuàng)立PCB*****/voidcreate3(charalg){ PCB*p; inti;ready=NULL; run=NULL; finish=NULL; printf("請輸入進程名字、到達時間和運營所需要時間\n"); for(i=0;i<N;i++) {p=(PCB*)malloc(sizeof(PCB)); scanf("%s",p->name); scanf("%d",&p->arrivetime); scanf("%d",&p->servicetime);p->starttime=0; p->finishtime=0; p->turnaroundtime=0; p->weightedturnaroundtime=0; p->state='W'; if(ready!=NULL) insert3(p); else { p->next=ready; ready=p; } } voidclrscr(void); printf("先來先服務算法模仿輸出成果:\n"); printf("***************************************************************************\n"); prt(alg); run=ready;/*將就緒隊列第一種進程投入運營*/ ready=ready->next; run->state='R';}/*****優(yōu)先數調度算法*****/voidpriority(charalg){while(run!=NULL)/*當運營隊列不空時,有進程正在運營*/{run->cputime=run->cputime+1;run->needtime=run->needtime-1;run->prio=run->prio-3;/*每運營一次優(yōu)先數減少3個單位*/if(run->needtime==0)/*如所需時間為0將其插入完畢隊列*/{run->next=finish;finish=run;run->state='F';/*置狀態(tài)為完畢態(tài)*/run=NULL;/*運營隊列頭指針為空*/if(ready!=NULL)/*如果就緒隊列不空*/firstin();/*將就緒對列第一種進程投入運營*/}else/*沒有運營完同步優(yōu)先數不是最大,則將其變?yōu)榫途w態(tài)插入到就緒隊列*/if((ready!=NULL)&&(run->prio<ready->prio)){run->state='W';insert1(run);firstin();/*將就緒隊列第一種進程投入運營*/}prt(alg);/*輸出進程PCB信息*/}}/*****時間片輪轉法*****/voidroundrun(charalg){while(run!=NULL){run->cputime=run->cputime+1;run->needtime=run->needtime-1;run->count=run->count+1;if(run->needtime==0)/*運營完將其變?yōu)橥戤厬B(tài),插入完畢隊列*/{run->next=finish;finish=run;run->state='F';run=NULL;if(ready!=NULL)firstin();/*就緒對列不空,將第一種進程投入運營*/}elseif(run->count==run->round)/*如果時間片到*/{run->count=0;/*計數器置0*/if(ready!=NULL)/*如就緒隊列不空*/{run->state='W';/*將進程插入到就緒隊列中檔待輪轉*/insert2(run);firstin();/*將就緒對列第一種進程投入運營*/}} prt(alg);/*輸出進程信息*/}}/*****先來先服務調度算法*****/voidFIFO(charalg){inttime; while(run!=NULL) { time=run->arrivetime>time?run->arrivetime:time;run->starttime=time; time=time+run->servicetime; run->finishtime=time; run->turnaroundtime=run->finishtime-run->arrivetime; run->weightedturnaroundtime=run->turnaroundtime/run->servicetime; run->next=finish; finish=run; run->state='F'; run=NULL; if(ready!=NULL){ run=ready; run->state='R'; ready=ready->next;} prt(alg); }} /*****主函數*****/intmain(){charalgo;/*算法標記*/voidclrscr(void);charmainmenu;do{ system("cls");/*清屏*/ printf("\n溫馨提示:為保證您操作得到預期效果,請規(guī)范輸入您信息^_^\n"); printf("\n\n"); printf("\t\t+━━━━━━━━━━━━━━━━━━━━━━━━+\n");printf("\t\t||歡迎進入進程調度算法模仿演示系統(tǒng)||\n");printf("\t\t|┗━━━━━━━━━━━━━━━━┛|\n");printf("\t\t||\n");printf("\t\t|●[1]優(yōu)先級算法演示|\n");printf("\t\t||\n");printf("\t\t|●[2]時間片輪轉算法演示|\n");printf("\t\t||\n");printf("\t\t|●[3]先來先服務算法演示|\n");printf("\t\t||\n"); printf("\t\t|●[4]退出系統(tǒng)|\n"); printf("\t\t||\n"); printf("\t\t+━━━━━━━━━━━━━━━━━━━━━━━━+\n");printf("請輸入您選?。篭n");scanf("%d",&algo);/*輸入字符擬定算法*/ switch(algo) { case1: printf("您選取是優(yōu)先級算法模仿進程調度\n\n"); printf("請輸入進程數目\n"); scanf("%d",&N);/*輸入進程數*/ create1(algo);/*優(yōu)先數法*/ priority(algo); break; case2: printf("您選取是時間片輪轉算法模仿進程調度\n\n"); printf("請輸入進程數目\n"); scanf("%d",&N);/*輸入進程數*/ create2(algo);/*輪轉法*/ roundrun(algo); break; case3: printf("您選取是先來先服務算法模仿進程調度\n\n"); printf("請輸入進程數目\n"); scanf("%d",&N);/*輸入進程數*/ create3(algo); FIFO(algo); break; case4: printf("歡迎您再次使用進程調度算法模仿系統(tǒng)!\n"); exit(4); break; default: printf("輸入有誤\n"); break; }printf("\n與否繼續(xù)操作(y/n)?");fflush(stdin);mainmenu=getchar(); }while(mainmenu=='y'||mainmenu=='Y');return0;}
實驗三存儲管理(一)實驗目掌握物理內存和虛擬內存基本概念;掌握重定位基本概念及其要點,理解邏輯地址與絕對地址;掌握各種存儲管理實現辦法,涉及基本原理、地址變換和缺頁中斷、主存空間分派及分派算法;掌握慣用裁減算法。(二)實驗內容編寫一種模仿動態(tài)頁式存儲管理程序,實現對動態(tài)頁式存儲裁減算法模仿(在先進先出裁減算法、近來至少使用裁減算法、最不經常使用裁減算法三種算法中至少選取兩種進行模仿)并計算各個算法缺頁率;并且頁面裁減算法在裁減一頁時,只將該頁在頁表中抹去,而不再判斷它與否被改寫過,也不將它寫回到輔存。實驗指引:#include<iostream.h>#definen12#definem3intpage[n];//保存需要訪問頁面inti,j,q,mem[m]={0},List[m][n],sum;charflag,f[n];voidInit();voidFIFO();voidLRU();voidmain(){ cout<<"*********************實驗***********************"<<endl; cout<<"┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl; cout<<"┃頁面調度算法模仿實現┃"<<endl; cout<<"┠───────────────────────┨"<<endl; cout<<"┃先進先出算法FIFO┃"<<endl; cout<<"┃近來至少使用算法LRU┃"<<endl; cout<<"┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl; cout<<"請輸入頁面訪問序列:\n"<<""; for(i=0;i<n;i++) cin>>page[i];cout<<endl; FIFO(); Init(); LRU();}voidInit()//初始化函數{ sum=0;//初始化計算缺頁次數變量 for(inti=0;i<m;i++) mem[i]=0; for(i=0;i<m;i++) for(j=0;j<n;j++) List[i][j]=0;}voidFIFO(){ for(i=0;i<n;i++)//查頁表,看與否缺頁 { q=0; while((page[i]!=mem[q])&&(q!=m)) q++; if(q==m) flag='*';//缺頁,則置標志flag為'*' else flag=''; if(flag=='*') { for(j=m-1;j>0;j--)//裁減最先調入頁面調入當前訪問 mem[j]=mem[j-1]; mem[0]=page[i]; } for(j=0;j<m;j++) List[j][i]=mem[j]; f[i]=flag; } cout<<"0代表為空,*代表有缺頁:\n"; cout<<endl; cout<<"FIFO算法成果"<<endl; for(i=0;i<m;i++) { for(j=0;j<n;j++) cout<<List[i][j]<<""; cout<<endl; } for(i=0;i<n;i++) { if(f[i]=='*') sum++; cout<<f[i]<<""; } cout<<"\n"<<endl; cout<<"缺頁次數是:"<<sum<<"缺頁率是:"<<(double)sum/12<<endl;}voidLRU(){ for(i=0;i<n;i++)//查頁表,看與否缺頁 { q=0; while((page[i]!=mem[q])&&(q!=m)) q++; if(q==m) flag='*';//缺頁,則置標志flag為'*' else flag=''; for(j=q;j>0;j--) mem[j]=mem[j-1]; mem[0]=page[i]; for(j=0;j<m;j++) List[j][i]=mem[j]; f[i]=flag; } cout<<endl; cout<<"LRU算法成果"<<endl; for(i=0;i<m;i++) { for(j=0;j<n;j++) cout<<List[i][j]<<""; cout<<endl; } for(i=0;i<n;i++) { if(f[i]=='*') sum++; cout<<f[i]<<""; } cout<<endl; cout<<""<<endl; cout<<"缺頁次數是:"<<sum<<"缺頁率是:"<<(double)sum/12<<endl;}
實驗四設備管理(一)實驗目掌握獨占設備使用方式,以及設備分派和回收;掌握用死鎖避免辦法來解決申請獨占設備也許導致死鎖。(二)實驗內容用死鎖避免辦法來解決申請獨占設備也許導致死鎖,程序實現對銀行家算法模仿。設計五個進程{P0,P1,P2,P3,P4}共享三類資源{A,B,C}系統(tǒng),{A,B,C}資源數量分別為10,5,7。進程可動態(tài)地申請資源和釋放資源,系統(tǒng)按各進程申請動態(tài)地分派資源。規(guī)定程序具備顯示和打印各進程某一時刻資源分派表和安全序列;顯示和打印各進程依次規(guī)定申請資源號以及為某進程分派資源后關于資源數據狀況。實驗指引:#include<iostream.h>#include<string.h>#include<stdio.h>#include<iomanip>#definen10#definetrue1#definefalse0intN;//資源總類intM; //總進程數intAvailable[50];intMax[50][50];intAllocation[50][50]={0};intNeed[50][50]={0};intWork[50]={0}; intTemp[50]={0};//存儲安全序列號charName[50]={0};intSum[50]={0};intRequest[50]={0};voidPrint(){ intk=0; cout<<" ***********資源分派表***********"<<endl; cout<<"Process"<<"Max"<<"Allocation"<<"Need"<<"Available"<<endl; cout<<" ABC"<<"ABC"<<"ABC"<<"ABC"<<endl; for(inti=0;i<M;i++) { cout<<"P"<<i<<""; for(intj=0;j<N;j++) cout<<""<<Max[i][j]; cout<<""; for(j=0;j<N;j++) cout<<""<<Allocation[i][j]; cout<<""; for(j=0;j<N;j++) cout<<""<<Need[i][j]; cout<<""; for(j=0;j<N;j++) { if(k!=3) { cout<<""<<Available[j]; k++; } } cout<<endl; }}voidCreate(){ inti,j; cout<<"請輸入您要創(chuàng)立進程數量:"<<endl; cin>>M; cout<<"請輸入各類資源總數:("<<N<<"個)"<<endl; for(i=0;i<N;i++) cin>>Sum[i];k1: cout<<endl; cout<<"請輸入各類進程所需要資源最大數目:("<<N*M<<"個)"<<endl; for(i=0;i<M;i++) for(j=0;j<N;j++) { cin>>Max[i][j]; if(Max[i][j]>Sum[j]) { cout<<"占有資源超過了聲明該資源總數,請重新輸入!"<<endl; gotok1; } } k2: cout<<endl; cout<<"請輸入各類進程已分派各類資源數目:("<<N*M<<"個)"<<endl; for(i=0;i<M;i++) for(j=0;j<N;j++) { cin>>Allocation[i][j]; if(Allocation[i][j]>Max[i][j]) { cout<<"占有資源超過了聲明該資源總數,請重新輸入!"<<endl; gotok2; } } intp; for(i=0;i<N;i++) { p=Sum[i]; for(j=0;j<M;j++) p=p-Allocation[j][i]; Available[i]=p; } for(i=0;i<M;i++) for(j=0;j<N;j++) Need[i][j]=Max[i][j]-Allocation[i][j];}voidrestore(inti){ intj; for(j=0;j<N;j++) { Available[j]+=Request[j]; Allocation[i][j]-=Request[j]; Need[i][j]+=Request[j]; }}intchangedata(inti){ intj; for(j=0;j<N;j++) { Available[j]+=Request[j]; Allocation[i][j]-=Request[j]; Need[i][j]+=Request[j]; } return1;}intSafe()//解決傳過來第幾種進程{ inti=0; intk=0; intm; intapply,Finish[50]={0}; intj,flag=0; for(i=0;i<N;i++) Work[i]=Available[i]; for(i=0;i<M;i++) { apply=0; for(j=0;j<N;j++) { if(Finish[i]==false&&Need[i][j]<=Work[j]) { apply++; if(apply==N) { for(m=0;m<N;m++) Work[m]=Work[m]+Allocation[i][m]; Finish[i]=true; Temp[k++]=i; i=-1; flag; } } }} for(i=0;i<M;i++) { if(Finish[i]==false) { cout<<"系統(tǒng)不安全!!!本次資源申請不成功!!!"<<endl; return-1; } } cout<<"經安全性檢查,系統(tǒng)安全,本次分派成功!!"<<endl; cout<<"安全序列號"; for(i=0;i<M-1;i++) cout<<"P"<<Temp[i]<<","; cout<<"P"<<Temp[i]<<">"<<endl; cout<<endl; return0;}voiddijkstra(){ charch; inti=0,j=0; ch='y'; cout<<"請輸入你要祈求資源進程號(0-"<<M-1<<"):"<<endl; cin>>i; cout<<"請輸入進程"<<i<<"祈求Request變量"<<endl; for(i=0;i<N;i++) { cout<<Name[j]<<":"; cin>>Request[i]; } for(i=0;i<N;i++) { if(Request[i]>Need[j][i]) { cout<<"進程"<<i<<"申請資源不不大于她需要資源"; cout<<"分派不合理,不予分派!"<<endl; ch='n'; break; } else if(Request[j]>Available[j]) { cout<<"進程"<<i<<"申請資源不不大于系統(tǒng)可運用資源"; cout<<"分派出錯,不予分派!"<<endl; ch='n'; break; } if(ch='y') changedata(i); Print(); Safe(); if(Safe()==1) restore(i); } }intmain(){ intc; Create(); Print(); Safe(); while(c) { cout<<" 銀行家算法"<<endl; cout<<"1分派資源"<<endl; cout<<"2離開"<<endl; cout<<"請選取功能號:"<<endl; cin>>c; switch(c) { case1:dijkstra();break; case0:c=0;break; default:cout<<"請對的選取功能號(0--1)"<<endl;break; } } return1;}
實驗五文獻管理(一)實驗目掌握文獻存取辦法;掌握文獻邏輯構造和物理構造;掌握存儲空間分派和回收;掌握磁盤管理與調度。(二)實驗內容用程序模仿磁盤調度過程,并計算各磁盤調度算法涉及先來先服務算法、最短尋道時間優(yōu)先算法、掃描算法和循環(huán)掃描算法平均尋道長度。本實驗是模仿操作系統(tǒng)磁盤尋道方式,運用磁盤訪問順序不同來設計磁盤調度算法。實現磁盤調度算法有FCFS,SSTF,SCAN,CSCAN和NStepSCAN算法。設定開始磁道號尋道范疇,根據起始掃描磁道號和最大磁道號數,隨機產生要進行尋道磁道號序列。選取磁盤調度算法,顯示該算法磁道訪問順序,計算出移動磁道總數和平均尋道總數。按算法尋道效率進行排序,并對各算法性能進行分析比較。實驗指引:#include<stdio.h>#include<math.h>voidFCFS(intb[],intn,intinit){ inti,s,sum; inta[20]; for(i=0;i<n;i++) a[i]=b[i]; s=init; sum=0; for(i=0;i<n;i++){ printf("第%d次訪問磁道:%d\n",i+1,a[i]); sum+=abs(s-a[i]); s=a[i]; } printf("平均尋道長度:%f\n",sum*1.0/n);}voidSSTF(intb[],intn,intk){ inti,j,s,sum=0,p; inta[20]; for(i=0;i<n;i++) a[i]=b[i]; for(i=n-1;i>=0;i--){ s=a[0]; p=0; for(j=0;j<=i;j++) if(abs(a[j]-k)<abs(s-k)){ s=a[j]; p=j; } a[p]=a[i]; printf("第%d次訪問磁道:%d\n",n-i,s); sum+=abs(s-k); k=s; } printf("平均尋道長度:%f\n",sum*1.0/n);}voidSCAN1(intb[],intn,intk){ inti,j,s,sum=0,p,biaoji; inta[20]; for(i=0;i<n;i++) a[i]=b[i]; for(i=n-1;i>=0;i--){ biaoji=0; for(j=0;j<=i;j++) if(a[j]-k<0){ biaoji=1; p=j; break; } if(biaoji==1){ s=a[p]; for(j=0;j<=i;j++) if(a[j]<k&&k-a[j]<k-s) { s=a[j]; p=j; } a[p]=a[i]; printf("第%d次訪問磁道:%d\n",n-i,s); sum+=k-s; k=s; } else{ s=a[0]; for(j=0;j<=i;j++) if(a[j]-k<=s-k) { s=a[j]; p=j; } a[p]=a[i]; printf("第%d次訪問磁道:%d\n",n-i,s); sum+=abs(k-s); k=s; } } printf("平均尋道長度:%f\n",sum*1.0/n);}voidSCAN2(intb[],intn,intk){ inti,j,s,sum=0,p,biaoji; inta[20]; for(i=0;i<n;i++)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 食品工藝學-第一章-緒論
- 2024專項房地產代購協議范本
- 2024工程招投標協議管理實訓解析
- 安全法律法規(guī)清單
- 2024年度三方服務銷售業(yè)務協議范本
- 2024年度綜合咨詢業(yè)務協議
- 2024年度合板銷售與購買協議
- 2024年水電安裝工程勞務協議細化
- 2024年貨物運輸保障協議樣本
- 2024年招聘流程合規(guī)協議書范例
- 2024年公司工會工作計劃模版(三篇)
- 2024年秋季新人教版7年級上冊生物課件 第2單元 第1章大單元整體設計
- 炸藥及火工品生產過程中的安全防護技術考核試卷
- DBJ04∕T 292-2023 住宅物業(yè)服務標準
- 光伏組件回收再利用建設項目可行性研究報告寫作模板-拿地申報
- 副總經理招聘筆試題及解答(某大型國企)
- 2024年工業(yè)和信息化部應急通信保障中心招聘高頻考題難、易錯點模擬試題(共500題)附帶答案詳解
- 2024年“安康杯”安全知識競賽培訓試題及答案
- 教育部《中小學德育工作指南》-道德修養(yǎng)手冊
- 2024至2030年中國建筑設計行業(yè)市場調研分析及發(fā)展趨勢研究預測報告
- 《食品營銷學》教案全本
評論
0/150
提交評論