1 .实验目的

了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。

2 .实验内容

(1)用C 语言分别实现采用首次适应算法(地址从小到大)和最佳适应算法(空闲块大小从小到大)的动态分区分配过程myalloc() 和回收过程myfree()(即自己编写一个分区分配和释放的函数) 。其中,空闲分区通过空闲分区链来管理;在进行内存分配时,系统优先使用空闲区低端的空间。

(2)假设初始状态下,可用的内存空间为640 KB(即程序开始运行时,用malloc()函数一次申请640KB的内存空间,程序结束时用free()函数释放空间。然后自己编写程序在这640KB的空间上模拟首次适应算法和最佳适应算法的分配过程。自己编写的分配过程不是真正去向操作系统申请空间,而是在这640KB空间上标记那块占用了;释放过程也不是真正释放空间,只是标记哪块分区空闲),作业请求序列如下:

  1. 作业l 申请130 KB 。
  2. 作业2 申请60 KB 。
  3. 作业3 申请100 KB 。
  4. 作业2 释放60 KB 。
  5. 作业4 申请200 KB 。
  6. 作业3 释放100 KB 。
  7. 作业l 释放130 KB 。
  8. 作业5 申请140 KB 。
  9. 作业6 申请60 KB 。
  10. 作业7 申请50 KB 。
  11. 作业6 释放60 KB 。

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

3 .实验步骤

不想看示例的话,可以直接向下滑到最后一步看代码

1.首次适应算法

模拟作业请求序列分配:

自由分配:

1.分配空间足够的情况

2.分配空间不足的情况

3.普通回收

首先分配一些内存准备回收,此时内存初始情况如下

4.连续回收

继上次内存情况回收任务2,此时应连续回收地址1-250的内存

当三个内存块需要连续回收时,回收任务4,此时所有内存块都空闲,需要连续回收

2.最佳适应算法

模拟作业请求序列分配:

自由分配:

1.体现出最佳适应的普通分配

分配任务6,大小为50kb。如果按照首次适应算法则会从地址101-300的内存块分配给任务,而最佳适应算法会寻找大小最小且满足条件的内存块,即从地址为551-640的内存块分配给任务6.

2.回收:

连续回收两个内存块

连续回收三个内存块

全部回收

4 .完整代码(C语言实现)

#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;break; }else if(node->size == size){ //需求空间和空闲空间大小相等时 node->teskid = teskid; node->size = size;node->status = 0;break;}    }if(node->next == NULL){printf("分配失败,没有足够的空间!\n");break;}node = node->next;}
} /*
* 最佳适应算法
*/
void myMalloc2(int teskid,int size,struct nodespace *node){//最佳块指针 struct nodespace *q = NULL;//首先找到第一个满足条件的空闲块 while(node != NULL){if(node->status == 1 && node->size >= size){q = node;break;}//如果下一个为空则说明没有空闲区可以分配 if(node->next == NULL){printf("分配失败,没有足够的空间!\n");break;} else{node = node->next;  }} //遍历寻找最佳的空闲块 while(node != NULL){if(node->status == 1 && node->size >= size && node->size < q->size){  //空闲的空间 q = node;}node = node->next;}if(q->size > size){             //最佳空闲块的大小大于需求大小 //分配后剩余的空间 struct nodespace *p = (struct nodespace*)malloc(sizeof(struct nodespace));p->begin = q->begin + size;p->size = q->size - size;p->status = 1;p->teskid = -1;//分配的空间 q->teskid = teskid; q->size = size;q->status = 0;//改变节点的连接 p->next = q->next; q->next = p;}else if(q->size == size){     //最佳空闲块空间大小和需求相等q->teskid = teskid; q->size = size;q->status = 0;}
}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){  //释放空间的上一块空间空闲时 node->size = node->size + node->next->size;struct nodespace *q = node->next;node->next = node->next->next;free(q);if(node->next->status == 1){ //下一个空间是空闲空间时 node->size = node->size + node->next->size;struct nodespace *q = node->next;node->next = node->next->next;free(q);}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);}break;}else if(node->next == NULL){  //任务id不匹配时 printf("没有此任务!\n");break;}node = node->next;}}void printNode(struct nodespace *node){printf("                        内存情况                        \n"); printf(" -------------------------------------------------------\n");printf("| 起始地址\t结束地址\t大小\t状态\t任务id\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("1.分配内存\n");printf("2.回收内存\n");printf("3.查看内存情况\n");printf("4.退出\n");printf("请输入选项:");
}int main(){// node为整个空间 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){printf("请选择模式:\n 1.演示模式\n 2.自由模式\n 3.退出\n");scanf("%d",&option);if(option == 1){  //演示模式 while(1){        //循环选择实现的算法 printf("请选择算法:\n 1.首次适应算法\n 2.最佳适应算法\n 3.退出\n");scanf("%d",&option);if(option == 1){           //首次适应算法 printf("作业1 申请130 KB\n");myMalloc1(1,130,node);      //作业1 申请130 KBprintNode(node);printf("作业2 申请60 KB\n");myMalloc1(2,60,node);       //作业2 申请60 KBprintNode(node);printf("作业3 申请100 KB\n");myMalloc1(3,100,node);      //作业3 申请100 KBprintNode(node);printf("作业2 释放60 KB\n");myFree(2,node);         //作业2 释放60 KBprintNode(node);printf("作业4 申请200 KB\n");myMalloc1(4,200,node);      //作业4 申请200 KBprintNode(node);printf("作业3 释放100 KB\n");myFree(3,node);            //作业3 释放100 KBprintNode(node);printf("作业1 释放130 KB\n");myFree(1,node);            //作业1 释放130 KBprintNode(node);printf("作业5 申请140 KB\n");myMalloc1(5,140,node);     //作业5 申请140 KBprintNode(node);printf("作业6 申请60 KB\n");myMalloc1(6,60,node);       //作业6 申请60 KBprintNode(node);printf("作业7 申请50 KB\n");myMalloc1(7,50,node);        //作业7 申请50 KBprintNode(node);printf("作业6 释放60 KB\n");myFree(6,node);          //作业6 释放60 KBprintNode(node);destory(node); //销毁链表initNode(init);   //重新初始化 node = init;   //重新指向开头 }else if(option == 2){       //最佳适应算法 printf("作业1 申请130 KB\n");myMalloc2(1,130,node);      //作业1 申请130 KBprintNode(node);printf("作业2 申请60 KB\n");myMalloc2(2,60,node);       //作业2 申请60 KBprintNode(node);printf("作业3 申请100 KB\n");myMalloc2(3,100,node);      //作业3 申请100 KBprintNode(node);printf("作业2 释放60 KB\n");myFree(2,node);         //作业2 释放60 KBprintNode(node);printf("作业4 申请200 KB\n");myMalloc2(4,200,node);      //作业4 申请200 KBprintNode(node);printf("作业3 释放100 KB\n");myFree(3,node);            //作业3 释放100 KBprintNode(node);printf("作业1 释放130 KB\n");myFree(1,node);            //作业1 释放130 KBprintNode(node);printf("作业5 申请140 KB\n");myMalloc2(5,140,node);     //作业5 申请140 KBprintNode(node);printf("作业6 申请60 KB\n");myMalloc2(6,60,node);       //作业6 申请60 KBprintNode(node);printf("作业7 申请50 KB\n");myMalloc2(7,50,node);        //作业7 申请50 KBprintNode(node);printf("作业6 释放60 KB\n");myFree(6,node);          //作业6 释放60 KBprintNode(node);destory(node); //销毁链表initNode(init);   //重新初始化 node = init;   //重新指向开头 }else if(option == 3){       //退出break;}else{printf("您的输入有误,请重新输入!\n"); }}   }else if(option == 2){    //自由模式 while(1){        //循环选择使用的算法 printf("请选择算法:\n 1.首次适应算法\n 2.最佳适应算法\n 3.退出\n");scanf("%d",&option);int n = option;     //标记选择的算法,n == 1 表示首次适应算法, n == 2表示最佳适应算法 if(option != 3){while(1){menu();      //打印想要进行的操作 scanf("%d",&option);if(option == 1 && n == 1){            //首次适应 printf("请输入任务id以及申请的空间大小:\n");scanf("%d%d",&teskid,&size);myMalloc1(teskid,size,node);printNode(node);}else if(option == 1 && n == 2){   //最佳适应 printf("请输入任务id以及申请的空间大小:\n");scanf("%d%d",&teskid,&size);myMalloc2(teskid,size,node);printNode(node);}else if(option == 2){printf("请输入任务id:\n");scanf("%d",&teskid);myFree(teskid,node);printNode(node);}else if(option == 3){printNode(node);}else if(option == 4){destory(node);    //销毁链表initNode(init);   //重新初始化 node = init;   //重新指向开头 break;}else{printf("您的输入有误,请重新输入!\n");continue;}}}else if(option == 3){destory(node);    //销毁链表initNode(init);   //重新初始化 node = init;   //重新指向开头 break;}else{printf("您的输入有误,请重新输入!\n");}} }else if(option == 3){  //退出  destory(node);return 0;}else {printf("您的输入有误,请重新输入!\n");continue;}}return 0;
}

如果文章对你有帮助的话点个赞鼓励一下吧!

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

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

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

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

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

  3. 【计算机操作系统】测试题:动态分区内存分配;调页系统;分页存储管理;快表是什么?计算指令操作数地址;有效存储访问时间,缺页次数,缺页率;

    目录 填空题: 选择题: 简答题: 应用题: 填空题: 1. 在动态分区式内存分配算法中,倾向于优先使用低地址部分空闲区的算法是   首次适应算法   :能使内存空间中空闲区分布较均匀的算法是  循环 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 如何显示服务器上的图片,显示服务器上的图片怎么写
  2. Bugku杂项(一)
  3. CodeForces - 1450E Capitalism(差分约束)
  4. 张勇:新技术是阿里“五新战略”的引擎
  5. Python这个超炫的黑科技,可全网爬取各种资源,建议收藏!!
  6. Jackson,Gson,Fastjson比较
  7. mybatisplus自动生成id_【mybatis-plus】主键id生成、字段自动填充
  8. OpenNLP中关于语言检测的语料训练
  9. K-Means聚类算法原理及实现
  10. 阿里云上部署kafka--遇到的坑
  11. 信息安全第五章 操作系统安全
  12. OmniGraffle 制作表格 调整对象
  13. Vue项目在页面添加水印及在某一个页面去除水印功能
  14. 【BZOJ】4668 冷战
  15. 哔哩哔哩android4.3,哔哩哔哩(tv.danmaku.bili) - 6.26.0 - 应用 - 酷安
  16. i3 10100f和i5 9400f哪个好?
  17. JAVA集合面试题52道
  18. 在Google 上搜书的方法
  19. 数字按键KEYPAD-PHONE的使用 附代码
  20. linux下打补丁和生成补丁

热门文章

  1. python期权定价公式_期权及 Black-Scholes模型的python实现
  2. Black-Scholes-Merton欧式期权定价公式
  3. DIY年轻人的第一辆电动滑板车
  4. 图片去水印工具软件,比PS还好用的图片杂物去除工具
  5. Javascript AJAX回调函数传递参数
  6. 关于计算机的好处的英语作文,关于电脑好处的英语作文
  7. 陀螺世界进度条一天进度多少_陀螺世界满级要多久?
  8. 微信小游戏开发新手教程1-人人都能做游戏
  9. 为计算机技术奉献一生语录,关于奉献精神的名言50句
  10. java-枚举类的定义及使用