最新c++动态分区分配算法模拟(操作系统课程设计)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
c++动态分区分配算法模拟(操作系统课程
设计)
课程设计
课程设计名称:操作系统课程设计
专业班级:
学生姓名:
学号:
指导教师:
课程设计时间:6月13日-——6月17日
计算机科学专业课程设计任务书
说明:本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页
1:需求分析
(1)用C语言实现采用首次适应算法的动态分区分配过程alloc()和回收过程free()。其中,空闲分区通过空闲分区链表来管理,在进行内存分配时,系统优先使用空闲区低端的空间。
(2)假设初始状态下,可用的内存空间为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。采用首次适应算法进行内存块的分配和回
收,同时显示内存块分配和回收后空闲内存分区链的情况。
2:概要设计
(1)数据结构:作业队列数据结构,用于存储待处理作业;阻塞作业队列数据结构,用于存储阻塞的作业。已分配内存块的双向链表,记录当前系
统已分配的各个内存块;未分配内存块的双向链表,记录系统中剩余的
各个内存块;系统内存分配总情况的结点对象,记录系统中阻塞的作业
总数,已分配的内存块数,剩余的内存块数。
(2)主函数:对作业队列、阻塞队列、已分配内存块链表、未分配内存块链表、系统总内存分配情况结点对象进行初始化,调用分配函数或回收函
数,循环处理11个作业步。
(3)分配函数alloc():首次适应算法检索未分配的内存块链表,若找到合适的内存块,则加以判断,空闲内存块大小减去作业去请求内存块大小小于
系统额定的最小碎片值,把空闲块全部分配,否则进行分割分配,最后
显示分配的内存信息。
(4)回收函数free():首次适应算法检索已分配的内存块链表,找到要释放的内存块后,在已分配链表中删除该结点,并把该结点挂到未分配内存块
链表的结尾处,然后进行两次调整,把未分配的内存块链表调整为首地
址从小到大的排列顺序,并且物理上相邻的空闲内存块要进行合并,以
方便下次进行分配。调度分配函数,循环处理阻塞作业队列,最后显示
回收后的内存情况。
(5)调度图如下:
3:运行环境
硬件:计算机
软件:windowsXP vc++6.0
4:开发工具和编程语言
开发工具:vc++6.0
编程语言:C语言
5:详细设计
(1):数据结构模块
struct job//作业结点
{
int num;//作业编号
int state;//0表示释放,1表示申请
int length;//作业要求处理大小
};
struct yifenpei//已分配内存块结点
{
int num;//占有内存区域的作业编号
int firstadd;//内存区域的首地址
int length;//内存区域的大小
struct yifenpei*forward;
struct yifenpei*next;
};
struct weifenpei//未分配内存块结点
{
int firstadd;//空闲区域的首地址
int length;//空闲区域的大小
struct weifenpei*forward;
struct weifenpei*next;
};
struct total//内存分配状况记录结点
{
int totalyifen;//已分配的总内存块数
int totalweifen;//未分配的总内存块数
int totalzuse;//阻塞的作业个数
};
struct job jobarray[11];//作业处理队列
struct yifenpei*headyifen=(struct yifenpei*)malloc(len2);//已分配的内存块所构成的双向链表的头指针
struct weifenpei*headweifen=(struct weifenpei*)malloc(len3);//未分配的内存块所构成的双向链表的头指针
struct job zuse[11];//阻塞作业队列
struct total totalnow;
2:主函数模块
void main()
{
jobarray[0].num=1; jobarray[0].state=1; jobarray[0].length=130;/* 初始化请求序列,共11个作业步*/
jobarray[1].num=2; jobarray[1].state=1; jobarray[1].length=60;
jobarray[2].num=3; jobarray[2].state=1; jobarray[2].length=100;
jobarray[3].num=2; jobarray[3].state=0; jobarray[3].length=60;
jobarray[4].num=4; jobarray[4].state=1; jobarray[4].length=200;
jobarray[5].num=3; jobarray[5].state=0; jobarray[5].length=100;
jobarray[6].num=1; jobarray[6].state=0; jobarray[6].length=130;
jobarray[7].num=5; jobarray[7].state=1; jobarray[7].length=140;
jobarray[8].num=6; jobarray[8].state=1; jobarray[8].length=60;
jobarray[9].num=7; jobarray[9].state=1; jobarray[9].length=50;
jobarray[10].num=6; jobarray[10].state=0; jobarray[10].length=60;
totalnow.totalyifen=0;totalnow.totalweifen=1;totalnow.totalzuse=0;//初始化系统内存分配状况
struct weifenpei*weifen=(struct weifenpei*)malloc(len3);
weifen->firstadd=1;weifen->forward=headweifen;weifen->length=640;weifen-
>next=NULL;
headweifen->forward=NULL;headweifen->next=weifen;//初始化未分配的内存块双向链表