logo资料库

操作系统实验四主存空间的分配与回收首次适应算法和循环首次适应算法.docx

第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
资料共12页,剩余部分请下载后查看
实验报告 【实验名称】 首次适应算法和循环首次适应算法 【实验目的】 理解在连续分区动态的存储管理方式下,如何实现主存空间的分配与回收。 【实验原理】 首次适应(first fit,FF)算法 FF 算法要求空闲分区链以地址递增的次序链接。在分配内存时,从链首开 始顺序查找,直至找到一个大小能满足要求的空闲分区即可。然后再按照作业的 大小,从该分区中划出一块内存空间,分配给请求者,余下的空闲分区仍留在空 闲链中。若从链首直至链尾都不能找到一个能满足要求的分区,则表明系统中已 经没有足够大的内存分配给该进程,内存分配失败,返回。 循环首次适应(next fit,NF)算法 为避免低址部分留下许多很小的空闲分区,以及减少查找可用空闲分区的开 销,循环首次适应算法在为进程分配内存空间时,不再是每次都从链首开始查找, 而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要 求的空闲分区,从中划出一块玉请求大小相等的内存空间分配给作业。 【实验内容】 实现主存空间的分配与回收: 1. 采用可变式分区管理,使用首次适应算法实现主存空间的分配与回收; 2. 采用可变式分区管理,使用循环首次适应算法实现主存空间的分配与回 收。 数据结构和符号说明: typedef struct PCB//进程控制块 {
char ProgressName[10]; int Startaddress; int ProgressSize; int ProgressState = 0; }; typedef struct FREE { int Free_num; int Startaddress; int Endaddress; int Free_Space; //进程名称 //进程开始地址 //进程大小 //进程状态 //空闲区结构体 //空闲区名称 //空闲区开始地址 //空闲区结束地址 //空闲区大小 }; 算法流程图: 首次适应算法 循环首次适应算法
程序代码及截图: #include #include #include #include #define N 1024 typedef struct PCB//进程控制块 { char ProgressName[10]; int Startaddress; int ProgressSize; int ProgressState = 0; //进程名称 //进程开始地址 //进程大小 //进程状态 }; typedef struct FREE { int Free_num; int Startaddress; int Endaddress; int Free_Space; }; //空闲区结构体 //空闲区名称 //空闲区开始地址 //空闲区结束地址 //空闲区大小 int count = 0; //当前内存中进程个数
bool ROM[N];//设置内存块 int p = 0;//循环首次使用需要标记当前的空闲区块 FREE FREE[100];//设置空闲区数组为 100 个 int FREE_counter = 0;//空闲区的个数 PCB num[20]; //作业队列 void init()//初始化操作 { for(int i=0; inum[j+1].Startaddress) { a = num[j]; num[j] = num[j+1]; num[j+1] = a; } for(int i=0; i
} void find_FREE() { //寻找空闲区 //计数值 int i,j,p; FREE_counter = 0;//预设空闲区数为 0 for(i = 0; i < N; i++) if(ROM[i] == 0) { p = i; for(j = i; j < N; j++) { if(ROM[j]==0)//未找到空闲区,则将 j 赋值给 i 后继续循环 { i = j; continue; } if(ROM[j]==1)//找到空闲区 { FREE_counter++;//空闲区个数+1; FREE[FREE_counter].Free_num = FREE_counter;//设置空闲区编号 FREE[FREE_counter].Startaddress = p; FREE[FREE_counter].Endaddress = j-1; FREE[FREE_counter].Free_Space = j-p; i=j+1; break; } } if(j == N && ROM[j-1] == 0)//对最后一个内存进行特殊操作 { FREE_counter++; FREE[ FREE_counter].Free_num = FREE_counter;//对空闲区进行处理 FREE[ FREE_counter].Startaddress = p; FREE[ FREE_counter].Endaddress =j-1; FREE[ FREE_counter].Free_Space = j-p; } } } void First_Fit(PCB &a)//首次适应算法 { int i,j,k;
for(i=0; i
ROM[k]=1; printf(" 插 入 成 功 , 进 程 %s 的 初 始 地 址 为 %d, 结 束 地 址 为%d\n",a.ProgressName,a.Startaddress,a.Startaddress+a.ProgressSize-1); p=i+a.ProgressSize; return; } } } for(i=0; i
int main() { int choose1,choose; char ProgressName[10]; PCB a; init(); printf("\t 主存空间的分配与回收\n"); printf("---------------------------------------\n"); printf("\t1、首次适应算法\n"); printf("\t2、循环首次适应算法\n"); printf("---------------------------------------\n"); printf("请选择分配算法:"); scanf("%d",&choose1); system("cls"); while(1) { w:system("cls"); printf("当前分配算法:"); if(choose1 == 1) printf("首次适应算法\n"); else printf("循环首次适应算法\n"); printf("---------------------------------------\n"); printf("\t1、插入进程\n"); printf("\t2、删除进程\n"); printf("\t3、显示进程的信息\n"); printf("\t4、显示空闲区\n"); printf("---------------------------------------\n"); printf("请输入:"); scanf("%d",&choose); system("cls"); switch(choose) { case 1: printf("请输入进程名:"); scanf("%s",&a.ProgressName); printf("请输入进程的大小:"); scanf("%d",&a.ProgressSize); for(int i = 0; i < count; i++) if(strcmp(num[i].ProgressName,a.ProgressName)==0) { printf("已存在同名进程,无法插入。\n"); system("pause"); goto w;
分享到:
收藏