郑 州 轻 工 业 学 院
实 验 报 告
课程名称:
操作系统
姓
名:
张立增
学
号:
541503020163
专业班级:
软件工程 15-1
任课教师:
黄伟
2018
年 5 月 28 日
实验三 动态分区存储管理
一、 目的与任务
目的:熟悉并掌握动态分区分配的各种算法,熟悉并掌握动态分区中分区回收的
各种情况,并能够实现分区合并。
任务:用高级语言模拟实现动态分区存储管理。
二、内容、要求与安排
1、实验内容
分区分配算法至少实现首次适应算法、最佳适应算法和最坏适应算法中的至
少一种。熟悉并掌握各种算法的空闲区组织方式。
分区的初始化——可以由用户输入初始分区的大小。(初始化后只有一个空
闲分区,起始地址为 0,大小是用户输入的大小)
分区的动态分配过程:由用户输入作业号和作业的大小,实现分区过程。
分区的回收:用户输入作业号,实现分区回收,同时,分区的合并要体现出
来。(注意:不存在的作业号要给出错误提示!)
分区的显示:任何时刻,可以查看当前内存的情况(起始地址是什么,大小
多大的分区时空闲的,或者占用的,能够显示出来)。
2、实验要求
(1)内存空间不足的情况,要有相应的显示;
(2)作业不能同名,但是删除后可以再用这个名字;
(3)作业空间回收是输入作业名,回收相应的空间,如果这个作业名不存
在,也要有相应的提示。
三、测试
1. 方案
作业
进程名
情况
到达时间
时间片
服务时间
完成时间
周转时间
RR
q=1
A
0
4
15
15
B
1
3
12
11
C
2
4
16
14
带权周转时间
3.75
3.67
3.5
D
3
2
9
6
3
E
4
4
17
13
平均
11.8
3.33
3.46
2. 结果
四、 总结与讨论
通过本次实验,加深了对动态分区存储管理各个算法的理解,同时也明白如
何将课本知识运用到实际的代码操作中,但是个人代码实践能力还有待提升,需
要不断提升自己。
五、附:程序模块的源代码
#include
using namespace std;
enum Status{FREE,BUSY,OK,ERROR};
struct PST
{
int ID;
int addr;
int size;
Status state;
};
struct Node{
PST data;
Node *back;
Node *next;
Node()
{
back=NULL;
next=NULL;
}
Node(int id,int size)
{
data.ID=id;
data.size=size;
back=NULL;
next=NULL;
}
};
int area;
Node *head,*last;
void Init(int area)
{
head=new Node();
last=new Node();
head->next=last;
last->back=head;
last->data.addr=0;
last->data.ID=0;
last->data.size=area;
last->data.state=FREE;
}
Status FFA(int id,int size)
{
Node*temp=new Node(id,size);
temp->data.state=BUSY;
Node *cur=head->next;
while(cur)
{
if(cur->data.state==FREE&&cur->data.size==size){
cur->data.ID=id;
cur->data.state=BUSY;
return OK;
}
if(cur->data.state==FREE&&cur->data.size>size){
temp->back=cur->back;
temp->next=cur;
cur->back->next=temp;
temp->data.addr=cur->data.addr;
cur->back=temp;
cur->data.addr=cur->data.addr+size;
cur->data.size=cur->data.size-size;
return OK;
break;
}
cur=cur->next;
}
return ERROR;
}
Status BFA(int id,int size)
{
Node*temp=new Node(id,size);
temp->data.state=BUSY;
int min ;
Node*fit;
Node*cur=head->next;
while(cur){
if(cur->data.state==FREE&&cur->data.size>=size){
fit=cur;
min=cur->data.size-size;
break;
}
cur=cur->next;
}
while(cur)
{
if(cur->data.state==FREE&&cur->data.size==size){
cur->data.state=BUSY;
cur->data.ID=id;
return OK;
break;
}
if(cur->data.state==FREE&&cur->data.size>size){
if(cur->data.size-sizedata.size-size;
fit=cur;
}
}
cur=cur->next;
}
if(fit){
temp->back=fit->back;
temp->next=fit;
fit->back->next=temp;
temp->data.addr=fit->data.addr;
fit->back=temp;
fit->data.addr=fit->data.addr+size;
fit->data.size=fit->data.size-size;
return OK;
}
else
return ERROR;
}
Status WFA(int id,int size){
Node*temp=new Node(id,size);
temp->data.state=BUSY;
int max ;
Node*fit;
Node*cur=head->next;
while(cur){
if(cur->data.state==FREE&&cur->data.size>=size){
fit=cur;
max=cur->data.size-size;
break;
}
cur=cur->next;
}
while(cur){
if(cur->data.state==FREE&&cur->data.size==size){
cur->data.state=BUSY;
cur->data.ID=id;
return OK;
break;