华南操作系统大作业Word文档格式.docx
- 文档编号:7020913
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:31
- 大小:361.56KB
华南操作系统大作业Word文档格式.docx
《华南操作系统大作业Word文档格式.docx》由会员分享,可在线阅读,更多相关《华南操作系统大作业Word文档格式.docx(31页珍藏版)》请在冰点文库上搜索。
动态分区常用的数据结构有空闲分区表和空闲分区链,用来记录内存的使用情况,此题中我采用的是空闲分区链的结构,用链指针将所有的分区链接成一条链,每个分区的结构如下所示:
structmemory
{
structmemory*former;
//前向指针
intaddress;
//分区起始地址
intnum;
//作业号
intsize;
//分配内存大小
intstate;
//状态字
structmemory*next;
//后向指针
};
前向指针和后向指针分别用于与当前分区的前后分区相链接,address用于说明当前分区的起始地址,状态字为0时表示当前分区空闲,为1时表示已分配,num为分配的作业号,size表示分配的内存大小。
4处理流程
分配算法
详细流程图见图5.1.1,其中各个条件分别为:
P1:
ptr->
next==NULL
P2:
size>
=assign->
size
P3:
current!
=NULL
P4:
current->
size&
&
current->
state==0
P5:
P6:
(ptr->
next)->
next!
=NULL&
is_optimist==true
回收算法
详细流程图见图5.1.2
若为首先适应算法回收,则各条件分别为:
state==1&
num==i
current==NULL
previous->
(current->
P7:
state==0&
(current->
P8:
P9:
is_optimist=true
若为最佳适应算法,则各条件分别为:
((previous->
address+previous->
size)==current->
addr
ess)
address+pr
evious->
address)&
((current->
size+current->
address)==(current->
address)
5源程序
程序如下所示:
#include<
iostream>
stdlib.h>
usingnamespacestd;
//地址
//状态0表示空闲1表示已分配
typedefstructmemoryMEMORY;
MEMORY*mem;
constintsize_min=10;
//内存允许的最小空闲块的大小
boolis_optimist;
//判断是否是最佳适应算法
voidinit();
//初始化内存块
voidexec();
//执行相应算法
voidF_F(int);
//依次初始化每个作业,并根据相应算法对作业分配内存
voidalloc(MEMORY*,MEMORY*);
//分配内存算法(包括两种不同算法)
voidfree(MEMORY*,int);
//首次适应算法回收内存
voidfree_optimist(MEMORY*,int);
//最佳适应算法回收内存
voidsort(MEMORY*);
//对内存链进行排序
voidinsert(MEMORY*,MEMORY*);
//按空间大小将作业顺序插入到内存链
voidprint(MEMORY*);
//打印内存链
voidmain()
{//主函数
inti=0;
while
(1)
{//选择算法
cout<
<
("
华南理工大学“计算机操作系统”课程设计大作业\n"
);
题目:
动态内存分区分配方式模拟\n"
学生姓名:
冯桥新\n学生学号:
200804692013001\n"
\n请输入一个数字(1,2,0)"
;
\n1--首次适应算法"
"
\n2--最佳适应算法"
endl;
0--中止程序"
cin>
>
i;
if(i==1)
{//首次适应算法
\n以下为首次适应算法:
\n"
is_optimist=false;
init();
exec();
}
if(i==2)
{//最佳适应算法
\n以下为最佳适应算法:
is_optimist=true;
exec();
elseif(i==0)
{exit
(1);
}
voidinit()
{//初始化内存容量
mem=newMEMORY;
mem->
size=640;
former=0;
next=0;
}
voidexec()
{//执行算法
while
(1)
{//选择申请或释放内存操作
**************************"
申请内存请输入作业号(1-7)"
释放内存请输入数字8"
中止程序请输入数字0"
intk;
cin>
k;
//根据k值选择相应的操作
if(k>
=1&
k<
=7)F_F(k);
if(k==8)
{intm;
请输入要释放的作业号:
m;
//选择相应的回收算法
if(is_optimist==false)free(mem,m);
elsefree_optimist(mem,m);
elseif(k==0)
{break;
}//回滚到选择算法的步骤
voidF_F(inti)
{//依次初始化每个作业,并根据相应算法对作业分配内存
intwork[]={0,130,60,100,200,140,60,50};
//作业序列,i从1开始(与作业号对应),因此从第一个开始存放作业值,第0个值为0,不是作业
MEMORY*running;
running=(MEMORY*)malloc(sizeof(MEMORY));
if(running!
=NULL)
{running->
former=NULL;
running->
address=0;
num=i;
//i从1开始循环
size=work[i];
//指定作业大小
state=0;
//作业未分配
next=NULL;
//根据相应算法为作业分配内存,详见alloc函数
alloc(mem,running);
print(mem);
else
没有足够的内存空间"
voidfree(MEMORY*ptr,inti)
{//首次适应算法作业处理完后释放内存空间
MEMORY*previous,*current;
previous=ptr;
current=previous->
next;
while(current!
{//循环直到找到需要释放的作业位置
if(current->
num==i)
}
previous=current;
current=current->
if(current==NULL)
{cout<
内存中没有任何作业!
!
return;
elseif(current->
next==NULL)
{//当前作业为内存中最后一个作业
if(previous->
state==0)
{//与前一个相邻空闲区合并
size=previous->
size;
作业"
num)<
释放"
size)<
k的空间"
{//将状态改为0,即为空闲区
elseif((current->
next==NULL)//p6
{//当前作业为倒数第二个作业(此种情况还是要单列出来讨论的否则会出现错误)
state==0)//p7
{//释放的地址空间前后均为空闲区
size+(current->
//与下边else(其他情况的不同之处)
elseif(previous->
state==0)//p5
{//释放的地址空间前面有空闲块则把它和前面的合并
former=previous;
next=current->
state==0)//p8
{//释放的地址空间后面有空闲块则把它和后面的空闲块合并
size=current->
{//释放的地址空间前后都没有空闲块时直接把它的状态改为0
{//其他情况下(当前作业在链表中间)
{//所释放空间前后均为空闲区
((current->
next=(current->
{//释放的地址空间前面有空闲块则把它和前面的合并
former=current;
{//处理完的作业前后都没有空闲块时直接把它的状态改为0
voidalloc(MEMORY*ptr,MEMORY*assign)
{//根据算法分配内存(is_optimist状态)
if(ptr->
next==NULL)
{//内存没有作业运行
size)
{//内存空间大于作业所需空间,为内存分配空间
size=ptr->
size-assign->
assign->
state=1;
next=assign;
former=ptr;
(assign->
申请"
"
k的内存空间"
{
没有足够的内存空间为作业"
分配"
deleteassign;
else
{//内存中如果已经分配了空间
//previous为链表中的第一个元素
{//当前区间不为空(最后一个区间的next为空),即没有循环到最后
//如果当前内存空间大于作业所需空间并且内存没有被分配
//则结束循环,当前current位置即为要插入的位置
state==0)
break;
//previous后移
if(current==NULL)
{//空闲链中没有为作业分配所需的空间,即释放的空闲区间小于要分配的作业空间
//不够用,则在所有作业后边另外再申请空闲区,如作业4
{//内存中还有足够没分配的空闲空间为此作业分配
//此时ptr指向内存上未分配空闲空间的起始地址
address=640-(ptr->
size);
{//释放的空闲链中有可为此作业分配的空间
if((current->
=size_min)
{//空闲链所具备的空间与作业所需空间大小差不多时
//直接把整个空闲块的空间分配给作业否则从空闲块中
num=assign->
num;
//划出与作业等同的空间
k的内存间"
{//从空闲块中划分一块与作业大小等同的空间
address=current->
address+current->
{//此要分配的空间是空闲链的最后一个元素
former=assign;
//最佳适应算法要对空闲块排序
if((ptr->
is_optimist==true)
sort(ptr);
//排序由空闲块从小到大
voidsort(MEMORY*ptr)
{//排序函数
MEMORY*temp=newMEMORY;
temp->
while(ptr->
next)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华南 操作系统 作业