操作系統(tǒng)試驗(yàn)參考指導(dǎo)書(shū)完整版_第1頁(yè)
操作系統(tǒng)試驗(yàn)參考指導(dǎo)書(shū)完整版_第2頁(yè)
操作系統(tǒng)試驗(yàn)參考指導(dǎo)書(shū)完整版_第3頁(yè)
操作系統(tǒng)試驗(yàn)參考指導(dǎo)書(shū)完整版_第4頁(yè)
操作系統(tǒng)試驗(yàn)參考指導(dǎo)書(shū)完整版_第5頁(yè)
已閱讀5頁(yè),還剩57頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)書(shū)紹興文理學(xué)院計(jì)算機(jī)系

前言1.實(shí)驗(yàn)總體目的通過(guò)學(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ī)構(gòu)成原理、數(shù)據(jù)構(gòu)造⒋實(shí)驗(yàn)學(xué)時(shí)分派序號(hào)實(shí)驗(yàn)名稱學(xué)時(shí)實(shí)驗(yàn)規(guī)定實(shí)驗(yàn)類(lèi)型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ī)構(gòu)成小型局域網(wǎng)實(shí)驗(yàn)室環(huán)境。計(jì)算機(jī)詳細(xì)規(guī)定:(1)Pentium133Hz以上CPU;(2)建議至少256MB內(nèi)存;(3)建議硬盤(pán)至少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)課程一種非常重要環(huán)節(jié)。通過(guò)操作系統(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)造和開(kāi)發(fā)當(dāng)代操作系統(tǒng)基本能力。實(shí)驗(yàn)規(guī)定做到:詳細(xì)描述實(shí)驗(yàn)設(shè)計(jì)思想、程序構(gòu)造及各模塊設(shè)計(jì)思路;詳細(xì)描述程序所用數(shù)據(jù)構(gòu)造及算法;明確給出測(cè)試用例和實(shí)驗(yàn)成果;為增長(zhǎng)程序可讀性,在程序中進(jìn)行恰當(dāng)注釋闡明;認(rèn)真進(jìn)行實(shí)驗(yàn)總結(jié),涉及:設(shè)計(jì)中遇到問(wèn)題、解決辦法與收獲等;實(shí)驗(yàn)報(bào)告撰寫(xiě)規(guī)定構(gòu)造清晰、描述精確邏輯性強(qiáng);實(shí)驗(yàn)過(guò)程中,同窗之間可以進(jìn)行討論互相提高,但絕對(duì)禁止抄襲。⒎本實(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é)辦法建議:力求在本指引書(shū)協(xié)助下,獨(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)。這里咱們一方面簡(jiǎn)介在windows下用vc++6.0設(shè)計(jì)控制臺(tái)應(yīng)用程序環(huán)節(jié),然后簡(jiǎn)介在linux下用C語(yǔ)言編寫(xiě)全屏幕程序環(huán)節(jié)。windows控制臺(tái)應(yīng)用程序

圖1-1圖1-2圖1-3環(huán)節(jié)1:開(kāi)機(jī),單擊“開(kāi)始”按鈕,選取“程序

->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”菜單命令,見(jiàn)圖1-2。

環(huán)節(jié)3:在“Files”選項(xiàng)卡中選取“C++

Source

File”,見(jiàn)圖1-32.

linuxvi應(yīng)用編程登錄Linux是一種多顧客多任務(wù)操作系統(tǒng),各種顧客可以擁有自己獨(dú)立顧客賬號(hào)登錄提示:RedHatLinuxrelease6.0(Hedwing)Kernel2.2.5-15onani686Login:此時(shí)輸入顧客戶名(賬號(hào))并鍵入回車(chē),則系統(tǒng)顯示“passward”。在輸入密碼和回車(chē)。登錄后:[root@hawk/root]##表達(dá)是按root方式登錄,$表達(dá)是普通顧客。Linux大小寫(xiě)敏感,用“-”加參數(shù)zlinux:~#ls–FHowTo/HowToMin/linux@nag/sag/獲取協(xié)助:Linux帶有聯(lián)機(jī)手冊(cè),可以用man命令來(lái)閱讀Zlinux:~$manls虛擬終端Linux可有各種顧客登錄到同一種計(jì)算機(jī),但普通微機(jī)只有一種終端難以體現(xiàn)。可以使用各種虛擬終端,用Alt+F1、Alt+F2等來(lái)切換。退出系統(tǒng)在停止使用系統(tǒng)時(shí),要退出系統(tǒng)。詳細(xì)辦法:exit或logout,或Ctrl+D關(guān)機(jī)如果沒(méi)有顧客在使用系統(tǒng),可以關(guān)機(jī)。但是不能直接關(guān)閉電源,而要按正常順序關(guān)機(jī)。普通顧客是不能關(guān)機(jī),只有root顧客可以關(guān)機(jī)。辦法:可以使用halt或shutdown命令,也可以同步鍵入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然后回車(chē)。下面作某些簡(jiǎn)樸解釋:一方面vi命令是打開(kāi)vi編輯器。背面filename.c是顧客即將編輯c文獻(xiàn)名字,注意擴(kuò)展名字是.c;固然,vi編輯器功能很強(qiáng),可以用它來(lái)編輯其他格式文獻(xiàn),例如匯編文獻(xiàn),其擴(kuò)展名字是.s;也可以直接用vi打開(kāi)一種新未命名文獻(xiàn),當(dāng)保存時(shí)候再給它命名,只是這樣做不很以便。最基本命令I(lǐng):當(dāng)進(jìn)入剛打開(kāi)文獻(xiàn)時(shí),不能寫(xiě)入信息,這時(shí)按一下鍵盤(pán)上I鍵(insert),插入意思,就可以進(jìn)入編輯模式了。如下圖所示:a與i是相似用法當(dāng)文獻(xiàn)編輯完后,需要保存退出,這時(shí)需要通過(guò)如下幾種環(huán)節(jié):1)按一下鍵盤(pán)上Esc鍵;2)鍵入冒號(hào)(:),緊跟在冒號(hào)背面是wq(意思是保存并退出)。如果不想保存退出,則在第二步鍵入冒號(hào)之后,鍵入!q(不帶w,機(jī)尾部保存)。如下圖所示:退出vi編輯器編輯模式之后,要對(duì)剛才編寫(xiě)程序進(jìn)行編譯。編譯命令是:gccfilename.c[-ooutputfilename],其中g(shù)cc是c編譯器。參數(shù):filename.c是剛才編輯c文獻(xiàn)(固然也可以是此前編寫(xiě)好c文獻(xiàn));背面中括號(hào)里面參數(shù)是可選,它是一種輸出文獻(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ìn)程同步問(wèn)題——生產(chǎn)者消費(fèi)者問(wèn)題模仿;2.

編寫(xiě)容許進(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è)題目里選取一種完畢。編程實(shí)現(xiàn)典型進(jìn)程同步問(wèn)題——生產(chǎn)者消費(fèi)者問(wèn)題模仿模仿實(shí)現(xiàn)用同步機(jī)構(gòu)避免發(fā)生進(jìn)程執(zhí)行時(shí)也許浮現(xiàn)與時(shí)間關(guān)于錯(cuò)誤。進(jìn)程是程序在一種數(shù)據(jù)集合上運(yùn)營(yíng)過(guò)程,進(jìn)程是并發(fā)執(zhí)行,也即系統(tǒng)中各種進(jìn)程輪流地占用解決器運(yùn)營(yíng)。咱們把若干個(gè)進(jìn)程都能進(jìn)行訪問(wèn)和修改那些變量稱為公共變量。由于進(jìn)程是并發(fā)地執(zhí)行,因此,如果對(duì)進(jìn)程訪問(wèn)公共變量不加限制,那么就會(huì)產(chǎn)生“與時(shí)間關(guān)于”錯(cuò)誤,即進(jìn)程執(zhí)行后所得到成果與訪問(wèn)公共變量時(shí)間關(guān)于。為了防止此類(lèi)錯(cuò)誤,系統(tǒng)必要要用同步機(jī)構(gòu)來(lái)控制進(jìn)程對(duì)公共變量訪問(wèn)。普通說(shuō),同步機(jī)構(gòu)是由若干條原語(yǔ)——同步原語(yǔ)——所構(gòu)成。本實(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ù)構(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)程控制塊構(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)指引: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ù)構(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");//闡明因素 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ì)列中去掉,指向下一種 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ì)列中去掉,指向下一種 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;//阻塞指針指向下一種阻塞進(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;//阻塞指針指向下一種阻塞進(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*釋放一種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*釋放一種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("*模仿過(guò)程字符串為:\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ǔ)將要產(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)程同步處在就緒狀態(tài),當(dāng)就緒進(jìn)程個(gè)數(shù)不不大于解決器數(shù)目時(shí),就必要依照某種方略決定哪些進(jìn)程優(yōu)先占用解決器。本實(shí)驗(yàn)?zāi)7略趩谓鉀Q器狀況下進(jìn)程調(diào)度,目是加深對(duì)進(jìn)程調(diào)度工作理解,掌握不同調(diào)度算法優(yōu)缺陷。設(shè)計(jì)一種按先來(lái)先服務(wù)、時(shí)間片輪轉(zhuǎn)法、優(yōu)先數(shù)調(diào)度算法實(shí)現(xiàn)解決器調(diào)度程序。實(shí)驗(yàn)指引:#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)程開(kāi)始時(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ì)列中第一種進(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í)間開(kāi)始時(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)/*依照優(yōu)先數(shù)擬定插入位置*/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;/*否則插入在就緒隊(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ì)列第一種PCB*/ ready=p;}} voidclrscr(void); printf("優(yōu)先級(jí)調(diào)度算法模仿輸出成果:\n"); printf("*******************************************************************\n"); prt(alg);/*輸出進(jìn)程PCB信息*/ run=ready;/*將就緒隊(duì)列第一種進(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)法模仿輸出成果:\n"); printf("********************************************************************\n"); prt(alg);/*輸出進(jìn)程PCB信息*/ run=ready;/*將就緒隊(duì)列第一種進(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ù)算法模仿輸出成果:\n"); printf("***************************************************************************\n"); prt(alg); run=ready;/*將就緒隊(duì)列第一種進(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ì)列第一種進(jìn)程投入運(yùn)營(yíng)*/}else/*沒(méi)有運(yùn)營(yíng)完同步優(yōu)先數(shù)不是最大,則將其變?yōu)榫途w態(tài)插入到就緒隊(duì)列*/if((ready!=NULL)&&(run->prio<ready->prio)){run->state='W';insert1(run);firstin();/*將就緒隊(duì)列第一種進(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ì)列不空,將第一種進(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ì)列第一種進(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)容編寫(xiě)一種模仿動(dòng)態(tài)頁(yè)式存儲(chǔ)管理程序,實(shí)現(xiàn)對(duì)動(dòng)態(tài)頁(yè)式存儲(chǔ)裁減算法模仿(在先進(jìn)先出裁減算法、近來(lái)至少使用裁減算法、最不經(jīng)常使用裁減算法三種算法中至少選取兩種進(jìn)行模仿)并計(jì)算各個(gè)算法缺頁(yè)率;并且頁(yè)面裁減算法在裁減一頁(yè)時(shí),只將該頁(yè)在頁(yè)表中抹去,而不再判斷它與否被改寫(xiě)過(guò),也不將它寫(xiě)回到輔存。實(shí)驗(yàn)指引:#include<iostream.h>#definen12#definem3intpage[n];//保存需要訪問(wè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<<"┃近來(lái)至少使用算法LRU┃"<<endl; cout<<"┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl; cout<<"請(qǐng)輸入頁(yè)面訪問(wèn)序列:\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)前訪問(wèn) 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算法成果"<<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算法成果"<<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}共享三類(lèi)資源{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)指引:#include<iostream.h>#include<string.h>#include<stdio.h>#include<iomanip>#definen10#definetrue1#definefalse0intN;//資源總類(lèi)intM; //總進(jìn)程數(shù)intAvailable[50];intMax[50][50];intAllocation[50][50]={0};intNeed[50][50]={0};intWork[50]={0}; intTemp[50]={0};//存儲(chǔ)安全序列號(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)輸入各類(lèi)資源總數(shù):("<<N<<"個(gè))"<<endl; for(i=0;i<N;i++) cin>>Sum[i];k1: cout<<endl; cout<<"請(qǐng)輸入各類(lèi)進(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<<"占有資源超過(guò)了聲明該資源總數(shù),請(qǐng)重新輸入!"<<endl; gotok1; } } k2: cout<<endl; cout<<"請(qǐng)輸入各類(lèi)進(jìn)程已分派各類(lèi)資源數(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<<"占有資源超過(guò)了聲明該資源總數(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()//解決傳過(guò)來(lái)第幾種進(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)輸入你要祈求資源進(jìn)程號(hào)(0-"<<M-1<<"):"<<endl; cin>>i; cout<<"請(qǐng)輸入進(jìn)程"<<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<<"進(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離開(kāi)"<<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)邏輯構(gòu)造和物理構(gòu)造;掌握存儲(chǔ)空間分派和回收;掌握磁盤(pán)管理與調(diào)度。(二)實(shí)驗(yàn)內(nèi)容用程序模仿磁盤(pán)調(diào)度過(guò)程,并計(jì)算各磁盤(pán)調(diào)度算法涉及先來(lái)先服務(wù)算法、最短尋道時(shí)間優(yōu)先算法、掃描算法和循環(huán)掃描算法平均尋道長(zhǎng)度。本實(shí)驗(yàn)是模仿操作系統(tǒng)磁盤(pán)尋道方式,運(yùn)用磁盤(pán)訪問(wèn)順序不同來(lái)設(shè)計(jì)磁盤(pán)調(diào)度算法。實(shí)現(xiàn)磁盤(pán)調(diào)度算法有FCFS,SSTF,SCAN,CSCAN和NStepSCAN算法。設(shè)定開(kāi)始磁道號(hào)尋道范疇,根據(jù)起始掃描磁道號(hào)和最大磁道號(hào)數(shù),隨機(jī)產(chǎn)生要進(jìn)行尋道磁道號(hào)序列。選取磁盤(pán)調(diào)度算法,顯示該算法磁道訪問(wèn)順序,計(jì)算出移動(dòng)磁道總數(shù)和平均尋道總數(shù)。按算法尋道效率進(jìn)行排序,并對(duì)各算法性能進(jìn)行分析比較。實(shí)驗(yàn)指引:#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次訪問(wèn)磁道:%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次訪問(wèn)磁道:%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次訪問(wèn)磁道:%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次訪問(wèn)磁道:%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;i++)

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論