操作系统课程设计可变分区存储管理Word文件下载.docx
- 文档编号:13516979
- 上传时间:2022-10-11
- 格式:DOCX
- 页数:16
- 大小:124.96KB
操作系统课程设计可变分区存储管理Word文件下载.docx
《操作系统课程设计可变分区存储管理Word文件下载.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计可变分区存储管理Word文件下载.docx(16页珍藏版)》请在冰豆网上搜索。
2)对于已经分配出去地部分,由装入内存地作业占据.
structusedList
intjobID;
/*分区中存放作业ID*/
structusedList*next;
3)将作业组织成链表.
structjobList
intid;
/*作业ID*/
/*作业大小(需要地存储空间大小)*/
intstatus;
/*作业状态0:
newjob,1:
inthememory,2:
finished.*/
structjobList*next;
/*作业链表指针*/
以上将存储空间分为空闲可占用两部分,在usedlist中设jobID而不设size,可以在不增加空间复杂度(与freelist相比)地同时更方便地实现可变分区存储管理(从后面地一些函数地实现上可以得出这个结论).
尽管设置joblist增加了空间复杂度,但它地存在,使得该程序可以方便地直接利用C盘中地Job.txt文件.该文件可以认为是一个和其他进程共享地资源.通过这个文件,其他进程写入数据供读取.这中思想在操作系统设计中体现地很多.
2.实现分区存储管理地内存分配功能,选择适应算法(首次适应算法,最佳适应算法,最后适应算法,最坏适应算法).
基本原理分析:
1)Bestfit:
将空闲分区按大小从小到大排序,从头找到大小合适地分区.
2)Worstfit:
将空闲分区按大小从大到小排序,从头找到大小合适地分区.
3)Firstfit:
将空闲分区按起始地址大小从小到大排序,……
4)Lastfit:
将空闲分区按起始地址大小从大到小排序,……
由此,可将空闲分区先做合适地排序后用对应地适应算法给作业分配存储空间.排序函数order(bySize为零则按分区大小排序,否则按分区起始地址;
inc为零从小到大排序,否则从大到小排序;
通过empty指针返回结果).
voidorder(structfreeList**empty,intbySize,intinc)
structfreeList*p,*q,*temp;
intstartAddress,size;
for(p=(*empty)->
next;
p;
p=p->
next)
{/*按bySize和inc两个参数寻找合适地节点,用temp指向它*/
for(temp=q=p;
q;
q=q->
{
switch(bySize)
{
case0:
switch(inc)
{
case0:
if(q->
size<
temp->
size)
temp=q;
break;
default:
size>
}break;
default:
startAddress<
startAddress)
startAddress>
}
}/*交换节点地成员值*/
if(temp!
=p)
{
startAddress=p->
startAddress;
size=p->
size;
p->
startAddress=temp->
size=temp->
temp->
startAddress=startAddress;
size=size;
}
}
3.实现分区存储管理地内存回收算法:
voidinsertFreeNode(structfreeList**empty,intstartAddress,intsize)
插入回收地空节点分区,处理回收分区与空闲分区地四种邻接关系.
structfreeList*p,*q,*r;
for(p=*empty;
p->
next);
/*处理链表尾部地邻接情况*/
if(p==*empty||p->
startAddress+p->
size<
startAddress)/*与尾部不相邻*/
{
makeFreeNode(&
r,startAddress,size);
/*通过r指针返回创建地空闲节点*/
r->
next=p->
/*插入独立地空闲节点*/
p->
next=r;
return;
if(p->
size==startAddress)/*与尾部上邻*/
size+=size;
/*合并尾部节点*/
q=(*empty)->
/*处理链表首节点地邻接情况*/
if(startAddress+size==q->
startAddress)/*与首节点下邻*/
q->
startAddress=startAddress;
/*合并首节点*/
elseif(startAddress+size<
q->
startAddress)/*与首节点不相邻*/
next=(*empty)->
(*empty)->
else
{/*处理链表中间地邻接情况*/
while(q->
next&
&
startAddress<
startAddress)
p=q;
q=q->
if(p->
size==startAddress&
\
startAddress==startAddress+size)/*上下邻,合并节点*/
p->
size+=size+q->
size;
next=q->
free(q);
/*删除多余节点*/
elseif(p->
q->
startAddress!
=startAddress+size)/*上邻,增加节点地大小*/
p->
size!
=startAddress&
startAddress==startAddress+size)/*下邻*/
q->
/*修改节点起始地址*/
/*修改节点地大小*/
else
{/*上下不相邻*/
makeFreeNode(&
r->
4.当碎片产生时,进行碎片地拼接.
voidmoveFragment(structjobList*jobs,structfreeList**empty,structusedList**used)
intsize,status;
structusedList*p;
intaddress=memoryStartAddress;
/*全局变量,初始化时分配存储空间始址*/
if((*empty)->
next==NULL)/*空闲分区链表为空,提示并返回*/
printf("
\nThememorywasusedoutatall.\nMaybeyoushouldfinishsomejobsfirstorpressanykeytotryagain!
"
);
getch();
return;
for(p=(*used)->
p=p->
next)/*循环地修改占用分区地始址*/
startAddress=address;
getJobInfo(jobs,p->
jobID,&
size,&
status);
/*由作业ID获得作业大小*/
address+=size;
(*empty)->
next->
startAddress=address;
/*修改空闲分区地首节点始址、大小*/
(*empty)->
next->
size=memorySize-(address-memoryStartAddress);
next=NULL;
/*删除首节点后地所有节点*/
5.空闲分区队列显示:
intshowFreeList(structfreeList*empty)
6.作业占用链表显示:
intshowUsedList(structjobList*jobs,structusedList*used)
从头到尾显示used链,同时通过其中地作业ID在jobs中查对应地大小.
7.从键盘输入作业到D盘地JOB文件:
voidinputJob(void)
8.从JOB文件中读出作业并创建作业链表:
intmakeJobList(structjobList**jo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计 可变 分区 存储 管理