3用C語言模擬實(shí)現(xiàn)可變式分區(qū)存儲(chǔ)管理_第1頁
3用C語言模擬實(shí)現(xiàn)可變式分區(qū)存儲(chǔ)管理_第2頁
3用C語言模擬實(shí)現(xiàn)可變式分區(qū)存儲(chǔ)管理_第3頁
3用C語言模擬實(shí)現(xiàn)可變式分區(qū)存儲(chǔ)管理_第4頁
3用C語言模擬實(shí)現(xiàn)可變式分區(qū)存儲(chǔ)管理_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、word可編輯試驗(yàn)三:用C語言模擬實(shí)現(xiàn)可變式分區(qū)存儲(chǔ)管理一、試驗(yàn)?zāi)繕?biāo):   1、通過編寫可變式分區(qū)存儲(chǔ)管理的C語言程序,使學(xué)生加強(qiáng)對(duì)可變式分區(qū)存儲(chǔ)管理的認(rèn)識(shí)。   2、掌握操作系統(tǒng)設(shè)計(jì)的根本原理、方法和一般步驟。 二、試驗(yàn)內(nèi)容:用C語言編寫一個(gè)實(shí)現(xiàn)可變式的分區(qū)管理的模擬程序。  *復(fù)習(xí)相關(guān)的知識(shí):   1、分區(qū)管理的原理:將存儲(chǔ)器劃分成假設(shè)干段大小固定的區(qū)域,一個(gè)區(qū)域里只能運(yùn)行一個(gè)程序,程序只能在其自身所在的分區(qū)中活動(dòng)。   2、固定式分區(qū)管理的原理:區(qū)域大小及起始地址是固定的。一個(gè)分區(qū)只能存放

2、一個(gè)程序。需要設(shè)置一個(gè)分區(qū)說明表來標(biāo)明內(nèi)存的使用狀態(tài)。根據(jù)分區(qū)說明表來給程序分配相應(yīng)的區(qū)域。由于程序不可能剛剛占有一個(gè)分區(qū)的大小 ,這樣就會(huì)在一個(gè)分區(qū)之中留下零頭,造成了極大的浪費(fèi)。  3、可變式分區(qū)管理的原理:區(qū)域的大小及起始地址是可變的,根據(jù)程序裝入時(shí)的大小動(dòng)態(tài)地分配一個(gè)區(qū)域。保證每個(gè)區(qū)域之中剛好放一個(gè)程序。這樣可以充分地利用存儲(chǔ)空間,提高內(nèi)存的使用效率。如果一個(gè)程序運(yùn)行完畢,就要釋放出它所占有的分區(qū),使之變成空閑區(qū)。這樣就會(huì)出現(xiàn)空閑區(qū)與占用區(qū)相互交錯(cuò)的情況。這樣就需要P表,F(xiàn)表來分別表示內(nèi)存的占用區(qū)狀態(tài)與空閑區(qū)的狀態(tài)。  *確定該系統(tǒng)所使用的數(shù)據(jù)結(jié)構(gòu): &#

3、160;    我們可以把內(nèi)存表示為一個(gè)數(shù)組的形式。這個(gè)數(shù)組中的每一個(gè)單元都是一個(gè)無符號(hào)的字符型的數(shù)據(jù)類型。這樣一個(gè)單元?jiǎng)偤谜加靡粋€(gè)字節(jié)的大小。這一個(gè)字節(jié)的地址可以用它在此數(shù)組中的下標(biāo)來表示。如果一個(gè)程序占用了一定的區(qū)域,那么這個(gè)區(qū)域的大小就可以用它占有的字節(jié)數(shù)的個(gè)數(shù)來表示。用C語言可以表述如下:    unsigned char memory1024    它就可以表示一個(gè)1K的內(nèi)存空間。    為了實(shí)現(xiàn)可變式的分區(qū)管理,還需要設(shè)立兩個(gè)表,一個(gè)是P表,一個(gè)是F表,它們分別表

4、示內(nèi)存的占用區(qū)狀態(tài)。由于在該程序運(yùn)行的過程之中需要不斷地修改P表和F表,所以這兩個(gè)表不適合于用數(shù)組的形式來表示;而應(yīng)該使用單鏈表的形式。這樣就要給單鏈表中的結(jié)點(diǎn)確立一個(gè)數(shù)據(jù)結(jié)構(gòu)。很顯然,P表中的每一個(gè)結(jié)點(diǎn)至少要包括以下的幾項(xiàng):占用的程序名、占用區(qū)的起始地址、占用區(qū)的大小、指向下一個(gè)結(jié)點(diǎn)的指針。F表中的結(jié)點(diǎn)可以不需要程序名這一項(xiàng)。但是為了統(tǒng)一起見,我們就統(tǒng)一地采用P表中的這種結(jié)點(diǎn)的結(jié)構(gòu)??梢杂肅語言描述如下:   struct node           char name10; &#

5、160;        int start, length;         struct node  *next;             ;     struct node  *p, *f;    還要為它們確立一個(gè)初始的狀態(tài)。這兩個(gè)鏈表最好帶有一個(gè)頭結(jié)點(diǎn)

6、。     p = (struct node *)malloc (sizeof(struct node);   p->next = NULL;   f = (struct node *) malloc (sizeof(struct node);   f->next = (struct node *)malloc (sizeof(struct node);   f->next ->start = 0;   f->next -> le

7、ngth = 1024;   f->next ->next = NULL;  *、實(shí)現(xiàn)分配與回收一個(gè)占用區(qū)的算法:    1、分配函數(shù)的執(zhí)行過程:按最正確分配法執(zhí)行。       查找F表,在其中找到一個(gè)滿足要求的空閑塊。如果沒有找到那么提示用戶。       申請(qǐng)一個(gè)新的P結(jié)點(diǎn),進(jìn)行填寫相關(guān)的數(shù)據(jù),將其掛接在P表的尾部。       修改原空閑

8、區(qū)結(jié)點(diǎn),并將其從F表中提出來。       將修改后的結(jié)點(diǎn)插入到適宜的位置,保證F表中的結(jié)點(diǎn)是按照地址空間的大小由小到大地進(jìn)行排序。       返回新生成P表結(jié)點(diǎn)的首地址。    2、回收函數(shù)的執(zhí)行過程:       查找P表,找到需要回收的程序的占用區(qū)結(jié)點(diǎn)。將它提出P表。       生成一個(gè)新的空閑結(jié)點(diǎn),填寫它。表示新生成

9、了一個(gè)空閑區(qū)。       觀察F表,看其中是否有舊的空閑區(qū)和新的空閑區(qū)相鄰。如果有,就將它與新 的空閑區(qū)結(jié)合點(diǎn)合并成一個(gè)大的空閑區(qū)。       將新生成的空閑區(qū)結(jié)點(diǎn)插入到F表中的適宜的位置。三試驗(yàn)要求:設(shè)計(jì)一個(gè)可變長分區(qū)的存儲(chǔ)器分配程序。四試驗(yàn)報(bào)告要求1寫出試驗(yàn)?zāi)康?2。寫出試驗(yàn)要求 3。寫出試驗(yàn)內(nèi)容包括可變長分區(qū)算法描述、實(shí)驗(yàn)結(jié)果及分析附錄1:   分配函數(shù)fenpei和回收函數(shù)free的C語言源程序:    

10、     int fenpei(char *c, int room, struct node *p, *f)                             struct node *p1, *f1, *f2;      

11、                              /*f2是f1的跟隨指針*/                 f1 = f->nex

12、t;  f2 = f;                while (f1!=NULL)    /*查找F表,看是否有滿足條件的一個(gè)結(jié)點(diǎn),如果沒有那么提示出錯(cuò)了*/                     

13、60;                          if (f1->length >=room)                   

14、0;          break;                           f1 = f1 -> next; f2 = f2->next;       &

15、#160;                              if (f1 = NULL)                  

16、60;                                 printf("no enough space!n");            

17、;                    return (-1);                        /*定位到P表的末尾,生成一個(gè)新的結(jié)點(diǎn),聯(lián)接到后面。*/ 

18、0;                                 p1 = p;                 while(

19、p1->next != NULL)                        p1 = p1 ->next;                  p1->next = (struc

20、t node *)malloc(sizeof(struct node);                  p1 = p1->next ;                  p1->length = room;   &

21、#160;              strcpy(p1->name, c);                  p1->start = f1 -> start;          

22、        p1->next = NULL;                   /*修改F表中被分配的節(jié)點(diǎn)*/                  f1->leng

23、th = f1->length - room;                  f1->start = f1->start + room;                  f2->next = f1 ->next; 

24、                               if (f1->length !=0)                 

25、  /*如果修改后的節(jié)點(diǎn)大小為0,那么舍棄之。*/                                             f2 = f;

26、60;                         while(f2->next!=NULL)&&(f2->next->length<= f1->length)            

27、60;                  f2 = f2 ->next;                         f1 ->next = f2 ->next;

28、60;                        f2->next = f1;                         &

29、#160;                               return (p1->start) ;                 

30、;      struct node *free (char *c, struct node *p, *f)                                     struct no

31、de *p1, *p2, *f1, *f2, *f3;                    p1 = p->next ;                   p2 = p;    &

32、#160;                     /*p2是p1是跟隨指針*/                    while(p1!= NULL)     

33、;                                 /*按外界提供的程序名在P表中查找其結(jié)點(diǎn),假設(shè)沒找到,那么返回NULL*/            &#

34、160;                                            if (!(strcmp(p1->name,c) break; &#

35、160;                             p1 = p1->next;                  &#

36、160;            p2 = p2->next;                                    &

37、#160;           if (p1=NULL)                                      

38、;                    printf("No find the program!n");                       

39、0;             return (NULL);                                    

40、        p2->next = p1 -> next ;             /*將找到的結(jié)點(diǎn)取出*/                    f1 = (struct node *)malloc(s

41、izeof(struct node);/*據(jù)此生成一個(gè)新的空閑結(jié)點(diǎn)*/                    f1->start = p1 ->start ;                    f1 -&

42、gt;length = p1 ->length;                     /*在F表中依次觀察各個(gè)結(jié)點(diǎn),看是否能與此新的空閑結(jié)點(diǎn)合并*/                    f2 = f

43、->next;                      f3 = f;                           

44、0;              while (f2!= NULL)                                  

45、60;                          if (f1->start + f1 ->length = f2->start)                &

46、#160;                                                  

47、            f1->length += f2->length;                                 

48、0;        f3->next = f2->next;                                      &

49、#160;  f2 = f2->next;                                              

50、                            else if (f2->start + f2->length = f1->start )              

51、;                                                  

52、0;                       f1->start = f2 ->start;                       

53、60;                        f1 ->length += f2->length;                     

54、                          f3 ->next = f2 ->next ;                    

55、                           f2 = f2->next;                     

56、                                                   

57、;     else f2=f2->next ;   f3 = f3->next;                                      

58、          f2 = f;   /*再尋找一個(gè)適宜的地方插入此空閑結(jié)點(diǎn)*/                    while  (f2->next!=NULL)&&(f2->next->length<=f1->length) 

59、                            f2 = f2->next;                   f1->next

60、 = f2->next;                   f2 ->next = f1;                    return (f1);     &

61、#160;       /*返回值*/               附錄2:可變長分區(qū)存儲(chǔ)分配完整程序/*可變分區(qū)的模擬*/ #include<stdio.h> unsigned char memory1024; struct node char name5; int start,length; struct node *next; ; struct node *p, *f, *pp,

62、*ff; /* 還要為它們確立一個(gè)初始的狀態(tài)。這兩個(gè)鏈表最好帶有一個(gè)頭結(jié)點(diǎn)。*/ struct node *free(char *c, struct node *p,struct node *f); main() int t=1,xz; char name5; unsigned int size; p = (struct node *)malloc (sizeof(struct node); p->next = NULL; f = (struct node *) malloc (sizeof(struct node); f->next = (struct node *)malloc

63、 (sizeof(struct node); f->next->start = 1; f->next->length = 1024; f->next->next = NULL; printf("可變式內(nèi)存管理模擬n "); while (t=1) printf("1:運(yùn)行進(jìn)程;2:終止進(jìn)程;3:退出 請(qǐng)選擇: "); scanf("%d",&xz); switch (xz) case 1: printf("請(qǐng)輸入請(qǐng)求進(jìn)程的進(jìn)程名(<=5個(gè)字符):"); scanf(

64、"%s",name); printf("請(qǐng)輸入請(qǐng)求進(jìn)程所需空間(起始可用內(nèi)存1024:"); scanf("%d",&size); fenpei(name,size,p,f); print(); /*打印分配表空閑表*/ break; case 2: printf("請(qǐng)輸入終止進(jìn)程的進(jìn)程名:");scanf("%s,%d",name); ff=free(name,p,f ); print();/*打印分配表空閑表*/ break; case 3: t=0;break; /*打印分配表空閑表函數(shù)*/ print() /*打印分配表*/ printf("分配表n"); pp=p->next; while (pp!=NULL) printf("%5s,%d,%dn",pp->name,pp->start, pp->length);pp=pp->next; /*打印空閑表 */ printf(

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論