- 22
- 0
- 约8.63千字
- 约 14页
- 2017-03-05 发布于重庆
- 举报
动态分区存储管理设计报告
《操作系统》
课 程 设 计 报 告 书
题 目: 动态分区存储管理
系 别:
学 号:
学生姓名:
指导教师:
完成日期: 2013/6/12
源代码可在Visual C++里成功运行
目录
一、实验目的 1
二、实验内容 1
三、设计分析 1
1.数据结构 1
2.主函数 1
3.分配函数alloc() 1
4.回收函数free() 1
5.调度图 2
6.运行环境 2
7.开发工具和编程语言 2
四、源代码 2
五、程序运行结果 10
1.最佳适应算法模拟 11
2.最先适应算法 11
六、设计总结 12
动态分区存储管理
一、实验目的
了解动态分区分配中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。
二、实验内容
用C语言或C++语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc()和回收过程free()。其中,空闲分区通过空闲分区链表来管理,在进行内存分配时,系统优先使用空闲区低端的空间。
假设初始状态如下,可用的内存空间为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.主函数
对作业队列、阻塞队列、已分配内存块链表、未分配内存块链表、系统总内存分配情况结点对象进行初始化,调用分配函数或回收函数,循环处理11个作业步。
3.分配函数alloc()
首次适应算法检索未分配的内存块链表,若找到合适的内存块,则加以判断,空闲内存块大小减去作业去请求内存块大小小于系统额定的最小碎片值,把空闲块全部分配,否则进行分割分配,最后显示分配的内存信息。
4.回收函数free()
首次适应算法检索已分配的内存块链表,找到要释放的内存块后,在已分配链表中删除该结点,并把该结点挂到未分配内存块链表的结尾处,然后进行两次调整,把未分配的内存块链表调整为首地址从小到大的排列顺序,并且物理上相邻的空闲内存块要进行合并,以方便下次进行分配。调度分配函数,循环处理阻塞作业队列,最后显示回收后的内存情况。
5.调度图
6.运行环境
硬件:计算机
软件:windowsXP vc++6.0
7.开发工具和编程语言
开发工具:vc++6.0
编程语言:C语言
四、源代码
#includestdio.h
#includestdlib.h
#includestring.h
#define MAX_SIZE 32767
typedef struct node //定义分区描述器的结构
{
int id; //编号
int adr; //分区首地址
int size; //分区大小
struct node *next;//指向下一个分区的指针
}Node;
Node *head1,*head2,*back1,*back2,*assign;/*head--空闲区队列首指针
back--指向释放区Node结构的指针
assign-指向申请的内存分区Node结构的指针*/
int request; //用户申请存储区的大小(由用户输入)
int check(int add,int siz,char c)//用于检查指定的释放块(由用户键入)的合法性
{
Node *p,*head;
int check=1;
if(add0||siz0)
check=0;/*地址和大小不能为负*/
if(c==f||c==F)
head=head1;
else
head=head2;
p=head-next;
while((p!=NULL)check)/*地址不能和空闲区表中结点出现重叠*/
原创力文档

文档评论(0)