操作系统请求页式存储管理报告
学院:
班级:
姓名:
学号:
请求页式存储管理
一、问题描述
设计一个请求页式存储管理方案,为简单起见。页面淘汰算法采用 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 #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;i for(i=0;i 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;i 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;i int* listnumber(struct Page *P,struct Phb *R) { int a[N]; printf(\"请输入一个需要访问的指令地址流:\\n\"); for(i=0;i pro[i]=a[i]/Psize; } else printf(\"访问指令不合理!结束访问\"); } printf(\"显示所输入地址流地址对应的页号分别为:\"); for(i=0;i int rsearchphb(struct Page *P,struct Phb *R) { for(j=0; j 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; i 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;t for(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;t if(P[t].Wnum==max) { P[t].Wnum=-1; P[t].P=0; } } for(t=0;t for(j = 0;j < q; j++) { Q[j]++; } max = -1; maxQ = 0; count++; } } else //该页在主存时打印页表情况 { phb[n]=pro[i]; for(j = 0 ;j 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); } 因篇幅问题不能全部显示,请点此查看更多更全内容R[i].Pnum=i; R[i].b=0; } }
printf(\"\\ %d \\ printf(\"\\ %d \\ } printf(\"\\n\"); } }
if(phb[j] == 0) {
printf(\"缺页次数为:%d\\n\}