




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
《操作系統(tǒng)》實(shí)驗(yàn)指導(dǎo)書紹興文理學(xué)院計(jì)算機(jī)系
前言1.實(shí)驗(yàn)總體目的通過學(xué)生自己動(dòng)手設(shè)計(jì)實(shí)驗(yàn)驗(yàn)證理論知識(shí),使學(xué)生掌握操作系統(tǒng)特性和功能,掌握不同調(diào)度算法下進(jìn)程的調(diào)度、進(jìn)程控制、進(jìn)程調(diào)度與死鎖,并必須掌握作業(yè)管理、存儲(chǔ)器管理、設(shè)備管理和文獻(xiàn)管理的重要原理。加深對(duì)操作系統(tǒng)基本原理理解。⒉合用專業(yè)計(jì)算機(jī)科學(xué)與技術(shù)⒊先修課程C語(yǔ)言程序設(shè)計(jì)、計(jì)算機(jī)組成原理、數(shù)據(jù)結(jié)構(gòu)⒋實(shí)驗(yàn)課時(shí)分派序號(hào)實(shí)驗(yàn)名稱學(xué)時(shí)實(shí)驗(yàn)規(guī)定實(shí)驗(yàn)類型1分析操作系統(tǒng)所面臨的操作需求2必修驗(yàn)證2進(jìn)程管理4必修設(shè)計(jì)3存儲(chǔ)管理4必修設(shè)計(jì)4設(shè)備管理2必修設(shè)計(jì)5文獻(xiàn)管理4必修設(shè)計(jì)⒌實(shí)驗(yàn)環(huán)境有70臺(tái)中檔配置的計(jì)算機(jī)組成的小型局域網(wǎng)的實(shí)驗(yàn)室環(huán)境。計(jì)算機(jī)的具體規(guī)定:(1)Pentium133Hz以上的CPU;(2)建議至少256MB的內(nèi)存;(3)建議硬盤至少2GB,并有1GB空閑空間。(4)安裝Windows操作系統(tǒng)及C語(yǔ)言編譯程序或Linux虛擬環(huán)境。⒍實(shí)驗(yàn)總體規(guī)定培養(yǎng)計(jì)算機(jī)專業(yè)的學(xué)生的系統(tǒng)程序設(shè)計(jì)能力,是操作系統(tǒng)課程的一個(gè)非常重要的環(huán)節(jié)。通過操作系統(tǒng)上機(jī)實(shí)驗(yàn),可以培養(yǎng)學(xué)生程序設(shè)計(jì)的方法和技巧,提高學(xué)生編制清楚、合理、可讀性好的系統(tǒng)程序的能力,加深對(duì)操作系統(tǒng)課程的理解。使學(xué)生更好地掌握操作系統(tǒng)的基本概念、基本原理、及基本功能,具有分析實(shí)際操作系統(tǒng)、設(shè)計(jì)、構(gòu)造和開發(fā)現(xiàn)代操作系統(tǒng)的基本能力。實(shí)驗(yàn)規(guī)定做到:具體描述實(shí)驗(yàn)設(shè)計(jì)思想、程序結(jié)構(gòu)及各模塊設(shè)計(jì)思緒;具體描述程序所用數(shù)據(jù)結(jié)構(gòu)及算法;明確給出測(cè)試用例和實(shí)驗(yàn)結(jié)果;為增長(zhǎng)程序可讀性,在程序中進(jìn)行適當(dāng)注釋說(shuō)明;認(rèn)真進(jìn)行實(shí)驗(yàn)總結(jié),涉及:設(shè)計(jì)中碰到的問題、解決方法與收獲等;實(shí)驗(yàn)報(bào)告撰寫規(guī)定結(jié)構(gòu)清楚、描述準(zhǔn)確邏輯性強(qiáng);實(shí)驗(yàn)過程中,同學(xué)之間可以進(jìn)行討論互相提高,但絕對(duì)嚴(yán)禁抄襲。⒎本實(shí)驗(yàn)的重點(diǎn)、難點(diǎn)及教學(xué)方法建議重點(diǎn):理解進(jìn)程調(diào)度中PCB的設(shè)計(jì),以實(shí)現(xiàn)對(duì)進(jìn)程的調(diào)度。難點(diǎn):進(jìn)程調(diào)度程序的設(shè)計(jì),設(shè)備管理程序的設(shè)計(jì)。教學(xué)方法建議:力爭(zhēng)在本指導(dǎo)書的幫助下,獨(dú)立設(shè)計(jì)程序以加深理解。
實(shí)驗(yàn)一分析操作系統(tǒng)所面臨的操作需求(一)實(shí)驗(yàn)?zāi)康氖箤W(xué)生理解操作系統(tǒng)所面臨的操作需求,掌握操作系統(tǒng)中的進(jìn)程管理、存儲(chǔ)管理、設(shè)備管理和文獻(xiàn)管理等功能。(二)實(shí)驗(yàn)內(nèi)容1.
分析操作系統(tǒng)所面臨的操作需求;2.
熟悉實(shí)驗(yàn)環(huán)境;3.
資料搜集與整理,進(jìn)行實(shí)驗(yàn)的前期準(zhǔn)備。熟悉編程環(huán)境
本課程中的實(shí)驗(yàn)題目既可以在windows下用控制臺(tái)應(yīng)用程序?qū)崿F(xiàn),也可以在linux下用全屏幕程序?qū)崿F(xiàn)。這里我們一方面介紹在windows下用vc++6.0設(shè)計(jì)控制臺(tái)應(yīng)用程序的環(huán)節(jié),然后介紹在linux下用C語(yǔ)言編寫全屏幕程序的環(huán)節(jié)。windows的控制臺(tái)應(yīng)用程序
圖1-1圖1-2圖1-3環(huán)節(jié)1:開機(jī),單擊“開始”按鈕,選擇“程序
->Microsoft
Visual
Studio
6.0->Microsoft
Visual
C++6.0”進(jìn)入Microsoft
Visual
環(huán)節(jié)2:在Microsoft
Visual
C++6.0中,單擊“File”菜單,選擇“New”菜單命令,見圖1-2。
環(huán)節(jié)3:在“Files”選項(xiàng)卡中選擇“C++
Source
File”,見圖1-32.
linux的vi應(yīng)用編程登錄Linux是一個(gè)多用戶多任務(wù)操作系統(tǒng),多個(gè)用戶可以擁有自己獨(dú)立的用戶賬號(hào)登錄提醒:RedHatLinuxrelease6.0(Hedwing)Kernel2.2.5-15onani686Login:此時(shí)輸入用戶戶名(賬號(hào))并鍵入回車,則系統(tǒng)顯示“passward”。在輸入密碼和回車。登錄后:[root@hawk/root]##表達(dá)是按root方式登錄,$表達(dá)是普通用戶。Linux大小寫敏感,用“-”加參數(shù)zlinux:~#ls–FHowTo/HowToMin/linux@nag/sag/獲取幫助:Linux帶有聯(lián)機(jī)手冊(cè),可以用man命令來(lái)閱讀Zlinux:~$manls虛擬終端Linux可有多個(gè)用戶登錄到同一個(gè)計(jì)算機(jī),但一般微機(jī)只有一個(gè)終端難以體現(xiàn)??梢允褂枚鄠€(gè)虛擬終端,用Alt+F1、Alt+F2等來(lái)切換。退出系統(tǒng)在停止使用系統(tǒng)時(shí),要退出系統(tǒng)。具體方法:exit或logout,或Ctrl+D關(guān)機(jī)假如沒有用戶在使用系統(tǒng),可以關(guān)機(jī)。但是不能直接關(guān)閉電源,而要按正常順序關(guān)機(jī)。一般用戶是不能關(guān)機(jī)的,只有root用戶可以關(guān)機(jī)。方法:可以使用halt或shutdown命令,也可以同時(shí)鍵入Ctrl+Alt+Del。Windows虛擬機(jī)環(huán)境:登錄到系統(tǒng)點(diǎn)擊桌面“VMware”圖標(biāo)——>VmwareWorkstation窗口——>Commands——>Startthisvirtualmachine進(jìn)入fedora后,用戶名:root口令:123456使用編輯器vi編輯文獻(xiàn)進(jìn)入linux的文本模式之后,在命令行鍵入vifilename.c然后回車。下面作一些簡(jiǎn)樸的解釋:一方面vi命令是打開vi編輯器。后面的filename.c是用戶即將編輯的c文獻(xiàn)名字,注意擴(kuò)展名字是.c;當(dāng)然,vi編輯器功能很強(qiáng),可以用它來(lái)編輯其它格式的文獻(xiàn),比如匯編文獻(xiàn),其擴(kuò)展名字是.s;也可以直接用vi打開一個(gè)新的未命名的文獻(xiàn),當(dāng)保存的時(shí)候再給它命名,只是這樣做不很方便。最基本的命令I(lǐng):當(dāng)進(jìn)入剛打開的文獻(xiàn)時(shí),不能寫入信息,這時(shí)按一下鍵盤上的I鍵(insert),插入的意思,就可以進(jìn)入編輯模式了。如下圖所示:a與i是相同的用法當(dāng)文獻(xiàn)編輯完后,需要保存退出,這時(shí)需要通過以下幾個(gè)環(huán)節(jié):1)按一下鍵盤上的Esc鍵;2)鍵入冒號(hào)(:),緊跟在冒號(hào)后面是wq(意思是保存并退出)。假如不想保存退出,則在第二步鍵入冒號(hào)之后,鍵入!q(不帶w,機(jī)尾部保存)。如下圖所示:退出vi編輯器的編輯模式之后,要對(duì)剛才編寫的程序進(jìn)行編譯。編譯的命令是:gccfilename.c[-ooutputfilename],其中g(shù)cc是c的編譯器。參數(shù):filename.c是剛才編輯的c文獻(xiàn)(當(dāng)然也可以是以前編寫好的c文獻(xiàn));后面中括號(hào)里面的參數(shù)是可選的,它是一個(gè)輸出文獻(xiàn)。假如不選,默認(rèn)的輸出文獻(xiàn)是a.out,選了之后輸出文獻(xiàn)就是outputfilename.out.最后一步是運(yùn)營(yíng)程序,方法如下:./outputfilename.out
實(shí)驗(yàn)二進(jìn)程管理(一)實(shí)驗(yàn)?zāi)康恼莆张R界區(qū)的概念及臨界區(qū)的設(shè)計(jì)原則;掌握信號(hào)量的概念、PV操作的含義以及應(yīng)用PV操作實(shí)現(xiàn)進(jìn)程的同步與互斥;分析進(jìn)程爭(zhēng)用資源的現(xiàn)象,學(xué)習(xí)解決進(jìn)程互斥的方法;掌握進(jìn)程的狀態(tài)及狀態(tài)轉(zhuǎn)換;掌握常用的進(jìn)程調(diào)度算法。(二)實(shí)驗(yàn)內(nèi)容1.分析進(jìn)程的同步與互斥現(xiàn)象,編程實(shí)現(xiàn)經(jīng)典的進(jìn)程同步問題——生產(chǎn)者消費(fèi)者問題的模擬;2.
編寫允許進(jìn)程并行執(zhí)行的進(jìn)程調(diào)度程序,在常用的進(jìn)程(作業(yè))調(diào)度算法:先來(lái)先服務(wù)算法、短作業(yè)優(yōu)先算法、最高響應(yīng)比優(yōu)先算法、高優(yōu)先權(quán)優(yōu)先算法等調(diào)度算法中至少選擇三種調(diào)度算法進(jìn)行模擬,并輸出平均周轉(zhuǎn)時(shí)間和平均帶權(quán)周轉(zhuǎn)時(shí)間。本實(shí)驗(yàn)涉及內(nèi)容較多,可以在兩個(gè)題目里選擇一個(gè)完畢。編程實(shí)現(xiàn)經(jīng)典的進(jìn)程同步問題——生產(chǎn)者消費(fèi)者問題的模擬模擬實(shí)現(xiàn)用同步機(jī)構(gòu)避免發(fā)生進(jìn)程執(zhí)行時(shí)也許出現(xiàn)的與時(shí)間有關(guān)的錯(cuò)誤。進(jìn)程是程序在一個(gè)數(shù)據(jù)集合上運(yùn)營(yíng)的過程,進(jìn)程是并發(fā)執(zhí)行的,也即系統(tǒng)中的多個(gè)進(jìn)程輪流地占用解決器運(yùn)營(yíng)。我們把若干個(gè)進(jìn)程都能進(jìn)行訪問和修改的那些變量稱為公共變量。由于進(jìn)程是并發(fā)地執(zhí)行的,所以,假如對(duì)進(jìn)程訪問公共變量不加限制,那么就會(huì)產(chǎn)生“與時(shí)間有關(guān)”的錯(cuò)誤,即進(jìn)程執(zhí)行后所得到的結(jié)果與訪問公共變量的時(shí)間有關(guān)。為了防止這類錯(cuò)誤,系統(tǒng)必須要用同步機(jī)構(gòu)來(lái)控制進(jìn)程對(duì)公共變量的訪問。一般說(shuō),同步機(jī)構(gòu)是由若干條原語(yǔ)——同步原語(yǔ)——所組成。本實(shí)驗(yàn)規(guī)定模擬PV操作同步機(jī)構(gòu)的實(shí)現(xiàn),模擬進(jìn)程的并發(fā)執(zhí)行,了解進(jìn)程并發(fā)執(zhí)行時(shí)同步機(jī)構(gòu)的作用。本次用到的數(shù)據(jù)結(jié)構(gòu)知識(shí)如下:typedefstructPcb{ charname[10];//進(jìn)程名 charstate[10];//運(yùn)營(yíng)狀態(tài) charreason[10];//若阻塞,其因素 intbreakp;//斷點(diǎn)保護(hù) structPcb*next;//阻塞時(shí)的順序}Pcb,*link;進(jìn)程名狀態(tài)等待因素?cái)帱c(diǎn)后繼進(jìn)程進(jìn)程控制塊結(jié)構(gòu)定義兩個(gè)進(jìn)程:linkp1;//生產(chǎn)者進(jìn)程,linkc1;//消費(fèi)者進(jìn)程。pc程序計(jì)數(shù)器和linkready;就緒隊(duì)列,linkb_s1;s1阻塞隊(duì)列,linkb_s2;s2阻塞隊(duì)列。實(shí)驗(yàn)指導(dǎo):h頭文獻(xiàn)#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頭文獻(xiàn)//數(shù)據(jù)結(jié)構(gòu)的定義和全局變量typedefstructPcb{ charname[10];//進(jìn)程名 charstate[10];//運(yùn)營(yíng)狀態(tài) charreason[10];//若阻塞,其因素 intbreakp;//斷點(diǎn)保護(hù) structPcb*next;//阻塞時(shí)的順序}Pcb,*link;ints1,s2;//信號(hào)量linkp1;//生產(chǎn)者進(jìn)程linkc1;//消費(fèi)者進(jìn)程charstr[MAX];//輸入的字符串charbuffer[BUF];//緩沖池intlen;//輸入長(zhǎng)度intsp=0;//string的指針intin=0;//生產(chǎn)者指針intout=0;//消費(fèi)者指針chartemp;//供打印的臨時(shí)產(chǎn)品charrec_p[MAX];//生產(chǎn)記錄intrp1=0;//生產(chǎn)記錄指針charrec_c[MAX];//消費(fèi)記錄intrp2=0;//消費(fèi)記錄指針linkready;//就緒隊(duì)列l(wèi)inkb_s1;//s1阻塞隊(duì)列l(wèi)inkb_s2;//s2阻塞隊(duì)列intpc;//程序計(jì)數(shù)器intcount;//字符計(jì)數(shù)器intcon_cnt;//消費(fèi)計(jì)數(shù)器h頭文獻(xiàn)voidinit();//初始化voidp(ints);//P操作voidv(ints);//V操作voidblock(ints);//阻塞函數(shù)voidwakeup(ints);//喚醒函數(shù)voidcontrol();//解決機(jī)調(diào)度voidprocessor();//解決機(jī)執(zhí)行voidprint();//打印函數(shù)voidinit(){//初始化 s1=BUF; s2=0; p1=(link)malloc(sizeof(Pcb));//建立新的結(jié)點(diǎn),并初始化為生產(chǎn)者 strcpy(p1->name,"Producer"); strcpy(p1->state,"Ready"); strcpy(p1->reason,"Null"); p1->breakp=0; p1->next=NULL; c1=(link)malloc(sizeof(Pcb));//建立新的結(jié)點(diǎn),并初始化為消費(fèi)者 strcpy(c1->name,"Consumer"); strcpy(c1->state,"Ready"); strcpy(c1->reason,"Null"); c1->breakp=0; c1->next=NULL; ready=p1; ready->next=c1;//初始化為生產(chǎn)進(jìn)程在前,消費(fèi)進(jìn)程在后 c1->next=NULL; b_s1=NULL; b_s2=NULL;//阻塞進(jìn)程為NULL pc=0; con_cnt=0;//消費(fèi)計(jì)數(shù)器}voidp(ints){ if(s==1){//p(s1) s1--; if(s1<0) block(1);//阻塞當(dāng)前生產(chǎn)進(jìn)程 else{ printf("\t*s1信號(hào)申請(qǐng)成功!\n"); ready->breakp=pc;//保存斷點(diǎn) } } else{//p(s2) s2--; if(s2<0) block(2);//阻塞當(dāng)前消費(fèi)進(jìn)程 else{ printf("\t*s2信號(hào)申請(qǐng)成功!\n"); ready->breakp=pc;//保存斷點(diǎn) } }}voidv(ints){ if(s==1){//v(s1) s1++; if(s1<=0) wakeup(1);//喚醒生產(chǎn)進(jìn)程 ready->breakp=pc;//保存斷點(diǎn) } else{//v(s2) s2++; if(s2<=0) wakeup(2);//喚醒消費(fèi)進(jìn)程 ready->breakp=pc;//保存斷點(diǎn) }}voidblock(ints){//阻塞函數(shù)的定義 linkp; intnum1=0; intnum2=0; if(s==1){//生產(chǎn)進(jìn)程 strcpy(p1->state,"Block");//改變狀態(tài) strcpy(p1->reason,"S1");//說(shuō)明因素 p=b_s1; while(p){ num1++; p=p->next;//p的值為NULL,表達(dá)隊(duì)尾 } if(!b_s1) b_s1=p1; else p=p1; p1->next=NULL; printf("\t*p1生產(chǎn)進(jìn)程阻塞了!\n"); ready->breakp=pc;//保存斷點(diǎn) ready=ready->next;//在就緒隊(duì)列中去掉,指向下一個(gè) num1++; } else{//消費(fèi)進(jìn)程 strcpy(c1->state,"Block"); strcpy(c1->reason,"S2"); p=b_s2; while(p){ num2++; p=p->next;//p的值為NULL,表達(dá)隊(duì)尾 } if(!b_s2) b_s2=c1; else p=c1; ready->breakp=pc;//保存斷點(diǎn) ready=ready->next;//在就緒隊(duì)列中去掉,指向下一個(gè) c1->next=NULL; printf("\t*c1消費(fèi)進(jìn)程阻塞了!\n"); num2++; } printf("\t*阻塞的生產(chǎn)進(jìn)程個(gè)數(shù)為:%d\n",num1); printf("\t*阻塞的消費(fèi)進(jìn)程個(gè)數(shù)為:%d\n",num2);}voidwakeup(ints){//喚醒函數(shù)的定義 linkp; linkq=ready; if(s==1){//喚醒b_s1隊(duì)首進(jìn)程,生產(chǎn)進(jìn)程隊(duì)列 p=b_s1; b_s1=b_s1->next;//阻塞指針指向下一個(gè)阻塞進(jìn)程 strcpy(p->state,"Ready"); strcpy(p->reason,"Null"); while(q)//插入就緒隊(duì)列 q=q->next; q=p; p->next=NULL; printf("\t*p1生產(chǎn)進(jìn)程喚醒了!\n"); } else{//喚醒b_s2隊(duì)首進(jìn)程,消費(fèi)進(jìn)程隊(duì)列 p=b_s2; b_s2=b_s2->next;//阻塞指針指向下一個(gè)阻塞進(jìn)程 strcpy(p->state,"Ready"); strcpy(p->reason,"Null"); while(q->next)//插入就緒隊(duì)列 q=q->next; q->next=p; p->next=NULL; printf("\t*c1消費(fèi)進(jìn)程喚醒了!\n"); }}voidcontrol()//解決器調(diào)度程序{ intrd; intnum=0; linkp=ready;if(ready==NULL)//若無(wú)就緒進(jìn)程,結(jié)束 return; while(p)//記錄就緒進(jìn)程個(gè)數(shù) { num++; p=p->next;//最終p變?yōu)镹ULL } printf("\t*就緒進(jìn)程個(gè)數(shù)為:%d\n",num); time_tt; srand((unsigned)time(&t)); rd=rand()%num;//隨機(jī)函數(shù)產(chǎn)生隨機(jī)數(shù) 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)//當(dāng)前進(jìn)程為生產(chǎn)者 switch(pc) {case0://produce printf("\t*生產(chǎn)者生產(chǎn)了字符%c\n",str[sp]); rec_p[rp1]=str[sp];//添加到生產(chǎn)記錄 sp=(sp+1)%len; pc++; ready->breakp=pc;//保存斷點(diǎn) 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;//保存斷點(diǎn) break; case3://v(s2) pc++; printf("\t*釋放一個(gè)s2信號(hào)\n"); v(2); break; case4://goto01 printf("\t*生產(chǎn)進(jìn)程goto0操作\n"); pc=0; count--;//剩余字符個(gè)數(shù)減1 printf("\t*剩余字符count=%d個(gè)\n",count); ready->breakp=pc;//保存斷點(diǎn) if(count<=0){//生產(chǎn)結(jié)束 printf("\t*生產(chǎn)者結(jié)束生產(chǎn)!\n"); strcpy(p1->state,"Stop"); strcpy(p1->reason,"Null"); ready->breakp=-1; ready=ready->next;//在就緒隊(duì)列中去掉 } } else//當(dāng)前進(jìn)程為消費(fèi)者 switch(pc) { case0://p(s2) pc++; p(2); break; case1://get printf("\t*消費(fèi)者取字符!\n"); temp=buffer[out]; out=(out+1)%BUF; pc++; ready->breakp=pc;//保存斷點(diǎn) break; case2://v(s1) pc++; printf("\t*釋放一個(gè)s1\n"); v(1); break; case3://consume printf("\t*消費(fèi)了字符%c\n",temp); rec_c[rp2]=temp;//添加到消費(fèi)記錄 rp2++; con_cnt++; if(con_cnt>=len){ strcpy(c1->state,"Stop");//完畢態(tài) c1->breakp=-1; return; } pc++; ready->breakp=pc;//保存斷點(diǎn) break; case4://goto0 printf("\t*消費(fèi)進(jìn)程goto0操作\n"); pc=0; ready->breakp=pc;//保存斷點(diǎn) }}voidprint(){ inti,j; printf("生產(chǎn)者消費(fèi)者模擬\n"); printf("*模擬過程的字符串為:\t"); printf("%s\n",&str); printf("*已生產(chǎn):"); 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*已消費(fèi):"); for(j=0;j<=rp2;j++) printf("%c",rec_c[j]); printf("\n進(jìn)程控制塊的信息\n"); printf("進(jìn)程名\t\t狀態(tài)\t等待因素\t斷點(diǎn)\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("*生產(chǎn)者消費(fèi)者模擬\n"); printf("\n"); printf("*請(qǐng)輸入字符串:\n"); scanf("%s",str);//string數(shù)組存放將要產(chǎn)生的字符 len=strlen(str); count=len;//輸入字符的個(gè)數(shù) init();//初始化 while(con_cnt<len)//消費(fèi)完所有的字符為結(jié)束 { system("cls");//清屏操作 printf("模擬指令流程\n"); control();//解決器調(diào)度程序 processor();//模擬解決器指令執(zhí)行 print();//輸出顯示各個(gè)信息 } printf("\n程序結(jié)束!\n");}
進(jìn)程調(diào)度算法模擬進(jìn)程管理是操作系統(tǒng)中的重要功能,用來(lái)創(chuàng)建進(jìn)程、撤消進(jìn)程、實(shí)現(xiàn)進(jìn)程狀態(tài)轉(zhuǎn)換,它提供了在可運(yùn)營(yíng)的進(jìn)程之間復(fù)用CPU的方法。在進(jìn)程管理中,進(jìn)程調(diào)度是核心,由于在采用多道程序設(shè)計(jì)的系統(tǒng)中,往往有若干個(gè)進(jìn)程同時(shí)處在就緒狀態(tài),當(dāng)就緒進(jìn)程個(gè)數(shù)大于解決器數(shù)目時(shí),就必須依照某種策略決定哪些進(jìn)程優(yōu)先占用解決器。本實(shí)驗(yàn)?zāi)M在單解決器情況下的進(jìn)程調(diào)度,目的是加深對(duì)進(jìn)程調(diào)度工作的理解,掌握不同調(diào)度算法的優(yōu)缺陷。設(shè)計(jì)一個(gè)按先來(lái)先服務(wù)、時(shí)間片輪轉(zhuǎn)法、優(yōu)先數(shù)調(diào)度算法實(shí)現(xiàn)解決器調(diào)度的程序。實(shí)驗(yàn)指導(dǎo):#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>typedefstructnode{ charname[10];/*進(jìn)程標(biāo)記符*/ intprio;/*進(jìn)程優(yōu)先數(shù)*/ intround;/*進(jìn)程時(shí)間輪轉(zhuǎn)時(shí)間片*/ intcputime;/*進(jìn)程占用CPU時(shí)間*/ intneedtime;/*進(jìn)程到完畢還要的時(shí)間*/ intarrivetime;/*進(jìn)程到達(dá)時(shí)間*/ intstarttime;/*進(jìn)程開始時(shí)間*/ intfinishtime;/*進(jìn)程完畢時(shí)間*/ intservicetime;/*進(jìn)程服務(wù)時(shí)間*/floatturnaroundtime;/*進(jìn)程周轉(zhuǎn)時(shí)間*/floatweightedturnaroundtime;/*進(jìn)程帶權(quán)周轉(zhuǎn)時(shí)間*/ intcount;/*計(jì)數(shù)器*/ charstate;/*進(jìn)程的狀態(tài)*/ structnode*next;/*鏈指針*/}PCB; PCB*finish,*ready,*tail,*run;/*隊(duì)列指針*/ intN;/*進(jìn)程數(shù)*//*將就緒隊(duì)列中的第一個(gè)進(jìn)程投入運(yùn)營(yíng)*/voidfirstin(){ run=ready;/*就緒隊(duì)列頭指針賦值給運(yùn)營(yíng)頭指針*/ run->state='R';/*進(jìn)程狀態(tài)變?yōu)檫\(yùn)營(yíng)態(tài)*/ ready=ready->next;/*就緒對(duì)列頭指針后移到下一進(jìn)程*/}/*****標(biāo)題輸出函數(shù)*****/voidprt1(chara){ switch(a) { case1:/*優(yōu)先數(shù)法*/ printf("名字進(jìn)程占用CPU時(shí)間進(jìn)程到完畢還要的時(shí)間優(yōu)先級(jí)數(shù)狀態(tài)\n");break; case2:/*時(shí)間片算法*/ printf("名字進(jìn)程占用CPU時(shí)間進(jìn)程到完畢還要的時(shí)間計(jì)數(shù)器時(shí)間片狀態(tài)\n");break; case3:/*先來(lái)先服務(wù)算法*/ printf("名字到達(dá)時(shí)間開始時(shí)間服務(wù)時(shí)間完畢時(shí)間周轉(zhuǎn)時(shí)間帶權(quán)周轉(zhuǎn)時(shí)間狀態(tài)\n");break; default:break; }}/*****進(jìn)程PCB輸出*****/voidprt2(chara,PCB*q){ switch(a) { case1:/*優(yōu)先數(shù)法的輸出*/ printf("%-10s\t%-10d\t%-10d\t%-10d\t%c\n",q->name, q->cputime,q->needtime,q->prio,q->state);break; case2:/*輪轉(zhuǎn)法的輸出*/ printf("%-10s%-20d%-15d%-10d%-10d%-c\n",q->name, q->cputime,q->needtime,q->count,q->round,q->state);break; case3:/*先來(lái)先服務(wù)算法輸出*/ 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; }}/*****輸出函數(shù)*****/voidprt(charalgo){ PCB*p; prt1(algo);/*輸出標(biāo)題*/ if(run!=NULL)/*假如運(yùn)營(yíng)指針不空*/ prt2(algo,run);/*輸出當(dāng)前正在運(yùn)營(yíng)的PCB*/ p=ready;/*輸出就緒隊(duì)列PCB*/ while(p!=NULL){ prt2(algo,p); p=p->next;} p=finish;/*輸出完畢隊(duì)列的PCB*/ while(p!=NULL){ prt2(algo,p); p=p->next;} getch();/*壓任意鍵繼續(xù)*/}/*****優(yōu)先數(shù)的插入算法*****/voidinsert1(PCB*q){ PCB*p1,*s,*r; intb; s=q;/*待插入的PCB指針*/ p1=ready;/*就緒隊(duì)列頭指針*/ r=p1;/*r做p1的前驅(qū)指針*/ b=1;while((p1!=NULL)&&b)/*根據(jù)優(yōu)先數(shù)擬定插入位置*/if(p1->prio>=s->prio){ r=p1; p1=p1->next;}else b=0; if(r!=p1)/*假如條件成立說(shuō)明插入在r與p1之間*/{ r->next=s; s->next=p1;} else{ s->next=p1;/*否則插入在就緒隊(duì)列的頭*/ ready=s;}}/*****輪轉(zhuǎn)法插入函數(shù)*****/voidinsert2(PCB*p2){tail->next=p2;/*將新的PCB插入在當(dāng)前就緒隊(duì)列的尾*/tail=p2;p2->next=NULL;}/*****先來(lái)先服務(wù)插入函數(shù)*****/voidinsert3(PCB*q){ PCB*p1,*s,*r; intb; s=q;/*指針s指向新要插入的進(jìn)程*/ p1=ready;/*指針p1指向本來(lái)的進(jìn)程的對(duì)首*/ r=p1;/*使用指針r指向p1前面的進(jìn)程*/ 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)先數(shù)創(chuàng)建初始PCB信息*****/voidcreate1(charalg){ PCB*p; inti,time; charna[10]; ready=NULL;/*就緒隊(duì)列頭指針*/ finish=NULL;/*完畢隊(duì)列頭指針*/ run=NULL;/*運(yùn)營(yíng)隊(duì)列頭指針*/ printf("請(qǐng)輸入進(jìn)程的名字和運(yùn)營(yíng)所需要的時(shí)間\n");/*輸入進(jìn)程標(biāo)記和所需時(shí)間創(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)/*就緒隊(duì)列不空則調(diào)用插入函數(shù)插入*/ insert1(p); else{ p->next=ready;/*創(chuàng)建就緒隊(duì)列的第一個(gè)PCB*/ ready=p;}} voidclrscr(void); printf("優(yōu)先級(jí)調(diào)度算法模擬輸出結(jié)果:\n"); printf("*******************************************************************\n"); prt(alg);/*輸出進(jìn)程PCB信息*/ run=ready;/*將就緒隊(duì)列的第一個(gè)進(jìn)程投入運(yùn)營(yíng)*/ ready=ready->next; run->state='R';}/*****輪轉(zhuǎn)法創(chuàng)建進(jìn)程PCB*****/voidcreate2(charalg){ PCB*p; inti,time; charna[10]; ready=NULL; finish=NULL; run=NULL; printf("請(qǐng)輸入進(jìn)程的名字和運(yùn)營(yíng)所需要的時(shí)間\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;/*計(jì)數(shù)器*/ p->state='W'; p->round=2;/*時(shí)間片*/ if(ready!=NULL) insert2(p); else{ p->next=ready; ready=p; tail=p;}} voidclrscr(void); printf("時(shí)間片輪轉(zhuǎn)法模擬輸出結(jié)果:\n"); printf("********************************************************************\n"); prt(alg);/*輸出進(jìn)程PCB信息*/ run=ready;/*將就緒隊(duì)列的第一個(gè)進(jìn)程投入運(yùn)營(yíng)*/ ready=ready->next; run->state='R';}/*****先來(lái)先服務(wù)算法創(chuàng)建PCB*****/voidcreate3(charalg){ PCB*p; inti;ready=NULL; run=NULL; finish=NULL; printf("請(qǐng)輸入進(jìn)程的名字、到達(dá)時(shí)間和運(yùn)營(yíng)所需要的時(shí)間\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("先來(lái)先服務(wù)算法模擬輸出結(jié)果:\n"); printf("***************************************************************************\n"); prt(alg); run=ready;/*將就緒隊(duì)列的第一個(gè)進(jìn)程投入運(yùn)營(yíng)*/ ready=ready->next; run->state='R';}/*****優(yōu)先數(shù)調(diào)度算法*****/voidpriority(charalg){while(run!=NULL)/*當(dāng)運(yùn)營(yíng)隊(duì)列不空時(shí),有進(jìn)程正在運(yùn)營(yíng)*/{run->cputime=run->cputime+1;run->needtime=run->needtime-1;run->prio=run->prio-3;/*每運(yùn)營(yíng)一次優(yōu)先數(shù)減少3個(gè)單位*/if(run->needtime==0)/*如所需時(shí)間為0將其插入完畢隊(duì)列*/{run->next=finish;finish=run;run->state='F';/*置狀態(tài)為完畢態(tài)*/run=NULL;/*運(yùn)營(yíng)隊(duì)列頭指針為空*/if(ready!=NULL)/*假如就緒隊(duì)列不空*/firstin();/*將就緒對(duì)列的第一個(gè)進(jìn)程投入運(yùn)營(yíng)*/}else/*沒有運(yùn)營(yíng)完同時(shí)優(yōu)先數(shù)不是最大,則將其變?yōu)榫途w態(tài)插入到就緒隊(duì)列*/if((ready!=NULL)&&(run->prio<ready->prio)){run->state='W';insert1(run);firstin();/*將就緒隊(duì)列的第一個(gè)進(jìn)程投入運(yùn)營(yíng)*/}prt(alg);/*輸出進(jìn)程PCB信息*/}}/*****時(shí)間片輪轉(zhuǎn)法*****/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ùn)營(yíng)完將其變?yōu)橥戤厬B(tài),插入完畢隊(duì)列*/{run->next=finish;finish=run;run->state='F';run=NULL;if(ready!=NULL)firstin();/*就緒對(duì)列不空,將第一個(gè)進(jìn)程投入運(yùn)營(yíng)*/}elseif(run->count==run->round)/*假如時(shí)間片到*/{run->count=0;/*計(jì)數(shù)器置0*/if(ready!=NULL)/*如就緒隊(duì)列不空*/{run->state='W';/*將進(jìn)程插入到就緒隊(duì)列中檔待輪轉(zhuǎn)*/insert2(run);firstin();/*將就緒對(duì)列的第一個(gè)進(jìn)程投入運(yùn)營(yíng)*/}} prt(alg);/*輸出進(jìn)程信息*/}}/*****先來(lái)先服務(wù)調(diào)度算法*****/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); }} /*****主函數(shù)*****/intmain(){charalgo;/*算法標(biāo)記*/voidclrscr(void);charmainmenu;do{ system("cls");/*清屏*/ printf("\n溫馨提醒:為保證您的操作得到預(yù)期效果,請(qǐng)規(guī)范輸入您的信息^_^\n"); printf("\n\n"); printf("\t\t+━━━━━━━━━━━━━━━━━━━━━━━━+\n");printf("\t\t||歡迎進(jìn)入進(jìn)程調(diào)度算法模擬演示系統(tǒng)||\n");printf("\t\t|┗━━━━━━━━━━━━━━━━┛|\n");printf("\t\t||\n");printf("\t\t|●[1]優(yōu)先級(jí)算法演示|\n");printf("\t\t||\n");printf("\t\t|●[2]時(shí)間片輪轉(zhuǎn)算法演示|\n");printf("\t\t||\n");printf("\t\t|●[3]先來(lái)先服務(wù)算法演示|\n");printf("\t\t||\n"); printf("\t\t|●[4]退出系統(tǒng)|\n"); printf("\t\t||\n"); printf("\t\t+━━━━━━━━━━━━━━━━━━━━━━━━+\n");printf("請(qǐng)輸入您的選擇:\n");scanf("%d",&algo);/*輸入字符擬定算法*/ switch(algo) { case1: printf("您選擇的是優(yōu)先級(jí)算法模擬進(jìn)程調(diào)度\n\n"); printf("請(qǐng)輸入進(jìn)程數(shù)目\n"); scanf("%d",&N);/*輸入進(jìn)程數(shù)*/ create1(algo);/*優(yōu)先數(shù)法*/ priority(algo); break; case2: printf("您選擇的是時(shí)間片輪轉(zhuǎn)算法模擬進(jìn)程調(diào)度\n\n"); printf("請(qǐng)輸入進(jìn)程數(shù)目\n"); scanf("%d",&N);/*輸入進(jìn)程數(shù)*/ create2(algo);/*輪轉(zhuǎn)法*/ roundrun(algo); break; case3: printf("您選擇的是先來(lái)先服務(wù)算法模擬進(jìn)程調(diào)度\n\n"); printf("請(qǐng)輸入進(jìn)程數(shù)目\n"); scanf("%d",&N);/*輸入進(jìn)程數(shù)*/ create3(algo); FIFO(algo); break; case4: printf("歡迎您再次使用進(jìn)程調(diào)度算法模擬系統(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;}
實(shí)驗(yàn)三存儲(chǔ)管理(一)實(shí)驗(yàn)?zāi)康恼莆瘴锢韮?nèi)存和虛擬內(nèi)存的基本概念;掌握重定位的基本概念及其要點(diǎn),理解邏輯地址與絕對(duì)地址;掌握各種存儲(chǔ)管理的實(shí)現(xiàn)方法,涉及基本原理、地址變換和缺頁(yè)中斷、主存空間的分派及分派算法;掌握常用淘汰算法。(二)實(shí)驗(yàn)內(nèi)容編寫一個(gè)模擬的動(dòng)態(tài)頁(yè)式存儲(chǔ)管理程序,實(shí)現(xiàn)對(duì)動(dòng)態(tài)頁(yè)式存儲(chǔ)的淘汰算法的模擬(在先進(jìn)先出淘汰算法、最近最少使用淘汰算法、最不經(jīng)常使用淘汰算法三種算法中至少選擇兩種進(jìn)行模擬)并計(jì)算各個(gè)算法的缺頁(yè)率;并且頁(yè)面淘汰算法在淘汰一頁(yè)時(shí),只將該頁(yè)在頁(yè)表中抹去,而不再判斷它是否被改寫過,也不將它寫回到輔存。實(shí)驗(yàn)指導(dǎo):#include<iostream.h>#definen12#definem3intpage[n];//保存需要訪問的頁(yè)面inti,j,q,mem[m]={0},List[m][n],sum;charflag,f[n];voidInit();voidFIFO();voidLRU();voidmain(){ cout<<"*********************實(shí)驗(yàn)***********************"<<endl; cout<<"┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl; cout<<"┃頁(yè)面調(diào)度算法的模擬實(shí)現(xiàn)┃"<<endl; cout<<"┠───────────────────────┨"<<endl; cout<<"┃先進(jìn)先出算法FIFO┃"<<endl; cout<<"┃最近最少使用算法LRU┃"<<endl; cout<<"┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl; cout<<"請(qǐng)輸入頁(yè)面訪問序列:\n"<<""; for(i=0;i<n;i++) cin>>page[i];cout<<endl; FIFO(); Init(); LRU();}voidInit()//初始化函數(shù){ sum=0;//初始化計(jì)算缺頁(yè)次數(shù)的變量 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++)//查頁(yè)表,看是否缺頁(yè) { q=0; while((page[i]!=mem[q])&&(q!=m)) q++; if(q==m) flag='*';//缺頁(yè),則置標(biāo)志flag為'*' else flag=''; if(flag=='*') { for(j=m-1;j>0;j--)//淘汰最先調(diào)入的頁(yè)面調(diào)入當(dāng)前訪問的 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代表為空,*代表有缺頁(yè):\n"; cout<<endl; cout<<"FIFO算法結(jié)果"<<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<<"缺頁(yè)次數(shù)是:"<<sum<<"缺頁(yè)率是:"<<(double)sum/12<<endl;}voidLRU(){ for(i=0;i<n;i++)//查頁(yè)表,看是否缺頁(yè) { q=0; while((page[i]!=mem[q])&&(q!=m)) q++; if(q==m) flag='*';//缺頁(yè),則置標(biāo)志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算法結(jié)果"<<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<<"缺頁(yè)次數(shù)是:"<<sum<<"缺頁(yè)率是:"<<(double)sum/12<<endl;}
實(shí)驗(yàn)四設(shè)備管理(一)實(shí)驗(yàn)?zāi)康恼莆摘?dú)占設(shè)備的使用方式,以及設(shè)備的分派和回收;掌握用死鎖避免方法來(lái)解決申請(qǐng)獨(dú)占設(shè)備也許導(dǎo)致的死鎖。(二)實(shí)驗(yàn)內(nèi)容用死鎖避免方法來(lái)解決申請(qǐng)獨(dú)占設(shè)備也許導(dǎo)致的死鎖,程序?qū)崿F(xiàn)對(duì)銀行家算法的模擬。設(shè)計(jì)五個(gè)進(jìn)程{P0,P1,P2,P3,P4}共享三類資源{A,B,C}的系統(tǒng),{A,B,C}的資源數(shù)量分別為10,5,7。進(jìn)程可動(dòng)態(tài)地申請(qǐng)資源和釋放資源,系統(tǒng)按各進(jìn)程的申請(qǐng)動(dòng)態(tài)地分派資源。規(guī)定程序具有顯示和打印各進(jìn)程的某一時(shí)刻的資源分派表和安全序列;顯示和打印各進(jìn)程依次規(guī)定申請(qǐng)的資源號(hào)以及為某進(jìn)程分派資源后的有關(guān)資源數(shù)據(jù)的情況。實(shí)驗(yàn)指導(dǎo):#include<iostream.h>#include<string.h>#include<stdio.h>#include<iomanip>#definen10#definetrue1#definefalse0intN;//資源總類intM; //總進(jìn)程數(shù)intAvailable[50];intMax[50][50];intAllocation[50][50]={0};intNeed[50][50]={0};intWork[50]={0}; intTemp[50]={0};//存放安全序列號(hào)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<<"請(qǐng)輸入您要?jiǎng)?chuàng)建進(jìn)程的數(shù)量:"<<endl; cin>>M; cout<<"請(qǐng)輸入各類資源的總數(shù):("<<N<<"個(gè))"<<endl; for(i=0;i<N;i++) cin>>Sum[i];k1: cout<<endl; cout<<"請(qǐng)輸入各類進(jìn)程所需要資源最大數(shù)目:("<<N*M<<"個(gè))"<<endl; for(i=0;i<M;i++) for(j=0;j<N;j++) { cin>>Max[i][j]; if(Max[i][j]>Sum[j]) { cout<<"占有資源超過了聲明的該資源總數(shù),請(qǐng)重新輸入!"<<endl; gotok1; } } k2: cout<<endl; cout<<"請(qǐng)輸入各類進(jìn)程已分派的各類資源的數(shù)目:("<<N*M<<"個(gè))"<<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<<"占有資源超過了聲明的該資源總數(shù),請(qǐng)重新輸入!"<<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()//解決傳過來(lái)的第幾個(gè)進(jìn)程{ 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)不安全!!!本次資源申請(qǐng)不成功!!!"<<endl; return-1; } } cout<<"經(jīng)安全性檢查,系統(tǒng)安全,本次分派成功!!"<<endl; cout<<"安全序列號(hào)"; 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<<"請(qǐng)輸入你要請(qǐng)求的資源進(jìn)程號(hào)(0-"<<M-1<<"):"<<endl; cin>>i; cout<<"請(qǐng)輸入進(jìn)程"<<i<<"請(qǐng)求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<<"進(jìn)程"<<i<<"申請(qǐng)的資源大于他需要的資源"; cout<<"分派不合理,不予分派!"<<endl; ch='n'; break; } else if(Request[j]>Available[j]) { cout<<"進(jìn)程"<<i<<"申請(qǐng)的資源大于系統(tǒng)可運(yùn)用的資源"; cout<<"分派犯錯(cuò),不予分派!"<<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<<"請(qǐng)選擇功能號(hào):"<<endl; cin>>c; switch(c) { case1:dijkstra();break; case0:c=0;break; default:cout<<"請(qǐng)對(duì)的選擇功能號(hào)(0--1)"<<endl;break; } } return1;}
實(shí)驗(yàn)五文獻(xiàn)管理(一)實(shí)驗(yàn)?zāi)康恼莆瘴墨I(xiàn)的存取方法;掌握文獻(xiàn)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu);掌握存儲(chǔ)空間的分派和回收;掌握磁盤管理與調(diào)度。(二)實(shí)驗(yàn)內(nèi)容用程序模擬磁盤的調(diào)度過程,并計(jì)算各磁盤調(diào)度算法涉及先來(lái)先服務(wù)算法、最短尋道時(shí)間優(yōu)先算法、掃描算法和循環(huán)掃描算法的平均尋道長(zhǎng)度。本實(shí)驗(yàn)是模擬操作系統(tǒng)的磁盤尋道方式,運(yùn)用磁盤訪問順序的不同來(lái)設(shè)計(jì)磁盤的調(diào)度算法。實(shí)現(xiàn)的磁盤調(diào)度算法有FCFS,SSTF,SCAN,CSCAN和NStepSCAN算法。設(shè)定開始磁道號(hào)尋道范圍,依據(jù)起始掃描磁道號(hào)和最大磁道號(hào)數(shù),隨機(jī)產(chǎn)生要進(jìn)行尋道的磁道號(hào)序列。選擇磁盤調(diào)度算法,顯示該算法的磁道訪問順序,計(jì)算出移動(dòng)的磁道總數(shù)和平均尋道總數(shù)。按算法的尋道效率進(jìn)行排序,并對(duì)各算法的性能進(jìn)行分析比較。實(shí)驗(yàn)指導(dǎo):#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("平均尋道長(zhǎng)度:%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("平均尋道長(zhǎng)度:%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("平均尋道長(zhǎng)度:%f\n",sum*1.0/n);}voidSCAN2(intb[],intn,intk){ inti,j,s,sum=0,p,biaoji; inta[20]; for(i=0;i<n;
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年海洋服務(wù)合作協(xié)議書
- 新型保安服務(wù)模式的探索與創(chuàng)新計(jì)劃
- 班級(jí)經(jīng)驗(yàn)分享會(huì)的開展計(jì)劃
- 培養(yǎng)學(xué)生判斷力與批判性思維計(jì)劃
- 增強(qiáng)圖書館開放日活動(dòng)效果計(jì)劃
- 如何應(yīng)對(duì)財(cái)務(wù)恐懼癥計(jì)劃
- 經(jīng)理績(jī)效目標(biāo)規(guī)劃計(jì)劃
- 美術(shù)欣賞與文化傳播課程大綱計(jì)劃
- 幼兒心理健康關(guān)懷計(jì)劃
- 2025年藝術(shù)表演場(chǎng)館服務(wù)項(xiàng)目建議書
- 特種設(shè)備及重要設(shè)備安全管理制度
- DB3502T052-2019 家政服務(wù)規(guī)范 家庭搬家
- 《自主神經(jīng)系統(tǒng)》課件
- 2025集團(tuán)公司內(nèi)部借款合同范本
- 遼寧省名校聯(lián)盟2025屆高三上學(xué)期1月份聯(lián)合考試語(yǔ)文試題(含答案)
- 2025年山西地質(zhì)集團(tuán)社會(huì)招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2024-2025學(xué)年遼寧省沈陽(yáng)市沈河區(qū)七年級(jí)(上)期末英語(yǔ)試卷(含答案)
- 前牙即刻種植的臨床應(yīng)用
- 2024-2025學(xué)年初中七年級(jí)上學(xué)期數(shù)學(xué)期末綜合卷(人教版)含答案
- 體育活動(dòng)策劃與組織課件
- 公司違規(guī)違紀(jì)連帶處罰制度模版(2篇)
評(píng)論
0/150
提交評(píng)論