




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 工程項(xiàng)目代建合同
- 監(jiān)理竣工評(píng)估報(bào)告范本
- 2025江西吉安市青原區(qū)睿才人力資源有限公司招聘6人筆試參考題庫附帶答案詳解
- 合同范本之茶葉代加工合同模板
- 2025年湖南益陽市交通規(guī)劃勘測設(shè)計(jì)院有限公司招聘6人筆試參考題庫附帶答案詳解
- 2025年上半年宣城市廣德縣事業(yè)單位招考(41人)易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽花山區(qū)事業(yè)單位招聘人選易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽省馬鞍山市含山縣林頭鎮(zhèn)人民政府招聘派遣制人員10人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽省貴池區(qū)事業(yè)單位招聘擬聘(第二批)易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年安徽省巢湖市槐林政府民政辦招聘易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年湖南大眾傳媒職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫學(xué)生專用
- 2025年南京旅游職業(yè)學(xué)院高職單招職業(yè)技能測試近5年常考版參考題庫含答案解析
- 【2025年衛(wèi)生健康宣傳日】世界防治結(jié)核病日
- 和田玉知識(shí)培訓(xùn)課件下載
- 新版《醫(yī)療器械經(jīng)營質(zhì)量管理規(guī)范》(2024)培訓(xùn)試題及答案
- 2025年高縣縣屬國企業(yè)公開招聘工作人員高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025年人教版數(shù)學(xué)五年級(jí)下冊(cè)教學(xué)計(jì)劃(含進(jìn)度表)
- 第7課 課題二《清潔工具與生活·創(chuàng)意清潔工具設(shè)計(jì)》(說課稿)-2023-2024學(xué)年四年級(jí)下冊(cè)綜合實(shí)踐活動(dòng)浙教版
- DB11-T 1191.3-2024 實(shí)驗(yàn)室危險(xiǎn)化學(xué)品安全管理要求 第3部分:科研單位
- 醫(yī)療行業(yè)學(xué)生職業(yè)發(fā)展的路徑規(guī)劃
- 規(guī)范填寫臨時(shí)用電作業(yè)票
評(píng)論
0/150
提交評(píng)論