《操作系統(tǒng)》實(shí)驗(yàn)指導(dǎo)書2022_第1頁(yè)
《操作系統(tǒng)》實(shí)驗(yàn)指導(dǎo)書2022_第2頁(yè)
《操作系統(tǒng)》實(shí)驗(yàn)指導(dǎo)書2022_第3頁(yè)
《操作系統(tǒng)》實(shí)驗(yàn)指導(dǎo)書2022_第4頁(yè)
《操作系統(tǒng)》實(shí)驗(yàn)指導(dǎo)書2022_第5頁(yè)
已閱讀5頁(yè),還剩37頁(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)介

1、?操作系統(tǒng)?實(shí) 驗(yàn) 指 導(dǎo) 書 紹興文理學(xué)院計(jì)算機(jī)系 前 言1實(shí)驗(yàn)總體目標(biāo)通過(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è)備管理和文件管理的主要原理。加深對(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)要求實(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文件管理4必修設(shè)計(jì) 實(shí)驗(yàn)環(huán)境有70臺(tái)中等配置的計(jì)算機(jī)組成的小型局域網(wǎng)的實(shí)驗(yàn)室環(huán)境。計(jì)算機(jī)

2、的具體要求:(1)Pentium 133Hz以上的CPU;(2)建議至少256MB的內(nèi)存;(3)建議硬盤至少2GB,并有1GB空閑空間。(4)安裝Windows操作系統(tǒng)及C語(yǔ)言編譯程序或Linux虛擬環(huán)境。 實(shí)驗(yàn)總體要求培養(yǎng)計(jì)算機(jī)專業(yè)的學(xué)生的系統(tǒng)程序設(shè)計(jì)能力,是操作系統(tǒng)課程的一個(gè)非常重要的環(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)造和開發(fā)現(xiàn)代操作系統(tǒng)的根本能力。實(shí)驗(yàn)要求做到:1) 詳細(xì)描述實(shí)驗(yàn)設(shè)計(jì)思想、程序結(jié)構(gòu)及

3、各模塊設(shè)計(jì)思路;2) 詳細(xì)描述程序所用數(shù)據(jù)結(jié)構(gòu)及算法;3) 明確給出測(cè)試用例和實(shí)驗(yàn)結(jié)果;4) 為增加程序可讀性,在程序中進(jìn)行適當(dāng)注釋說(shuō)明;5) 認(rèn)真進(jìn)行實(shí)驗(yàn)總結(jié),包括:設(shè)計(jì)中遇到的問(wèn)題、解決方法與收獲等;6) 實(shí)驗(yàn)報(bào)告撰寫要求結(jié)構(gòu)清晰、描述準(zhǔn)確邏輯性強(qiáng);7) 實(shí)驗(yàn)過(guò)程中,同學(xué)之間可以進(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é)方法建議:力爭(zhēng)在本指導(dǎo)書的幫助下,獨(dú)立設(shè)計(jì)程序以加深理解。實(shí)驗(yàn)一 分析操作系統(tǒng)所面臨的操作需求一實(shí)驗(yàn)?zāi)康氖箤W(xué)生理解操作系統(tǒng)所面臨的操作需求,掌握

4、操作系統(tǒng)中的進(jìn)程管理、存儲(chǔ)管理、設(shè)備管理和文件管理等功能。二實(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)用程序的步驟,然后介紹在linux下用C語(yǔ)言編寫全屏幕程序的步驟。1. windows的控制臺(tái)應(yīng)用程序  圖1-1 圖1-2圖1-3步驟1:開機(jī),單擊“開始按鈕,選擇“程序

5、 ->Microsoft Visual Studio 6.0->Microsoft Visual C+6.0”進(jìn)入Microsoft Visual C+6.0。見圖1-1。步驟2:在Microsoft Visual C+6.0中,單擊“File菜單,選擇“New菜單命令,見圖1-2。 步驟3:在“Files選項(xiàng)卡中選擇“C+ Source File,見圖1-32. linux的vi應(yīng)用編程登錄 Linux是一個(gè)多用戶多任務(wù)操作系統(tǒng),多個(gè)用戶可以

6、擁有自己獨(dú)立的用戶賬號(hào)登錄提示: Red Hat Linux release 6.0 (Hedwing) Kernel -15 on an i686 Login:此時(shí)輸入用戶戶名賬號(hào)并鍵入回車,那么系統(tǒng)顯示“passward。在輸入密碼和回車。登錄后:roothawk/root#表示是按root方式登錄,$表示是普通用戶。Linux大小寫敏感,用“-加參數(shù)zlinux:# ls FHowTo/ HowToMin/ linux nag/ sag/獲取幫助:Linux帶有聯(lián)機(jī)手冊(cè),可以用man命令來(lái)閱讀 Zlinux:$ man ls虛擬終端 Linux可有多個(gè)用戶登錄到同一個(gè)計(jì)算機(jī),但一般微機(jī)只

7、有一個(gè)終端難以表達(dá)??梢允褂枚鄠€(gè)虛擬終端,用Alt+F1、 Alt+F2等來(lái)切換。退出系統(tǒng) 在停止使用系統(tǒng)時(shí),要退出系統(tǒng)。具體方法: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命令,也可以同時(shí)鍵入Ctrl+Alt+Del。Windows 虛擬機(jī)環(huán)境:登錄到系統(tǒng)點(diǎn)擊桌面“VMware圖標(biāo)> Vmware Workstation窗口>Commands>Start this virtual machine進(jìn)入fedora

8、后,用戶名:root 口 令:123456使用編輯器vi 編輯文件1. 進(jìn)入linux的文本模式之后,在命令行鍵入vi filename.c 然后回車。下面作一些簡(jiǎn)單的解釋:首先vi命令是翻開vi編輯器。后面的filename.c是用戶即將編輯的c文件名字,注意擴(kuò)展名字是.c;當(dāng)然,vi編輯器功能很強(qiáng),可以用它來(lái)編輯其它格式的文件,比方匯編文件,其擴(kuò)展名字是.s;也可以直接用vi翻開一個(gè)新的未命名的文件,當(dāng)保存的時(shí)候再給它命名,只是這樣做不很方便。2. 最根本的命令I(lǐng) :當(dāng)進(jìn)入剛翻開的文件時(shí),不能寫入信息,這時(shí)按一下鍵盤上的I鍵insert,插入的意思,就可以進(jìn)入編輯模式了。如下列圖所示: 3

9、. a與i是相同的用法4. 當(dāng)文件編輯完后,需要保存退出,這時(shí)需要經(jīng)過(guò)以下幾個(gè)步驟:1按一下鍵盤上的Esc 鍵;2鍵入冒號(hào)(:),緊跟在冒號(hào)后面是wq意思是保存并退出。如果不想保存退出,那么在第二步鍵入冒號(hào)之后,鍵入!q不帶w,機(jī)尾部保存。如下列圖所示:5. 退出vi編輯器的編輯模式之后,要對(duì)剛剛編寫的程序進(jìn)行編譯。編譯的命令是:gcc filename.c -o outputfilename,其中g(shù)cc是c的編譯器。參數(shù):filename.c 是剛剛編輯的c 文件當(dāng)然也可以是以前編寫好的c文件;后面中括號(hào)里面的參數(shù)是可選的,它是一個(gè)輸出文件。如果不選,默認(rèn)的輸出文件是a.out ,選了之后輸

10、出文件就是outputfilename.out6. 最后一步是運(yùn)行程序,方法如下:./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)程同步問(wèn)題生產(chǎn)者消費(fèi)者問(wèn)題的模擬;2 編寫允許進(jìn)程并行執(zhí)行的進(jìn)程調(diào)度程序,在常用的進(jìn)程作業(yè)調(diào)度算法:先來(lái)先效勞算法、短作業(yè)優(yōu)先算法、最高響應(yīng)比優(yōu)先算法、高優(yōu)先權(quán)優(yōu)先算法等調(diào)度算法中至

11、少選擇三種調(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)程同步問(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)程是程序在一個(gè)數(shù)據(jù)集合上運(yùn)行的過(guò)程,進(jìn)程是并發(fā)執(zhí)行的,也即系統(tǒng)中的多個(gè)進(jìn)程輪流地占用處理器運(yùn)行。我們把假設(shè)干個(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í)行后所得到的結(jié)果與訪問(wèn)公共變量的時(shí)間有關(guān)。為了防止這類錯(cuò)誤,系統(tǒng)必須要用同步機(jī)構(gòu)來(lái)控制進(jìn)程對(duì)公共變量的訪問(wèn)。一般

12、說(shuō),同步機(jī)構(gòu)是由假設(shè)干條原語(yǔ)同步原語(yǔ)所組成。本實(shí)驗(yàn)要求模擬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í)如下: typedef struct Pcb char name10; /進(jìn)程名char state10; /運(yùn)行狀態(tài)char reason10; /假設(shè)阻塞,其原因int breakp; /斷點(diǎn)保護(hù)struct Pcb *next; /阻塞時(shí)的順序 Pcb,*link; 進(jìn)程名狀態(tài)等待原因斷點(diǎn)后繼進(jìn)程 進(jìn)程控制塊結(jié)構(gòu)定義兩個(gè)進(jìn)程: link p1;/生產(chǎn)者進(jìn)程,link c1;/消費(fèi)者進(jìn)程。pc程序計(jì)數(shù)器和link ready; 就緒隊(duì)

13、列,link b_s1; s1阻塞隊(duì)列,link b_s2; s2阻塞隊(duì)列。實(shí)驗(yàn)指導(dǎo):a. 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() */ #in

14、clude<math.h> /* floor(),ceil(),abs() */ #include<process.h> /* exit() */ #include <iostream> using namespace std; #include <time.h> #define BUF 10 /緩存的大小 #define MAX 20 /最大可以輸入的字符b. h頭文件/數(shù)據(jù)結(jié)構(gòu)的定義和全局變量typedef struct Pcb char name10; /進(jìn)程名char state10; /運(yùn)行狀態(tài)char reason10; /假設(shè)阻塞,

15、其原因int breakp; /斷點(diǎn)保護(hù)struct Pcb *next; /阻塞時(shí)的順序Pcb,*link;int s1,s2; /信號(hào)量link p1;/生產(chǎn)者進(jìn)程link c1;/消費(fèi)者進(jìn)程char strMAX; /輸入的字符串char bufferBUF; /緩沖池int len; /輸入長(zhǎng)度int sp=0; /string的指針int in=0; /生產(chǎn)者指針int out=0; /消費(fèi)者指針char temp; /供打印的臨時(shí)產(chǎn)品char rec_pMAX;/生產(chǎn)記錄int rp1=0;/生產(chǎn)記錄指針char rec_cMAX;/消費(fèi)記錄int rp2=0;/消費(fèi)記錄指針lin

16、k ready; /就緒隊(duì)列l(wèi)ink b_s1; /s1阻塞隊(duì)列l(wèi)ink b_s2; /s2阻塞隊(duì)列int pc; /程序計(jì)數(shù)器int count; /字符計(jì)數(shù)器int con_cnt; /消費(fèi)計(jì)數(shù)器c. h頭文件void init(); /初始化void p(int s); /P操作void v(int s); /V操作void block(int s);/阻塞函數(shù)void wakeup(int s);/喚醒函數(shù)void control(); /處理機(jī)調(diào)度void processor();/處理機(jī)執(zhí)行void print(); /打印函數(shù)void init() /初始化s1=BUF;s2=0

17、;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->stat

18、e,"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)程為NULLpc=0;con_cnt=0; /消費(fèi)計(jì)數(shù)器void p(int s)if(s=1) /p(s1)s1-;if(s1<0) block(1); /阻塞當(dāng)前生產(chǎn)進(jìn)程elseprintf("t* s1信號(hào)申請(qǐng)成功!n&

19、quot;);ready->breakp=pc; /保存斷點(diǎn)else /p(s2)s2-;if(s2<0) block(2);/阻塞當(dāng)前消費(fèi)進(jìn)程elseprintf("t* s2信號(hào)申請(qǐng)成功!n");ready->breakp=pc; /保存斷點(diǎn)void v(int s)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)

20、void block(int s)/阻塞函數(shù)的定義link p;int num1=0;int num2=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,表示隊(duì)尾if(!b_s1)b_s1=p1;elsep=p1;p1->next=NULL;printf("t* p1生產(chǎn)進(jìn)程阻塞了!n");ready->breakp=pc; /

21、保存斷點(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,表示隊(duì)尾if(!b_s2)b_s2=c1;elsep=c1;ready->breakp=pc; /保存斷點(diǎn)ready=ready->next;/在就緒隊(duì)列中去掉,指向下一個(gè)c1->next=NULL;printf("t*

22、c1消費(fèi)進(jìn)程阻塞了!n");num2+;printf("t* 阻塞的生產(chǎn)進(jìn)程個(gè)數(shù)為:%dn",num1);printf("t* 阻塞的消費(fèi)進(jìn)程個(gè)數(shù)為:%dn",num2);void wakeup(int s)/喚醒函數(shù)的定義link p;link q=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");w

23、hile(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("

24、t* c1消費(fèi)進(jìn)程喚醒了!n");void control() /處理器調(diào)度程序int rd;int num=0;link p=ready; if(ready=NULL) /假設(shè)無(wú)就緒進(jìn)程,結(jié)束return;while(p) /統(tǒng)計(jì)就緒進(jìn)程個(gè)數(shù)num+;p=p->next;/最終p變?yōu)镹ULLprintf("t* 就緒進(jìn)程個(gè)數(shù)為:%dn",num);time_t t; srand(unsigned) time(&t);rd=rand()%num;/隨機(jī)函數(shù)產(chǎn)生隨機(jī)數(shù)if(rd=1)p=ready;ready=ready->next;ready-

25、>next=p;p->next=NULL;strcpy(ready->state,"Run");strcpy(ready->next->state,"Ready");else strcpy(ready->state,"Run");pc=ready->breakp;void processor() /模擬處理器指令執(zhí)行if(strcmp(ready->name,"Producer")=0) /當(dāng)前進(jìn)程為生產(chǎn)者switch(pc) case 0:/produceprint

26、f("t* 生產(chǎn)者生產(chǎn)了字符%cn",strsp);rec_prp1=strsp;/添加到生產(chǎn)記錄 sp=(sp+1)%len;pc+;ready->breakp=pc; /保存斷點(diǎn)break;case 1: /p(s1)pc+;p(1);break;case 2: /putbufferin=rec_prp1; /放到緩沖區(qū)printf("t* %c字符成功入駐空緩存!n",bufferin);rp1+; in=(in+1)%BUF;pc+;ready->breakp=pc; /保存斷點(diǎn)break;case 3: /v(s2)pc+;prin

27、tf("t* 釋放一個(gè)s2信號(hào)n");v(2);break;case 4:/goto01 printf("t* 生產(chǎn)進(jìn)程goto 0 操作n");pc=0;count-; /剩余字符個(gè)數(shù)減1printf("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,&q

28、uot;Null");ready->breakp=-1;ready=ready->next;/在就緒隊(duì)列中去掉 else /當(dāng)前進(jìn)程為消費(fèi)者switch(pc)case 0: /p(s2)pc+;p(2); break;case 1: /getprintf("t* 消費(fèi)者取字符!n");temp=bufferout;out=(out+1)%BUF;pc+;ready->breakp=pc; /保存斷點(diǎn)break;case 2: /v(s1)pc+;printf("t* 釋放一個(gè)s1n");v(1);break;case 3:

29、/consumeprintf("t* 消費(fèi)了字符%cn",temp);rec_crp2=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;case 4: /goto0printf("t* 消費(fèi)進(jìn)程goto 0 操作n");pc=0;ready->breakp=pc; /保存斷點(diǎn)void print()int

30、 i,j;printf("-生產(chǎn)者消費(fèi)者模擬-n");printf("* 模擬過(guò)程的字符串為:t");printf("%sn",&str);printf("* 已生產(chǎn):");for(j=0;j<=rp1;j+)printf("%c",rec_pj);printf("n* 空緩存:");for(j=rp2;j<=rp1;j+)printf("%c",bufferj);printf("n* 已消費(fèi):");for(j=0;

31、j<=rp2;j+)printf("%c",rec_cj);printf("n-進(jìn)程控制塊的信息-n");printf("進(jìn)程名tt狀態(tài)t等待原因t斷點(diǎn)n");printf("%st%st%stt%dnn",p1->name,p1->state,p1->reason,p1->breakp);printf("%st%st%stt%dn",c1->name,c1->state,c1->reason,c1->breakp);printf("

32、;-n");printf("1.繼續(xù) 0.退出n");scanf("%d",&i);if(i=0)exit(0);主程序#include "a.h"#include "b.h"#include "c.h"void main()printf("*生產(chǎn)者消費(fèi)者模擬n");printf("-n");printf("*請(qǐng)輸入字符串:n");scanf("%s",str); /string數(shù)組存放將要產(chǎn)生的字

33、符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)行的進(jìn)程之間復(fù)用CPU的方法。在進(jìn)程

34、管理中,進(jìn)程調(diào)度是核心,因?yàn)樵诓捎枚嗟莱绦蛟O(shè)計(jì)的系統(tǒng)中,往往有假設(shè)干個(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)缺點(diǎn)。設(shè)計(jì)一個(gè)按先來(lái)先效勞、時(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> typedef struct node char nam

35、e10; /*進(jìn)程標(biāo)識(shí)符*/ int prio; /*進(jìn)程優(yōu)先數(shù)*/ int round; /*進(jìn)程時(shí)間輪轉(zhuǎn)時(shí)間片*/ int cputime; /*進(jìn)程占用CPU時(shí)間*/ int needtime; /*進(jìn)程到完成還要的時(shí)間*/int arrivetime; /*進(jìn)程到達(dá)時(shí)間*/int starttime; /*進(jìn)程開始時(shí)間*/int finishtime; /*進(jìn)程完成時(shí)間*/int servicetime; /*進(jìn)程效勞時(shí)間*/ float turnaroundtime; /*進(jìn)程周轉(zhuǎn)時(shí)間*/ float weightedturnaroundtime; /*進(jìn)程帶權(quán)周轉(zhuǎn)時(shí)間*/int c

36、ount; /*計(jì)數(shù)器*/ char state; /*進(jìn)程的狀態(tài)*/ struct node *next; /*鏈指針*/ PCB; PCB *finish,*ready,*tail,*run; /*隊(duì)列指針*/ int N; /*進(jìn)程數(shù)*/*將就緒隊(duì)列中的第一個(gè)進(jìn)程投入運(yùn)行*/ void firstin() run=ready; /*就緒隊(duì)列頭指針賦值給運(yùn)行頭指針*/ run->state='R' /*進(jìn)程狀態(tài)變?yōu)檫\(yùn)行態(tài)*/ ready=ready->next; /*就緒對(duì)列頭指針后移到下一進(jìn)程*/ /*標(biāo)題輸出函數(shù)*/ void prt1(char a) sw

37、itch(a)case 1: /*優(yōu)先數(shù)法*/ printf("名字 進(jìn)程占用CPU時(shí)間 進(jìn)程到完成還要的時(shí)間 優(yōu)先級(jí)數(shù) 狀態(tài)n");break; case 2: /*時(shí)間片算法*/ printf("名字 進(jìn)程占用CPU時(shí)間 進(jìn)程到完成還要的時(shí)間 計(jì)數(shù)器 時(shí)間片 狀態(tài)n");break;case 3: /*先來(lái)先效勞算法*/printf("名字 到達(dá)時(shí)間 開始時(shí)間 效勞時(shí)間 完成時(shí)間 周轉(zhuǎn)時(shí)間 帶權(quán)周轉(zhuǎn)時(shí)間 狀態(tài)n");break;default:break; /*進(jìn)程PCB輸出*/void prt2(char a,PCB *q) s

38、witch(a)case 1: /*優(yōu)先數(shù)法的輸出*/ printf("%-10st%-10dt%-10dt%-10dt%cn",q->name, q->cputime,q->needtime,q->prio,q->state);break; case 2:/*輪轉(zhuǎn)法的輸出*/ printf("%-10s%-20d%-15d%-10d%-10d%-cn",q->name, q->cputime,q->needtime,q->count,q->round,q->state);break;ca

39、se 3:/*先來(lái)先效勞算法輸出*/printf("%s%10d%10d%10d%10d%10.1f%10.2ftt%cn",q->name,q->arrivetime,q->starttime,q->servicetime,q->finishtime,q->turnaroundtime,q->weightedturnaroundtime,q->state);break;default:break; /*輸出函數(shù)*/ void prt(char algo) PCB *p; prt1(algo); /*輸出標(biāo)題*/ if(run

40、!=NULL) /*如果運(yùn)行指針不空*/ prt2(algo,run); /*輸出當(dāng)前正在運(yùn)行的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ù)的插入算法*/ void insert1(PCB *q) PCB *p1,*s,*r; int b; s=q; /*待插入的PCB指針*/ p1=ready; /*就緒隊(duì)列頭

41、指針*/ 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ù)*/ void insert2(PCB *p2) tail->next=p2; /*將新

42、的PCB插入在當(dāng)前就緒隊(duì)列的尾*/ tail=p2; p2->next=NULL; /*先來(lái)先效勞插入函數(shù)*/void insert3(PCB *q)PCB *p1,*s,*r;int b;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;elseb=0;if(r!=p1)r->next=s;s->

43、next=p1;elses->next=p1;ready=s; /*優(yōu)先數(shù)創(chuàng)立初始PCB信息*/ void create1(char alg) PCB *p; int i,time; char na10; ready=NULL; /*就緒隊(duì)列頭指針*/ finish=NULL; /*完成隊(duì)列頭指針*/ run=NULL; /*運(yùn)行隊(duì)列頭指針*/ printf("請(qǐng)輸入進(jìn)程的名字和運(yùn)行所需要的時(shí)間n"); /*輸入進(jìn)程標(biāo)識(shí)和所需時(shí)間創(chuàng)立PCB*/ for(i=1;i<=N;i+) p=(PCB *)malloc(sizeof(PCB); scanf("%

44、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; void clrscr(void);printf(" 優(yōu)先級(jí)調(diào)度算法模擬輸出結(jié)果:n&qu

45、ot;); printf("*n"); prt(alg); /*輸出進(jìn)程PCB信息*/ run=ready; /*將就緒隊(duì)列的第一個(gè)進(jìn)程投入運(yùn)行*/ ready=ready->next; run->state='R' /*輪轉(zhuǎn)法創(chuàng)立進(jìn)程PCB*/ void create2(char alg) PCB *p; int i,time; char na10; ready=NULL; finish=NULL; run=NULL; printf("請(qǐng)輸入進(jìn)程的名字和運(yùn)行所需要的時(shí)間n"); for(i=1;i<=N;i+) p=(

46、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; void clrscr(void

47、);printf(" 時(shí)間片輪轉(zhuǎn)法模擬輸出結(jié)果:n"); printf("*n"); prt(alg); /*輸出進(jìn)程PCB信息*/ run=ready; /*將就緒隊(duì)列的第一個(gè)進(jìn)程投入運(yùn)行*/ ready=ready->next; run->state='R' /*先來(lái)先效勞算法創(chuàng)立PCB*/void create3(char alg)PCB *p;int i; ready=NULL;run=NULL;finish=NULL;printf("請(qǐng)輸入進(jìn)程的名字、到達(dá)時(shí)間和運(yùn)行所需要的時(shí)間n");for(i=

48、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)inse

49、rt3(p);elsep->next=ready;ready=p;void clrscr(void);printf(" 先來(lái)先效勞算法模擬輸出結(jié)果:n");printf("*n");prt(alg);run=ready; /*將就緒隊(duì)列的第一個(gè)進(jìn)程投入運(yùn)行*/ ready=ready->next; run->state='R'/*優(yōu)先數(shù)調(diào)度算法*/ void priority(char alg) while(run!=NULL) /*當(dāng)運(yùn)行隊(duì)列不空時(shí),有進(jìn)程正在運(yùn)行*/ run->cputime=run->c

50、putime+1; run->needtime=run->needtime-1; run->prio=run->prio-3; /*每運(yùn)行一次優(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)行隊(duì)列頭指針為空*/ if(ready!=NULL) /*如果就緒隊(duì)列不空*/ firstin(); /*將就緒對(duì)列的第一個(gè)進(jìn)程投入運(yùn)行*/ else /*沒(méi)有運(yùn)行完同時(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)程投入

溫馨提示

  • 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)論