动态分区分配方式的模拟
{
// 分配初始分区存
subAreaNode *fir = (subAreaNode *)malloc(sizeof(subAreaNode));
// 给首个分区赋值
fir->n= 0;
fir->addr = 0;
fir->size = SIZE;
fir->state = Free;
fir->taskId = -1;
tar->state = Busy;
tar->taskId = taskId;
p->n=p->n+1;
}
printf("存分配成功!\n");
return 1;
} else {
// 找不到合适的空闲分区
printf("找不到合适的存分区,分配失败...\n");
return 0;
}
}
// 回收存
int freeSubArea(int taskId)
// 分配大小为size的区间
subAreaNode *node = (subAreaNode *)malloc(sizeof(subAreaNode));
node->addr = p->addr + size;
node->size = p->size - size;
node->state = Free;
最佳适应算法;它从全部空闲区中找出能满足作业要求的、且大小最小的空闲分区,这种方法能使碎片尽量小。为适应此算法,空闲分区表(空闲区链)中的空闲分区要按从小到大进行排序,自表头开始查找到第一个满足要求的自由分区分配。该算法保留大的空闲区,但造成许多小的空闲区。
核心代码;
// 初始化空闲分区链
void intSubArea()
设置初始状态,每次分配和回收后显示出空闲存分区链的情况。
实
验
步
骤
首次适应算法; 从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法目的在于减少查找时间。为适应这种算法,空闲分区表(空闲区链)中的空闲分区要按地址由低到高进行排序。该算法优先使用低址部分空闲区,在低址空间造成许多小的空闲区,在高地址空间保留大的空闲区。
node->taskId = Nhomakorabea-1;// 修改分区链节点指针
node->pre = p;
node->nxt = p->nxt;
if(p->nxt != NULL) {
p->nxt->pre = node;
}
p->nxt = node;
// 分配空闲区间
p->size = size;
p->state = Busy;
tar = p;
tarSize = p->size;
}
p = p->nxt;
}
if(tar != NULL) {
// 找到要分配的空闲分区
if(tar->size - size <= MINSIZE) {
// 整块分配
tar->state = Busy;
tar->taskId = taskId;
} else {
fir->pre = &subHead;
fir->nxt = NULL;
// 初始化分区头部信息
subHead.pre = NULL;
subHead.nxt = fir;
}
// 首次适应算法
int firstFit(int taskId, int size)
{
subAreaNode *p = subHead.nxt;
while(p != NULL)
{
if(p->state == Free && p->size >= size) {
// 找到要分配的空闲分区
if(p->size - size <= MINSIZE) {
// 整块分配
p->state = Busy;
p->taskId = taskId;
} else {
{
int flag = 0;
subAreaNode *p = subHead.nxt, *pp;
while(p != NULL)
{
p->n++;
if(p->state == Busy && p->taskId == taskId) {
flag = 1;
if((p->pre != &subHead && p->pre->state == Free)
{
subAreaNode *tar = NULL;
int tarSize = SIZE + 1;
subAreaNode *p = subHead.nxt;
while(p != NULL)
{
// 寻找最佳空闲区间
if(p->state == Free && p->size >= size && p->size < tarSize) {
&& (p->nxt != NULL && p->nxt->state == Free)) {
// 情况1:合并上下两个分区
// 先合并上区间
p->taskId = taskId;
p->n=p->n+1;
}
printf("存分配成功!\n");
return 1;
}
p = p->nxt;
}
printf("找不到合适的存分区,分配失败...\n");
return 0;
}
// 最佳适应算法
int bestFit(int taskId, int size)
node->taskId = -1;
// 修改分区链节点指针
node->pre = tar;
node->nxt = tar->nxt;
if(tar->nxt != NULL) {
tar->nxt->pre = node;
}
tar->nxt = node;
// 分配空闲区间
tar->size = size;
// 分配大小为size的区间
subAreaNode *node = (subAreaNode *)malloc(sizeof(subAreaNode));
node->addr = tar->addr + size;
node->size = tar->size - size;
node->state = Free;
工业学院计算机工程系
操作系统实验报告(二)
实验名称
动态分区分配方式的模拟
实验日期
2016/12/3
成绩
姓 名
班级学号
实
验
目
的
了解动态分区分配方式中使用的数据结构和分配算法,进一步加深对动态分区存储管理方式及其实现过程的理解
实
验
环
境
Windows8.1+Visual C++6.0
实
验
容
用C或C++分别实现采用首次适应算法和最佳适应算法的动态分区分配过程和回收过程。