您好,欢迎来到化拓教育网。
搜索
您的当前位置:首页计算机操作系统内存分配实验源代码

计算机操作系统内存分配实验源代码

来源:化拓教育网
#define OK 1 //完成 #define ERROR 0 //出错 typedef int Status;

typedef struct free_table//定义一个空闲区说明表结构 {

int num; //分区序号 long address; //起始地址 long length; //分区大小 int state; //分区状态 }ElemType;

typedef struct Node// 线性表的双向链表存储结构 {

ElemType data;

struct Node *prior; //前趋指针 struct Node *next; //后继指针 }Node,*LinkList; LinkList first; //头结点 LinkList end; //尾结点 int flag;//记录要删除的分区序号

Status Initblock()//开创带头结点的内存空间链表 {

first=(LinkList)malloc(sizeof(Node)); end=(LinkList)malloc(sizeof(Node)); first->prior=NULL; first->next=end; end->prior=first; end->next=NULL; end->=1; end->=40; end->=600; end->=0; return OK; }

void sort()//分区序号重新排序 {

Node *p=first->next,*q; q=p->next;

for(;p!=NULL;p=p->next) {

for(q=p->next;q;q=q->next) {

if(p->>=q-> {

q->+=1;

} } } }

//显示主存分配情况 void show()

{ int flag=0;//用来记录分区序号 Node *p=first; p->=0; p->=0; p->=40; p->=1; sort();

printf(\"\\n\\》主存空间分配情况《\\n\");

printf(\"**********************************************************\\n\\n\"); printf(\"分区序号\起始地址\分区大小\分区状态\\n\\n\"); while(p) {

printf(\"%d\\%d\\%d\ if(p->==0) printf(\"\\空闲\\n\\n\"); else printf(\"\\已分配\\n\\n\"); p=p->next; }

printf(\"**********************************************************\\n\\n\"); }

//首次适应算法

Status First_fit(int request) {

//为申请作业开辟新空间且初始化 Node *p=first->next;

LinkList temp=(LinkList)malloc(sizeof(Node)); temp->=request; temp->=1; p->=1; while(p) {

if((p->==0)&&(p->==request)) {//有大小恰好合适的空闲块 p->=1; return OK; break; }

else if((p->==0) && (p->>request)) {//有空闲块能满足需求且有剩余

temp->prior=p->prior; temp->next=p; temp->=p->; temp->=p->;

p->prior->next=temp; p->prior=temp; p->=temp->+temp->; p->=request; p->+=1; return OK; break; } p=p->next; }

return ERROR; }

//最佳适应算法

Status Best_fit(int request) {

int ch; //记录最小剩余空间 Node *p=first;

Node *q=NULL; //记录最佳插入位置

LinkList temp=(LinkList)malloc(sizeof(Node)); temp->=request; temp->=1; p->=1;

while(p) //初始化最小空间和最佳位置 {

if((p->==0) && (p->>=request) ) {

if(q==NULL) { q=p; ch=p->; }

else if(q-> > p-> { q=p; ch=p->; } }

p=p->next; }

if(q==NULL) return ERROR;//没有找到空闲块

else if(q->==request) {

q->=1; return OK; } else {

temp->prior=q->prior; temp->next=q; temp->=q->; temp->=q->; q->prior->next=temp; q->prior=temp; q->+=request; q->=ch; q->+=1; return OK; } return OK; }

//最差适应算法

Status Worst_fit(int request) {

int ch; //记录最大剩余空间 Node *p=first->next;

Node *q=NULL; //记录最佳插入位置

LinkList temp=(LinkList)malloc(sizeof(Node)); temp->=request; temp->=1; p->=1;

while(p) //初始化最大空间和最佳位置 {

if(p->==0 && (p->>=request) ) {

if(q==NULL) { q=p; ch=p->; }

else if(q-> < p-> { q=p; ch=p->; }

} p=p->next; }

if(q==NULL) return ERROR;//没有找到空闲块 else if(q->==request) { q->=1; return OK; } else {

temp->prior=q->prior; temp->next=q; temp->=q->; temp->=q->; q->prior->next=temp; q->prior=temp; q->+=request; q->=ch; q->+=1; return OK; } return OK; }

//分配主存

Status allocation(int a) {

int request;//申请内存大小

printf(\"请输入申请分配的主存大小(单位:KB):\"); scanf(\"%d\ if(request<0 ||request==0) {

printf(\"分配大小不合适,请重试!\"); return ERROR; } switch(a) {

case 1: //默认首次适应算法

if(First_fit(request)==OK) printf(\"\****分配成功!****\"); else printf(\"\****内存不足,分配失败!****\"); return OK;

break;

case 2: //选择最佳适应算法

if(Best_fit(request)==OK) printf(\"\****分配成功!****\");

else printf(\"\****内存不足,分配失败!****\"); return OK; break;

case 3: //选择最差适应算法

if(Worst_fit(request)==OK) printf(\"\****分配成功!****\"); else printf(\"\****内存不足,分配失败!****\"); return OK; } }

Status deal1(Node *p)//处理回收空间 {

Node *q=first;

for(;q!=NULL;q=q->next) {

if(q==p) {

if(q->prior->==0&&q->next->!=0)

{

q->prior->+=q->;

break;

q->prior->next=q->next; q->next->prior=q->prior; q=q->prior; q->=0; q->=flag-1;

}

if(q->prior->!=0&&q->next->==0) {

q->+=q->next->;

q->next=q->next->next; q->next->next->prior=q; q->=0; q->=flag;

} {

q->prior->+=q->;

if(q->prior->==0&&q->next->==0)

q->prior->next=q->next; q->next->prior=q->prior; q=q->prior; q->=0; q->=flag-1;

}

if(q->prior->!=0&&q->next->!=0)

{

q->=0;

}

} } return OK; }

Status deal2(Node *p)//处理回收空间 {

Node *q=first;

for(;q!=NULL;q=q->next) {

if(q==p) {

if(q->prior->==0&&q->next->!=0)

{

q->prior->+=q->;

q->prior->next=q->next; q->next->prior=q->prior; q=p->prior; q->=0; q->=flag-1;

}

if(q->prior->!=0&&q->next->==0) { q->=0;

} {

q->prior->+=q->;

if(q->prior->==0&&q->next->==0)

q->prior->next=q->next; q->next->prior=q->prior; q=q->prior; q->=0; q->=flag-1;

} {

q->=0;

}

if(q->prior->!=0&&q->next->!=0)

} } return OK; }

//主存回收

Status recovery(int flag) {

Node *p=first;

for(;p!=NULL;p=p->next) {

if(p->==flag)

{

if(p->prior==first) {

if(p->next!=end)//当前P指向的下一个不是最后一个时 {

if(p->next->==0) //与后面的空闲块相连 {

p->+=p->next->; p->next->next->prior=p; p->next=p->next->next; p->=0; p->=flag; }

printf(\"\****回收成功****\"); return OK; } //主函数

} else p->=0; }

if(p->next==end)//当前P指向的下一个是最后一个时 { }

}//结束if(p->prior==block_first)的情况 else if(p->prior!=first) {

if(p->next!=end) {

deal1(p); } else { deal2(p); }

}//结束if(p->prior!=block_first)的情况

p->=0;

}//结束if(p->==flag)的情况

void main() {

int i; //操作选择标记 int a;//算法选择标记

printf(\"**********************************************************\\n\"); printf(\"\\用以下三种方法实现主存空间的分配\\n\");

printf(\"\(1)首次适应算法\(2)最佳适应算法\(3)最差适应算法\\n\");

printf(\"**********************************************************\\n\"); printf(\"\\n\");

printf(\"请输入所使用的内存分配算法:\"); scanf(\"%d\ while(a<1||a>3) {

printf(\"输入错误,请重新输入所使用的内存分配算法:\\n\"); scanf(\"%d\ }

switch(a) {

case 1:printf(\"\\n\****使用首次适应算法:****\\n\");break;

case 2:printf(\"\\n\****使用最佳适应算法:****\\n\");break; case 3:printf(\"\\n\****使用最坏适应算法:****\\n\");break;

}

Initblock(); //开创空间表 while(1) {

show();

printf(\"\1: 分配内存\2: 回收内存\0: 退出\\n\"); printf(\"请输入您的操作:\"); scanf(\"%d\ if(i==1)

allocation(a); // 分配内存 else if(i==2) // 内存回收 {

printf(\"请输入您要释放的分区号:\"); scanf(\"%d\ recovery(flag); }

else if(i==0)

{ }

printf(\"\\n退出程序\\n\"); break; //退出

else //输入操作有误 {

printf(\"输入有误,请重试!\"); continue; } } }

八、执行结果和结果分析 初始化首次适应算法:

当作业1、2、3顺利分配内存空间后: 回收序号2里面的内存: 分配作业4:

回收序号3里面的内存(与上邻序号2相连了) 回收序号1里的内存(与下邻序号2相连了)

继续分配(会发现总是按顺序查找满足要求的第一个空闲块,一旦发现就会分配):

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo9.cn 版权所有 赣ICP备2023008801号-1

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务