广工 操作系统课程设计 最佳适应算法最坏适应算法循环首次适应算法Word文件下载.docx
- 文档编号:17529735
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:19
- 大小:19.68KB
广工 操作系统课程设计 最佳适应算法最坏适应算法循环首次适应算法Word文件下载.docx
《广工 操作系统课程设计 最佳适应算法最坏适应算法循环首次适应算法Word文件下载.docx》由会员分享,可在线阅读,更多相关《广工 操作系统课程设计 最佳适应算法最坏适应算法循环首次适应算法Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
}
voidMemoryInit()//初始化两个链表
initDlist(pro);
//process链表
initDlist(fre);
//freeblock链表
Node*p=newNode;
p->
name=0;
start=0;
state=0;
size=memory;
next=NULL;
//这里曾错写成p->
pre..............
pre=fre.head;
//这里曾漏写
fre.head->
next=p;
intgetLength(Dlist&
L)//返回链表的长度,即元素的个数
intm=0;
Node*p=L.head->
next;
while(p!
=NULL)
{
m++;
p=p->
}
returnm;
voidarrangeSmaller(Dlist&
L)//冒泡排序,链表按size进行排序,从小到大
intlength=getLength(L);
for(inti=0;
i<
length-1;
i++)//当链表中的元素个数>
=2的时候才排序
Node*p=L.head->
Node*q=p->
inta,b,c,d;
//==========================================================================
for(intj=0;
j<
length-1-i;
j++)
{
if(p->
size>
q->
size)//交换位置,如果前面的大于后面的,使小的上浮,如果两个相等,则还是原来在前的保持在前
{
a=p->
size;
p->
size=q->
q->
size=a;
b=p->
name;
name=q->
name=b;
c=p->
start;
start=q->
start=c;
d=p->
state;
state=q->
state=d;
}
p=p->
q=p->
}
voidarrangeBigger(Dlist&
L)//链表按size进行排序,从大到小
i++)
size<
size)
voidarrangeStart(Dlist&
L)//链表按start递增排序
start>
start)
voidDlistInsert(Dlist&
L,Nodee)//在头结点之后插入元素,即L.head->
next指向e
name=e.name;
size=e.size;
start=e.start;
state=e.state;
if(L.head->
next!
=NULL)//这是个值得注意的地方,L.head->
next==NULL,则没有指针L.head->
next->
pre,如果这里不加判断的话,会出错
L.head->
pre=p;
pre=L.head;
//双向链表,插入一个新的元素,如果元素不是插入在链尾,则一共要修改四次指针
voidDlistDelete(Node*p,Node&
e)//传递指针p,删除指针p指向的链表元素,用Node型变量e记录该元素的相关数据
{
e.name=p->
e.start=p->
e.size=p->
e.state=p->
pre->
next=p->
//这里曾写成=p->
pre....
if(p->
p->
pre=p->
pre;
//这里曾写成p->
pre=p,留意
delete(p);
//删除一个元素修改一次或两次指针
//=======================
voidGreen()
{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
voidRed()
{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
voidWhite()
{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
voidYellow()
{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
voidBestOrWorst()
arrangeStart(fre);
//先按地址递增排序
if(fit==1)
arrangeSmaller(fre);
//再按size递增排序,当两个空闲区的size一样时,由于先按地址递增排序了,所以还是地址低的在前。
if(fit==2)
arrangeBigger(fre);
Nodee;
intflag=0;
Node*p=fre.head->
/*p=fre.head->
next,而这时fre是不可能为空的,因为在input()中加入了判断,如果输入了allocate的请求时,如果fre为空,则不会执行BestOrWorst()
故不用讨论fre是否为空的情况。
也就是说,在进入BestOrWorst()的时候就已经确保了fre.head->
=NULL,同理,进入NextFit()的时候也保证了fre不为空*/
{//遍历fre链表,当找到合适的空间之后就break
if(p->
=size)
flag=1;
break;
//一定要break不然遇到两个size相同的空闲区就会出现两个都分配出去的状况
if(flag==0)//在fre链表不空的前提下,如果flag==0则说明没有找到合适的空闲区间,所以分配失败
Red();
cout<
<
"
Nofittingblock,failedtoallocatememory!
!
endl;
else
size-size<
=minsize)
p->
state=2;
DlistDelete(p,e);
e.name=name;
//这里注意了,不是e.name=p->
name因为fre链表中所有的name全部被我置为0,所以当把空闲区间分配给process的时候一定要记得把名字加进去
//其实state对操作什么的都完全没有影响,可改可不改,但为了规范,还是改一下吧
DlistInsert(pro,e);
/*这里还有的一个问题是,例如,当输入的信息为name=1,size=48KB,而将要分配给它的空闲区间p->
size=50,这样,当在表格中输出的时候
该process的信息是name=1,size=50KB,也就是说它的实际大小向p->
size看齐了,但如果这里让e.size=size的话,输出来的信息确实跟原来输入
的时候对应了,但是当kill这个进程的时候,回收的空间并不等于之前分配出去时的空间,会导致memory发生变化*/
else
e.state=2;
//同理
e.start=p->
//e.state=1;
e.size=size;
start=p->
start+size;
//只要修改一下原来空闲区间的start和size即可
size=p->
size-size;
//==================================================
Yellow();
Memoryallocated"
voidNextFit()
Node*p=NULL;
//在这里不用讨论fre是否为空,因为只有fre不为空才会执行NextFit(),详情请看input()
intlength=getLength(fre);
if(temp==NULL)//if(length==1||temp==NULL)当上一次进行分配的空间为链尾元素,则temp会指向NULL,这里加了个length==1,是因为
p=fre.head->
//第一次执行NextFit()的时候,Node*temp=newNode,但是后来改进了,直接在声明temp的时候就让temp=NULL,这样一来,第一次执行NextFit()的时候也能通过
p=temp;
while(length>
0)
length--;
next==NULL)//这里也是值得注意的地方
p=fre.head->
if(flag==0)//没有找到合适的空闲区间来进行分配
//因为reclaim操作并不会减少fre中的元素,只有可能增加而已,所以只要在这个函数体内记录好temp就行。
//只有这一步操作才会减少fre中的元素,如果移出的元素是链尾元素(或者是fre中只有这个元素),则temp==NULL,如果不是则temp=p->
next
temp=p->
//应该p指针发生改变之前就执行该操作,保证了temp=p->
next,
//注意了,因为fre里面所有的name都置零了,所以弹出来之后要修改一下再放入pro中
//====================================================================
//这里注意了,这是跟BestOrWorst()不同。
voidReclaimMemory()
Node*t=NULL;
Node*s=pro.head->
//在这里不讨论s==NULL的情况,因为我在后面intput()函数中有补充
while(s!
if(s->
name==name)
//一定要break
s=s->
if(flag==1)
arrangeStart(fre);
Node*p=fre.head->
if(p==NULL)
DlistDelete(s,e);
e.name=0;
////====================================================================
DlistInsert(fre,e);
while(p!
=NULL)//遍历fre链表
if(p->
start+p->
size==s->
start&
&
(p->
next==NULL||p->
start!
=s->
start+s->
size))//当回收区与前一个空闲区邻接
{
p->
size+s->
DlistDelete(s,e);
//要记得删除pro链表中指针s对应的元素
break;
//一定要留意,一旦找到了符合条件的元素,执行完之后一定要break
}
if(s->
size==p->
pre==fre.head||p->
size!
start))//当回收区与后一个空闲区邻接
start=s->
break;
=NULL&
start==s->
size)//回收区与前后空闲区邻接
t=p->
size+t->
DlistDelete(t,e);
p=p->
if(p==NULL)//遍历完fre链表之后发现没有一个元素满足上面三种情况,则在链首部插入该回收区
DlistDelete(s,e);
e.name=0;
e.state=2;
DlistInsert(fre,e);
arrangeStart(fre);
//由于是在链首插入回收区,所以还是排一下序
Process"
name<
iskilled"
Nomatchingprocess!
voidoutput()
//每次执行完输入的请求操作之后两条链表中发生过变动的元素的state==2,output的时候如果遇到state为2,则字体变色,并且输出完之后,fre中所有的state==0,pro中所有的state==1
arrangeStart(pro);
if(fit==3)
Green();
cout<
============================"
Processinformation:
"
namestartsize"
Node*p=pro.head->
if(p==NULL)
NULL"
state==2)//==================================================
Yellow();
cout<
setw(4)<
p->
setw(6)<
start<
setw(7)<
stat
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 广工 操作系统课程设计 最佳适应算法最坏适应算法循环首次适应算法 操作系统 课程设计 最佳 适应 算法 最坏 循环 首次
![提示](https://static.bdocx.com/images/bang_tan.gif)