0 🌙实验目的
通过本实验,可加深理解动态分区分配、回收程序的功能和具体实现,特别是对回收分区的合并的理解。
1 🌙实验内容
设计动态分区首次适应分配、回收算法。
设计“未分配区说明表”,格式为:
序号 | 始址 | 长度 | 状态 |
1 | 60k | 200 | 1 |
0 |
设计“已分配区说明表”,格式为:
作业名 | 始址 | 长度 | 状态 |
0 | |||
0 |
设计显示程序,将“未分配区说明表”和“已分配区说明表”的内容,显示在屏幕上。
初始分配从一个空闲区分配起,回收时要合并空区。
2 🌙实验要求
系统要求分配一个分区时,应输入:作业名、作业长度。
回收一个分区时,应输入:回收的作业名。回收的分区请注意是否需要进行合并。
main 函数的结构:
3 🌙各功能简要说明
分配功能:选择该功能后,首先输入需要分配空间的作业名及所需空间的大小。然后,按照首次适用算法从空闲分区表中找到一个合适的分区,若找到,则划分相应的空闲分区给该作业(修改“未分配区说明表”和“已分配区说明表”中的内容);若没有找到,需要给出相应的提示信息。
回收算法:选择该功能后,首先输入需要回收的作业的名称,然后,系统按照该名称从“已分配区说明表”中找到该作业对应的表项,若找到,则回收该分区(修改“未分配区说明表”和“已分配区说明表”中的内容),要注意空闲分区的合并与空闲分区表需要按地址有序调整;若没有找到,则给出相应的提示信息。
显示分区表:将两个分区表的内容显示在屏幕上,以便随时查看程序的运行情况。
4 🌙实验代码
#include<bits/stdc++.h>
using namespace std;
#define M 5
typedef struct{
int add;
int length;
int status;
}Emp;
typedef struct{
int add;
int length;
int status;
char name[10];
}Use;
void Distribute(Emp emplist[],Use uselist[]);
void Recycling(Emp emplist[],Use uselist[]);
void Print(Emp emplist[],Use uselist[]);
int main(){
int i,select,flag=1;
Emp emp[M];
Use use[M];
for(i=0;i<M;i++){
emp[i].status=0;
emp[i].add=0;
emp[i].length=0;
use[i].add=0;
use[i].length=0;
use[i].status=0;
}
emp[0].add=600;
emp[0].length=2500;
emp[0].status=1;
while(flag==1){
printf("\n\n\n\n");
printf("\t\t|----------------------主菜单---------------------|\n");
printf("\t\t|\t\t\t\t\t |\n");
printf("\t\t|\t\t 1----分配\t |\n");
printf("\t\t|\t\t 2----回收\t |\n");
printf("\t\t|\t\t 3----显示\t |\n");
printf("\t\t|\t\t 0----退出\t |\n");
printf("\t\t|\t\t\t\t\t |\n");
printf("\t\t|-------------------------------------------------|\n\n");
printf("\t\t请输入你的选择(0-3):");
scanf("%d",&select);
printf("\n");
switch(select){
case 1:Distribute(emp,use);break;
case 2:Recycling(emp,use);break;
case 3:Print(emp,use);break;
case 0:flag=0;break;
}
}
}
void Distribute(Emp emplist[],Use uselist[]){ //分配
char name[10];
int RAM,i,j;
cout<<"请输入作业名:";
scanf("%s",name);
cout<<"请输入内存大小:";
scanf("%d",&RAM);
for(i=0;i<M;i++){
if(emplist[i].status==1&&emplist[i].length>=RAM){
emplist[i].length-=RAM;
emplist[i].add+=RAM;
if(emplist[i].length==0)emplist[i].status=0;
for(j=0;j<M;j++)if(uselist[j].status==0)break;
if(j==M)cout<<"分区使用表已满。"<<endl;
else{
strcpy(uselist[j].name,name);
uselist[j].add=emplist[i].add-RAM;
uselist[j].length=RAM;
uselist[j].status=1;
}
break;
}
}
if(i==M)cout<<"空闲分区已满,作业需要继续等待。"<<endl;;
}
void Recycling(Emp emp[],Use use[]){
char name[10];
Emp tem;
int i,m,n,add,length;
cout<<"请输入作业名:";
scanf("%s",name);
for(i=0;i<M;i++){
if(use[i].status==1&&strcmp(use[i].name,name)==0){
use[i].status=0;
break;
}
}
if(i!=M){
for(n=0;n<M;n++)if(emp[n].status==1&&emp[n].add+emp[n].length==use[i].add)break;
for(m=0;m<M;m++)if(emp[m].status==1&&emp[m].add==use[i].length+use[i].add)break;
if(n!=M){
if(m!=M){
emp[n].length+=emp[m].length+use[i].length;
emp[m].status=0;
}
else emp[n].length+=use[i].length;
}
else{
if(m!=M){
emp[m].length+=use[i].length;
emp[m].add=use[i].add;
}
else{
for(n=0;n<M;n++)if(emp[n].status==0){
emp[n].status=1;
emp[n].length=use[i].length;
emp[n].add=use[i].add;
break;
}
for(n=0;n<M-1;n++)for(m=0;m<M-1-n;m++){
if(emp[m].add>emp[m+1].add&&emp[m].status==1&&emp[m+1].status==1){
tem=emp[m];
emp[m]=emp[m+1];
emp[m+1]=tem;
}
}
}
}
}
else cout<<"该作业不存在。"<<endl;
}
void Print(Emp emp[],Use use[]){
int i,count=0;
cout<<"------------"<<"空闲分区表:"<<"------------"<<endl;
for(i=0;i<M;i++)if(emp[i].status==1)
{
count++;
cout<<count<<". "<<" 起始地址:"<<emp[i].add<<" "<<" 空间:"<<emp[i].length<<" 状态:"<<emp[i].status<<endl;
}
cout<<endl<<"------------"<<"分区使用表:"<<"------------"<<endl;
for(i=0;i<M;i++)if(use[i].status==1)
cout<<" 作业名:"<<use[i].name<<" "<<"起始地址:"<<use[i].add<<" "<<"空间:"<<use[i].length<<" 状态:"<<use[i].status<<endl;
cout<<endl;
}
5 🌙实验结果
6 🌙实验总结
设计Distribute函数时,存储函数名使用了%d,导致程序不能正常录入。
解决办法:通过对程序进行调试,找出了错误,将%d改成了%s。
在比较作业名称时,直接用了“==”,导致程序不能正常运行。
解决办法:将“==”改成使用strcmp函数,程序正常运行。
在写emp.status时,其中忘记了赋值为1,导致程序出现错误结果。
解决办法:将emp.status的值设为1。
设计Distribute函数时,直接将emplist的地址直接付给了uselist,忘记了emplist的地址早已改变。
解决办法:设一个int类型变量用于保留emplist的地址,再赋值给uselist。
7 🌙实验程序以及实验报告下载链接
操作系统原理实验:内含实验报告和实验视频希望能够给正在写实验报告的同学提供一定程度上的帮助如果需要讨论可以与我私信,相帮助-OS文档类资源-CSDN文库