




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、?操作系統(tǒng)?實 驗 指 導 書 紹興文理學院計算機系 前 言1實驗總體目標通過學生自己動手設計實驗驗證理論知識,使學生掌握操作系統(tǒng)特征和功能,掌握不同調度算法下進程的調度、進程控制、進程調度與死鎖,并必須掌握作業(yè)管理、存儲器管理、設備管理和文件管理的主要原理。加深對操作系統(tǒng)根本原理理解。 適用專業(yè)計算機科學與技術 先修課程C語言程序設計、計算機組成原理、數(shù)據(jù)結構 實驗課時分配序號實驗名稱學時實驗要求實驗類型1分析操作系統(tǒng)所面臨的操作需求2必修驗證2進程管理4必修設計3存儲管理4必修設計4設備管理2必修設計5文件管理4必修設計 實驗環(huán)境有70臺中等配置的計算機組成的小型局域網的實驗室環(huán)境。計算機
2、的具體要求:(1)Pentium 133Hz以上的CPU;(2)建議至少256MB的內存;(3)建議硬盤至少2GB,并有1GB空閑空間。(4)安裝Windows操作系統(tǒng)及C語言編譯程序或Linux虛擬環(huán)境。 實驗總體要求培養(yǎng)計算機專業(yè)的學生的系統(tǒng)程序設計能力,是操作系統(tǒng)課程的一個非常重要的環(huán)節(jié)。通過操作系統(tǒng)上機實驗,可以培養(yǎng)學生程序設計的方法和技巧,提高學生編制清晰、合理、可讀性好的系統(tǒng)程序的能力,加深對操作系統(tǒng)課程的理解。使學生更好地掌握操作系統(tǒng)的根本概念、根本原理、及根本功能,具有分析實際操作系統(tǒng)、設計、構造和開發(fā)現(xiàn)代操作系統(tǒng)的根本能力。實驗要求做到:1) 詳細描述實驗設計思想、程序結構及
3、各模塊設計思路;2) 詳細描述程序所用數(shù)據(jù)結構及算法;3) 明確給出測試用例和實驗結果;4) 為增加程序可讀性,在程序中進行適當注釋說明;5) 認真進行實驗總結,包括:設計中遇到的問題、解決方法與收獲等;6) 實驗報告撰寫要求結構清晰、描述準確邏輯性強;7) 實驗過程中,同學之間可以進行討論互相提高,但絕對禁止抄襲。 本實驗的重點、難點及教學方法建議重點:理解進程調度中PCB的設計,以實現(xiàn)對進程的調度。難點:進程調度程序的設計,設備管理程序的設計。教學方法建議:力爭在本指導書的幫助下,獨立設計程序以加深理解。實驗一 分析操作系統(tǒng)所面臨的操作需求一實驗目的使學生理解操作系統(tǒng)所面臨的操作需求,掌握
4、操作系統(tǒng)中的進程管理、存儲管理、設備管理和文件管理等功能。二實驗內容1. 分析操作系統(tǒng)所面臨的操作需求;2. 熟悉實驗環(huán)境;3. 資料搜集與整理,進行實驗的前期準備。熟悉編程環(huán)境 本課程中的實驗題目既可以在windows下用控制臺應用程序實現(xiàn),也可以在linux下用全屏幕程序實現(xiàn)。這里我們首先介紹在windows下用vc+6.0設計控制臺應用程序的步驟,然后介紹在linux下用C語言編寫全屏幕程序的步驟。1. windows的控制臺應用程序 圖1-1 圖1-2圖1-3步驟1:開機,單擊“開始按鈕,選擇“程序
5、 ->Microsoft Visual Studio 6.0->Microsoft Visual C+6.0”進入Microsoft Visual C+6.0。見圖1-1。步驟2:在Microsoft Visual C+6.0中,單擊“File菜單,選擇“New菜單命令,見圖1-2。 步驟3:在“Files選項卡中選擇“C+ Source File,見圖1-32. linux的vi應用編程登錄 Linux是一個多用戶多任務操作系統(tǒng),多個用戶可以
6、擁有自己獨立的用戶賬號登錄提示: Red Hat Linux release 6.0 (Hedwing) Kernel 2.2.5-15 on an i686 Login:此時輸入用戶戶名賬號并鍵入回車,那么系統(tǒng)顯示“passward。在輸入密碼和回車。登錄后:roothawk/root#表示是按root方式登錄,$表示是普通用戶。Linux大小寫敏感,用“-加參數(shù)zlinux:# ls FHowTo/ HowToMin/ linux nag/ sag/獲取幫助:Linux帶有聯(lián)機手冊,可以用man命令來閱讀 Zlinux:$ man ls虛擬終端 Linux可有多個用戶登錄到同一個計算機,但
7、一般微機只有一個終端難以表達??梢允褂枚鄠€虛擬終端,用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圖標> Vmware Workstation窗口>Commands>Start this virtual machine進入f
8、edora后,用戶名:root 口 令:123456使用編輯器vi 編輯文件1. 進入linux的文本模式之后,在命令行鍵入vi filename.c 然后回車。下面作一些簡單的解釋:首先vi命令是翻開vi編輯器。后面的filename.c是用戶即將編輯的c文件名字,注意擴展名字是.c;當然,vi編輯器功能很強,可以用它來編輯其它格式的文件,比方匯編文件,其擴展名字是.s;也可以直接用vi翻開一個新的未命名的文件,當保存的時候再給它命名,只是這樣做不很方便。2. 最根本的命令I :當進入剛翻開的文件時,不能寫入信息,這時按一下鍵盤上的I鍵insert,插入的意思,就可以進入編輯模式了。如下列圖
9、所示: 3. a與i是相同的用法4. 當文件編輯完后,需要保存退出,這時需要經過以下幾個步驟:1按一下鍵盤上的Esc 鍵;2鍵入冒號(:),緊跟在冒號后面是wq意思是保存并退出。如果不想保存退出,那么在第二步鍵入冒號之后,鍵入!q不帶w,機尾部保存。如下列圖所示:5. 退出vi編輯器的編輯模式之后,要對剛剛編寫的程序進行編譯。編譯的命令是:gcc filename.c -o outputfilename,其中gcc是c的編譯器。參數(shù):filename.c 是剛剛編輯的c 文件當然也可以是以前編寫好的c文件;后面中括號里面的參數(shù)是可選的,它是一個輸出文件。如果不選,默認的輸出文件是a.out ,
10、選了之后輸出文件就是outputfilename.out6. 最后一步是運行程序,方法如下:./outputfilename.out實驗二 進程管理一實驗目的掌握臨界區(qū)的概念及臨界區(qū)的設計原那么;掌握信號量的概念、PV操作的含義以及應用PV操作實現(xiàn)進程的同步與互斥;分析進程爭用資源的現(xiàn)象,學習解決進程互斥的方法;掌握進程的狀態(tài)及狀態(tài)轉換;掌握常用的進程調度算法。二實驗內容1分析進程的同步與互斥現(xiàn)象,編程實現(xiàn)經典的進程同步問題生產者消費者問題的模擬;2 編寫允許進程并行執(zhí)行的進程調度程序,在常用的進程作業(yè)調度算法:先來先效勞算法、短作業(yè)優(yōu)先算法、最高響應比優(yōu)先算法、高優(yōu)先權優(yōu)先算法等調
11、度算法中至少選擇三種調度算法進行模擬,并輸出平均周轉時間和平均帶權周轉時間。本實驗涉及內容較多,可以在兩個題目里選擇一個完成。編程實現(xiàn)經典的進程同步問題生產者消費者問題的模擬模擬實現(xiàn)用同步機構防止發(fā)生進程執(zhí)行時可能出現(xiàn)的與時間有關的錯誤。進程是程序在一個數(shù)據(jù)集合上運行的過程,進程是并發(fā)執(zhí)行的,也即系統(tǒng)中的多個進程輪流地占用處理器運行。我們把假設干個進程都能進行訪問和修改的那些變量稱為公共變量。由于進程是并發(fā)地執(zhí)行的,所以,如果對進程訪問公共變量不加限制,那么就會產生“與時間有關的錯誤,即進程執(zhí)行后所得到的結果與訪問公共變量的時間有關。為了防止這類錯誤,系統(tǒng)必須要用同步機構來控制進程對公共變量的
12、訪問。一般說,同步機構是由假設干條原語同步原語所組成。本實驗要求模擬PV操作同步機構的實現(xiàn),模擬進程的并發(fā)執(zhí)行,了解進程并發(fā)執(zhí)行時同步機構的作用。此次用到的數(shù)據(jù)結構知識如下: typedef struct Pcb char name10; /進程名char state10; /運行狀態(tài)char reason10; /假設阻塞,其原因int breakp; /斷點保護struct Pcb *next; /阻塞時的順序 Pcb,*link; 進程名狀態(tài)等待原因斷點后繼進程 進程控制塊結構定義兩個進程: link p1;/生產者進程,link c1;/消費者進程。pc程序計數(shù)器和link ready
13、; 就緒隊列,link b_s1; s1阻塞隊列,link b_s2; s2阻塞隊列。實驗指導: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() *
14、/ #include<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ù)結構的定義和全局變量typedef struct Pcb char name10; /進程名char state10; /運行狀態(tài)char reason10; /
15、假設阻塞,其原因int breakp; /斷點保護struct Pcb *next; /阻塞時的順序Pcb,*link;int s1,s2; /信號量link p1;/生產者進程link c1;/消費者進程char strMAX; /輸入的字符串char bufferBUF; /緩沖池int len; /輸入長度int sp=0; /string的指針int in=0; /生產者指針int out=0; /消費者指針char temp; /供打印的臨時產品char rec_pMAX;/生產記錄int rp1=0;/生產記錄指針char rec_cMAX;/消費記錄int rp2=0;/消費記錄
16、指針link ready; /就緒隊列l(wèi)ink b_s1; /s1阻塞隊列l(wèi)ink b_s2; /s2阻塞隊列int pc; /程序計數(shù)器int count; /字符計數(shù)器int con_cnt; /消費計數(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(); /處理機調度void processor();/處理機執(zhí)行void print(); /打印函數(shù)void init() /初始化s1=BUF
17、;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->
18、;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;/阻塞進程為NULLpc=0;con_cnt=0; /消費計數(shù)器void p(int s)if(s=1) /p(s1)s1-;if(s1<0) block(1); /阻塞當前生產進程elseprintf("t* s1信號申請
19、成功!n");ready->breakp=pc; /保存斷點else /p(s2)s2-;if(s2<0) block(2);/阻塞當前消費進程elseprintf("t* s2信號申請成功!n");ready->breakp=pc; /保存斷點void v(int s)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;
20、/保存斷點void block(int s)/阻塞函數(shù)的定義link p;int num1=0;int num2=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;elsep=p1;p1->next=NULL;printf("t* p1生產進程阻塞了!n");ready->breakp=
21、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;elsep=c1;ready->breakp=pc; /保存斷點ready=ready->next;/在就緒隊列中去掉,指向下一個c1->next=NULL;printf(&quo
22、t;t* c1消費進程阻塞了!n");num2+;printf("t* 阻塞的生產進程個數(shù)為:%dn",num1);printf("t* 阻塞的消費進程個數(shù)為:%dn",num2);void wakeup(int s)/喚醒函數(shù)的定義link p;link q=ready;if(s=1) /喚醒b_s1隊首進程,生產進程隊列p=b_s1;b_s1=b_s1->next;/阻塞指針指向下一個阻塞進程strcpy(p->state,"Ready");strcpy(p->reason,"Null&quo
23、t;);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(&
24、quot;t* c1消費進程喚醒了!n");void control() /處理器調度程序int rd;int num=0;link p=ready; if(ready=NULL) /假設無就緒進程,結束return;while(p) /統(tǒng)計就緒進程個數(shù)num+;p=p->next;/最終p變?yōu)镹ULLprintf("t* 就緒進程個數(shù)為:%dn",num);time_t t; srand(unsigned) time(&t);rd=rand()%num;/隨機函數(shù)產生隨機數(shù)if(rd=1)p=ready;ready=ready->next;r
25、eady->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) /當前進程為生產者switch(pc) case 0:/produce
26、printf("t* 生產者生產了字符%cn",strsp);rec_prp1=strsp;/添加到生產記錄 sp=(sp+1)%len;pc+;ready->breakp=pc; /保存斷點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; /保存斷點break;case 3: /v(s2)pc+
27、;printf("t* 釋放一個s2信號n");v(2);break;case 4:/goto01 printf("t* 生產進程goto 0 操作n");pc=0;count-; /剩余字符個數(shù)減1printf("t* 剩余字符count=%d個n",count);ready->breakp=pc; /保存斷點if(count<=0) /生產結束printf("t* 生產者結束生產!n");strcpy(p1->state,"Stop");strcpy(p1->reas
28、on,"Null");ready->breakp=-1;ready=ready->next;/在就緒隊列中去掉 else /當前進程為消費者switch(pc)case 0: /p(s2)pc+;p(2); break;case 1: /getprintf("t* 消費者取字符!n");temp=bufferout;out=(out+1)%BUF;pc+;ready->breakp=pc; /保存斷點break;case 2: /v(s1)pc+;printf("t* 釋放一個s1n");v(1);break;cas
29、e 3: /consumeprintf("t* 消費了字符%cn",temp);rec_crp2=temp;/添加到消費記錄rp2+;con_cnt+;if(con_cnt>=len)strcpy(c1->state,"Stop");/完成態(tài)c1->breakp=-1;return;pc+;ready->breakp=pc; /保存斷點break;case 4: /goto0printf("t* 消費進程goto 0 操作n");pc=0;ready->breakp=pc; /保存斷點void print
30、()int i,j;printf("-生產者消費者模擬-n");printf("* 模擬過程的字符串為:t");printf("%sn",&str);printf("* 已生產:");for(j=0;j<=rp1;j+)printf("%c",rec_pj);printf("n* 空緩存:");for(j=rp2;j<=rp1;j+)printf("%c",bufferj);printf("n* 已消費:");for
31、(j=0;j<=rp2;j+)printf("%c",rec_cj);printf("n-進程控制塊的信息-n");printf("進程名tt狀態(tài)t等待原因t斷點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("*生產者消費者模擬n");printf("-n");printf("*請輸入字符串:n");scanf("%s",str); /string數(shù)組存放將
33、要產生的字符len=strlen(str);count=len; /輸入字符的個數(shù)init(); /初始化while(con_cnt<len) /消費完所有的字符為結束system("cls"); /清屏操作printf("-模擬指令流程-n");control(); /處理器調度程序processor(); /模擬處理器指令執(zhí)行print(); /輸出顯示各個信息printf("n程序結束!n");進程調度算法模擬進程管理是操作系統(tǒng)中的重要功能,用來創(chuàng)立進程、撤消進程、實現(xiàn)進程狀態(tài)轉換,它提供了在可運行的進程之間復用CPU的方
34、法。在進程管理中,進程調度是核心,因為在采用多道程序設計的系統(tǒng)中,往往有假設干個進程同時處于就緒狀態(tài),當就緒進程個數(shù)大于處理器數(shù)目時,就必須依照某種策略決定哪些進程優(yōu)先占用處理器。本實驗模擬在單處理器情況下的進程調度,目的是加深對進程調度工作的理解,掌握不同調度算法的優(yōu)缺點。設計一個按先來先效勞、時間片輪轉法、優(yōu)先數(shù)調度算法實現(xiàn)處理器調度的程序。實驗指導:#include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> typedef struct node cha
35、r name10; /*進程標識符*/ int prio; /*進程優(yōu)先數(shù)*/ int round; /*進程時間輪轉時間片*/ int cputime; /*進程占用CPU時間*/ int needtime; /*進程到完成還要的時間*/int arrivetime; /*進程到達時間*/int starttime; /*進程開始時間*/int finishtime; /*進程完成時間*/int servicetime; /*進程效勞時間*/ float turnaroundtime; /*進程周轉時間*/ float weightedturnaroundtime; /*進程帶權周轉時間*/
36、int count; /*計數(shù)器*/ char state; /*進程的狀態(tài)*/ struct node *next; /*鏈指針*/ PCB; PCB *finish,*ready,*tail,*run; /*隊列指針*/ int N; /*進程數(shù)*/*將就緒隊列中的第一個進程投入運行*/ void firstin() run=ready; /*就緒隊列頭指針賦值給運行頭指針*/ run->state='R' /*進程狀態(tài)變?yōu)檫\行態(tài)*/ ready=ready->next; /*就緒對列頭指針后移到下一進程*/ /*標題輸出函數(shù)*/ void prt1(char
37、a) switch(a)case 1: /*優(yōu)先數(shù)法*/ printf("名字 進程占用CPU時間 進程到完成還要的時間 優(yōu)先級數(shù) 狀態(tài)n");break; case 2: /*時間片算法*/ printf("名字 進程占用CPU時間 進程到完成還要的時間 計數(shù)器 時間片 狀態(tài)n");break;case 3: /*先來先效勞算法*/printf("名字 到達時間 開始時間 效勞時間 完成時間 周轉時間 帶權周轉時間 狀態(tài)n");break;default:break; /*進程PCB輸出*/void prt2(char a,PCB
38、*q) switch(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:/*輪轉法的輸出*/ printf("%-10s%-20d%-15d%-10d%-10d%-cn",q->name, q->cputime,q->needtime,q->count,q->round,q->state);bre
39、ak;case 3:/*先來先效勞算法輸出*/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); /*輸出標題*/ i
40、f(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)先數(shù)的插入算法*/ void insert1(PCB *q) PCB *p1,*s,*r; int b; s=q; /*待插入的PCB指針*/ p1=ready; /*
41、就緒隊列頭指針*/ r=p1; /*r做p1的前驅指針*/ 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) /*如果條件成立說明插入在r與p1之間*/ r->next=s; s->next=p1; else s->next=p1; /*否那么插入在就緒隊列的頭*/ ready=s; /*輪轉法插入函數(shù)*/ void insert2(PCB *p2) tail->next=p2;
42、 /*將新的PCB插入在當前就緒隊列的尾*/ tail=p2; p2->next=NULL; /*先來先效勞插入函數(shù)*/void insert3(PCB *q)PCB *p1,*s,*r;int b;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;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; /*就緒隊列頭指針*/ finish=NULL; /*完成隊列頭指針*/ run=NULL; /*運行隊列頭指針*/ printf("請輸入進程的名字和運行所需要的時間n"); /*輸入進程標識和所需時間創(chuàng)立PCB*/ for(i=1;i<=N;i+) p=(PCB *)malloc(sizeof(PCB); scanf(&q
44、uot;%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) /*就緒隊列不空那么調用插入函數(shù)插入*/ insert1(p); else p->next=ready; /*創(chuàng)立就緒隊列的第一個PCB*/ ready=p; void clrscr(void);printf(" 優(yōu)先級調度算法模擬輸出結果
45、:n"); printf("*n"); prt(alg); /*輸出進程PCB信息*/ run=ready; /*將就緒隊列的第一個進程投入運行*/ ready=ready->next; run->state='R' /*輪轉法創(chuàng)立進程PCB*/ void create2(char alg) PCB *p; int i,time; char na10; ready=NULL; finish=NULL; run=NULL; printf("請輸入進程的名字和運行所需要的時間n"); for(i=1;i<=N;i+
46、) p=(PCB *)malloc(sizeof(PCB); scanf("%s",na); scanf("%d",&time); strcpy(p->name,na); p->cputime=0; p->needtime=time; p->count=0; /*計數(shù)器*/ p->state='W' p->round=2; /*時間片*/ if(ready!=NULL) insert2(p); else p->next=ready; ready=p; tail=p; void clrscr
47、(void);printf(" 時間片輪轉法模擬輸出結果:n"); printf("*n"); prt(alg); /*輸出進程PCB信息*/ run=ready; /*將就緒隊列的第一個進程投入運行*/ ready=ready->next; run->state='R' /*先來先效勞算法創(chuàng)立PCB*/void create3(char alg)PCB *p;int i; ready=NULL;run=NULL;finish=NULL;printf("請輸入進程的名字、到達時間和運行所需要的時間n");f
48、or(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
49、)insert3(p);elsep->next=ready;ready=p;void clrscr(void);printf(" 先來先效勞算法模擬輸出結果:n");printf("*n");prt(alg);run=ready; /*將就緒隊列的第一個進程投入運行*/ ready=ready->next; run->state='R'/*優(yōu)先數(shù)調度算法*/ void priority(char alg) while(run!=NULL) /*當運行隊列不空時,有進程正在運行*/ run->cputime=run-
50、>cputime+1; run->needtime=run->needtime-1; run->prio=run->prio-3; /*每運行一次優(yōu)先數(shù)降低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)先數(shù)不是最大,那么將其變?yōu)榫途w態(tài)插入到就緒隊列*/ if(ready!=NULL)&&(run->prio<ready->prio) run->state='W' insert1(run); firstin(); /*將就緒隊列的第一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 溝槽砂石墊層施工方案
- 液壓鋼板壩施工方案
- 端墻施工方案
- TSHAEPI 001-2022 凈味環(huán)保瀝青氣態(tài)污染物減排性能技術要求
- DLT-637-1997-閥控式密封鉛酸蓄電池訂貨技術條件
- 二零二五年度設備安裝安全協(xié)議及設備安裝驗收證書
- 二零二五年度房地產租賃稅務籌劃與合同管理服務協(xié)議
- 二零二五年度住宅及地下室使用權租賃合同
- 2025年度智能化綠植養(yǎng)護服務合同協(xié)議書模板
- 二零二五年度珠寶店電子商務平臺合作開發(fā)合同
- 醫(yī)美機構客戶滿意度調查表
- clsim100-32藥敏試驗標準2023中文版
- LNG加氣站質量管理手冊
- 苗木供貨服務計劃方案
- 《諫逐客書》課后練習 統(tǒng)編版高中語文必修下冊
- 2 我多想去看看(課件)-一年級下冊語文
- 《肺癌課件:基本概念與臨床表現(xiàn)》
- 產品九宮格產品賣點課件
- 政府采購汽車采購競爭性談判文件
- 西安袁家村項目計劃書
- 新生兒休克的早期識別
評論
0/150
提交評論