您的当前位置:首页请求页式管理实验报告

请求页式管理实验报告

2023-08-15 来源:乌哈旅游


操作系统请求页式存储管理报告

学院:

班级:

姓名:

学号:

请求页式存储管理

一、问题描述

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

二、基本要求

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

页 号 物理块号 状态位 0 2 True (在主存) 1 1 2 False (在辅存) 3 0 4 False (在辅存) 5 False (在辅存) 系统为进程分配3 个物理块(页框),块号分别为0、1、2,页框管理表(空闲块表): 物理块号 是否空闲 0 1 2 true true true 任意输入一个需要访问的指令地址流(例如:3635、3642、1140、0087、1700、5200、4355,输入负数结束),打印页表情况。

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

三、主要代码

#include #include

#include

#define N 7

#define q 3 //物理块个数 #define p 6 //页面个数 int JCsize=5300; //进程大小 int Psize=1024; //页面长度

int phb[q]={0}; //物理块标号 int pro[N]={0}; //进程序列号

int m = -1, n = -1; //物理块空闲和进程是否相同判断标志 int i = 0, j = 0,k = 0; //i表示进程序列号,j表示物理块号

int Q[q] = {0}; //进程等待次数(存放最久未被使用的进程标志) int max = -1,maxQ = 0; //标记替换物理块进程下标

int count=0; //统计页面缺页次数 struct Page { int Ynum; //页号 int Wnum; //物理块号 int P; //状态位 int time; //记录调入内存时间 };

struct Phb { int Pnum; //物理块号 int b; //是否空闲 };

void scan(struct Page *P,struct Phb *R) //输入页表和物理块页框初始化信息 {

int i;

for(i=0;ifor(i=0;iR[i].Pnum=i; R[i].b=0; } }

void print_Page(struct Page *P,struct Phb *R) { int n;

printf(\"按1键打印输出物理块页框管理表如下所示:\"); scanf(\"%d\

printf(\"\\n------------------------------------\\n\"); if(n==1) {

printf(\"\物理块号 \是否空闲 \\"); for(i=0;iprintf(\"\\ %d \\ printf(\"\\ %d \\ } printf(\"\\n\"); } }

void print(struct Page *P,struct Phb *R) { int i,j;

printf(\"\\n按0键打印输出页表结构如下所示:\"); scanf(\"%d\ printf(\"\\n---------------------------------------\\n\"); if(j==0) { printf(\"\页号 \物理块号 \状态位 \\"); for(i=0;iint* listnumber(struct Page *P,struct Phb *R) { int a[N]; printf(\"请输入一个需要访问的指令地址流:\\n\"); for(i=0;iscanf(\"%d\ if(a[i]>=0 && a[i]<=JCsize) {

pro[i]=a[i]/Psize; } else printf(\"访问指令不合理!结束访问\"); } printf(\"显示所输入地址流地址对应的页号分别为:\"); for(i=0;i//查找空闲物理块

int rsearchphb(struct Page *P,struct Phb *R) { for(j=0; jif(phb[j] == 0) {

m = j; return m; break; } }

return -1; }

//查找相同进程

int rsearchpage(struct Page *P,struct Phb *R) {

for(j = 0; j < q; j++) //物理块 { if(phb[j]==pro[i]) {

n = j;

return j; //第j块物理块中的进程与此同步 } }

return -1; }

//FIFO算法

void FIFO(struct Page *P,struct Phb *R) { int t;

for(i = 0; im=rsearchphb(P,R);

n=rsearchpage(P,R); for(j = 0; j < q;j++) {

if(Q[j]>maxQ) {

maxQ = Q[j]; //进程等待次数最大值 max = j; //物理块标号 } }

if(n == -1) //该页不在主存中即:不存在相同进程 {

if(m != -1) //该页不在主存中且页框未满时 {

phb[m] = pro[i]; //进程号填入该空闲物理块 count++; //页面缺页次数+1 Q[m] = 0; //等待次数置为0 for(t=0;tfor(j = 0;j <= m; j++) {

Q[j]++; } //等待次数分别+1 m = -1; print(P,R); //打印页表结构 }

//该页不在主存且页框已满,执行FIFO淘汰算法 else {

phb[max] =pro[i]; Q[max] = 0; for(t=0;tif(P[t].Wnum==max) { P[t].Wnum=-1; P[t].P=0; }

}

for(t=0;tfor(j = 0;j < q; j++) { Q[j]++; } max = -1; maxQ = 0;

count++; } } else //该页在主存时打印页表情况

{

phb[n]=pro[i]; for(j = 0 ;j printf(\"缺页次数为:%d\\n\}

void main() { struct Page P[p]; struct Phb R[q]; printf(\"*****************************************\\n\"); printf(\" \\n\"); printf(\" |内存页面调度算法| \\n\"); printf(\" \\n\"); printf(\"*****************************************\\n\"); scan(P,R); print(P,R); print_Page(P,R); listnumber(P,R); FIFO(P,R); }

因篇幅问题不能全部显示,请点此查看更多更全内容