基于顺序搜索的动态分区分配算法模拟内存动态分配--最佳适应算法(best fit,BF)

BF算法、男朋友算法,哈哈
要实现动态分区分配,需要考虑三个方面的问题。分别是数据结构、分区分配算法、分区的分配与回收操作。

首数据结构

这里我们使用的是空闲分区链,采用双向链表表示空闲分区。
具体实现如下:

typedef struct LNode{int order;                       //表示内存块的顺序int start;                       //表示内存的初始地址int end;                         //表示内存的结束地址int size;                        //表示内存块的大小int state;                       //表示内存块的状态,1表示被占用,0表示空闲int process;                     //存储占用该内存块的进程的序号struct LNode *next;              //指向下一个内存块struct LNode *pre;               //指向上一个内存块
}LNode;

分配算法

采用基于顺序搜索的动态分区分配算法中的最佳适应(best fit BF)算法。
每次为作业分配内存时,总是把能满足要求,又是最小的空闲分区分配给作业,避免“大材小用”。

内存的分配与回收

  • 分配内存
    从空闲分区链中找到所需大小的分区。设请求的分区大小为u.size,表中每个空闲分区的大小可表示为m.size,若m.size-u.size>=0时进行内存分配操作,若大于0,则申请一新节点,插入到双向链表中,若等于0,则只需修改符合要求的结点的信息就行了。
  • 回收内存,四种情况(F:要回收的内存区、F1:F的前一分区、F2:F的后一分区)
    • F与F1地址衔接,且F1空闲,将F与F1合并,合并后结点首地址为F1首地址,末地址为F末地址,结点数减一。
    • F与F2地址衔接,且F2空闲,将F与F2合并,合并后结点首地址为F首地址,末地址为F2末地址地址,结点数减一。
    • F与F1和F2的地址衔接,且F1,F2空闲,合并后结点首地址为F1首地址,末地址为F2末地址,结点数减二。
    • 其他情况,将结点的state标志和process标志均设置为0。

程序解释

int buf[N]={100,500,200,700,300};   //内存块大小,用来初始化空闲分区链表
int add[N]={20,150,700,950,1700,};  //内存块的初始地址,用来初始化空闲分区链表
int dis[N]={301,400,310,105,190};   //进程所需内存,下标记为进程编号List list_init();               //用来初始化空闲分区链表的函数,返回空闲分区链表的头部
void print(List head);          //顺序输出链表的信息
List allot_memory(List head,ing i);//为编号为i的进程分配内存
List free_memory(List head,int i);//释放编号为i的进程所占用的内存

全部代码

#include<stdio.h> 
#include<stdlib.h>#define N 5int buf[N]={100,500,200,700,300};
int add[N]={20,150,700,950,1700,};
int dis[N]={301,400,310,105,190};
typedef struct LNode *List;typedef struct LNode{int order;int start;int end;int size;int state; int process;struct LNode *next;struct LNode *pre;
}LNode;List list_init(){List head,p,m;int i;for(i=0;i<N;i++){m=(List)malloc(sizeof(struct LNode));if(!m){printf("error\n");exit(0);}m->order=i+1;m->start=add[i];m->end=m->start+buf[i]-1;m->size=buf[i];m->next=NULL;m->pre=NULL;m->state=0;p->process=0;if(i==0)head=p=m;else{p->next=m;m->pre=p;p=p->next;}}return head;
}void print(List head){List p=head;while(p){printf("第%d块内存--->始地址:%-5d--->末地址:%-5d--->大小:%-5d--->状态:",p->order,p->start,p->end,p->size);if(p->state==1)printf("被%d号进程占用中!\n",p->process);else if(p->state==0){printf("空闲中!\n");} p=p->next;}printf("\n");
}List free_memory(List head,int i){List p,m,temp;p=head;while(p){if(p->process==i+1){temp=p;if(p->next){m=p->next;if(p->end+1==m->start){if(!m->state){p->size+=m->size;p->end+=m->size;p->next=m->next;p->state=0;p->process=0;if(m->next){m->next->pre=p;}p=m->next;free(m);while(p){p->order--;p=p->next;}}else{p->state=0;p->process=0;}}else{p->state=0;p->process=0;}}p=temp;if(p->pre){m=p->pre;if(p->start==m->end+1){if(!m->state){m->size+=p->size;m->end+=p->size;m->next=p->next;if(p->next){p->next->pre=m;}free(p);p=m->next;while(p){p->order--;p=p->next;}}else{p->state=0;p->process=0;}}else{p->state=0;p->process=0;}}return head;}p=p->next;}
}List allot_memory(List head,int i){int memory_size=dis[i];List p=head;List m;int min=-1;int order=-1;while(p){if(p->process-1==i){printf("内存中已有%d号进程了\n",i+1);return head;}p=p->next;}p=head;while(p){if(p->size>=memory_size&&p->state==0){if(min<0){min=p->size-memory_size;order=p->order;}else{if(min>p->size-memory_size){min=p->size-memory_size;order=p->order;}}}p=p->next;}if(order==-1){printf("%d号进程分配内存失败!\n",i+1);return head;}else{p=head;while(p){if(p->order==order){if(p->size==memory_size){p->state=1;p->process=i+1;return head;}else{m=(List)malloc(sizeof(struct LNode));m->order=p->order;m->start=p->start;m->end=m->start+memory_size-1;m->size=memory_size;m->state=1;m->next=p;m->process=i+1;m->pre=p->pre;p->pre->next=m;p->pre=m;p->start=m->end+1;p->size-=memory_size;while(p){p->order++;p=p->next;}return head;}}p=p->next;}}
}int main(){List p,m;int choice1,choice2;int i;p=list_init();print(p);p=allot_memory(p,3);print(p);p=allot_memory(p,3);p=free_memory(p,3);print(p);p=allot_memory(p,0);print(p);p=allot_memory(p,4);print(p);p=free_memory(p,4);print(p);p=allot_memory(p,4);print(p);p=free_memory(p,0);print(p);p=free_memory(p,4);print(p);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我也要谈谈大型网站架构之系列(4)——分布式中的异步通信

我们知道在面向对象编程中&#xff0c;总会想着各种办法来实现代码的解耦&#xff0c;从而让项目中的各种人员面对自己熟悉的业务进行开发&#xff0c; 做到术业有专攻&#xff0c;比如大家非常熟悉的三层架构&#xff0c;MVC&#xff0c;MVP以及MVVM模式&#xff0c;让前端设计…

node模块函数图解

已截图方式记录模块信息&#xff1a; HTTP模块&#xff1a; 对于网络返回处理状态封装了很多种&#xff0c;我已截图展现 以上状态也是在http协议中包含的状态。 http函数&#xff1a; path模块&#xff1a; 转载于:https://www.cnblogs.com/kuailingmin/p/4547538.html

android 心跳效果动画,Android实现心跳的效果

最近再做一个教育类的项目。在做一些学习工具的时候&#xff0c;美工提出了一些要求&#xff0c;大致如下&#xff1a;其实实现过程也不难&#xff0c;大致就是对一个视图控件添加一个圆形的背景&#xff0c;然后该视图进行动画处理&#xff0c;膨胀的同时&#xff0c;透明度增…

Oracle超出最大连接数问题及解决

用过Oracle的应该都熟悉如何查看和设置Oracle数据库的最大连接数。这里就再啰嗦一遍。 查看当前的连接数&#xff0c;可以用select count(*) from v$process;设置的最大连接数&#xff08;默认值为150&#xff09;select value from v$parameter where name ‘processes’;修改…

操作系统上机作业--使用系统调用实现mycat

mycat.c的功能与系统cat程序相同mycat将指定的文件内容输出到屏幕&#xff0c;例子如下&#xff1a;要求使用系统调用open/read/write/close实现 $ cat /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/u…

GCDAynscSocket简单使用-客户端

这是一篇介绍GCDAynscSocket客户端简单使用的文章&#xff08;服务端后续添加&#xff09; 背景&#xff1a;在这篇文章之前我对socket的了解仅限于知道有TCP、UDP两种方式&#xff0c;使用抓包工具时甚至看不懂抓包数据&#xff08;惭愧...&#xff09;&#xff0c;所以本文介…

微信android版字体,微信炫彩字下载-微信七彩字体 安卓版v1.6.2-PC6安卓网

微信七彩字体一款方便的手机字体更换软件&#xff0c;微信炫彩字软件集合了上百款优质中文美化字体&#xff0c;微信七彩发光字里有可爱的喵呜体、卡通体&#xff0c;清秀的静蕾体等多种字体。软件介绍微信、qq上最好用、最个性的聊天字体应用&#xff0c;让你的聊天与众不同&a…

Android SQLite 数据库 增删改查操作

Android SQLite 数据库 增删改查操作 转载▼一、使用嵌入式关系型SQLite数据库存储数据在Android平台上&#xff0c;集成了一个嵌入式关系型数据库——SQLite&#xff0c;SQLite3支持NULL、INTEGER、REAL&#xff08;浮点数字&#xff09;、TEXT(字符串文本)和BLOB(二进制对象…

SIT与UAT的分别

在企业级软件的测试过程中&#xff0c;经常会划分为三个阶段——单元测试&#xff0c;SIT和UAT&#xff0c;如果开发人员足够&#xff0c;通常还会在SIT之前引入代码审查机制&#xff08;Code Review&#xff09;来保证软件符合客户需求且流程正确。下面简单介绍一下SIT和UAT的…

操作系统上机作业--使用系统调用实现mycp

mycp.c的功能与系统cp程序相同将源文件复制到目标文件&#xff0c;例子如下&#xff1a;要求使用系统调用open/read/write/close实现 $ cat /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nolo…

android自动化持续集成,基于持续集成的Android自动化测试.pdf

基于持续集成的Android自动化测试.pdf2015 年 第24 卷 第 5 期 计 算 机 系 统 应 用①基于持续集成的Android 自动化测试王 焱, 张 征(华中科技大学 自动化学院, 武汉 430074)摘 要: Android 测试方面的研究大多集中在测试工具和框架的实现上, 有些工具和框架可以实现测试用例…

Csharp 高级编程 C7.1.2

第七章 代理&#xff08;1&#xff09; 一、代理要声明 二、代理使用步骤 声明代理初始化代理&#xff08;使用 实例的方法名 作为参数&#xff09;使用代理代码示例&#xff1a; /*C7.1.2*/ using System; using System.Collections.Generic; using System.Linq; using System…

操作系统上机作业--实现mysys(多进程)

mysys.c: 实现函数mysys&#xff0c;用于执行一个系统命令&#xff0c;要求如下mysys的功能与系统函数system相同&#xff0c;要求用进程管理相关系统调用自己实现一遍使用fork/exec/wait系统调用实现mysys不能通过调用系统函数system实现mysys 测试程序 #include <stdio.…

06链队列_LinkQueue--(栈与队列)

#include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h"#define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 /* 存储空间初始分配量 */ty…

android 透明变成白色,android – 状态栏不透明但是白色

为了用anko DSL测试kotlin我决定在最后一个android studio ide(2.1.3)中使用kotlin插件(1.0.3)和最新的anko库(0.9)开始一个新的proyect我使用默认的proyect Navigation Drawer Activity,所以我只需要将主xml转换为anko.这是xml&#xff1a;xmlns:android"http://schemas.…

操作系统上机作业--实现shell(1)(多进程)

sh1.c: 实现shell程序&#xff0c;要求具备如下功能支持命令参数 $ echo arg1 arg2 arg3 $ ls /bin /usr/bin /home 实现内置命令cd、pwd、exit $ cd /bin $ pwd /bin 实现思路&#xff1a;在获取命令字符串后&#xff0c;用strtok函数对字符串进行处理&#xff0c;获取参数…

VC下勉强可用的list

linux内核中的list太好用了&#xff0c;可惜VC编译器不支持 typeof 关键字&#xff0c;将linux内核中的list直接移植过来不能用 修改所有与typeof相关的代码后&#xff0c;终于可以勉强在VC下运行起来了&#xff0c;但是还不完美&#xff0c;list_for_each_entry和list_for_eac…

当执行游戏0xc000007b错误的解决方法

如图&#xff0c;这个错误使无数玩家烦恼。 出现这个错误&#xff0c;可能是硬件的问题&#xff0c;也可能是软件的问题。可是&#xff0c;因为硬件引起该问题的概率非常小&#xff0c;而且除了更换硬件之外没有更好的解决方法&#xff0c;因此本文将具体介绍怎样通过软件解决此…

android触屏音文件地址,Android音视频-音频采集

Android的音视频开发是我暂定的一个职业发展的一个方向&#xff0c;通过自学记录一些记了又忘记的知识。音频基础知识采样率(samplerate)蓝色代表模拟音频信号&#xff0c;红色的点代表采样得到的量化数值。采用就是把模拟信号数字化的过程&#xff0c;不仅仅是音频需要采样&am…

平衡二叉树,AVL树之图解篇

学习过了二叉查找树&#xff0c;想必大家有遇到一个问题。例如&#xff0c;将一个数组{1,2,3,4}依次插入树的时候&#xff0c;形成了图1的情况。有建立树与没建立树对于数据的增删查改已经没有了任何帮助&#xff0c;反而增添了维护的成本。而只有建立的树如图2&#xff0c;才能…