操作系统实验报告--内存管理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统课程设计

实验报告

学院:信息学院

班级:计1109班

姓名:林海慧

学号:XXXXXXXXXXXXX

指导老师:XXXX

实验三、内存管理

一、[问题描述] 设计一个请求页式存储管理方案,为简单起见。页面淘汰算法采用FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页表中修改状态位。而不再判断它是否被改写过,也不将它写回到辅存。

二、[基本要求]

页面尺寸1K,输入进程大小(例如5300bytes),对页表进行初始化,

页表结构:

,块号分别为0、1、2,页框管理表(空闲块表):

任意输入一个需要访问的指令地址流(例如:3635、3642、1140、0087、1700、5200、4355,输入负数结束),打印页表情况。

每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印页表情况;如果该页不在主存且页框未满,则调入该页并修改页表,打印页表情况;如果该页不在主存且页框已满,则按FIFO页面淘汰算法淘汰一页后调入所需的页,修改页表,打印页表情况;

存储管理算法的流程图如下:

三、源代码

#include

#include

#define BUSY 1

#define NOTBUSY 0

struct PageB{

int PNumber; //页号

int BNumber; //物理块号

int Count; //计数器,在内存驻留时间

bool State; //状态位

} ;

PageB

Page[6]={{0,-1,0,false},{1,-1,0,false},{2,-1,0,false},{3,-1,0,false},{4,-1,0,false},{5,-1,0,false}};

int queye=0;

struct Physical{

int BNumber; //物理块号

int State; //状态位

}Physical[3]={{0,0},{1,0},{2,0}};

int MaxSzie, MaxCount = 0;

bool IsInPage(int P)//判断是否在内存

{

int i=0;

int flag=0;

for (i = 0; i <= 5; i++)

{

if (Page[i].PNumber == P && Page[i].State == true)

{

printf("\n页在主存,打印页表:");

printf("\n页号:%d 物理块号:%d 状态:%d(true)",Page[i].PNumber,Page[i].BNumber,Page[i].State);

flag=1;

}

}

if(flag==1)

return true;

else return false;

}

void FIFO(int P)//FIFO页面置换算法

{

int i, j, k;

int BNumber;//暂存物理块号

for(i = 0; i <= 5; i++)

{

if (Page[i].PNumber == P && Page[i].State == false)

{

printf("页号%d在辅存\n",P);

//分配给该进程的物理块均被占

if(Physical[0].State == BUSY && Physical[1].State == BUSY && Physical[2].State == BUSY)

{

MaxCount=0;

for (j = 0; j <= 5; j++)

{

if (Page[j].Count >= MaxCount && Page[j].State == true)

{

MaxCount = Page[j].Count;

k = j;

}

}

BNumber = Page[k].BNumber;

Page[k].Count = 0;

Page[k].State = false;

Page[k].BNumber=-1;

Page[i].BNumber = BNumber;

Page[i].State = true;

for (j = 0; j <= 5; j++)

if (Page[j].State == true)//驻留在内存的页号时间增加

Page[j].Count = Page[j].Count + 1;

printf("\n页在辅存并已调入主存,打印页表:");

printf("\n页号:%d 物理块号:%d 状态:%d(true)",Page[i].PNumber,Page[i].BNumber,Page[i].State);

}

else //分配给该进程的物理块有空闲

{

for (j = 0; j <= 2 ; j++)

{

if (Physical[j].State == NOTBUSY)

{

Page[i].BNumber = Physical[j].BNumber;

Page[i].State = true;

Physical[j].State=BUSY;

for (j = 0; j <= 5; j++)//驻留在内存的页号时间增加

if (Page[j].State == true)

相关文档
最新文档