一、 實驗目的
采用可變式分區管理,使用最佳適應算法實現主存的分配與回收
通過本次實驗,幫助學生理解在可變式分區管理方式下,如何實現主存空間的分配與回收。
二、 實驗內容
主存是中央處理機能直接存取指令和數據的存儲器。能否合理而有效地使用主存,在很大程度上將影響到整個計算機系統的性能。本實驗采用可變式分區管理,使用首次或最佳適應算法實現主存空間的分配與回收。要求采用分區說明表進行。
三、 代碼及運行結果分析
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma warning(disable:4996)
#define MAX 1000
struct partition {char pn[10];//分區名字int begin;//起始地址int size;//分區大小int end;//結束地址char status[10];//分區狀態
}part[MAX];
int p = 0; void Init()//初始化分區地址、大小以及狀態
{for (int i = 0; i < MAX; i++) strcpy_s(part[i].status, "null"); strcpy_s(part[0].pn, "system");part[0].begin = 0;part[0].size = 150;strcpy_s(part[0].status, "占用");strcpy_s(part[1].pn, "-----");part[1].begin = 150;part[1].size = 150;strcpy_s(part[1].status, "空閑");strcpy_s(part[2].pn, "AAA");part[2].begin = 300;part[2].size = 80;strcpy_s(part[2].status, "占用");strcpy_s(part[3].pn, "-----");part[3].begin = 380;part[3].size = 120;strcpy_s(part[3].status, "空閑");strcpy_s(part[4].pn, "BBB");part[4].begin = 500;part[4].size = 180;strcpy_s(part[4].status, "占用");strcpy_s(part[5].pn, "-----");part[5].begin = 680;part[5].size = 170;strcpy_s(part[5].status, "空閑");strcpy_s(part[6].pn, "CCC");part[6].begin = 850;part[6].size = 70;strcpy_s(part[6].status, "占用");strcpy_s(part[7].pn, "DDD");part[7].begin = 920;part[7].size = 80;strcpy_s(part[7].status, "占用");for (int i = 0; i < MAX; i++)part[i].end = part[i].begin + part[i].size - 1;
}void display() //顯示分區
{printf("\n 占用表");printf("\n\tNo.\tproname\tbegin\tsize\tend\tstatus");printf("\n");int n1 = 0;for (int i = 0; i < MAX; i++){if (strcmp(part[i].status, "null") == 0) break;if (strcmp(part[i].status, "占用") == 0){n1++;printf("\n\tNo.%d", n1);printf("\t%s\t%d\t%d\t%d\t%s", part[i].pn, part[i].begin, part[i].size, part[i].end, part[i].status);}}printf("\n");printf("\n 空閑表");printf("\n\tNo.\tproname\tbegin\tsize\tend\tstatus");printf("\n");int n2 = 0;for (int i = 0; i < MAX; i++){if (strcmp(part[i].status, "null") == 0) break;if (strcmp(part[i].status, "空閑") == 0){n2++; printf("\n\tNo.%d", n2);printf("\t%s\t%d\t%d\t%d\t%s", part[i].pn, part[i].begin, part[i].size, part[i].end, part[i].status);}}printf("\n");printf("\n 內存使用情況");printf("\n\tNo.\tproname\tbegin\tsize\tend\tstatus");printf("\n");int n3 = 0;for (int i = 0; i < MAX; i++){if (strcmp(part[i].status, "null") == 0) break;n3++;printf("\n\tNo.%d", n3);printf("\t%s\t%d\t%d\t%d\t%s", part[i].pn, part[i].begin, part[i].size, part[i].end, part[i].status);}printf("\n");
}void distribute() // 分配
{int i;char workName[10];int workSize;int pFree;printf("\n 內存使用情況");printf("\n\tNo.\tproname\tbegin\tsize\tend\tstatus");printf("\n");int n3 = 0;for (i = 0; i < MAX; i++){if (strcmp(part[i].status, "null") == 0) break;n3++;printf("\n\tNo.%d", n3);printf("\t%s\t%d\t%d\t%d\t%s", part[i].pn, part[i].begin, part[i].size, part[i].end, part[i].status);}printf("\n");printf("\n請輸入作業名稱:");scanf("%s", &workName);for (i = 0; i < MAX; i++) {if (strcmp(part[i].pn, workName)==0)//判斷作業名稱是否已經存在{printf("\n該作業已存在,無法分配\n");return;}}printf("請輸入作業大小(k):");scanf("%d", &workSize);for (i = 0; i < MAX; i++) {//通過循環在空閑區找是否有適合區間存儲作業if (strcmp(part[i].status, "空閑") == 0 && part[i].size >= workSize) {pFree = i;break;}}if (i == MAX) {printf("\n該作業超出目前最大可分配空間,無法分配\n");getchar();return;}for (i = 0; i < MAX; i++)//最佳適應算法if (strcmp(part[i].status, "空閑") == 0 && part[i].size >= workSize)if (part[pFree].size > part[i].size)pFree = i;//通過遍歷所有區間,每次都找到最小空閑分區進行分配int a = pFree;for (int i = MAX; i > a + 1; i--) {if (strcmp(part[i - 1].status, "null") == 0) continue;part[i] = part[i - 1];}strcpy_s(part[a + 1].pn, "-----");part[a + 1].begin = part[a].begin + workSize;part[a + 1].size = part[a].size - workSize;part[a + 1].end = part[a+1].begin + part[a+1].size - 1;strcpy_s(part[a + 1].status, "空閑");strcpy_s(part[a].pn, workName);part[a].size = workSize;part[a].end = part[a].begin + part[a].size - 1;strcpy_s(part[a].status, "占用");printf("\n分配成功!");
}void recover() // 回收分區
{int i;printf("\n 內存使用情況");printf("\n\tNo.\tproname\tbegin\tsize\tend\tstatus");printf("\n");int n3 = 0;for (i = 0; i < MAX; i++){if (strcmp(part[i].status, "null") == 0) break;n3++;printf("\n\tNo.%d", n3);printf("\t%s\t%d\t%d\t%d\t%s", part[i].pn, part[i].begin, part[i].size, part[i].end, part[i].status);}printf("\n");
printf("\n請輸入回收的占用分區號:");int number;scanf("%d", &number);if (number == 1){printf("\nsystem無法回收");return;}int n = 0;for (i = 0; i < MAX; i++)//通過循環查找要回收的已使用分區區號{if (strcmp(part[i].status, "占用") == 0){n++;if (n == number){strcpy_s(part[i].pn, "-----");strcpy_s(part[i].status, "空閑");}}}if (i == MAX - 1){printf("\n找不到分區");return;}while (i != MAX - 1) {for (i = 0; i < MAX - 1; i++) {if (strcmp(part[i].status, "空閑") == 0)if (strcmp(part[i + 1].status, "空閑") == 0) {part[i].size = part[i].size + part[i + 1].size;part[i].end = part[i].begin + part[i].size - 1;i++;for (i; i < MAX - 1; i++) {if (strcmp(part[i + 1].status, "null") == 0) {strcpy_s(part[i].status, "null");break;}part[i] = part[i + 1];}strcpy_s(part[MAX - 1].status, "null");break;}}}printf("\n回收成功!");
}
int main()
{int selection;Init();printf("本系統內存容量%dk,其中系統文件低址存儲%dk", MAX, part[0].size);while (1) {printf("\n------------主存空間的分配與回收------------");printf("\n| 1、顯示 |");printf("\n| 2、分配 |");printf("\n| 3、回收 |");printf("\n| 4、退出 |");printf("\n--------------------------------------------");printf("\n請輸入 > ");scanf("%d", &selection);switch (selection) {case 1:display(); //顯示分區break;case 2:distribute(); //分配作業break;case 3:recover(); //回收分區break;case 4:exit(0); //退出系統break;default:printf("輸入錯誤,請重新輸入:");break;}}
}
顯示
分配
回收
四、 實驗心得
1、 對C及C++語言重溫回顧,熟悉了使用
2、 理解在可變式分區管理下實現主存空間的分配與回收。
3、 掌握使用最佳適應算法
總結
以上是生活随笔為你收集整理的操作系统——实验叁——主存空间的分配与回收的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。