操作系统实验_首次适应算法与循环首次适应算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学号P7*******专业计算机科学与技术姓名
实验日期2017.11.16教师签字成绩
实验报告
【实验名称】首次适应算法和循环首次适应算法
【实验目的】
学会主存空间分配与回收的基本方法首次适应算法和循环首次适应算法。
【实验原理】
理解在连续分区动态的存储管理方式下,如何实现贮存空间的分配与回收。
采用可变式分区管理,使用最佳适应算法实现主存空间的分配与回收。
采用可变式分区管理,使用最坏适应算法实现主存空间的分配与回收。
数据结构:
1、bool ROM[N]; //定义主存信息,如果内存被占用,则标记为1,否则标记为0,设置内存单元为1024
2、pcb num[20];//定义作业数组,最大支持20个作业
3、typedef struct Pcb //定义作业结构体,包括名称,开始时间,大小,是否执行状态
{
char name[10];
int start;
int size;
int state=0;
} pcb;
typedef struct Free_rom //空闲区结构体
{
int num;
int start;
int end;
int space;
} Free_room;
Free_rom free_rom[100];//设置空闲区数组为100个
主要函数
void init();//初始化信息,包括初始化内存信息,和初始化作业队列
void insert_pcb1(pcb &a);插入作业函数,首次适应算法,如果有适合的就插入,无合适输出‘插入失败’
void insert_pcb1(pcb &a);插入作业函数,循环首次适应算法,如果有适合的就插入,无合适输出‘插入失败’
void Delete(pcb &a)//删除作业信息,包括修改内存状态修改作业状态并对作业进行初始化
void show();//显示信息
void find_free_rom() //寻找空闲区
算法流程图
首次适应算法
循环首次适应算法
程序代码及截图:
#include
#include
#define N 1024
bool ROM[N];//设置内存块
int p=0;//循环首次使用需要标记当前的空闲区块
typedef struct Pcb//作业数据结构
{
char name[10];
int start;
int size;
int state=0;
} pcb;
int free_rom_counter=0;
pcb num[20]; //作业队列
typedef struct Free_rom //空闲区结构体
{
int num;
int start;
int end;
int space;
} Free_room;
Free_rom free_rom[100];//设置空闲区数组为100个void find_free_rom() //寻找空闲区
{
free_rom_counter=0;
int i,j,p;
for(i=0; i if(ROM[i]==0) { p=i; for(j=i; j { if(ROM[j]==0) { i=j; continue; } if(ROM[j]==1)//找到空闲区 { free_rom_counter++; free_rom[ free_rom_counter].num= free_rom_counter; free_rom[ free_rom_counter].start=p; free_rom[ free_rom_counter].end=j-1; free_rom[ free_rom_counter].space=j-p; i=j+1; break; } } if(j==N&&ROM[j-1]==0)//对最后一个内存进行特殊操作 { free_rom_counter++; free_rom[ free_rom_counter].num= free_rom_counter;//对空闲区进行处理 free_rom[ free_rom_counter].start=p; free_rom[ free_rom_counter].end=j-1; free_rom[ free_rom_counter].space=j-p; } } } void init()//初始化 { for(int i=0; i ROM[i]=0; } void show() { printf("空闲区名\t开始地址\t\t大小\t\t结束地址\t\t\n"); for (int i=1; i<= free_rom_counter; i++) printf("%d\t\t%d\t\t\t%d\t\t%d\t\t\n",free_rom[ i].num,free_rom[ i].start, free_rom[ i].space,free_rom[ i].end); } void insert_pcb1(pcb &a)//首次适应算法来实现作业调度 { int i,j,k; for(i=0; i if(ROM[i]==0) { for(j=i; j<=(i+a.size)&&j