操作系統實驗報告+進程調度+作業調度等_第1頁
操作系統實驗報告+進程調度+作業調度等_第2頁
操作系統實驗報告+進程調度+作業調度等_第3頁
操作系統實驗報告+進程調度+作業調度等_第4頁
操作系統實驗報告+進程調度+作業調度等_第5頁
已閱讀5頁,還剩46頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

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

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

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

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

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

6、前就緒隊列狀態為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鍵繼續運行進程:Theexecute naitte:p2*當冃IJ止在運仃的進程是=p2在隊列可停留時間nanestatequeue timei*t imeIp211!012K X M X當前就緒隊列狀態為:nanestatequeue timei*t ime在隊列可停留時間I

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

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

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

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

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;/進程狀態/進程所在的隊列 /進程需要運行的時間 /進程已經運行的時間 /進程在本隊列可運行的時間片struct pcb *link; PCB;/就緒隊列,進程插入PCB *ready = NULL, *pinsert = NULL, *pfend = NULL,*p =NULL; 位置的變量int geti() / 使用戶僅能輸入整數 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 輸入有誤 ! 輸入只能為正整數,請重新輸入 fflush(stdin);i = 0;ch = getchar();elsei = i*10 + (ch - '0');ch = getchar();return i;void findpos()/ 更新狀態量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()/* 建立進程控制塊函數 */int i,num;printf("n 請輸入進程的個數 ?"); 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();/* 調用 insert 函數 */void disp(PCB *pr)/* 建立進程現實函數,用于顯示當前進程 */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()/* 建立進程查看函數 */PCB *pr;printf("n * 當前正在運行的進程是 :%s",ready->name);/* 顯示當前運行的進程 */ disp(ready);pr= ready ->link;printf("n* 當前就緒隊列狀態為 :n");/* 顯示就緒隊列狀態 */ while(pr!=NULL)disp(pr); pr=pr->link;void sort()/ 調整進程隊列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();/* 調用 sort 函數 */input();elseinput();void destroy()/* 建立進程撤銷函數 ( 進程運行結束,撤銷進程 )*/ printf("n 進程 %s 已完成 .n",ready->name);p = ready;ready = ready->link;free(p);if (ready && ready -> queue = pinsert ->queue) findpos();)*/void running()/* 建立進程就緒函數 (

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

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

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

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

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

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

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

29、自己的編程能力欠缺,之后要多多的寫程序。七、思考題1、寫出每種算法的調度策略,最后比較各種算法的優缺點。答:先來先服務算法是根據作業的進入時間來排序,到達時間短的先運行,優點是實現簡單,缺點是運行時間慢。短作業優先算法是根據作業的估計運行時間來排序,估計運行時間短的先運行,優點是運行時間快,缺點是實現起來比較復雜。2、選擇調度算法的依據是什么?答:如果作業要求的速度不高,而且作業比較小型,那就最好用先來先服務算法。如果作業要求的速度高,作業流程復雜,那就最好用短作業優先算法。八、源代碼#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 / 作業控制塊 char username20; 用戶名 char jobname10; 作業名char state;/作業狀態char atime5;/ 到達時間float rtime;/ 運行時間RESOURCE resource;/ 資源數量struct JCB*link;JCB

31、;RESOURCE source = 100,5;JCB *pjcb =getjcb();/ 作業鏈表頭char nowtime5;/ 現在時間 ,初始時間為 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()/ 釋放鏈表所占的內存JCB *p = pjcb->link; while(pjcb) free(pjcb); pjcb = p; if(p) p = p->link;float stof

33、(char *time)/ 把時間轉化為浮點型數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)/ 把浮點型數值轉化為時間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(" 現在時間是 %sn",nowtime);printf(" 現在資源的數量 %dtt%dn",source.memo

35、ry,source.tape); printf("ttttttt 資源要求 n");printf("用戶名t作業名t狀態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()/ 為作業分配資源JCB *p;p = pjcb->link;while(p)/ 為到達的作業調度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 被調入內存 n", p->username, p->jobname); p = p->link;void init()/ 初始化,讀取文件中的作業信息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;/ 不初始化則會發生錯誤,? 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() / 檢查是否所有的作業都已經運行完了JCB *p = pjcb

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

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

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

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

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

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

48、內存時的一些問題,使我對課本知識有了更進一步的理解。七、思考題1、內存的主要分配方式有哪些?回收時可能出現的什么情況?應怎樣處理這些情況?答:有定分區分配和動態分區分配兩種,回收時可能出現內存分區被切成若干在小不等小分區,過小的分區浪費內存資源,這要求我們要用緊湊技術修整。2、動態分區管理的常用內存分配算法有哪幾種?比較它們各自的使用范圍。 答:有首次適應算法、循環首次適應算法、最佳適應算法三種。首次適應算法適用于小型作業,而且分配速度不怎么要求的作業,循環首次適應算法適 用于一些大的作業,避免大作業長期得不到分配,最佳適應算法適應于對分配速度要求高, 作業容量比較大的作業。八、源代碼#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 可用分區鏈表節點int base;/ 基地址int size;/ 大小struct Memory *next;MEM;MEM *pm = getMEM();/ 可用分區的鏈表頭MEM *temp;/int SIZE;/ 總的內存的大小,由用戶輸入int geti()/ 讓用戶只能輸入正整數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 輸入有誤 ! 輸入只能為正整數,請重新輸入 .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)/ 釋放內存空間 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)/ 低地址相鄰釋放區上下都相鄰僅高地址相鄰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/ 釋放區上下與空閑區都不相鄰temp = getMEM(); temp->size = size;temp->base = base; temp->next = p->next;p->next = temp;return true;int allocMem(MEM *pm, int size)/ 分配內存空間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)/ 空閑分區大小剛好等于所需分區 base = p->next->base; p->next = p->next->next;else p

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論