一、实验目的
了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。
二、实验环境
硬件环境:计算机一台,局域网环境;
软件环境: Windows或Linux操作系统, C语言编程环境。
三、实验内容
1、用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc( )和回收过程free( )。其中,空闲分区通过空闲分区链来管理:在进行内存分配时,系统优先使用空闲区低端的空间。

2、假设初始状态下,可用的内存空间为640KB,并有下列的请求序列:

•作业1申请130KB。
•作业2申请60KB。
•作业3申请100KB。
•作业2释放60KB。
•作业4申请200KB。
•作业3释放100KB。
•作业1释放130KB。
•作业5申请140KB。
•作业6申请60KB。
•作业7申请50KB。
•作业6释放60KB。

请分别采用首次适应算法和最佳适应算法,对内存块进行分配和回收,要求每次分配和回收后显示出空闲分区链的情况。

3、实验报告要求:
(1)给出具体的设计过程,贴出相应的代码,截图给出试验结果。

①设计过程
最佳适应算法:首先,定义一个p指针,让p指针遍历空闲分区链表,当找到第一个满足进程请求空间大小的空闲区时,记录此位置,并且保存请求大小与空闲分区实际大小的差值记为a,然后让p指针继续遍历空闲分区链表,每当满足请求内存大小小于空闲区大小时,就记录两者的差值并且记录为b,比较a与b的大小关系,当a>b时,将b的值赋予a,并且修改记录位置为此空闲区的位置。若,a<=b,不做操作。继续遍历链表,重复上面的操作,直到p->next指向null为止。

首次适应算法:首次适应算法比较简单,只要找到满足条件的空闲区,就将此区的空间分配给进程。首先,用P指针遍历链表,找到第一个空间大于或者等于请求大小的位置,将此空间分配给进程,当此空闲区大小大于请求空间大小时,将空闲区分为两部分,一部分分配给进程,另一部分为空闲区,它的大小为之前空闲区大小减去分配给进程的空间大小。

内存回收算法:内存回收时,回收分区与空闲分区有四种关系。第一种情况为回收分区r上临一个空闲分区,此时应该合并为一个连续的空闲区,其始址为r上相邻的分区的首地址,而大小为两者大小之和。第二种情况为回收分区r与下相邻空闲分区,合并后仍然为空闲区,该空闲区的始址为回收分区r的地址。大小为两者之和,第三种情况为回收部分r与上下空闲区相邻,此时将这三个区域合并,始址为r上相邻区域的地址,大小为三个分区大小之和。当回收部分r上下区域都为非空闲区域,此时建立一个新的空闲分区,并且加入到空闲区队列中去。

②代码描述

#include <iostream>
#include<stdlib.h>
using namespace std;#define FREE 0
#define  BUSY 1
#define  MAX_length 640typedef struct freeArea//首先定义空闲区分表结构{int flag;
int size;
int ID;
int address;}Elemtype;typedef struct Free_Node
{Elemtype date;struct Free_Node *front;struct Free_Node *next;
}Free_Node,*FNodeList;FNodeList block_first;
FNodeList block_last;
int alloc(int tag);//内存分配
int free(int ID);//内存回收
int first_fit(int ID,int size);//首次适应算法
int best_fit(int ID,int size);//最佳适应算法
void show();//查看分配
void init();//初始化
void Destroy(Free_Node *p);//销毁节点
void menu();
void init()//
{block_first=new Free_Node;block_last = new Free_Node;block_first->front=NULL;block_first->next=block_last;block_last->front=block_first;block_last->next=NULL;block_last->date.address=0;block_last->date.flag=FREE;block_last->date.ID=FREE;block_last->date.size=MAX_length;
}//实现内存分配
int alloc(int tag)
{int ID,size1;cout<<"请输入作业号:";cin>>ID;cout<<"请输入所需内存大小:";cin>>size1;if (ID<=0 || size1<=0){cout<<"输入错误!请输入正确的ID和请求大小:"<<endl;return 0;}if (tag==1)//采用首次适应算法{if(first_fit(ID,size1)){       cout<<"分配成功!"<<endl;}else cout<<"分配失败!"<<endl;return 1;}else{if (best_fit(ID,size1)){cout<<"分配成功!"<<endl;}else cout<<"分配失败!"<<endl;return 1;}}int first_fit(int ID,int size)//首次适应算法
{FNodeList temp=(FNodeList)malloc(sizeof(Free_Node));Free_Node *p=block_first->next;temp->date.ID=ID;temp->date.size=size;temp->date.flag=BUSY;while(p){if (p->date.flag==FREE && p->date.size==size)//请求大小刚好满足{p->date.flag=BUSY;p->date.ID=ID;return 1;break;}if (p->date.flag==FREE && p->date.size>size)//说明还有其他的空闲区间{temp->next=p;temp->front=p->front;temp->date.address=p->date.address;p->front->next=temp;p->front=temp;p->date.address=temp->date.address+temp->date.size;p->date.size-=size;return 1;break;}p=p->next;}return 0;
}int best_fit(int ID,int size)//最佳适应算法
{int surplus;//记录可用内存与需求内存的差值FNodeList temp=(FNodeList)malloc(sizeof(Free_Node));Free_Node *p=block_first->next;temp->date.ID=ID;temp->date.size=size;temp->date.flag=BUSY;Free_Node *q=NULL;//记录最佳位置while(p)//遍历链表,找到第一个可用的空闲区间将他给q{if (p->date.flag==FREE&&p->date.size>=size){q=p;surplus=p->date.size-size;break;}p=p->next;}while(p)//继续遍历,找到更加合适的位置{if (p->date.flag==FREE&&p->date.size==size){p->date.flag=BUSY;p->date.ID=ID;return 1;break;}if (p->date.flag==FREE&&p->date.size>size){if (surplus>p->date.size-size){surplus=p->date.size-size;q=p;}}p=p->next;}if (q==NULL)//如果没有找到位置{return 0;}else//找到了最佳位置{temp->next=q;temp->front=q->front;temp->date.address=q->date.address;q->front->next=temp;q->front=temp;q->date.size=surplus;q->date.address+=size;return 1;}
}int free(int ID)//主存回收
{Free_Node *p=block_first->next;while(p){if (p->date.ID==ID)//找到要回收的ID区域{p->date.flag=FREE;p->date.ID=FREE;//判断P与前后区域关系if (p->front->date.flag==FREE&&p->next->date.flag!=FREE){p->front->date.size+=p->date.size;p->front->next=p->next;p->next->front=p->front;}if (p->front->date.flag!=FREE&&p->next->date.flag==FREE){p->date.size+=p->next->date.size;if(p->next->next){p->next->next->front=p;p->next = p->next->next;}else p->next=p->next->next;}if(p->front->date.flag==FREE&&p->next->date.flag==FREE){p->front->date.size+=p->date.size+p->next->date.size;if(p->next->next){p->next->next->front=p->front;p->front->next=p->next->next;}else p->front->next=p->next->next;}if(p->front->date.flag!=FREE&&p->next->date.flag!=FREE){//}break;}p=p->next;}cout<<"回收成功!"<<endl;return 1;
}
void Destroy(Free_Node *p)
{}
void show()
{cout<<"*******内存分配情况*******"<<endl;Free_Node *p=block_first->next;while(p){cout<<"分区号:";if (p->date.ID==FREE)cout<<"FREE"<<endl;else cout<<p->date.ID<<endl;cout<<"起始地址:"<<p->date.address<<endl;cout<<"内存大小:"<<p->date.size<<endl;cout<<"分区状态:";if (p->date.flag==FREE)cout<<"空闲"<<endl;elsecout<<"已分配"<<endl;cout<<"**************************"<<endl;p=p->next;}
}
void menu()//菜单
{int tag=0;int ID;init();cout<<"\t\t\t\t\t动态分区分配方式的模拟"<<endl;while(tag!=5){cout<<"\t\t**************************请选择要进行的操作**************************"<<endl;cout<<"\t\t\t\t\t1:首次适应算法\n\t\t\t\t\t2:最佳适应算法\n\t\t\t\t\t3:内存回收\n\t\t\t\t\t4:显示内存状况\n\t\t\t\t\t5:退出"<<endl;cin>>tag;switch(tag){case 1:alloc(tag);break;case 2:alloc(tag);break;case 3:cout<<"请输入需要回收的作业号:";cin>>ID;free(ID);break;case 4:show();break;}}}
int main()
{menu();return 0;
}

实验结果

首次适应算法





最佳适应算法




(2)结合实验情况,谈谈你对存储管理的理解和体会。
存储管理可以有效地对外部存储资源和内存进行管理,可以完成存储分配,存储共享,存储保护,存储扩充,地址映射等重要功能,对操作系统的性能有很重要的影响。首次适应算法和最佳适应算法是存储管理中两个十分重要的页面置换算法。
首次适应算法从空闲分区链首开始查找,直至找到一个能满足其大小要求的空闲分区为止。然后再按照作业的大小,从该分区中划出一块内存分配给请求者,余下的空闲分区仍留在空闲分区链中。该算法倾向于使用内存中低地址部分的空闲区,在高地址部分的空闲区很少被利用,从而保留了高地址部分的大空闲区,为以后到达的大作业分配大的内存空间创造了条件。但是低地址部分不断被划分,留下许多难以利用、很小的空闲区,而每次查找又都从低地址部分开始,会增加查找的开销。
最佳适应算法总是把既能满足要求,又是最小的空闲分区分配给作业。为了加速查找,该算法将所有的空闲区按大小排序后,以递增顺序形成一个空白链。这样每次找到的第一个满足要求的空闲区,必然是最优的。这样,每次分配给文件的都是最合适该文件大小的分区,但是内存中留下许多难以利用的小的空闲区。

操作系统实验七:动态分区分配方式的模拟相关推荐

  1. 操作系统分区分配java算法_合肥工业大学操作系统课程设计 动态分区分配存储管理java版.doc...

    合肥工业大学操作系统课程设计 动态分区分配存储管理java版.doc 1课程设计动态分区分配存储管理设计题目学号专业班级学生姓名号指导教师22010年12月合肥工业大学课程设计任务书设计题目动态分区分 ...

  2. 内存管理-动态分区分配方式模拟

    内存管理 - 动态分区分配方式模拟 操作系统第二次课程作业 - 动态分区分配方式模拟 项目需求 假设初始态下,可用内存空间为640K,并有下列请求序列,请分别用首次适应算法和最佳适应算法进行内存块的分 ...

  3. 操作系统—内存的动态分区分配算法

    建议将思维导图保存下来观看,或点击这里在线观看

  4. 操作系统之动态分区分配与回收—C语言实现

    前言 这篇文章用来记录操作系统实验之 动态分区分配与回收. 不想从网上copy代码,打算自己从头到尾写一下,没想到却花了我整整两个晚上的时间,好在终于写完了- 动态分区分配采用的算法是最佳适应(bes ...

  5. 操作系统实验2—实现动态分区分配模拟程序

    操作系统实验2-实现动态分区分配模拟程序 文章目录 操作系统实验2-实现动态分区分配模拟程序 实验描述 设计思路 上机代码 测试结果 心得体会 实验描述 实验内容: 编写一个可变分区存储管理程序,模拟 ...

  6. 七、操作系统——动态分区分配算法(详解)

    一.引入 动态分区分配算法:在动态分区分配方式中,当很多个空闲分区都能满足需求时,应该选择哪个分区进行分配? 二.首次适应算法(First Fit) 算法思想:每次都从低地址开始查找,找到第一个能满足 ...

  7. java动态分区分配_操作系统动态分区分配算法课程设计java版解析.doc

    湖 南 文 理 学 院 实 验 报 告 课程名称 操作系统课程设计 实验名称 存储管理--动态分区分配算法的模拟 成绩 学生姓名 曹乐 专业 计算机 班级.学号 13101 18 同组者姓名 实验日期 ...

  8. java动态分区分配算法,操作系统_动态分区分配算法课程设计_java版

    <操作系统_动态分区分配算法课程设计_java版>由会员分享,可在线阅读,更多相关<操作系统_动态分区分配算法课程设计_java版(13页珍藏版)>请在人人文库网上搜索. 1. ...

  9. java动态分区分配_操作系统 动态分区分配算法课程设计 java版.pdf

    操作系统 动态分区分配算法课程设计 java版 湖 南 文 理 学 院 实 验 报 告 课程名称 操作系统课程设计 实验名称 存储管理--动态分区分配算法的模拟 成绩 学生姓名 曹乐 专业 计算机 班 ...

  10. 连续分配管理方式的动态分区分配算法(首次适应、最佳适应、最坏适应、邻接适应算法)

    一.动态分区分配算法(连续分配管理方式) 动态分区分配算法:在动态分区分配方式中, 当很多个空闲分区都能满足需求时,应该选择哪个分区进行分配? (一)首次适应算法 算法思想:每次都从低地址开始查找,找 ...

最新文章

  1. 宏定义define的使用
  2. leaflet大量marker卡顿_leaflet如何加载10万数据
  3. php 重复区域,如何使用Mysql和PHP从重复区域单击缩略图后检索图像
  4. openjdk(HOTSPOT)垃圾回收源码解读
  5. Linux的系统程序包管理
  6. ai人工智能的数据服务_数据科学和人工智能如何改变超市购物
  7. 【CodeForces】gym-101205B Curvy Little Bottles (2012 ACM-ICPC World Finals B)
  8. 小微个人网站如何接入免费短信验证码
  9. iphone 蓝牙开发 总结
  10. 【问题整理】计算机故障相关
  11. NextCloud前端支持播放mov文件
  12. 大数据到底是什么意思?
  13. 软件开发方法和开发模型的比较
  14. Java 二进制与十六进制字符串相互转换
  15. 案例实战:用户评论情感分析模型
  16. 计算机芯片的主要用途,汽车电脑芯片30343的主要作用是什么??
  17. 财务自由之路——我的投资史
  18. 伽马校正笔记(Gamma Correction)
  19. 常用HTML代码,字体颜色等
  20. mysql添加函数库_创建mysql函数

热门文章

  1. 记录自建ALIDDNS服务域名解析和外网访问
  2. 美团财报数据初步分析
  3. 在财务中python能做什么_Python在财务会计工作中的应用【举例】
  4. 对于学习编程,你认为英语和数学哪个重要?
  5. php计算圆的面积怎么带单位_圆的面积计算公式的教学演示工具的制作方法
  6. Python——类的继承
  7. 《晨间日记的奇迹》读书笔记
  8. python使用selenium大麦网抢票
  9. 关于C和C++的register关键字
  10. HTTP协议请求头部的User-Agen和Cookie