设计目的

所谓动态分区分配,就是指内存在初始时不会划分区域,而是会在进程装入时,根据所要装入的进程大小动态地对内存空间进行划分,以提高内存空间利用率,降低碎片的大小 动态分区分配算法有以下四种:

  • 首次适应算法(First Fit)
    空闲分区以地址递增的次序链接。分配内存时顺序查找,找到大小满足要求的第一个空闲分区就进行分配
  • 邻近适应算法(Next Fit)
    又称循环首次适应法,由首次适应法演变而成,不同之处是分配内存时从上一次查找结束的位置开始继续查找
  • 最佳适应算法(Best Fit)
    空闲分区按容量递增形成分区链,找到第一个能满足要求的空闲分区就进行分配
  • 最坏适应算法(Next Fit)
    又称最大适应算法(Largest Fit),空闲分区以容量递减的次序链接,找到第一个能满足要求的空闲分区(也就是最大的分区)就进行分配

设计内容及要求

  • 用C语言实现采用首次适应算法的动态分区分配过程alloc()和回收过程free()。其中,空闲分区通过空闲分区链表来管理,在进行内存分配时,系统优先使用空闲区低端的空间
  • 假设初始状态如下,可用的内存空间为640KB,并有下列的请求序列;采用首次适应算法进行内存块的分配和回收,同时显示内存块分配和回收后空闲内存分区链的情况
  • 假设初始状态如下,可用的内存空间为640KB,并有下列的请求序列;
    作业1申请130KB
    作业2申请60KB
    作业3申请100KB
    作业2释放60KB
    作业4申请200 KB
    作业3释放100 KB
    作业1释放130 KB
    作业5申请140 KB
    作业6申请60 KB
    作业7申请50KB
    作业6释放60 KB
    请采用循环首次适应算法进行内存块的分配和回收,同时显示内存块分配和回收后空闲内存分区链的情况。

设计准备

首次适应算法:

  • 算法思想:
    将空闲分区链以地址递增的顺序连接;在进行内存分配时,从链首开始顺序查找,直到找到一块分区的大小可以满足需求时,按照该作业的大小,从该分区中分配出内存,将剩下的空闲分区仍然链在空闲分区链中
  • 优点:高址部分的大的空闲分区得到保留,为大作业的内存分配创造了条件
  • 缺点:(1)每次都是优先利用低址部分的空闲分区,造成低址部分产生大量的外碎片。(2)每次都是从低址部分查找,使得查找空闲分区的开销增大

内存回收:

将释放作业所在内存块的状态改为空闲状态,删除其作业名,设置为空。并判断该空闲块是否与其他空闲块相连,若释放的内存空间与空闲块相连时,则合并为同一个空闲块,同时修改分区大小及起始地址

设计过程

我们以空闲分区链为例来说明采用FF算法时的分配情况,FF算法要求空闲分区链以地址递增的次序链接

  • 在分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止
  • 然后再按照作业的大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲链中
  • 若从链首直至链尾都不能找到一个能满足要求的分区,则此次内存分配失败,返回

了解动态分区分配中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。采用首次适应算法的动态分区分配过程alloc()和回收过程free()。空闲分区通过空闲分区链表来管理,在进行内存分配时,系统优先使用空闲区低端的空间,即每次分配内存空间是总是从低址部分开始进行循环,找到第一个合适的空间,便按作业所需分配的大小分配给作业。 作业完成时,需要释放作业所占空间,此时要考虑到四种情况:

  • 回收区与插入点的前一个空闲分区相邻接。此时将二者合并,修改前一分区的大小。
  • 回收区与插入点的后一空闲分区相邻接,将二者合并,用回收区的首址作为新空闲区的首址。
  • 回收区同时与插入点的前后两个空闲分区相邻接,三者合并,使用前一空闲分区的表项和首址。
  • 回收区单独存在。

设计结果并分析

菜单

作业1申请130KB

作业2申请60KB

作业3申请100KB

作业2释放60KB

作业4申请200KB

作业3释放100KB

作业1释放100KB

作业5申请140KB

作业6申请60KB

作业7申请50KB

作业6释放60KB

原理框图

模块设计

  • void initNode(struct nodespace *p)
    创建一个双链表存储信息

  • void myMalloc1(int teskid,int size,struct nodespace *node)
    申请空间函数

  • void myFree(int teskid,struct nodespace *node)
    释放空间函数

  • void printNode(struct nodespace *node)
    打印输出节点存储信息了,即内存申请剩余情况

  • void destory(struct nodespace *node)
    退出程序并销毁清空节点

  • void menu()
    主菜单,提示用户进行相应的操作

C语言源程序——建议使用Devc ++ 运行

#include<stdio.h>
#include<stdlib.h>
struct nodespace{int teskid;   // 作业号 int begin;    // 开始地址 int size;     // 大小 int status;   // 状态 0代表占用,1代表空闲 struct nodespace *next;  // 后指针
};
void initNode(struct nodespace *p){if(p == NULL){ //如果为空则新创建一个 p = (struct nodespace*)malloc(sizeof(struct nodespace));}p->teskid = -1;p->begin = 0;p->size = 640;p->status = 1;p->next =NULL;
}
void myMalloc1(int teskid,int size,struct nodespace *node){while(node != NULL){if(node->status == 1){  //空闲的空间 if(node->size > size){  //当需求小于剩余空间充足的情况 //分配后剩余的空间 struct nodespace *p = (struct nodespace*)malloc(sizeof(struct nodespace));p->begin = node->begin + size;p->size = node->size - size;p->status = 1;p->teskid = -1;//分配的空间 node->teskid = teskid; node->size = size;node->status = 0;//改变节点的连接 p->next = node->next; node->next = p;printf("==================================分配内存成功!==================================\n");break; }else if(node->size == size){ //需求空间和空闲空间大小相等时 node->teskid = teskid; node->size = size;node->status = 0;printf("==================================分配内存成功!==================================\n");break;}  }if(node->next == NULL){printf("===============================分配失败,没有足够的空间!=============================\n");break;}node = node->next;}
}
void myFree(int teskid,struct nodespace *node){if(node->next == NULL && node->teskid == -1){printf("================================您还没有分配任何作业!================================\n");}while(node != NULL){if(node->status == 1 && node->next->status ==0 && node->next->teskid == teskid){struct nodespace *q = node->next;node->next = node->next->next;free(q);printf("==================================释放内存成功!==================================\n");if(node->next->status == 1){ //下一个空间是空闲空间时 node->size = node->size + node->next->size;struct nodespace *q = node->next;node->next = node->next->next;free(q);printf("==================================释放内存成功!==================================\n");}break;}else if(node->status == 0 && node->teskid == teskid){  //释放空间和空闲空间不连续时  node->status = 1;node->teskid = -1;if(node->next != NULL && node->next->status == 1){ //下一个空间是空闲空间时 node->size = node->size + node->next->size;struct nodespace *q = node->next;node->next = node->next->next;free(q);}printf("==================================释放内存成功!==================================\n");break;}else if(node->next == NULL){  //作业号不匹配时 printf("==================================没有此作业!!==================================\n");break;}node = node->next;}}
void printNode(struct nodespace *node){printf("                        内存情况                        \n"); printf(" -------------------------------------------------------\n");printf("| 起始地址\t结束地址\t大小\t状态\t作业号\t|\n");while(node != NULL){if(node->status==1){printf("| %d\t\t%d\t\t%dKB\tfree\t 无\t|\n", node->begin + 1, node->begin+node->size, node->size);}else{printf("| %d\t\t%d\t\t%dKB\tbusy\t %d\t|\n", node->begin + 1, node->begin+node->size, node->size, node->teskid);}node = node->next;}printf(" -------------------------------------------------------\n");
}
void destory(struct nodespace *node){struct nodespace *q = node;while(node != NULL){node = node->next;free(q);q = node;}
}
void menu(){printf("\n"); printf("\t\t\t\t   ╭═════════════════════════════════○●○●═══╮\n");printf("\t\t\t\t   │    首次适应算法的动态分区分配方式模拟      │\n");printf("\t\t\t\t   ╰═══○●○●═════════════════════════════════╯\n");printf("\t\t\t\t   ┌───────────────────────────────────────────-┐\n");printf("\t\t\t\t   │                                            │\n");printf("\t\t\t\t   │                 1. 申请内存                │\n");printf("\t\t\t\t   │                                            │\n");printf("\t\t\t\t   │                 2. 回收内存                │\n");printf("\t\t\t\t   │                                            │\n");printf("\t\t\t\t   │                 3. 查看内存情况            │\n");printf("\t\t\t\t   │                                            │\n");printf("\t\t\t\t   │                 4. 退出                    │\n");printf("\t\t\t\t   │                                            │\n");printf("\t\t\t\t   └────────────────────────────────────────────┘\n");printf("\t\t\t\t\t\t  请您选择(1-4):\t");
}int main(){// node为整个空间 system("color 0f");//system("mode con cols=120 lines=50");struct nodespace *init = (struct nodespace*)malloc(sizeof(struct nodespace));struct nodespace *node = NULL;initNode(init);           //初始化主链 node = init;           //指向链表头 int option; int teskid;int size;while(1){menu();        //打印想要进行的操作scanf("%d",&option);if(option == 1){printf("请输入作业号;");scanf("%d",&teskid);printf("此作业申请的空间大小(KB):");scanf("%d",&size);myMalloc1(teskid,size,node);printf("\n"); printNode(node);}else if(option == 2){printf("请输入作业号:");scanf("%d",&teskid);myFree(teskid,node);printf("\n"); printNode(node);}else if(option == 3){printNode(node);}else if(option == 4){destory(node);initNode(init);node = init;break;}else{printf("===========================您的输入有误,请重新输入!============================\n");continue;}}
return 0;
}

首次适应算法 动态分区分配方式的模拟 C语言——课程设计实习相关推荐

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

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

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

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

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

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

  4. JS实现动态分区分配中的首次适应算法和最佳适应算法

    实验目的 了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解. 实验内容 (1) 用C语言(不会C这里就用JS实现)分别实现采用首次适应算法和最佳适应 ...

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

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

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

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

  7. (王道408考研操作系统)第三章内存管理-第一节5:动态分区分配算法(首次适应、和邻近适应)

    文章目录 一:首次适应算法(First Fit) 二:最佳适应算法(Best Fit) 三:最坏适应算法(Worst Fit) 四:邻近适应算法(Next Fit) 总结 动态分区分配算法:用于研究当 ...

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

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

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

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

  10. 二十八、动态分区分配算法

    一.知识总览 二.首次适应算法 算法思想:每次都从低地址开始查找,找到第一个能满足大小的空闲分区 如何实现:空闲分区以地址递增的次序排列.每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满 ...

最新文章

  1. java实验的技术问题及解决方法,2018-2019-2 20175313 实验一《Java开发环境的熟悉》实验报告...
  2. zabbix——拓扑图入门
  3. java 基础--NIO(4)
  4. 【干货】常用的Linux 系统备份、恢复命令
  5. 计算机核心配件是什么,计算机的核心是什么
  6. flink的scala版本的wordcount+flink没有输出结果的几种原因
  7. excel查重_发票查重工具,不止查重这么简单,你还可以体验这些新玩法
  8. NHibernate3.0剖析:Query篇之NHibernate.Linq标准查询
  9. 亚麻纤维截面形态_纺织品知识点--纺织纤维的分类get
  10. Oracle日期范围
  11. 异星工厂机器人科技树_异星工场(Factorio)玩法分析与讨论
  12. 计算机怎么获取权限删除文件,电脑删除文件需要获取trustedinstaller权限怎么回事...
  13. 收集的13个杀毒软件和安全防护软件(有图哦)
  14. 平凡之路_2022年
  15. 【微信转账—设置付款时间问题】
  16. R软件R2WinBUGS程序包在网状Meta分析中的应用
  17. EF系列(一)——深入框架底层
  18. 基于ADS1298的心电图仪
  19. IBM MessageBroker笔记系列(一)
  20. js获取当天0点时间戳

热门文章

  1. 《SRE Google运维解密》散文
  2. Java游戏项目之黄金矿工
  3. 中国 / 省市区县 / 四级联动 / 地址选择器(京东商城地址选择)
  4. 奇兔recovery卡刷教程_奇兔刷机小编为你详解recovery界面中的功能
  5. 迈开职场充电第一步,让我们在这个冬天邂逅社科院杜兰金融管理硕士项目
  6. 如何解决MathType公式与文字不在同一行问题---已解决
  7. java练习题,个人所得税计算
  8. winapi消息大全
  9. hdu1879继续畅通工程(最小生成树kru算法)
  10. ping网络通不通、ttl讲解、查询ip归属地、tracert路由分析诊断