算法思想:
1.分区的个数和大小不是固定不变的,而是可变的,随装入的作业动态划分,且不会产生内部碎片。
2.外部碎片:
频繁的分配与回收物理页面会导致大量的、连续且小的页面块夹杂在已分配的页面中间,就会产生外部碎片。
3.首次适应算法:
在分配内存时,从链首开始顺序查找,直到找到一个大小能满足要求的空闲分区为止。然后再按照作业的大小,从该分区中划分出一块内存空间,分配给请求者,余下的空闲分区仍留在空闲链中。若从链首直至链尾都不能找到一个能满足要求的分区,则表明系统中已没有足够大的内存分配给该进程,内存分配失败,返回。
4.最佳适应算法:
所谓“最佳”是指,每次分配内存时,总能把满足要求,又是最小的空闲分区分配给作业,避免大材小用。为了加速寻找,该算法要求将所有的空闲分区按照容量由小到大的顺序形成一条空闲分区链。这样,第一次找到的能满足要求的空闲区必然时最佳的。
5.分区分配中的内存回收有四种情况:
(1)回收分区与插入点的前一个空闲分区相邻接。
(2)回收分区与插入点的后一个空闲分区相邻接。
(3)回收分区同时与插入点的前后两个分区邻接。
(4)回收分区既不与前一个分区邻接,也不与后一个分区邻接。

程序流程图

源代码:

#include <iostream>
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 << "ERROR,请输入正确的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;cout << "内存分配情况" << endl;cout << "------------------" << endl;Free_Node* p = block_first->next;while (p){cout << "分区号:";if (p->date.ID == FREE)cout << "FREE" << endl;else cout << p->date.ID;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 << "分区模拟:" << endl;while (tag != 5){cout << "亲输入要进行的操作:" << endl;cout << "1-首次适应算法,2-最佳适应算法,3-内存回收,4-显示内存状况,5-退出" << endl;cin >> tag;switch (tag){case 1:alloc(tag);break;case 2:alloc(tag);break;case 3:cout << "亲输入需要回收的ID号:" << endl;cin >> ID;free(ID);break;case 4:show();break;}}}
void main()
{menu();
}

运行实现结果:
在这里插入图片描述


操作系统之 动态分区分配与回收相关推荐

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

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

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

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

  3. 模拟实现内存动态分区分配与回收

    一.目的 四个动态分区分配算法:最佳适应算法,循环首次适应算法,最坏适应算法,首次适应算法: 四种回收情况:上邻不下邻,上不邻下邻,上下都邻,上下都不邻: 要求有录入界面,动态初始化内存使用情况,动态 ...

  4. 操作系统【动态分区分配算法——首次适应算法、最佳适应算法、最坏适应算法、临近适应算法】

    学习地址(哔哩哔哩网站--王道论坛):https://www.bilibili.com/video/BV1YE411D7nH?p=37 目录 1.首次适应算法(First Fit) 2.最佳适应算法( ...

  5. 3.1.5 操作系统之动态分区分配的四种算法(首次适应算法、最佳适应算法、最坏适应算法、临近适应算法)

    文章目录 0.思维导图 1.首次适应算法 2.最佳适应算法 3.最坏(大)适应算法 4.临近适应算法 5.四种算法归纳比较 0.思维导图 本篇文章是对上一篇文章内存的分配与回收提到的动态分区分配算法的 ...

  6. 【操作系统】-- 动态分区分配算法(首次适应算法FF、最佳适应算法BF、最坏适应算法WF、循环首次适应算法NF)

    一.首次适应算法 1.算法思想 每次从低地址开始查找,找到第一个能满足大小的空闲分区. 2.如何实现 空闲分区以地址递增的次序排列,每次分配内存时顺序查找空闲分区链,找到大小能满足要求的第一个空闲分区 ...

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

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

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

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

  9. 操作系统(三十六)动态分区分配算法

    3.5 动态分区分配算法 上节讲述了连续分区分配方式中有动态分区分配的方式,如果在动态分区分配算法中有许多空闲分区都满足需求的时候,那该如何分配空间呢,今天来介绍四种分配方法解决这个问题. 目录 3. ...

最新文章

  1. Java Web开发乱码问题
  2. cache-control_网站 cache control 最佳实践
  3. 博客上一些项目相关源码链接
  4. java高分面试指南:javamvc模式简单案例
  5. python论文摘要_python新玩法:用python进行文章摘要拿取,只需要一行代码
  6. matlab背景点状,基于MATLAB的点状目标检测
  7. Appcan性能低?速度慢?UI难看?与apicloud用数据说话
  8. 100个最受欢迎的机器学习课程视频
  9. JavaScript 设计模式——策略模式
  10. 悲剧的山寨采用的新芯片资料汇总(更新Rk3066)
  11. 十大常见web漏洞及防范
  12. java—Web(项目)—数据库(插入数据)
  13. (十一)51单片机——用AT24C02实现存储秒表数据(附成果展示)
  14. EditPlus中文版+英文版+注册码下载
  15. JAVA学习笔记-----Thirteen(正则表达式,Math)
  16. 有趣的网站分享——福音戰士標題生成器
  17. Android Fonts
  18. swift 解决SDWebImage同时加载大量高分辨率图片导致的内存爆炸问题
  19. 你的企业IM安全吗?对于私有化的即时通讯软件你了解多少?
  20. 使用xpath匹配猫眼top100标题名(萌新简化版)

热门文章

  1. rust自创服务器_【推荐】可自建中继服务器的远程桌面软件 RustDesk
  2. 三台(及以上)Pc实现网络通信
  3. 大数据技术之_23_Python核心基础学习_01_计算机基础知识 + Python 入门 (9.5小时)...
  4. 炫酷传送门HTML5动画js特效
  5. C#中File和FileStream的用法
  6. 哪些原因可能会导致 HBase 的 RegionServer 宕机?
  7. 机器学习原来这么有趣!第二章:用机器学习制作超级马里奥的关卡
  8. 艺术馆小程序,线上成就“诗和远方”
  9. 3D人脸技术漫游指南
  10. windows 可用win+R打开的一些程序