计算机操作系统内存分配实验源代码Word文档格式.docx
《计算机操作系统内存分配实验源代码Word文档格式.docx》由会员分享,可在线阅读,更多相关《计算机操作系统内存分配实验源代码Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
![计算机操作系统内存分配实验源代码Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-12/1/7d454fbb-bf56-4ada-8711-25e083fa57c7/7d454fbb-bf56-4ada-8711-25e083fa57c71.gif)
//记录要删除的分区序号
StatusInitblock<
>
//开创带头结点的内存空间链表
{
first=<
LinkList>
malloc<
sizeof<
Node>
;
end=<
first->
prior=NULL;
next=end;
end->
prior=first;
next=NULL;
data.num=1;
data.address=40;
data.length=600;
data.state=0;
returnOK;
}
voidsort<
//分区序号重新排序
Node*p=first->
next,*q;
q=p->
next;
for<
p!
=NULL;
p=p->
next>
{
for<
q=p->
q;
q=q->
{
if<
p->
data.num>
=q->
q->
data.num+=1;
}
}
//显示主存分配情况
voidshow<
{intflag=0;
//用来记录分区序号
Node*p=first;
p->
data.num=0;
data.address=0;
data.length=40;
data.state=1;
sort<
printf<
"
\n\t\t》主存空间分配情况《\n"
**********************************************************\n\n"
分区序号\t起始地址\t分区大小\t分区状态\n\n"
while<
p>
%d\t\t%d\t\t%d"
p->
data.num,p->
data.address,p->
data.length>
if<
data.state==0>
\t\t空闲\n\n"
elseprintf<
\t\t已分配\n\n"
p=p->
//首次适应算法
StatusFirst_fit<
intrequest>
//为申请作业开辟新空间且初始化
LinkListtemp=<
temp->
data.length=request;
<
&
data.length==request>
{//有大小恰好合适的空闲块
break;
elseif<
&
<
request>
{//有空闲块能满足需求且有剩余
prior=p->
prior;
next=p;
data.address=p->
data.address;
data.num=p->
data.num;
prior->
next=temp;
prior=temp;
data.address=temp->
data.address+temp->
data.length;
data.length-=request;
returnERROR;
//最佳适应算法
StatusBest_fit<
intch;
//记录最小剩余空间
Node*q=NULL;
//记录最佳插入位置
p->
//初始化最小空间和最佳位置
=request>
>
q==NULL>
q=p;
ch=p->
data.length-request;
q->
data.length>
//没有找到空闲块
q->
else
prior=q->
next=q;
data.address=q->
data.num=q->
data.address+=request;
data.length=ch;
//最差适应算法
StatusWorst_fit<
//记录最大剩余空间
//初始化最大空间和最佳位置
data.state==0&
data.length<
data.length=1;
//分配主存
Statusallocation<
inta>
intrequest;
//申请内存大小
请输入申请分配的主存大小<
单位:
KB>
:
scanf<
%d"
&
request<
0||request==0>
分配大小不合适,请重试!
switch<
a>
case1:
//默认首次适应算法
First_fit<
==OK>
\t****分配成功!
****"
\t****内存不足,分配失败!
break;
case2:
//选择最佳适应算法
Best_fit<
case3:
//选择最差适应算法
Worst_fit<
Statusdeal1<
Node*p>
//处理回收空间
Node*q=first;
q!
q==p>
data.state==0&
next->
data.state!
=0>
data.length+=q->
next=q->
q=q->
data.num=flag-1;
=0&
prior=q;
data.num=flag;
Statusdeal2<
//主存回收
Statusrecovery<
intflag>
data.num==flag>
{
prior==first>
next!
=end>
//当前P指向的下一个不是最后一个时
if<
//与后面的空闲块相连
data.length+=p->
prior=p;
next=p->
}
elsep->
next==end>
//当前P指向的下一个是最后一个时
}//结束if<
prior==block_first>
的情况
elseif<
prior!
=first>
deal1<
else
deal2<
=block_first>
}//结束if<
\t****回收成功****"
//主函数
voidmain<
inti;
//操作选择标记
inta;
//算法选择标记
**********************************************************\n"
\t\t用以下三种方法实现主存空间的分配\n"
\t<
1>
首次适应算法\t<
2>
最佳适应算法\t<
3>
最差适应算法\n"
\n"
请输入所使用的内存分配算法:
a<
1||a>
输入错误,请重新输入所使用的内存分配算法:
case1:
printf<
\n\t****使用首次适应算法:
****\n"
break;
\n\t****使用最佳适应算法:
\n\t****使用最坏适应算法:
Initblock<
//开创空间表
show<
\t1:
分配内存\t2:
回收内存\t0:
退出\n"
请输入您的操作:
i>
i==1>
allocation<
//分配内存
i==2>
//内存回收
请输入您要释放的分区号:
flag>
recovery<
i==0>
printf<
\n退出程序\n"
//退出
else//输入操作有误
输入有误,请重试!
continue;
八、执行结果和结果分析
初始化首次适应算法:
当作业1、2、3顺利分配内存空间后:
回收序号2里面的内存:
分配作业4:
回收序号3里面的内存〔与上邻序号2相连了
回收序号1里的内存〔与下邻序号2相连了
继续分配〔会发现总是按顺序查找满足要求的第一个空闲块,一旦发现就会分配: