实验二——动态高优先权优先调度算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《操作系统》课程实验报告实验名称:动态分区存储管理

姓名:王子瑜

学号: 541413450235

地点:四教楼

指导老师:刘放美

专业班级:软件工程(测试技术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;

tar->taskId = taskId;

} else {

// 分配大小为size的区间

相关文档
最新文档