实验四、主存空间的分配和回收模拟
實驗四、主存空間的分配和回收模
物聯網工程??王鸞? 201306104128
一、????????實驗目的
?
?????為了合理地分配和使用這些存儲空間,當用戶提出申請主存儲器空間時,存儲管理必須根據申請者的要求,按一定的策略分析主存空間和使用情況,找出足夠的空閑區域給申請者。當作業撤離歸還主存資源時,則存儲管理要收回占用的主存空間。主存的分配和回收的實現是與主存儲器的管理方式有關的,通過本實驗幫助我們理解在不同的存儲管理方式下應怎樣實現主存空間的分配和回收。
用高級語言完成一個主存空間的分配和回收模擬程序,以加深對內存分配方式及其算法的理解。
?
二、????????實驗內容和要求
???? 2.1? 模擬包括3部分:
1)實現特定的內存分配算法
2)實現內存回收模擬
3)每種內存分配策略對應的碎片數統計
?
2.2? 固定分區存儲管理
假設內存容量為120KB,并且分別劃分成8,16,32,64KB大小的塊各一塊。
一個進程所需要的內存為0到100個KB。同時假設一個進程在運行過程中所需內存的大小不變。
模擬五個進程到達請求分配與運行完回收情況,輸出主存分配表.
?
2.3? 動態分區分配存儲管理
采用連續分配方式之動態分區分配存儲管理,使用首次適應算法、下次適應算法、最佳適應算法和最壞適應算法4種算法完成設計(任選兩種算法)。
(1)在程序運行過程,由用戶指定申請與釋放。
(2)設計一個已占用分區表,以保存某時刻主存空間占用情況。
(3)設計一個空閑分區表,以保存某時刻主存空間剩余情況。
(4)用兩個表的變化情況,反應各進程所需內存的申請與釋放情況。
?
?
三、????????實驗方法、步驟及結果測試
1.????? 源程序名:壓縮包文件(rar或zip)中源程序名 zxl4.c
? ? ? ? ?可執行程序名:zxl.exe
2.????? 原理分析及流程圖
? ? ?? ? ①.首先設置一個結構體類型的內存分區,用于存放內存的起始地址、長度、任務名和志向下一個空閑分區的指針;
? ? ? ? ②.設置showmemory函數,顯示當前內存分配情況 ;
? ? ? ? ③.memoallocate函數,用于分配內存;
? ? ? ? ④.Minsert函數,功能插入任務到空閑分區;
? ? ? ? ⑤.memoreturn函數,用于回收內存;Mreturn函數,功能回收內存;
? ? ? ? ⑥.main函數,用戶自行選擇,系統做出響應。
3.????? 主要程序段及其解釋:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct process
{
int number;
char name[20];
int begin;
int size;
char status;
}Pro;
main()
{
int sys=512;
char s;
int i=0;
int count1=0;
int count2=0;
int flag=1;
char j[10];
Pro a[10];
strcpy(a[0].name,"system");//a[0]是系統進程
a[0].begin=0;
a[0].size=100;
a[0].status='f';
printf("內存大小%dK\n",sys);
printf("占用%dK\n\n",a[0].size);
printf("空閑區表Free:\n");
printf("\tNO.\t proname\tbegin\t size\t status\n");
printf("\tNO.1\t -----\t\t %d\t %d\t f\n\n",a[0].size,sys-a[0].size);
printf("==============================================\n");
printf("已分配分區表::\n");
printf("\tNO.\t proname\tbegin\t size\t status\n");
printf("\tNO.1\t %s\t\t %d\t %d\t %c\n",a[0].name,a[0].begin,a[0].size,a[0].status);
printf("\n\n");
printf("內存使用情況:\n");
printf("printf sorted by address::\n");
printf("\tNO.\t proname\tbegin\t size\t status\n");
printf("\t---------------------------------------------\n");
printf("\tNO.1\t %s\t\t %d\t %d\t u\n",a[0].name,a[0].begin,a[0].size);
printf("\tNO.2\t -----\t\t %d\t %d\t f\n\n",a[0].size,sys-a[0].size);
printf("\n\n");
i=1;
while (1)
{
printf("請選擇:分配按1 回收按2 退出按e\n");
scanf("%s",&s);
switch (s)
{
case '1':
printf("輸入進程名:");
scanf("%s",&a[i].name);
printf("輸入進程大小:");
scanf("%d",&a[i].size);
a[1].begin=100;
a[i].status='u';
flag++; //當前的進程數
printf("插入完成!\n");
printf("空閑區表Free:\n");
printf("\tNO.\t proname\tbegin\t size\t status\n");
for (i=0;i<flag;i++)
{
a[i+1].begin=a[i].begin+a[i].size;
count1=a[i+1].begin;
count2=sys-count1;
}
printf("\tNO.1\t -----\t\t %d\t %d\t f\n\n",count1,count2);
a[0].status='u';
printf("==============================================\n");
printf("已分配分區表:\n");
printf("\tNO.\t proname\tbegin\t size\t status\n");
for(i=0;i<flag;i++)
{
a[i+1].begin=a[i].begin+a[i].size;
printf("\tNO.%d\t %s\t\t %d\t %d\t %c\n",i+1,a[i].name,a[i].begin,a[i].size,a[i].status);
}
printf("\n\n");
printf("內存使用情況:\n");
printf("printf sorted by address:\n");
printf("\tNO.\t proname\tbegin\t size\t status\n");
printf("\t--------------------------------------------\n");
for (i=0;i<flag;i++)
{
printf("\tNO.%d\t %s\t\t %d\t %d\t %c\n",i+1,a[i].name,a[i].begin,a[i].size,a[i].status);
}
printf("\tNO.%d\t -----\t\t %d\t %d\t f\n\n",flag+1,count1,count2);
break;
case '2':
printf("輸入進程名:");
scanf("%s",&j);
printf("回收成功!\n");
for (i=0;i<flag;i++)
{
if (strcmp(j,a[i].name)==0)
{
strcpy(a[i].name,"-----");
a[i].status='f';
}
}
printf("空閑區表Free:\n");
printf("\tNO.\t proname\tbegin\t size\t status\n");
for (i=0;i<flag;i++)
{
if (a[i].status=='f'){
printf("\tNO.%d\t %s\t\t %d\t %d\t %c\n",i,a[i].name,a[i].begin,a[i].size,a[i].status);}
}
printf("\tNO.%d\t -----\t\t %d\t %d\t f\n\n",flag-1,count1,count2);
printf("==============================================\n");
printf("已分配分區表::\n");
printf("\tNO.\t proname\tbegin\t size\t status\n");
for(i=0;i<flag;i++)
{
if (a[i].status=='u'){
printf("\tNO.%d\t %s\t\t %d\t %d\t %c\n",i,a[i].name,a[i].begin,a[i].size,a[i].status);}
}
printf("\n\n");
printf("內存使用情況:\n");
printf("printf sorted by address:\n");
printf("\tNO.\t proname\tbegin\t size\t status\n");
printf("\t--------------------------------------------\n");
for (i=0;i<flag;i++)
{
printf("\tNO.%d\t %s\t\t %d\t %d\t %c\n",i+1,a[i].name,a[i].begin,a[i].size,a[i].status);
}
printf("\tNO.%d\t -----\t\t %d\t %d\t f\n\n",flag+1,count1,count2);
break;
case 'e':
exit(0);
break;
}
}
}
4. ?運行結果:
?
內存使用情況
分配進程
回收進程
退出界面
5. ?心得:
本次實驗難度總的來說難度較大,部分代碼來源于網絡,但大都能理解,后來自己試著寫了一次。編程中應該注意獨立思考。
轉載于:https://www.cnblogs.com/kingluan/p/5103817.html
總結
以上是生活随笔為你收集整理的实验四、主存空间的分配和回收模拟的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML语意化
- 下一篇: 2.2.5 NIO.2 Path 和 J