实验二——动态高优先权优先调度算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《操作系统》课程实验报告实验名称:动态分区存储管理
姓名:王子瑜
学号: 5
地点:四教楼
指导老师:放美
专业班级:软件工程(测试技术14-02)
实验成绩:
一、实验要求:
熟悉并掌握动态分区分配的各种算法。
熟悉并掌握动态分区中分区回收的各种情况,并能够实现分区合并。
二、实验容:
用高级语言模拟实现动态分区存储管理,要求:
1、分区分配算法至少实现首次适应算法、最佳适应算法和最坏适应算法中的至
少一种。熟悉并掌握各种算法的空闲区组织方式。
2、分区的初始化——可以由用户输入初始分区的大小。(初始化后只有一个空闲
分区,起始地址为0,大小是用户输入的大小)
3、分区的动态分配过程:由用户输入作业号和作业的大小,实现分区过程。
4、分区的回收:用户输入作业号,实现分区回收,同时,分区的合并要体现出
来。(注意:不存在的作业号要给出错误提示!)
5、分区的显示:任何时刻,可以查看当前存的情况(起始地址是什么,大小多
大的分区时空闲的,或者占用的,能够显示出来)
要求考虑:(1)存空间不足的情况,要有相应的显示;
(2)作业不能同名,但是删除后可以再用这个名字;
(3)作业空间回收是输入作业名,回收相应的空间,如果这个作业名不存在,也要有相应的提示。
三、实验代码
#include
#include
#define SIZE 640 // 存初始大小
#define MINSIZE 5 // 碎片最小值
enum STATE { Free, Busy };
struct subAreaNode {
int addr; // 起始地址
int size; // 分区大小
int taskId; // 作业号
STATE state; // 分区状态
subAreaNode *pre; // 分区前向指针
subAreaNode *nxt; // 分区后向指针
}subHead;
// 初始化空闲分区链
void intSubArea()
{
// 分配初始分区存
subAreaNode *fir = (subAreaNode *)malloc(sizeof(subAreaNode));
// 给首个分区赋值
fir->addr = 0;
fir->size = SIZE;
fir->state = Free;
fir->taskId = -1;
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 {
// 分配大小为size的区间
subAreaNode *node = (subAreaNode *)malloc(sizeof(subAreaNode));
node->addr = p->addr + size;
node->size = p->size - size;
node->state = Free;
node->taskId = -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;
p->taskId = taskId;
}
printf("存分配成功!\n");
return 1;
}
p = p->nxt;
}
printf("找不到合适的存分区,分配失败...\n");
return 0;
}
// 最佳适应算法
int bestFit(int taskId, int size)
{
subAreaNode *tar = NULL;
int tarSize = SIZE + 1;
subAreaNode *p = subHead.nxt;
while(p != NULL)
{
// 寻找最佳空闲区间
if(p->state == Free && p->size >= size && p->size < tarSize) { tar = p;
tarSize = p->size;
}
p = p->nxt;
}
if(tar != NULL) {
// 找到要分配的空闲分区
if(tar->size - size <= MINSIZE) {
// 整块分配
tar->state = Busy;