存储管理实验报告参考模板Word格式文档下载.docx
- 文档编号:19293994
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:27
- 大小:288.08KB
存储管理实验报告参考模板Word格式文档下载.docx
《存储管理实验报告参考模板Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《存储管理实验报告参考模板Word格式文档下载.docx(27页珍藏版)》请在冰豆网上搜索。
//分配索引,表示已申请队列已分配的进程数
intexeIndex;
//执行的进程号
Node*subareaNode=newNode[3];
//分区回收时,进程所在分区及其前,后分区信息
LinkListcreateLinkList(intn);
//建立空闲分区链
NodefirstFit(LinkList&
head,Processpro);
//首次适应算法
NodenestFit(LinkList&
head,Processpro,Nodeflag);
//循环适应算法
NodebestFit(LinkList&
//最佳适应算法
NodeworstFit(LinkList&
//最坏适应算法
Nodeassign(LinkList&
head,intorderIndex,intindex,NodeflagNode);
//一次分区分配
intassignMemory(LinkList&
head);
//内存分配
voidinsertNode(LinkList&
head,Nodeq,intindex);
//插入节点
NodedeleteNode(LinkList&
head,intindex);
//删除节点
intdisplay(LinkList&
//打印分区分配情况
intlowAttemper(int*excursionPointer);
//低级调度
intfindSubarea(LinkList&
//回收内存
intcreatProcess();
//创建进程
Process*randomCreatPro(intn);
//随机产生进程
下面是各种方法简述:
(1)最优替换算法,即OPT算法。
上面介绍的几种页面替换算法主要是以主存储器中页面调度情况的历史信息为依据的,它假设将来主存储器中的页面调度情况与过去一段时间内主存储器中的页面调度情况是相同的。
显然,这种假设不总是正确的。
最好的算法应该是选择将来最久不被访问的页面作为被替换的页面,这种替换算法的命中率一定是最高的,它就是最优替换算法。
要实现OPT算法,唯一的办法是让程序先执行一遍,记录下实际的页地址流情况。
根据这个页地址流才能找出当前要被替换的页面。
显然,这样做是不现实的。
因此,OPT算法只是一种理想化的算法,然而,它也是一种很有用的算法。
实际上,经常把这种算法用来作为评价其它页面替换算法好坏的标准。
在其它条件相同的情况下,哪一种页面替换算法的命中率与OPT算法最接近,那么,它就是一种比较好的页面替换算法。
(2)先进先出算法,即FIFO算法(First-InFirst-Outalgorithm)。
这种算法选择最先调入主存储器的页面作为被替换的页面。
它的优点是比较容易实现,能够利用主存储器中页面调度情况的历史信息,但是,没有反映程序的局部性。
因为最先调入主存的页面,很可能也是经常要使用的页面。
(3)最久没有使用算法,即LRU算法(LeastRecentlyUsedalgorithm)。
这种算法把近期最久没有被访问过的页面作为被替换的页面。
它把LFU算法中要记录数量上的多"
与"
少简化成判断"
有"
无"
,因此,实现起来比较容易。
(4)近期最少使用算法,即LFU算法(LeastFrequentlyUsedalgorithm)。
这种算法选择近期最少访问的页面作为被替换的页面。
显然,这是一种非常合理的算法,因为到目前为止最少使用的页面,很可能也是将来最少访问的页面。
该算法既充分利用了主存中页面调度情况的历史信息,又正确反映了程序的局部性。
但是,这种算法实现起来非常困难,它要为每个页面设置一个很长的计数器,并且要选择一个固定的时钟为每个计数器定时计数。
在选择被替换页面时,要从所有计数器中找出一个计数值最大的计数器。
因此,通常采用如下一种相对比较简单的方法。
(5)最近未使用法缺页中断率=缺页中断次数总的页面引用次数*100%
三、所用仪器、材料(设备名称、型号、规格等)。
计算机一台
四、实验方法、步骤
#include<
iostream>
cmath>
iomanip.h>
time.h>
conio.h>
#defineSize4
#definenum10
typedefintbyte;
typedefstruct{
bytesubareaSize;
intstartLoc;
//起始地址
intindex;
//分区号
}SubareaTable;
//分区表
typedefstructnode{//结点
SubareaTablesubarea;
//分区
structnode*next;
intstatus;
//状态位0(空闲)1(使用)
}*Node,*LinkList;
byteprocessSize;
intsubareaIndex;
//保存分区号
//进程状态,0(新建)1(执行)-1(终止)-2(未绪。
申请但没有分配内存)2(就绪,已分配内存)
}Process;
//进程
LinkListcreateLinkList(intn){//建立空闲分区链
cout<
<
"
-------------创建分区--------------"
endl;
LinkListhead;
Nodep;
head=(LinkList)malloc(sizeof(node));
if(head==NULL){
cout<
头结点分配错误"
returnNULL;
}
head->
next=NULL;
//链表尾巴设置为NULL
LinkListq=head;
intstart=0;
for(inti=1;
i<
=n;
i++){
p=(Node)malloc(sizeof(node));
if(p==NULL){
节点分配错误"
p->
next=q->
next;
q->
next=p;
q=p;
subarea.index=i;
subarea.subareaSize=subareaSize[i-1];
//分区表赋值大小
subarea.startLoc=start;
status=0;
start+=subareaSize[i-1];
}
分区创建成功!
!
returnhead;
}
head,Processpro){//首次适应算法
Nodep=head->
//遍历结点,返回结点,从第一个结点开始遍历
cout<
空闲链表不存在"
else{
do{
if(p->
status==0&
&
p->
subarea.subareaSize>
=pro.processSize){
break;
p=p->
while(p!
=NULL);
if(p==NULL){//没找到合适的结点
returnp;
head,Processpro,Nodeflag){//循环适应算法
Nodep=flag->
//遍历结点
while(p!
=NULL){
if(p==NULL){//遍历到链表结尾
p=head;
//从头开始遍历
=flag){//标记结点
if(p->
break;
}
if(p==flag){//正常跳出循环,没有合适的结点可分配
returnhead;
}else{
returnp;
//在flag结点前找到一合适的结点分配
}else{
//在flag结点后找到一合适的结点分配
head,Processpro){//最佳适应算法
Nodeq;
//返回最佳空闲结点
intleave;
//剩余空间
intcount=0;
//计数器
returnNULL;
}else{
do{
if(p->
=pro.processSize){
count++;
if(count==1){//第一个可以分配的空闲分区
leave=p->
subarea.subareaSize-pro.processSize;
q=p;
}elseif(count>
1){
if(p->
subarea.subareaSize-pro.processSize<
leave){//更适合的结点
leave=p->
q=p;
}
}
}
p=p->
}while(p!
returnq;
head,Processpro){//最坏适应算法
//返回最大空闲结点
}else{//开始遍历
do{
status==0){
count++;
if(count==1){//第一个空闲区
q=p;
}
else{//非第一个空闲区
if(p->
q->
subarea.subareaSize){//当前结点大于前面最大结点
}
}
}
if(q->
returnq;
}else{
进程大小大于最大分区,无法分配"
returnhead;
head,Nodeq,intindex)
{
intj=1;
if(head==NULL){
链表为空"
;
return;
p=head->
for(;
p;
p=p->
next){
j++;
if(j>
=index)
next=p->
next=q;
//插入完成
j=q->
subarea.index;
//j保持q的分区号
q=q->
//开始修改分区号
while(q!
subarea.index=j+1;
head,intindex){
Nodeq;
//保存要删掉的节点
Nodep=head;
//遍历的节点
while(p&
count<
index-1){
count++;
q=p->
returnq;
return0;
intj=1;
for(;
j++)
{
if(j>
=index-1)break;
for(inti=0;
3;
subareaNode[i]=p;
p=p->
return1;
head){//打印分区分配情况
-------------分区信息--------------"
分区未创建,请先创建分区"
cout.fill('
'
);
=NULL){
cout.width(3);
subarea.index<
分区的大小:
setw(5)<
subarea.subareaSize<
KB"
<
分区开始位置:
setw(6)<
subarea.startLoc<
是否空闲:
setw(4)<
status<
intdisplayProcess(){
-------------进程信息--------------"
if(pro==NULL){
进程未创建,请先创建进程"
for(inti=0;
ProcessNum;
pro++,i++)
{
i+1<
号进程大小:
pro->
processSize<
进程状况:
setw(6);
if(pro->
创建"
elseif(pro->
status==1){//进程状态
执行"
}elseif(pro->
status==-1){
终止"
status==2){
就绪"
status==-2){
未绪"
pro-=ProcessNum;
intapplyforProcess(){
-------------申请进程--------------"
进程未创建,请先创建进程"
输入申请进程的数目:
cin>
>
applyProcessNum;
while(applyProcessNum>
maxApplyNum){//申请数目大于最大可申请数目
申请进程数目大于可申请进程数目,不合法"
请重新输入申请进程数:
cin>
displayProcess();
){
请输入需要申请的进程(创建进程才能申请):
index;
pro+=(index-1);
//修改指针
if(pro->
index<
号进程申请成功"
applyIndex[i+totalApplyNum]=index-1;
//保持申请进程的偏移量
pro->
status=-2;
//改状态
i++;
maxApplyNum--;
号进程不为创建状态,重新申请"
pro-=(index-1);
//回首址
totalApplyNum+=applyProcessNum;
head){//分配内存
intn;
NodeflagNode;
if(applyProcessNum==0||head==NULL){
未申请进程或未建分区....."
return0;
}
do{
**********内存分配**********"
setw(10)<
1.首次适应算法"
2.循环适应算法"
3.最佳适应算法"
4.最坏适应算法"
**************************"
请选择:
n;
}while(n<
1||n>
4);
//第一次分配,从头结点开始,其他重上次分配的节点开始
applyIndex+=assignFlag;
//从分配资源的进程开始分配
for(int
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 存储 管理 实验 报告 参考 模板