操作系統(tǒng)實驗報告+進程調(diào)度+作業(yè)調(diào)度等_第1頁
操作系統(tǒng)實驗報告+進程調(diào)度+作業(yè)調(diào)度等_第2頁
操作系統(tǒng)實驗報告+進程調(diào)度+作業(yè)調(diào)度等_第3頁
操作系統(tǒng)實驗報告+進程調(diào)度+作業(yè)調(diào)度等_第4頁
操作系統(tǒng)實驗報告+進程調(diào)度+作業(yè)調(diào)度等_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、操作系統(tǒng)實驗報告1、進程調(diào)度2、作業(yè)調(diào)度3、主存空間的分配與回收4、文件系統(tǒng)學生學院計算機學院專業(yè)班級網(wǎng)絡工程班學 號3107007062學生姓名張菲指導教師胡欣如2009 年 12 月 20 日計算機 學院 網(wǎng)絡工程 專業(yè)3班組、學號3107007062姓名張菲協(xié)作者 無 教師評定實驗題目進程調(diào)度一、實驗目的用高級語言編寫和調(diào)試一個進程調(diào)度程序,以加深對進程的概念及進程調(diào)度算法的理 解。二、實驗內(nèi)容和要求編寫并調(diào)試一個模擬的進程調(diào)度程序,采用“簡單時間片輪轉(zhuǎn)法”調(diào)度算法對五個進程進行調(diào)度。每個進程有一個進程控制塊(PCB)表示。進程控制塊可以包含如下信息:進程名、到達時間、需要運行時間、已運

2、行時間、進程狀態(tài)等等。進程的到達時間及需要的運行時間可以事先人為地指定(也可以由隨機數(shù)產(chǎn)生)。進程的到達時間為進程輸入的時間。進程的運行時間以時間片為單位進行計算。每個進程的狀態(tài)可以是就緒 W( Wait )、運行R( Run)兩種狀態(tài)之一。就緒進程獲得 CPU后都只能運行一個時間片。用運行時間加1來表示。如果運行一個時間片后,進程的已占用CPU時間已達到所需要的運行時間,則撤消該進程,如果運行一個時間片后進程的已占用CPU時間還未達所需要的運行時間,也就是進程還需要繼續(xù)運行,此時應分配時間片給就緒隊列中排在該進程之后的進程,并將它插入就緒隊列隊尾。 每進行一次調(diào)度程序都打印一次運行進程、就緒

3、隊列、以及各個進程的PCB,以便進行檢查。重復以上過程,直到所要進程都完成為止。三、實驗主要儀器設備和材料硬件環(huán)境:IBM-PC或兼容機軟件環(huán)境:C語言編程環(huán)境四、實驗原理及設計方案1、進程調(diào)度算法:采用多級反饋隊列調(diào)度算法。其基本思想是:當一個新進程進入內(nèi)在后,首先將它放入第一個隊列的末尾,按FCFS原則排隊等待高度。 當輪到該進程執(zhí)行時,如能在該時間片內(nèi)完成,便可準備撤離系統(tǒng);如果它在一個時間片結(jié)束時尚為完成,調(diào)度程序便將該進程轉(zhuǎn)入第二隊列的末尾,再同樣地按FCFS原則等待調(diào)度執(zhí)行,以此類推。2、實驗步驟:(1)按先來先服務算法將進程排成就緒隊列。(2)檢查所有隊列是否為空,若空則退出,否

4、則將隊首進程調(diào)入執(zhí)行。(3)檢查該運行進程是否運行完畢,若運行完畢,則撤消進程,否則,將該進程插 入到下一個邏輯隊列的隊尾。(4)是否再插入新的進程,若是則把它放到第一邏輯隊列的列尾。(5)重復步驟(2 )、( 3 )、( 4 ),直到就緒隊列為空。五、流程圖六、結(jié)果過程及截圖初始化隊列入進程運行時冋二9程號忖。.2二正入進程運彳亍吋司=5程號“4輸入所有進程后的進程信息如下:xjfx xnane ipi當前正在運行的進穰齊洪nt inefhe execute name :i>l進程所在的 邏輯隊列state qi.ttfue ;R:1rtine10在臥列可停留時間2P1需要運行兩 個時

5、間片,本進 程才離開此隊列當前就緒隊列狀態(tài)為:lane:p2state :wqueue !1nt ine:10亍七imeSB在隊列可停留時間2lane:p4state :ws 七 ate;wqueue !1nt incr 七 imeSH在隊列可停留時間queue !1nt inertine在隊列可停留時間按i犍添加新進程按其他任意鍵繼續(xù)運行.9按Y鍵繼續(xù)運行進程:P1需要運行1個技:鍵添加新進程.按其他任意鍵繼續(xù)運行.y時間片,本進 才離開此隊歹E程JTheexecute name:Pl*當前正在運仃的進程是;namequeuent ineIplIR:i1?rtime:1在隊列可停留時間:i當

6、前就緒隊列狀態(tài)為naiine:p2state (wqueuent ine:1rtime:0在隊列可停留時間:2n ane!p3state ! wque Lie :1nt ine :5rt iine 苗在隊列可停留時間 ;2paRe!p4state Mque ue !1nt ine:5rt ine在隊列可停留時間 :2按Y鍵繼續(xù)運行進程:Theexecute naitte:p2*當冃IJ止在運仃的進程是=p2在隊列可停留時間nanestatequeue timei*t imeIp211!012K X M X當前就緒隊列狀態(tài)為:nanestatequeue timei*t ime在隊列可停留時間I

7、p3'u11:5!012namestatequeuentimer-t ine在隊列可停留時間pi加入到了第:Hname!wstate!1queue!510ntimertine:2二個邏輯隊列!pl! 2 <1 J1 £n運行若干次后的狀態(tài):execute name:p3*當前正在運行的進程是"3列namestatequeuent tinertimelV3ER13E5:414 當前就緒隊列狀態(tài)為:namestatequeuent imeime在隊列可停留時間Ip4;w15:4:4namestatequeuent imert ime在隊列可停留時間;wK19:8:

8、Bnanestatequeuent imei*t ime在隊列可停留時間:p2!10:8:B進程【卩3己完應.添加新的進程:,進程在次隊按士鍵添加新進程按其他任意犍繼續(xù)運行i請輸入進程的個數(shù)"進程號斷-1 =削入進程名:newl輸入逬程運行時間:mphe execute:newl派當前正在運行的逬程是:ne«lnamestatequeuent ine在隊列可停留時間1 inewl!R11:3:a22 u rw 1_TP當前就緒隊列狀態(tài)為:namestatequeuent iert ime胚隊列可停留時間Splhl!4!9:8!8HAniestatequeuencineFt

9、ime在隊列可停留時間:p2hi;4江0:8!8namestateQueuent ineretime在隊列可停留時間:p4tW14:5!4!8七、所遇困難的解決以及心得體會在這個多級反饋的實驗中,我采取了用一條實際上的鏈表隊列來模擬多個邏輯上的隊列,通過維護幾個鏈表的狀態(tài)信息來找到每個進程運行完后應該插入的地方,還有一個標志位Fend用來表明新插入的隊列的位置。雖然實驗原理很簡單,但是在編寫代碼的過程中遇 到了不少的問題,在兩個小時之內(nèi)已經(jīng)完成的大體代碼的編寫,但是之中存在不少的問題, 導致了用了差不多四個小時的時間去調(diào)試才把它弄好,這主要歸咎于在開始設計代碼的不太合理, 在后期使得代碼結(jié)構(gòu)有

10、些混亂, 使得調(diào)試更加的麻煩, 以及對編程的不熟悉。 通過這 個實驗不僅使我對進程的調(diào)度算法有了更深的認識, 使得理論知識得到的實踐, 也使我的編 程能力得到了進一步提高。七、思考題1、 分析不同調(diào)度算法的調(diào)度策略,比較不同調(diào)度算法的優(yōu)缺點,總結(jié)它們的適用范圍。 答:動態(tài)有限權(quán)算法: 動態(tài)優(yōu)先權(quán)是指在創(chuàng)建進程時所創(chuàng)建的優(yōu)先權(quán), 會隨進程的推進或者 等待時間的增加而改變,以便獲得更好的調(diào)度性能。處理機為每個進程分配一定的時間片, 在就緒隊列中, 優(yōu)先權(quán)高的進程將優(yōu)先獲得處理機, 進程在進去運行完響應的時間片后, 如 沒完成,優(yōu)先權(quán)減 1,從新回到就緒隊列等待分配處理機。時間片的輪轉(zhuǎn)法: 系統(tǒng)將所

11、有進程排成一個隊列, 按照先來先服務的原則, 對隊列首的 進程進行處理, 每個進程在用完自己的時間片后, 從新回到隊尾進行排隊。 每運行一次, 進 程的需要時間減 1,直到就緒隊列為空!八、源代碼#include<stdio.h>#include<stdlib.h>#include<conio.h> #define getpch(type) (type*)malloc(sizeof(type)#define NULL 0#define TIME 2/ 時間片長度typedef struct pcb/ 進程管理塊 char name10;/ 進程名字char

12、state; int queue; int ntime; int rtime; int etime;/進程狀態(tài)/進程所在的隊列 /進程需要運行的時間 /進程已經(jīng)運行的時間 /進程在本隊列可運行的時間片struct pcb *link; PCB;/就緒隊列,進程插入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 輸入不能為空 .請重新輸入 n"); fflush(stdin);ch = getchar();while(ch != 'n')if(ch > '9' | ch < '0').n");printf("t 輸入有誤 ! 輸入只能為正整數(shù),請重新輸入 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()/ 插入進程if(!ready )ready = p;pfend = p;pinsert = p;else if(ready ->queue = 1)/ 第

15、一隊列存在p->link = pfend->link;pfend->link = p;pfend = p;findpos();elsep->link = ready; ready = p; findpos(); void input()/* 建立進程控制塊函數(shù) */int i,num;printf("n 請輸入進程的個數(shù) ?"); num = geti();for(i=0; i < num; i+)printf("n 進程號 No.%d:n",i+1); p=getpch(PCB);printf("n 輸入進程名

16、:"); scanf("%s",p->name);printf("n 輸入進程運行時間 :");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)/* 建立進程現(xiàn)實函數(shù),用于顯示當前進程 */printf("nnamet

17、statet queuet ntimet rtimet 在隊列可停留時間 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()/* 建立進程查看函數(shù) */PCB *pr;printf("n * 當前正在運行的進程是 :%s",ready->name);/* 顯示當前運行的進程 */ disp(ready);pr= ready ->link;printf("n* 當前就緒隊列狀態(tài)為 :n");/* 顯示就緒隊列狀態(tài) */ while(pr!=NULL)disp(pr); pr=pr->link;void sort()/ 調(diào)整進程隊列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()/ 添加新的進程if(ready ->queue != 1)(ready -> queue)+;ready->etime *= 2;ready -&g

20、t; state='w'sort();/* 調(diào)用 sort 函數(shù) */input();elseinput();void destroy()/* 建立進程撤銷函數(shù) ( 進程運行結(jié)束,撤銷進程 )*/ printf("n 進程 %s 已完成 .n",ready->name);p = ready;ready = ready->link;free(p);if (ready && ready -> queue = pinsert ->queue) findpos();)*/void running()/* 建立進程就緒函數(shù) (

21、進程運行時間到,置就緒狀態(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 鍵添加新進程 按其他任意鍵繼續(xù)運行 .");fflush(stdin);ch = getchar();if (ch = 'i'| ch='I') addnew();printf("nn 進程已經(jīng)完成 n

23、"); getchar();計算機 學院 網(wǎng)絡工程 專業(yè)3班組、學號3107007062姓名張菲協(xié)作者 無教師評定實驗題目作業(yè)調(diào)度一、實驗目的本實驗要求學生模擬作業(yè)調(diào)度的實現(xiàn),用高級語言編寫和調(diào)試一個或多個作業(yè)調(diào)度的模擬程序,了解作業(yè)調(diào)度在操作系統(tǒng)中的作用,以加深對作業(yè)調(diào)度算法的理解。二、實驗內(nèi)容和要求1、編寫并調(diào)度一個多道程序系統(tǒng)的作業(yè)調(diào)度模擬程序。作業(yè)調(diào)度算法:采用 基于先來先服務的調(diào)度算法 ??梢詤⒖颊n本中的方法進行設計。對于多道程序系統(tǒng),要假定系統(tǒng)中具有的各種資源及數(shù)量、調(diào)度作業(yè)時必須考慮到每個作業(yè)的資源要求。三、實驗主要儀器設備和材料硬件環(huán)境:IBM-PC或兼容機 軟件環(huán)境

24、:C語言編程環(huán)境四、實驗原理及設計方案采用多道程序設計方法的操作系統(tǒng),在系統(tǒng)中要經(jīng)常保留多個運行的作業(yè),以提高系統(tǒng)效率。作業(yè)調(diào)度從系統(tǒng)已接納的暫存在輸入井中的一批作業(yè)中挑選出若干個可運行的作業(yè), 并為這些被選中的作業(yè)分配所需的系統(tǒng)資源。對被選中運行的作業(yè)必須按照它們各自的作業(yè)說明書規(guī)定的步驟進行控制。采用先來先服務算法算法模擬設計作業(yè)調(diào)度程序。(1 )、作業(yè)調(diào)度程序負責從輸入井選擇若干個作業(yè)進入主存,為它們分配必要的資源,當它們能夠被進程調(diào)度選中時,就可占用處理器運行。作業(yè)調(diào)度選擇一個作業(yè)的必要條件是系統(tǒng) 中現(xiàn)有的尚未分配的資源可滿足該作業(yè)的資源要求。但有時系統(tǒng)中現(xiàn)有的尚未分配的資源既可滿足某

25、個作業(yè)的要求也可滿足其它一些作業(yè)的要求,那么,作業(yè)調(diào)度必須按一定的算法在這些作業(yè)中作出選擇。先來先服務算法是按照作業(yè)進入輸入井的先后次序來挑選作業(yè),先進入輸入井的作業(yè)優(yōu)先被挑選,當系統(tǒng)中現(xiàn)有的尚未分配的資源不能滿足先進入輸入井的作業(yè) 時,那么順序挑選后面的作業(yè)。(2)假定某系統(tǒng)可供用戶使用的主存空間共100k,并有5臺磁帶機。3)流程圖:羽處理機輪流分配給內(nèi)存中的作業(yè),并當作業(yè)毎分配到處理機時苴屋仃時間加rl. timesHllJX內(nèi)存中某作業(yè)runtime等于needtimeY空釋放作業(yè)rZ賦列昱否為 空白諭丄犀 五、結(jié)果過程及截圖讀取文件jobs.txt來初始化主存,磁帶機的個數(shù),并打印出

26、來。初始時間是9:00:JOBfi被調(diào)入內(nèi)存現(xiàn)在時囘是9個0現(xiàn)在貿(mào)源的數(shù)量盹3用戶名作業(yè)名狀態(tài)到達時間ftJOBAR9:00BJOBBN?:20CJOBCN9:30DJOBDM9:35EJOBEN9:45運行時間2卜時0.25舉雜帶機2320.35601Q.154533.2012d.10253星否繼續(xù)運行,每次運行5分鐘少也°。按Y運行5分鐘:用戶名作業(yè)名狀態(tài)到達時間AJOBAR9:00JOBBM9:20CJOBCN9:30DJOBBN9:35EJOBEN9:45資源要求運行吋間(小吋王#K磁帶機0_25202乩35G010.1S4530.28102BA0253if BJOM作業(yè)己到

27、達BJORB調(diào)入內(nèi)存現(xiàn)在時|可是肌加現(xiàn)在資擦的數(shù)量祁4用戶名作業(yè)名狀態(tài)到達時間aJOBAF9:9BJOBBR9:20CJOBCN9:30DJOBDN9:35EJOBEN9:45多次運行后最后狀態(tài):資源要求運行時間"卜時主存磁帶機0.25220.356010.154538.201020.10253按Y運行5分鐘:kJOBA己經(jīng)執(zhí)行結(jié)衷現(xiàn)在時間是9:鮎典在資源的數(shù)量丄靦5用戶名作業(yè)名狀態(tài)到達時間運行時間或小時主存K磁帶機AJOBAF9:000.25202BJOBSN9:20B.35丘01CJOBCN9:300.15453DJOBDN9=350.20102EJOBEN9:450.10253

28、按Y運行5分鐘:EJOBE己經(jīng)執(zhí)行結(jié)東用戶名A作業(yè)名獲態(tài)JOBRFJOBSFJOBCFJOBDFJOBEF到達時間9:009=209:309:359:45運行時間 小時0.25£350.15fl.206.10|X X X Jt: XBtJtXXKXJOCJOCMKJCXKJCXItXKKliCMXXJOCM!是否腿索運行.每次運行B分鐘b所有作業(yè)都己經(jīng)完成-六、所遇困難的解決以及心得體會這個實驗是花的時間最多的一個實驗, 第一次做的時候由于理解有些問題,所以做錯了。之后重新做了一遍,收獲還是很多的,遇到了很多的細節(jié)問題,例如像是時間化成浮點數(shù)和 浮點數(shù)化成時間等一些問題,從中也暴露了

29、自己的編程能力欠缺,之后要多多的寫程序。七、思考題1、寫出每種算法的調(diào)度策略,最后比較各種算法的優(yōu)缺點。答:先來先服務算法是根據(jù)作業(yè)的進入時間來排序,到達時間短的先運行,優(yōu)點是實現(xiàn)簡單,缺點是運行時間慢。短作業(yè)優(yōu)先算法是根據(jù)作業(yè)的估計運行時間來排序,估計運行時間短的先運行,優(yōu)點是運行時間快,缺點是實現(xiàn)起來比較復雜。2、選擇調(diào)度算法的依據(jù)是什么?答:如果作業(yè)要求的速度不高,而且作業(yè)比較小型,那就最好用先來先服務算法。如果作業(yè)要求的速度高,作業(yè)流程復雜,那就最好用短作業(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;/ 到達時間float rtime;/ 運行時間RESOURCE resource;/ 資源數(shù)量struct JCB*link;JCB

31、;RESOURCE source = 100,5;JCB *pjcb =getjcb();/ 作業(yè)鏈表頭char nowtime5;/ 現(xiàn)在時間 ,初始時間為 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、取文件時用 )FILE* findchar(FILE *fp,char c)/ 在文件中找到一個字符的位置 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)/ 把時間轉(zhuǎ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)/ 把浮點型數(shù)值轉(zhuǎn)化為時間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)/ 兩個時間相減,得到時間差return stof(time1) - stof(time2);void print()/ 打印輸出JCB *p = pjcb->link;printf(" 現(xiàn)在時間是 %sn",nowtime);printf(" 現(xiàn)在資源的數(shù)量 %dtt%dn",source.memo

35、ry,source.tape); printf("ttttttt 資源要求 n");printf("用戶名t作業(yè)名t狀態(tài)t到達時間t運行時間(小時)t主存(K)t磁帶機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)/ 為到達的作業(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;/ 不初始化則會發(fā)生錯誤,? 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)運行完了JCB *p = pjcb

40、 ->link; while(p) if(p ->state != 'F') return 0;p = p->link; return 1;void run()/ 運行作業(yè) if(checkend()/ 檢查是否所有的作業(yè)都已經(jīng)運行完了 printf(" 所有作業(yè)都已經(jīng)完成 .n");exit(0);JCB *p = pjcb ->link; double time;while(p)/ 作業(yè)運行完畢釋放資源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)/ 計算到達的作業(yè)if( strcmp(nowtime, p->atime) =

42、0 && p->state = 'N') p->state = 'W'printf("n%st%s 作業(yè)已到達 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ù)運行,每次運行5分鐘Y/N。");*n");ch = getche();time += step; ftos(time);while(toupper(ch) = 'Y');destory();return 0;計算機 學院 網(wǎng)絡工程 專業(yè)3班組、學號3107007062姓名 張菲 協(xié)作者 無教師評定實驗題目主存空間的分配和回收一、實驗目的熟悉主存的分配與回收。 理解在不同的存儲管理方式下,如何實現(xiàn)主存空間的分配與回收。掌握動態(tài)分區(qū)分配方式中的數(shù)據(jù)結(jié)構(gòu)和分配算法及動態(tài)分區(qū)存儲管理方式及其實現(xiàn)過 程。二、實驗內(nèi)容和要求主存的分配和回收

44、的實現(xiàn)是與主存儲器的管理方式有關的。所謂分配,就是解決多道作業(yè)或多進程如何共享主存空間的問題。所謂回收,就是當作業(yè)運行完成時將作業(yè)或進程所占的主存空間歸還給系統(tǒng)。可變分區(qū)管理是指在處理作業(yè)過程中建立分區(qū), 使分區(qū)大小正好適合作業(yè)的需求, 并且 分區(qū)個數(shù)是可以調(diào)整的。 當要裝入一個作業(yè)時, 根據(jù)作業(yè)需要的主存量查看是否有足夠的空 閑空間, 若有,則按需要量分割一個分區(qū)分配給該作業(yè); 若無, 則作業(yè)不能裝入, 作業(yè)等待。 隨著作業(yè)的裝入、 完成, 主存空間被分成許多大大小小的分區(qū), 有的分區(qū)被作業(yè)占用, 而有 的分區(qū)是空閑的。實驗要求使用可變分區(qū)存儲管理方式, 分區(qū)分配中所用的數(shù)據(jù)結(jié)構(gòu)采用空閑分區(qū)

45、表和空 閑分區(qū)鏈來進行, 分區(qū)分配中所用的算法采用首次適應算法、 循環(huán)首次適應算法、 最佳適應 算法三種算法來實現(xiàn)主存的分配與回收。 同時, 要求設計一個實用友好的用戶界面, 并顯示 分配與回收的過程。三、實驗主要儀器設備和材料硬件環(huán)境: IBM-PC 或兼容機軟件環(huán)境: VC+ 6.0四、實驗原理及設計方案1、循環(huán)首次適應算法在該算法中, 把主存中所有空閑區(qū)按其物理地址遞增的次序排列。 在為作業(yè)分配存儲空 間時, 從上次找到的空閑分區(qū)的下一個空閑分區(qū)開始查找,直到找到第一個能滿足要求的空閑區(qū), 從中劃出與請求的大小相等的存儲空間分配給作業(yè),余下的空閑區(qū)仍留在空閑區(qū)表或鏈中。2、實驗步驟( 1

46、)初始化空閑分區(qū);( 2)反復對現(xiàn)有的空閑分區(qū)進行進程創(chuàng)建和撤消,即內(nèi)存分配和回收;( 3)退出。3、流程圖五、結(jié)果過程及截圖 初始化主存大小后的狀態(tài)請輸入可用內(nèi)存空間大小:空閑內(nèi)存分區(qū)鏈基地址大小1030x)(ioo(ioo(xjc)(j(jixxjf)o(jiio(jc)o(aoo(i< 干Sj 占借淨 : xhJcxxaootK大小基地址0 0分配空間請按釋放空間請按2按1后分配一塊內(nèi)存:少配空間請按釋放空間請按2請輸入需要分配的空間大小匚S0分配內(nèi)存成功此次分配的內(nèi)存基地址為0HXXKXXXXXKXXXXXKXXXXXXXXXXXX宇閑內(nèi)存分區(qū)鏈:基地址大小950XXKXXXXX

47、KXXXXXKXXXXXXXXXXXX 主“存宇| 可占用情況:基地址大小按1后分配一塊內(nèi)存:請輸入需要分配的空間大仏50分配內(nèi)存成功,此次分配的內(nèi)存基地址為盹大小00900XXiMlf XKKiMlfXXMKlI X WJOtXiMlt 30貳«)0:主彳耳年1 可 占Z100100按2釋放內(nèi)存:100六、所遇困難的解決以及心得體會本實驗我采取用一條鏈表同時表示空閑分區(qū)鏈和主存空間占用情況,因為主存總大小是固定的,把空閑分區(qū)鏈所表示的區(qū)域從總的內(nèi)存里去除就是被占用的空間的大小,這個實驗還是比較簡單的,因此很快就完成了, 通過它使我學習了主存空間的分配與回收,同時也讓我意識到了在回收

48、內(nèi)存時的一些問題,使我對課本知識有了更進一步的理解。七、思考題1、內(nèi)存的主要分配方式有哪些?回收時可能出現(xiàn)的什么情況?應怎樣處理這些情況?答:有定分區(qū)分配和動態(tài)分區(qū)分配兩種,回收時可能出現(xiàn)內(nèi)存分區(qū)被切成若干在小不等小分區(qū),過小的分區(qū)浪費內(nèi)存資源,這要求我們要用緊湊技術修整。2、動態(tài)分區(qū)管理的常用內(nèi)存分配算法有哪幾種?比較它們各自的使用范圍。 答:有首次適應算法、循環(huán)首次適應算法、最佳適應算法三種。首次適應算法適用于小型作業(yè),而且分配速度不怎么要求的作業(yè),循環(huán)首次適應算法適 用于一些大的作業(yè),避免大作業(yè)長期得不到分配,最佳適應算法適應于對分配速度要求高, 作業(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é)點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 輸入不能為空 .請重新輸入 n"); fflush(stdin);ch = getchar(); while(ch != 'n')if(ch > '9' | ch < '0') printf("t 輸入有誤 ! 輸入只能為正整數(shù),請重新輸入 .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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論