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