




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、操作系統(tǒng)實(shí)驗(yàn)報(bào)告1、進(jìn)程調(diào)度2、作業(yè)調(diào)度3、主存空間的分配與回收4、文件系統(tǒng)學(xué)生學(xué)院計(jì)算機(jī)學(xué)院專業(yè)班級(jí)網(wǎng)絡(luò)工程班學(xué) 號(hào)3107007062學(xué)生姓名張菲指導(dǎo)教師胡欣如2009 年 12 月 20 日計(jì)算機(jī) 學(xué)院 網(wǎng)絡(luò)工程 專業(yè)3班組、學(xué)號(hào)3107007062姓名張菲協(xié)作者 無 教師評(píng)定實(shí)驗(yàn)題目進(jìn)程調(diào)度一、實(shí)驗(yàn)?zāi)康挠酶呒?jí)語言編寫和調(diào)試一個(gè)進(jìn)程調(diào)度程序,以加深對(duì)進(jìn)程的概念及進(jìn)程調(diào)度算法的理 解。二、實(shí)驗(yàn)內(nèi)容和要求編寫并調(diào)試一個(gè)模擬的進(jìn)程調(diào)度程序,采用“簡單時(shí)間片輪轉(zhuǎn)法”調(diào)度算法對(duì)五個(gè)進(jìn)程進(jìn)行調(diào)度。每個(gè)進(jìn)程有一個(gè)進(jìn)程控制塊(PCB)表示。進(jìn)程控制塊可以包含如下信息:進(jìn)程名、到達(dá)時(shí)間、需要運(yùn)行時(shí)間、已運(yùn)
2、行時(shí)間、進(jìn)程狀態(tài)等等。進(jìn)程的到達(dá)時(shí)間及需要的運(yùn)行時(shí)間可以事先人為地指定(也可以由隨機(jī)數(shù)產(chǎn)生)。進(jìn)程的到達(dá)時(shí)間為進(jìn)程輸入的時(shí)間。進(jìn)程的運(yùn)行時(shí)間以時(shí)間片為單位進(jìn)行計(jì)算。每個(gè)進(jìn)程的狀態(tài)可以是就緒 W( Wait )、運(yùn)行R( Run)兩種狀態(tài)之一。就緒進(jìn)程獲得 CPU后都只能運(yùn)行一個(gè)時(shí)間片。用運(yùn)行時(shí)間加1來表示。如果運(yùn)行一個(gè)時(shí)間片后,進(jìn)程的已占用CPU時(shí)間已達(dá)到所需要的運(yùn)行時(shí)間,則撤消該進(jìn)程,如果運(yùn)行一個(gè)時(shí)間片后進(jìn)程的已占用CPU時(shí)間還未達(dá)所需要的運(yùn)行時(shí)間,也就是進(jìn)程還需要繼續(xù)運(yùn)行,此時(shí)應(yīng)分配時(shí)間片給就緒隊(duì)列中排在該進(jìn)程之后的進(jìn)程,并將它插入就緒隊(duì)列隊(duì)尾。 每進(jìn)行一次調(diào)度程序都打印一次運(yùn)行進(jìn)程、就緒
3、隊(duì)列、以及各個(gè)進(jìn)程的PCB,以便進(jìn)行檢查。重復(fù)以上過程,直到所要進(jìn)程都完成為止。三、實(shí)驗(yàn)主要儀器設(shè)備和材料硬件環(huán)境:IBM-PC或兼容機(jī)軟件環(huán)境:C語言編程環(huán)境四、實(shí)驗(yàn)原理及設(shè)計(jì)方案1、進(jìn)程調(diào)度算法:采用多級(jí)反饋隊(duì)列調(diào)度算法。其基本思想是:當(dāng)一個(gè)新進(jìn)程進(jìn)入內(nèi)在后,首先將它放入第一個(gè)隊(duì)列的末尾,按FCFS原則排隊(duì)等待高度。 當(dāng)輪到該進(jìn)程執(zhí)行時(shí),如能在該時(shí)間片內(nèi)完成,便可準(zhǔn)備撤離系統(tǒng);如果它在一個(gè)時(shí)間片結(jié)束時(shí)尚為完成,調(diào)度程序便將該進(jìn)程轉(zhuǎn)入第二隊(duì)列的末尾,再同樣地按FCFS原則等待調(diào)度執(zhí)行,以此類推。2、實(shí)驗(yàn)步驟:(1)按先來先服務(wù)算法將進(jìn)程排成就緒隊(duì)列。(2)檢查所有隊(duì)列是否為空,若空則退出,否
4、則將隊(duì)首進(jìn)程調(diào)入執(zhí)行。(3)檢查該運(yùn)行進(jìn)程是否運(yùn)行完畢,若運(yùn)行完畢,則撤消進(jìn)程,否則,將該進(jìn)程插 入到下一個(gè)邏輯隊(duì)列的隊(duì)尾。(4)是否再插入新的進(jìn)程,若是則把它放到第一邏輯隊(duì)列的列尾。(5)重復(fù)步驟(2 )、( 3 )、( 4 ),直到就緒隊(duì)列為空。五、流程圖六、結(jié)果過程及截圖初始化隊(duì)列入進(jìn)程運(yùn)行時(shí)冋二9程號(hào)忖。.2二正入進(jìn)程運(yùn)彳亍吋司=5程號(hào)“4輸入所有進(jìn)程后的進(jìn)程信息如下:xjfx xnane ipi當(dāng)前正在運(yùn)行的進(jìn)穰齊洪nt inefhe execute name :i>l進(jìn)程所在的 邏輯隊(duì)列state qi.ttfue ;R:1rtine10在臥列可停留時(shí)間2P1需要運(yùn)行兩 個(gè)時(shí)
5、間片,本進(jìn) 程才離開此隊(duì)列當(dāng)前就緒隊(duì)列狀態(tài)為:lane:p2state :wqueue !1nt ine:10亍七imeSB在隊(duì)列可停留時(shí)間2lane:p4state :ws 七 ate;wqueue !1nt incr 七 imeSH在隊(duì)列可停留時(shí)間queue !1nt inertine在隊(duì)列可停留時(shí)間按i犍添加新進(jìn)程按其他任意鍵繼續(xù)運(yùn)行.9按Y鍵繼續(xù)運(yùn)行進(jìn)程:P1需要運(yùn)行1個(gè)技:鍵添加新進(jìn)程.按其他任意鍵繼續(xù)運(yùn)行.y時(shí)間片,本進(jìn) 才離開此隊(duì)歹E程JTheexecute name:Pl*當(dāng)前正在運(yùn)仃的進(jìn)程是;namequeuent ineIplIR:i1?rtime:1在隊(duì)列可停留時(shí)間:i當(dāng)
6、前就緒隊(duì)列狀態(tài)為naiine:p2state (wqueuent ine:1rtime:0在隊(duì)列可停留時(shí)間:2n ane!p3state ! wque Lie :1nt ine :5rt iine 苗在隊(duì)列可停留時(shí)間 ;2paRe!p4state Mque ue !1nt ine:5rt ine在隊(duì)列可停留時(shí)間 :2按Y鍵繼續(xù)運(yùn)行進(jìn)程:Theexecute naitte:p2*當(dāng)冃IJ止在運(yùn)仃的進(jìn)程是=p2在隊(duì)列可停留時(shí)間nanestatequeue timei*t imeIp211!012K X M X當(dāng)前就緒隊(duì)列狀態(tài)為:nanestatequeue timei*t ime在隊(duì)列可停留時(shí)間I
7、p3'u11:5!012namestatequeuentimer-t ine在隊(duì)列可停留時(shí)間pi加入到了第:Hname!wstate!1queue!510ntimertine:2二個(gè)邏輯隊(duì)列!pl! 2 <1 J1 £n運(yùn)行若干次后的狀態(tài):execute name:p3*當(dāng)前正在運(yùn)行的進(jìn)程是"3列namestatequeuent tinertimelV3ER13E5:414 當(dāng)前就緒隊(duì)列狀態(tài)為:namestatequeuent imeime在隊(duì)列可停留時(shí)間Ip4;w15:4:4namestatequeuent imert ime在隊(duì)列可停留時(shí)間;wK19:8:
8、Bnanestatequeuent imei*t ime在隊(duì)列可停留時(shí)間:p2!10:8:B進(jìn)程【卩3己完應(yīng).添加新的進(jìn)程:,進(jìn)程在次隊(duì)按士鍵添加新進(jìn)程按其他任意犍繼續(xù)運(yùn)行i請(qǐng)輸入進(jìn)程的個(gè)數(shù)"進(jìn)程號(hào)斷-1 =削入進(jìn)程名:newl輸入逬程運(yùn)行時(shí)間:mphe execute:newl派當(dāng)前正在運(yùn)行的逬程是:ne«lnamestatequeuent ine在隊(duì)列可停留時(shí)間1 inewl!R11:3:a22 u rw 1_TP當(dāng)前就緒隊(duì)列狀態(tài)為:namestatequeuent iert ime胚隊(duì)列可停留時(shí)間Splhl!4!9:8!8HAniestatequeuencineFt
9、ime在隊(duì)列可停留時(shí)間:p2hi;4江0:8!8namestateQueuent ineretime在隊(duì)列可停留時(shí)間:p4tW14:5!4!8七、所遇困難的解決以及心得體會(huì)在這個(gè)多級(jí)反饋的實(shí)驗(yàn)中,我采取了用一條實(shí)際上的鏈表隊(duì)列來模擬多個(gè)邏輯上的隊(duì)列,通過維護(hù)幾個(gè)鏈表的狀態(tài)信息來找到每個(gè)進(jìn)程運(yùn)行完后應(yīng)該插入的地方,還有一個(gè)標(biāo)志位Fend用來表明新插入的隊(duì)列的位置。雖然實(shí)驗(yàn)原理很簡單,但是在編寫代碼的過程中遇 到了不少的問題,在兩個(gè)小時(shí)之內(nèi)已經(jīng)完成的大體代碼的編寫,但是之中存在不少的問題, 導(dǎo)致了用了差不多四個(gè)小時(shí)的時(shí)間去調(diào)試才把它弄好,這主要?dú)w咎于在開始設(shè)計(jì)代碼的不太合理, 在后期使得代碼結(jié)構(gòu)有
10、些混亂, 使得調(diào)試更加的麻煩, 以及對(duì)編程的不熟悉。 通過這 個(gè)實(shí)驗(yàn)不僅使我對(duì)進(jìn)程的調(diào)度算法有了更深的認(rèn)識(shí), 使得理論知識(shí)得到的實(shí)踐, 也使我的編 程能力得到了進(jìn)一步提高。七、思考題1、 分析不同調(diào)度算法的調(diào)度策略,比較不同調(diào)度算法的優(yōu)缺點(diǎn),總結(jié)它們的適用范圍。 答:動(dòng)態(tài)有限權(quán)算法: 動(dòng)態(tài)優(yōu)先權(quán)是指在創(chuàng)建進(jìn)程時(shí)所創(chuàng)建的優(yōu)先權(quán), 會(huì)隨進(jìn)程的推進(jìn)或者 等待時(shí)間的增加而改變,以便獲得更好的調(diào)度性能。處理機(jī)為每個(gè)進(jìn)程分配一定的時(shí)間片, 在就緒隊(duì)列中, 優(yōu)先權(quán)高的進(jìn)程將優(yōu)先獲得處理機(jī), 進(jìn)程在進(jìn)去運(yùn)行完響應(yīng)的時(shí)間片后, 如 沒完成,優(yōu)先權(quán)減 1,從新回到就緒隊(duì)列等待分配處理機(jī)。時(shí)間片的輪轉(zhuǎn)法: 系統(tǒng)將所
11、有進(jìn)程排成一個(gè)隊(duì)列, 按照先來先服務(wù)的原則, 對(duì)隊(duì)列首的 進(jìn)程進(jìn)行處理, 每個(gè)進(jìn)程在用完自己的時(shí)間片后, 從新回到隊(duì)尾進(jìn)行排隊(duì)。 每運(yùn)行一次, 進(jìn) 程的需要時(shí)間減 1,直到就緒隊(duì)列為空!八、源代碼#include<stdio.h>#include<stdlib.h>#include<conio.h> #define getpch(type) (type*)malloc(sizeof(type)#define NULL 0#define TIME 2/ 時(shí)間片長度typedef struct pcb/ 進(jìn)程管理塊 char name10;/ 進(jìn)程名字char
12、state; int queue; int ntime; int rtime; int etime;/進(jìn)程狀態(tài)/進(jìn)程所在的隊(duì)列 /進(jìn)程需要運(yùn)行的時(shí)間 /進(jìn)程已經(jīng)運(yùn)行的時(shí)間 /進(jìn)程在本隊(duì)列可運(yùn)行的時(shí)間片struct pcb *link; PCB;/就緒隊(duì)列,進(jìn)程插入PCB *ready = NULL, *pinsert = NULL, *pfend = NULL,*p =NULL; 位置的變量int geti() / 使用戶僅能輸入整數(shù) char ch;int i = 0;fflush(stdin); ch = getchar(); while(ch = 'n') printf(
13、"tf 輸入不能為空 .請(qǐng)重新輸入 n"); fflush(stdin);ch = getchar();while(ch != 'n')if(ch > '9' | ch < '0').n");printf("t 輸入有誤 ! 輸入只能為正整數(shù),請(qǐng)重新輸入 fflush(stdin);i = 0;ch = getchar();elsei = i*10 + (ch - '0');ch = getchar();return i;void findpos()/ 更新狀態(tài)量PCB *ps
14、= pfend;if(!ps | !ps -> link | (ps-> link->queue - ps->queue) > 1)pinsert = ps;elsewhile (ps->link && ps ->link->queue != (pfend ->queue +2) ps = ps->link;pinsert = ps;void insert()/ 插入進(jìn)程if(!ready )ready = p;pfend = p;pinsert = p;else if(ready ->queue = 1)/ 第
15、一隊(duì)列存在p->link = pfend->link;pfend->link = p;pfend = p;findpos();elsep->link = ready; ready = p; findpos(); void input()/* 建立進(jìn)程控制塊函數(shù) */int i,num;printf("n 請(qǐng)輸入進(jìn)程的個(gè)數(shù) ?"); num = geti();for(i=0; i < num; i+)printf("n 進(jìn)程號(hào) No.%d:n",i+1); p=getpch(PCB);printf("n 輸入進(jìn)程名
16、:"); scanf("%s",p->name);printf("n 輸入進(jìn)程運(yùn)行時(shí)間 :");p ->ntime = geti(); printf("n");p->rtime=0; p->state='w' p->queue =1; p->etime = TIME; p->link=NULL;insert();/* 調(diào)用 insert 函數(shù) */void disp(PCB *pr)/* 建立進(jìn)程現(xiàn)實(shí)函數(shù),用于顯示當(dāng)前進(jìn)程 */printf("nnamet
17、statet queuet ntimet rtimet 在隊(duì)列可停留時(shí)間 t n"); printf("|%st",pr->name);printf(" |%ct",pr->state);printf(" |%dt",pr->queue);printf(" |%dt",pr->ntime);printf(" |%dt",pr->rtime);printf(" |%dt",pr->etime); printf("n&quo
18、t;);void check()/* 建立進(jìn)程查看函數(shù) */PCB *pr;printf("n * 當(dāng)前正在運(yùn)行的進(jìn)程是 :%s",ready->name);/* 顯示當(dāng)前運(yùn)行的進(jìn)程 */ disp(ready);pr= ready ->link;printf("n* 當(dāng)前就緒隊(duì)列狀態(tài)為 :n");/* 顯示就緒隊(duì)列狀態(tài) */ while(pr!=NULL)disp(pr); pr=pr->link;void sort()/ 調(diào)整進(jìn)程隊(duì)列if(!ready->link |ready->queue < ready->
19、;link->queue) return;p = ready ->link;ready ->link = pinsert ->link;pinsert ->link = ready;pinsert = ready;ready = p;if (ready && ready -> queue = pinsert ->queue) findpos();void addnew()/ 添加新的進(jìn)程if(ready ->queue != 1)(ready -> queue)+;ready->etime *= 2;ready -&g
20、t; state='w'sort();/* 調(diào)用 sort 函數(shù) */input();elseinput();void destroy()/* 建立進(jìn)程撤銷函數(shù) ( 進(jìn)程運(yùn)行結(jié)束,撤銷進(jìn)程 )*/ printf("n 進(jìn)程 %s 已完成 .n",ready->name);p = ready;ready = ready->link;free(p);if (ready && ready -> queue = pinsert ->queue) findpos();)*/void running()/* 建立進(jìn)程就緒函數(shù) (
21、進(jìn)程運(yùn)行時(shí)間到,置就緒狀態(tài)(ready -> rtime)+;ready ->etime -;if(ready->rtime = ready->ntime) destroy(); return;else if(ready ->etime = 0)int time = 2;(ready -> queue)+;for(int i = 2; i != ready->queue; +i) time *= 2;ready->etime = time;ready -> state='w' sort();/* 調(diào)用 sort 函數(shù) */v
22、oid main()char ch;input();while(ready != NULL) printf("nThe execute name:%sn",ready ->name); ready ->state = 'R'check();running();printf("n 按 i 鍵添加新進(jìn)程 按其他任意鍵繼續(xù)運(yùn)行 .");fflush(stdin);ch = getchar();if (ch = 'i'| ch='I') addnew();printf("nn 進(jìn)程已經(jīng)完成 n
23、"); getchar();計(jì)算機(jī) 學(xué)院 網(wǎng)絡(luò)工程 專業(yè)3班組、學(xué)號(hào)3107007062姓名張菲協(xié)作者 無教師評(píng)定實(shí)驗(yàn)題目作業(yè)調(diào)度一、實(shí)驗(yàn)?zāi)康谋緦?shí)驗(yàn)要求學(xué)生模擬作業(yè)調(diào)度的實(shí)現(xiàn),用高級(jí)語言編寫和調(diào)試一個(gè)或多個(gè)作業(yè)調(diào)度的模擬程序,了解作業(yè)調(diào)度在操作系統(tǒng)中的作用,以加深對(duì)作業(yè)調(diào)度算法的理解。二、實(shí)驗(yàn)內(nèi)容和要求1、編寫并調(diào)度一個(gè)多道程序系統(tǒng)的作業(yè)調(diào)度模擬程序。作業(yè)調(diào)度算法:采用 基于先來先服務(wù)的調(diào)度算法 ??梢詤⒖颊n本中的方法進(jìn)行設(shè)計(jì)。對(duì)于多道程序系統(tǒng),要假定系統(tǒng)中具有的各種資源及數(shù)量、調(diào)度作業(yè)時(shí)必須考慮到每個(gè)作業(yè)的資源要求。三、實(shí)驗(yàn)主要儀器設(shè)備和材料硬件環(huán)境:IBM-PC或兼容機(jī) 軟件環(huán)境
24、:C語言編程環(huán)境四、實(shí)驗(yàn)原理及設(shè)計(jì)方案采用多道程序設(shè)計(jì)方法的操作系統(tǒng),在系統(tǒng)中要經(jīng)常保留多個(gè)運(yùn)行的作業(yè),以提高系統(tǒng)效率。作業(yè)調(diào)度從系統(tǒng)已接納的暫存在輸入井中的一批作業(yè)中挑選出若干個(gè)可運(yùn)行的作業(yè), 并為這些被選中的作業(yè)分配所需的系統(tǒng)資源。對(duì)被選中運(yùn)行的作業(yè)必須按照它們各自的作業(yè)說明書規(guī)定的步驟進(jìn)行控制。采用先來先服務(wù)算法算法模擬設(shè)計(jì)作業(yè)調(diào)度程序。(1 )、作業(yè)調(diào)度程序負(fù)責(zé)從輸入井選擇若干個(gè)作業(yè)進(jìn)入主存,為它們分配必要的資源,當(dāng)它們能夠被進(jìn)程調(diào)度選中時(shí),就可占用處理器運(yùn)行。作業(yè)調(diào)度選擇一個(gè)作業(yè)的必要條件是系統(tǒng) 中現(xiàn)有的尚未分配的資源可滿足該作業(yè)的資源要求。但有時(shí)系統(tǒng)中現(xiàn)有的尚未分配的資源既可滿足某
25、個(gè)作業(yè)的要求也可滿足其它一些作業(yè)的要求,那么,作業(yè)調(diào)度必須按一定的算法在這些作業(yè)中作出選擇。先來先服務(wù)算法是按照作業(yè)進(jìn)入輸入井的先后次序來挑選作業(yè),先進(jìn)入輸入井的作業(yè)優(yōu)先被挑選,當(dāng)系統(tǒng)中現(xiàn)有的尚未分配的資源不能滿足先進(jìn)入輸入井的作業(yè) 時(shí),那么順序挑選后面的作業(yè)。(2)假定某系統(tǒng)可供用戶使用的主存空間共100k,并有5臺(tái)磁帶機(jī)。3)流程圖:羽處理機(jī)輪流分配給內(nèi)存中的作業(yè),并當(dāng)作業(yè)毎分配到處理機(jī)時(shí)苴屋仃時(shí)間加rl. timesHllJX內(nèi)存中某作業(yè)runtime等于needtimeY空釋放作業(yè)rZ賦列昱否為 空白諭丄犀 五、結(jié)果過程及截圖讀取文件jobs.txt來初始化主存,磁帶機(jī)的個(gè)數(shù),并打印出
26、來。初始時(shí)間是9:00:JOBfi被調(diào)入內(nèi)存現(xiàn)在時(shí)囘是9個(gè)0現(xiàn)在貿(mào)源的數(shù)量盹3用戶名作業(yè)名狀態(tài)到達(dá)時(shí)間ftJOBAR9:00BJOBBN?:20CJOBCN9:30DJOBDM9:35EJOBEN9:45運(yùn)行時(shí)間2卜時(shí)0.25舉雜帶機(jī)2320.35601Q.154533.2012d.10253星否繼續(xù)運(yùn)行,每次運(yùn)行5分鐘少也°。按Y運(yùn)行5分鐘:用戶名作業(yè)名狀態(tài)到達(dá)時(shí)間AJOBAR9:00JOBBM9:20CJOBCN9:30DJOBBN9:35EJOBEN9:45資源要求運(yùn)行吋間(小吋王#K磁帶機(jī)0_25202乩35G010.1S4530.28102BA0253if BJOM作業(yè)己到
27、達(dá)BJORB調(diào)入內(nèi)存現(xiàn)在時(shí)|可是肌加現(xiàn)在資擦的數(shù)量祁4用戶名作業(yè)名狀態(tài)到達(dá)時(shí)間aJOBAF9:9BJOBBR9:20CJOBCN9:30DJOBDN9:35EJOBEN9:45多次運(yùn)行后最后狀態(tài):資源要求運(yùn)行時(shí)間"卜時(shí)主存磁帶機(jī)0.25220.356010.154538.201020.10253按Y運(yùn)行5分鐘:kJOBA己經(jīng)執(zhí)行結(jié)衷現(xiàn)在時(shí)間是9:鮎典在資源的數(shù)量丄靦5用戶名作業(yè)名狀態(tài)到達(dá)時(shí)間運(yùn)行時(shí)間或小時(shí)主存K磁帶機(jī)AJOBAF9:000.25202BJOBSN9:20B.35丘01CJOBCN9:300.15453DJOBDN9=350.20102EJOBEN9:450.10253
28、按Y運(yùn)行5分鐘:EJOBE己經(jīng)執(zhí)行結(jié)東用戶名A作業(yè)名獲態(tài)JOBRFJOBSFJOBCFJOBDFJOBEF到達(dá)時(shí)間9:009=209:309:359:45運(yùn)行時(shí)間 小時(shí)0.25£350.15fl.206.10|X X X Jt: XBtJtXXKXJOCJOCMKJCXKJCXItXKKliCMXXJOCM!是否腿索運(yùn)行.每次運(yùn)行B分鐘b所有作業(yè)都己經(jīng)完成-六、所遇困難的解決以及心得體會(huì)這個(gè)實(shí)驗(yàn)是花的時(shí)間最多的一個(gè)實(shí)驗(yàn), 第一次做的時(shí)候由于理解有些問題,所以做錯(cuò)了。之后重新做了一遍,收獲還是很多的,遇到了很多的細(xì)節(jié)問題,例如像是時(shí)間化成浮點(diǎn)數(shù)和 浮點(diǎn)數(shù)化成時(shí)間等一些問題,從中也暴露了
29、自己的編程能力欠缺,之后要多多的寫程序。七、思考題1、寫出每種算法的調(diào)度策略,最后比較各種算法的優(yōu)缺點(diǎn)。答:先來先服務(wù)算法是根據(jù)作業(yè)的進(jìn)入時(shí)間來排序,到達(dá)時(shí)間短的先運(yùn)行,優(yōu)點(diǎn)是實(shí)現(xiàn)簡單,缺點(diǎn)是運(yùn)行時(shí)間慢。短作業(yè)優(yōu)先算法是根據(jù)作業(yè)的估計(jì)運(yùn)行時(shí)間來排序,估計(jì)運(yùn)行時(shí)間短的先運(yùn)行,優(yōu)點(diǎn)是運(yùn)行時(shí)間快,缺點(diǎn)是實(shí)現(xiàn)起來比較復(fù)雜。2、選擇調(diào)度算法的依據(jù)是什么?答:如果作業(yè)要求的速度不高,而且作業(yè)比較小型,那就最好用先來先服務(wù)算法。如果作業(yè)要求的速度高,作業(yè)流程復(fù)雜,那就最好用短作業(yè)優(yōu)先算法。八、源代碼#in clude<stdio.h>#in clude<stdlib.h>#in cl
30、ude<stri ng.h>#in clude<c oni o.h>#define getjcb() (JCB*)malloc(sizeof(JCB)typedef struct / 資源的總量int memory;int tape;RESOURCE;typedef struct JCB / 作業(yè)控制塊 char username20; 用戶名 char jobname10; 作業(yè)名char state;/作業(yè)狀態(tài)char atime5;/ 到達(dá)時(shí)間float rtime;/ 運(yùn)行時(shí)間RESOURCE resource;/ 資源數(shù)量struct JCB*link;JCB
31、;RESOURCE source = 100,5;JCB *pjcb =getjcb();/ 作業(yè)鏈表頭char nowtime5;/ 現(xiàn)在時(shí)間 ,初始時(shí)間為 9:00FILE* ignore(FILE *fp)/ 忽略文件中的空白符if(feof(fp) return fp; char ch = fgetc(fp);while (!feof(fp) && (ch = ' '| ch = '')ch = fgetc(fp); /if(!feof(fp) return fp;fseek(fp, -1, SEEK_CUR); return fp;(讀
32、取文件時(shí)用 )FILE* findchar(FILE *fp,char c)/ 在文件中找到一個(gè)字符的位置 if(feof(fp) return fp; char ch = fgetc(fp); while (!feof(fp) && (ch != c) ch = fgetc(fp); fseek(fp, -1, SEEK_CUR);return fp;void destory()/ 釋放鏈表所占的內(nèi)存JCB *p = pjcb->link; while(pjcb) free(pjcb); pjcb = p; if(p) p = p->link;float stof
33、(char *time)/ 把時(shí)間轉(zhuǎn)化為浮點(diǎn)型數(shù)float h = 0, m = 0;int i = 0;while(timei != ':')h = h*10 + timei - '0'i+;i+;while(timei != '0')m = m*10 + timei - '0'i+;return (h + m/60);char* ftos(double ftime)/ 把浮點(diǎn)型數(shù)值轉(zhuǎn)化為時(shí)間int h,m;h = int(ftime);m = int(ftime-h)*60); sprintf(nowtime,"%c
34、:%c%c",h+'0',int(m/10)+'0',int(m%10)+'0'); return nowtime;float timesub(char *time1, char *time2)/ 兩個(gè)時(shí)間相減,得到時(shí)間差return stof(time1) - stof(time2);void print()/ 打印輸出JCB *p = pjcb->link;printf(" 現(xiàn)在時(shí)間是 %sn",nowtime);printf(" 現(xiàn)在資源的數(shù)量 %dtt%dn",source.memo
35、ry,source.tape); printf("ttttttt 資源要求 n");printf("用戶名t作業(yè)名t狀態(tài)t到達(dá)時(shí)間t運(yùn)行時(shí)間(小時(shí))t主存(K)t磁帶機(jī)n"); while(p)printf("%st%st%ct%sttt%.2ft%dt%dn", p->username, p->jobname, p->state,p->atime, p->rtime, p->resource.memory,p->resource.tape);p = p->link;void sends
36、ource()/ 為作業(yè)分配資源JCB *p;p = pjcb->link;while(p)/ 為到達(dá)的作業(yè)調(diào)度if(p->state = 'W' && source.memory - p->resource.memory >=0 && source.tape - p->resource.tape >=0)p->state = 'R'source.memory -= p->resource.memory; source.tape -= p->resource.tape;prin
37、tf("n%st%s 被調(diào)入內(nèi)存 n", p->username, p->jobname); p = p->link;void init()/ 初始化,讀取文件中的作業(yè)信息FILE *fp;JCB *p= NULL,*q = pjcb ;if(fp = fopen("jobs.txt", "r") = NULL) printf("Cannot open the file!"); exit(1);rewind(fp);fp = findchar(fp, 'A');while (!fe
38、of(fp)p = getjcb(); fscanf(fp, "%s",p->username); fp = ignore(fp); fscanf(fp, "%s",p->jobname); fp = ignore(fp); fscanf(fp, "%c",&p->state); fp = ignore(fp);fscanf(fp, "%s",p->atime); fp = ignore(fp);p->rtime = 0;/ 不初始化則會(huì)發(fā)生錯(cuò)誤,? fscanf(fp, &q
39、uot;%f",&(p->rtime);fp = ignore(fp);fscanf(fp, "%d",&p->resource.memory);fp = ignore(fp);fscanf(fp, "%d",&p->resource.tape);fp = ignore(fp); q->link = p; q = p;p ->link = NULL; sendsource(); fclose(fp);int checkend() / 檢查是否所有的作業(yè)都已經(jīng)運(yùn)行完了JCB *p = pjcb
40、 ->link; while(p) if(p ->state != 'F') return 0;p = p->link; return 1;void run()/ 運(yùn)行作業(yè) if(checkend()/ 檢查是否所有的作業(yè)都已經(jīng)運(yùn)行完了 printf(" 所有作業(yè)都已經(jīng)完成 .n");exit(0);JCB *p = pjcb ->link; double time;while(p)/ 作業(yè)運(yùn)行完畢釋放資源time = stof(nowtime) - stof(p->atime); if(p ->state = '
41、R' &&time >= p->rtime)p->state = 'F'source.memory += p->resource.memory; source.tape += p->resource.tape;printf("n%st%s 已經(jīng)執(zhí)行結(jié)束 n", p->username, p->jobname);break; p = p->link;p = pjcb ->link; while(p)/ 計(jì)算到達(dá)的作業(yè)if( strcmp(nowtime, p->atime) =
42、0 && p->state = 'N') p->state = 'W'printf("n%st%s 作業(yè)已到達(dá) n", p->username, p->jobname); p = p->link;sen dsource();為作業(yè)分配資源 print();int main()char ch;double time =9.00;double step = float(5)/60+0.00001;ftos(9.0);init();dorun();*n");puts("puts(&q
43、uot;puts(”是否繼續(xù)運(yùn)行,每次運(yùn)行5分鐘Y/N。");*n");ch = getche();time += step; ftos(time);while(toupper(ch) = 'Y');destory();return 0;計(jì)算機(jī) 學(xué)院 網(wǎng)絡(luò)工程 專業(yè)3班組、學(xué)號(hào)3107007062姓名 張菲 協(xié)作者 無教師評(píng)定實(shí)驗(yàn)題目主存空間的分配和回收一、實(shí)驗(yàn)?zāi)康氖煜ぶ鞔娴姆峙渑c回收。 理解在不同的存儲(chǔ)管理方式下,如何實(shí)現(xiàn)主存空間的分配與回收。掌握動(dòng)態(tài)分區(qū)分配方式中的數(shù)據(jù)結(jié)構(gòu)和分配算法及動(dòng)態(tài)分區(qū)存儲(chǔ)管理方式及其實(shí)現(xiàn)過 程。二、實(shí)驗(yàn)內(nèi)容和要求主存的分配和回收
44、的實(shí)現(xiàn)是與主存儲(chǔ)器的管理方式有關(guān)的。所謂分配,就是解決多道作業(yè)或多進(jìn)程如何共享主存空間的問題。所謂回收,就是當(dāng)作業(yè)運(yùn)行完成時(shí)將作業(yè)或進(jìn)程所占的主存空間歸還給系統(tǒng)??勺兎謪^(qū)管理是指在處理作業(yè)過程中建立分區(qū), 使分區(qū)大小正好適合作業(yè)的需求, 并且 分區(qū)個(gè)數(shù)是可以調(diào)整的。 當(dāng)要裝入一個(gè)作業(yè)時(shí), 根據(jù)作業(yè)需要的主存量查看是否有足夠的空 閑空間, 若有,則按需要量分割一個(gè)分區(qū)分配給該作業(yè); 若無, 則作業(yè)不能裝入, 作業(yè)等待。 隨著作業(yè)的裝入、 完成, 主存空間被分成許多大大小小的分區(qū), 有的分區(qū)被作業(yè)占用, 而有 的分區(qū)是空閑的。實(shí)驗(yàn)要求使用可變分區(qū)存儲(chǔ)管理方式, 分區(qū)分配中所用的數(shù)據(jù)結(jié)構(gòu)采用空閑分區(qū)
45、表和空 閑分區(qū)鏈來進(jìn)行, 分區(qū)分配中所用的算法采用首次適應(yīng)算法、 循環(huán)首次適應(yīng)算法、 最佳適應(yīng) 算法三種算法來實(shí)現(xiàn)主存的分配與回收。 同時(shí), 要求設(shè)計(jì)一個(gè)實(shí)用友好的用戶界面, 并顯示 分配與回收的過程。三、實(shí)驗(yàn)主要儀器設(shè)備和材料硬件環(huán)境: IBM-PC 或兼容機(jī)軟件環(huán)境: VC+ 6.0四、實(shí)驗(yàn)原理及設(shè)計(jì)方案1、循環(huán)首次適應(yīng)算法在該算法中, 把主存中所有空閑區(qū)按其物理地址遞增的次序排列。 在為作業(yè)分配存儲(chǔ)空 間時(shí), 從上次找到的空閑分區(qū)的下一個(gè)空閑分區(qū)開始查找,直到找到第一個(gè)能滿足要求的空閑區(qū), 從中劃出與請(qǐng)求的大小相等的存儲(chǔ)空間分配給作業(yè),余下的空閑區(qū)仍留在空閑區(qū)表或鏈中。2、實(shí)驗(yàn)步驟( 1
46、)初始化空閑分區(qū);( 2)反復(fù)對(duì)現(xiàn)有的空閑分區(qū)進(jìn)行進(jìn)程創(chuàng)建和撤消,即內(nèi)存分配和回收;( 3)退出。3、流程圖五、結(jié)果過程及截圖 初始化主存大小后的狀態(tài)請(qǐng)輸入可用內(nèi)存空間大小:空閑內(nèi)存分區(qū)鏈基地址大小1030x)(ioo(ioo(xjc)(j(jixxjf)o(jiio(jc)o(aoo(i< 干Sj 占借淨(jìng) : xhJcxxaootK大小基地址0 0分配空間請(qǐng)按釋放空間請(qǐng)按2按1后分配一塊內(nèi)存:少配空間請(qǐng)按釋放空間請(qǐng)按2請(qǐng)輸入需要分配的空間大小匚S0分配內(nèi)存成功此次分配的內(nèi)存基地址為0HXXKXXXXXKXXXXXKXXXXXXXXXXXX宇閑內(nèi)存分區(qū)鏈:基地址大小950XXKXXXXX
47、KXXXXXKXXXXXXXXXXXX 主“存宇| 可占用情況:基地址大小按1后分配一塊內(nèi)存:請(qǐng)輸入需要分配的空間大仏50分配內(nèi)存成功,此次分配的內(nèi)存基地址為盹大小00900XXiMlf XKKiMlfXXMKlI X WJOtXiMlt 30貳«)0:主彳耳年1 可 占Z100100按2釋放內(nèi)存:100六、所遇困難的解決以及心得體會(huì)本實(shí)驗(yàn)我采取用一條鏈表同時(shí)表示空閑分區(qū)鏈和主存空間占用情況,因?yàn)橹鞔婵偞笮∈枪潭ǖ?,把空閑分區(qū)鏈所表示的區(qū)域從總的內(nèi)存里去除就是被占用的空間的大小,這個(gè)實(shí)驗(yàn)還是比較簡單的,因此很快就完成了, 通過它使我學(xué)習(xí)了主存空間的分配與回收,同時(shí)也讓我意識(shí)到了在回收
48、內(nèi)存時(shí)的一些問題,使我對(duì)課本知識(shí)有了更進(jìn)一步的理解。七、思考題1、內(nèi)存的主要分配方式有哪些?回收時(shí)可能出現(xiàn)的什么情況?應(yīng)怎樣處理這些情況?答:有定分區(qū)分配和動(dòng)態(tài)分區(qū)分配兩種,回收時(shí)可能出現(xiàn)內(nèi)存分區(qū)被切成若干在小不等小分區(qū),過小的分區(qū)浪費(fèi)內(nèi)存資源,這要求我們要用緊湊技術(shù)修整。2、動(dòng)態(tài)分區(qū)管理的常用內(nèi)存分配算法有哪幾種?比較它們各自的使用范圍。 答:有首次適應(yīng)算法、循環(huán)首次適應(yīng)算法、最佳適應(yīng)算法三種。首次適應(yīng)算法適用于小型作業(yè),而且分配速度不怎么要求的作業(yè),循環(huán)首次適應(yīng)算法適 用于一些大的作業(yè),避免大作業(yè)長期得不到分配,最佳適應(yīng)算法適應(yīng)于對(duì)分配速度要求高, 作業(yè)容量比較大的作業(yè)。八、源代碼#i n
49、clude <stdio.h>#i nclude <malloc.h>#in clude<c oni o.h>#defi ne getMEM() (MEM*)(malloc(sizeof(MEM) typedef struct Memory 可用分區(qū)鏈表節(jié)點(diǎn)int base;/ 基地址int size;/ 大小struct Memory *next;MEM;MEM *pm = getMEM();/ 可用分區(qū)的鏈表頭MEM *temp;/int SIZE;/ 總的內(nèi)存的大小,由用戶輸入int geti()/ 讓用戶只能輸入正整數(shù)char ch;int i =
50、0; fflush(stdin);ch = getchar(); while(ch = 'n') printf("tf 輸入不能為空 .請(qǐng)重新輸入 n"); fflush(stdin);ch = getchar(); while(ch != 'n')if(ch > '9' | ch < '0') printf("t 輸入有誤 ! 輸入只能為正整數(shù),請(qǐng)重新輸入 .n"); fflush(stdin);i = 0; ch = getchar();elsei = i*10 + (ch
51、- '0'); ch = getchar(); return i;bool check(MEM* pm, int base, int size)/ 檢查用戶輸入的合法性 MEM *p = pm;p = pm; while(p->next) if(p->base + p->size <= base &&base <= p->next->base && p->next->base >= base+ size)return true;p= p ->next;if(!p->next
52、&& p->base + p->size < SIZE)if(p->base + p->size <= base && base <= SIZE && SIZE >= base + size)return true;return false;bool release(MEM *pm, int base, int size)/ 釋放內(nèi)存空間 MEM *p = pm;if(!check(pm, base ,size)return false;while(p->next)if(base + size
53、 <= p->next->base) break;p = p->next;if(base = p->base + p->size)/ 低地址相鄰釋放區(qū)上下都相鄰僅高地址相鄰if(p ->next && p->next->base = base + size)/ p->size += size + p->next->size; temp = p->next;p->next = p->next->next; free(temp);else/ 僅與地地址相鄰 p->size += s
54、ize;else if (p->next && p->next->base = base +size)/ p->next->base = base;p->next->size += size;else/ 釋放區(qū)上下與空閑區(qū)都不相鄰temp = getMEM(); temp->size = size;temp->base = base; temp->next = p->next;p->next = temp;return true;int allocMem(MEM *pm, int size)/ 分配內(nèi)存空間MEM *p = pm;int base;while(p->next) if(p->next->size >= size) break;p = p->next; if(!p->next) return -1;if(p->next->size = size)/ 空閑分區(qū)大小剛好等于所需分區(qū) base = p->next->base; p->next = p->next->next;else p
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 湘藝版四年級(jí)上冊(cè)音樂教案- 第五課(演唱) 踩雨
- 2025年印刷品、記錄媒介復(fù)制品項(xiàng)目合作計(jì)劃書
- 大數(shù)據(jù)技術(shù)助力提升教學(xué)質(zhì)量研究
- 教育技術(shù)在不同領(lǐng)域的應(yīng)用及前景分析
- 從教育心理學(xué)看學(xué)校教育與家庭教育的結(jié)合
- 教師專業(yè)成長與教育法的緊密結(jié)合
- 心理資本開發(fā)教育心理學(xué)在人力資源培訓(xùn)中的實(shí)踐
- 2025屆安徽省合肥市巢湖市匯文實(shí)驗(yàn)學(xué)校物理高二下期末質(zhì)量跟蹤監(jiān)視試題含解析
- 在線教育與遠(yuǎn)程教學(xué)下的教師能力提升
- 合同變更的處理流程題目
- 2025至2030全球及中國公共廣播和語音報(bào)警系統(tǒng)(PAVA)行業(yè)發(fā)展趨勢(shì)分析與未來投資戰(zhàn)略咨詢研究報(bào)告
- 2025至2030中國精釀啤酒行業(yè)深度產(chǎn)業(yè)運(yùn)行態(tài)勢(shì)及投資規(guī)劃深度研究報(bào)告
- 2025至2030中國電蚊拍行業(yè)發(fā)展趨勢(shì)分析與未來投資戰(zhàn)略咨詢研究報(bào)告
- 體動(dòng)脈-肺動(dòng)脈轉(zhuǎn)流術(shù)之術(shù)后監(jiān)護(hù)要點(diǎn)
- 2025至2030中國膩?zhàn)臃坌袠I(yè)市場(chǎng)發(fā)展現(xiàn)狀及發(fā)展趨勢(shì)與投資報(bào)告
- 女性職場(chǎng)禮儀
- 2025年湖北省中考語文真題(解析版)
- 維修安全生產(chǎn)管理制度
- 《小學(xué)生心理健康教育》試題及答案
- 2024年全球及中國神經(jīng)康復(fù)外骨骼機(jī)器人行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 某鎮(zhèn)“十五五”發(fā)展規(guī)劃編制思路
評(píng)論
0/150
提交評(píng)論