c语言实现紧凑算法的内存分配,可重定向动态分区分配算法.docx

这篇博客介绍了操作系统课程设计中关于内存管理的部分,重点是动态分区分配的模拟实现,包括首次适应算法、内存回收策略以及紧凑算法。通过使用PCB结构体表示进程,利用单链表模拟内存分区表,实现了内存的动态分配和回收。文章详细阐述了各个算法的原理和代码实现,并提供了输入输出函数以展示内存分配情况。
摘要由CSDN通过智能技术生成

组号 成绩

计算机操作系统

课程设计报告

题目 内存的连续分配算法

基于动态分区分配的内存管理的模拟设计与实现

专业:

班级:

学号+姓名:

指导教师:

2016年12月 22 日

一.设计目的

掌握内存的连续分配方式的各种分配算法。

二.设计内容

本系统模拟操作系统内存分配算法的实现,实现动态分区分配,算法,采用PCB定义结构体来表示一个进程,定义了进程的名称和大小,进程内存起始地址和进程状态。内存分区表采用单链表来模拟实现。定义与算法相关的数据结构,如PCB,空闲分区;在使用动态分区分配算法时必须实现紧凑功能。

三.设计原理

1.首次适应算法分配内存:空闲分区链以地址递增的次序链接。进行内存分配时,从链首开始顺序查找,直到找到一个大小能满足要求的空闲分区为止。然后再按照作业的大小,从该分区中划出一块内存空间,分配给请求者,余下的空闲分区仍留在空闲链中。若从链首直至链尾都不能找到一个能满足要求的分区,则表明系统中已没有足够大的内存分配给该进程,内存分配结束,返回。

2.回收内存:当进程运行完毕释放内存时,系统根据回收区的首址,从空闲区链中找到相应的插入点:

(1)回收区与插入点的前一个空闲分区F1相邻接,此时应将回收区与插入点的前一分区合并,不必为回收分区分配新表项,而只需要修改前一分区F1的大小。

(2)回收区与插入点的后一个空闲分区F2相邻接,此时将两分区合并形成新的空闲分区,但用回收区的首址作为新空闲区的首址,大小为两者之和。

(3)回收区与插入点的前后两个空闲分区相邻接,此时将三个分区合并,使用F1的表项和F1的首址,取消F2的表项,大小为三者之和。

(4)回收区与插入点的前后两个空闲分区均不相邻接,此时应为回收区单独建立一个新表项,填写回收区的首址和大小,并根据其首址插入到空闲链中的适当位置。

3.紧凑:将内存中的所有作业移动,使他们全都相邻接。可以把原来分散的多个空闲小分区拼接成一个大分区,可将一个作业装入该区。这种技术称为“紧凑”。

四.详细设计及编码

1.模块分析

①paixu():排序算法。按分区的起始位置以递增的次序排序。

②compact():紧凑算法。记录每个忙碌分区的首址及大小,改变其首址。计算所有空闲分区的大小为新空闲分区的大小,首址为所有忙碌分区的大小总和。

③show(FENQU *p):输出函数。输出分区信息(首址,大小,状态,进程号)。

④input():输入函数。输入分区信息(分区个数,各分区首址,大小,状态,进程号)。调用show(FENQU *p)函数。

⑤FENQU *scsf():(递归算法)首次适应算法。进行内存分配时,从链首开始顺序查找,直到找到一个大小能满足要求的空闲分区为止。调用compact()函数。

⑥FENQU * huishou():回收算法。当进程运行完毕释放内存时,系统根据回收区的首址,从空闲区链中找到相应的插入点,判断相应情况进行后续动作。

⑦void function():逻辑函数。从键盘输入选择,实现相应操作。调用scsf(),huishou(),show(p)函数。

⑧int main():主函数。调用input(),function()函数。

流程图

检索空闲分区链

检索空闲分区链

进行紧凑形成连续空闲区

空闲分区总和≥u.size?

N

Y

N

找到>u.size的分区?

无法分配,返回

请求分配u.size分区

修改有关的数据结构

进行紧凑形成连续空闲区

按动态分区方式进行分配

Y

返回分区号及首址

代码实现

#include

#include

#include

typedef struct memory{

int startaddress;//首址

int size;//大小

char state[10];//状态

int number;//进程号

struct memory *next;

}FENQU;

FENQU *ready=NULL, *p;

void paixu();

int len();

void compact();

void show(FENQU *p){

printf("%d\t",p->startaddress);

printf("%d\t",p->size);

printf("%s\t",p->state);

printf("%d\t\n\n",p->number);

}

//输入分区信息

vo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值