0 🍂实验目的
了解内存请求分页管理中地址转换过程与先进先出置换算法和缺页中断处理过程。
1 🍂实验内容
在页式管理中,地址转换是由硬件完成的,实验中设计程序模拟地址转换过程。
设计页表格式为:
页号 | 存在标志 | 主存块号 | 修改标志 | 在磁盘上块号 |
设内存 1 块=1024B,现有一个共 8 页的作业,其副本已存在磁盘上,设第 0 页至第 2 页已装入主存,其余 5 页都不在内存。将页表进行初始化处理。
假设每个作业只分配 3 块内存,按先进先出置换算法淘汰。用“页面队列”表示淘汰的顺序。
设计缺页中断处理程序。当对读入的逻辑地址,划分为页号、页内地址后,通过页表发现访问的页不在内存,转入“缺页中断处理”程序去处理。
2 🍂实验要求
采用“先进先出”页面置换算法进行缺页中断处理。
3 🍂实验代码
#include <bits/stdc++.h>
using namespace std;
#define PAGESIZE 1024
#define PN 7
typedef struct PAGETAB
{
int Pageno;
int status;
int Phyno;
} PAGETAB;
void show(PAGETAB s[]);
void change(PAGETAB s[]);
queue<int> que;
int main()
{
PAGETAB s[PN];
int sel, i, flag;
for (i = 0; i < PN; i++)
{
s[i].Pageno = i;
s[i].status = 0;
s[i].Phyno = 0;
}
s[0].status = s[1].status = s[2].status = 1;
s[0].Phyno = 9;
que.push(0);
s[1].Phyno = 5;
que.push(1);
s[2].Phyno = 4;
que.push(2);
printf("\n");
while (flag == 1)
{
printf("\n\n\n\n");
printf("\t\t|-------------------System Menu------------------|\n");
printf("\t\t|\t\t\t\t\t |\n");
printf("\t\t|\t\t 1----Change(地址转换)\t |\n");
printf("\t\t|\t\t 2----Show(显示页表)\t |\n");
printf("\t\t|\t\t 0----Exit(退出)\t |\n");
printf("\t\t|\t\t\t\t\t |\n");
printf("\t\t|-------------------------------------------------|\n\n");
printf("\t\t请输入你的选择(0-2):");
scanf("%d", &sel);
switch (sel)
{
case 1:
change(s);
break;
case 2:
show(s);
break;
case 0:
flag = 0;
break;
}
}
}
void change(PAGETAB s[])
{
int flag = 1,temp=0;
char st = 'N';
int del;
while (flag == 1)
{
int A;
int place;
printf("逻辑地址:");
scanf("%d", &A);
int p = A / PAGESIZE;
int inplace = A % PAGESIZE;
if (p >= PN)
printf("ERROR:非法逻辑地址!\n");
else
{
printf("页号:%d\n", p);
printf("页内位移:%d\n", inplace);
if (s[p].status == 0)
{
temp=que.front();
que.push(p);
que.pop();
s[temp].status = 0;
s[p].Phyno = s[temp].Phyno;
s[temp].Phyno=0;
s[p].status = 1;
st = 'Y';
printf("是否缺页:%c\n", st);
printf("淘汰的页面:%d\n", temp);
}
else
{
printf("是否缺页:%c\n", st);
printf("淘汰的页面:无\n");
}
place = s[p].Phyno * PAGESIZE + inplace;
printf("该逻辑地址存储的物理块:%d\n", s[p].Phyno);
printf("物理地址:%d\n", place);
}
printf("Do you want to continue ? (1 yes 0 no) : ");
scanf("%d", &flag);
}
}
void show(PAGETAB s[])
{
printf("页号\t状态\t物理块号\n");
for (int i = 0; i < PN; i++)
printf("%d\t%d\t%d\n", s[i].Pageno, s[i].status, s[i].Phyno);
}
4 🍂实验结果
5 🍂实验总结
调试程序时出现了以下的诸多问题:
忘记对队列进行初始化,导致程序运行结果错误;
解决办法:在主函数中进行队列的入列操作,进而对队列进行初始化。
进行对页面的淘汰时,忘记对队列进行相应的操作,导致页面无法正确淘汰;
解决办法:在新的页面入队列时,不要忘记接着弹出最先进来的。
写change函数时,从上次替换的页面处,开始找下次应替换的页面,会导致忽略了向后查找不到而从头查找的情况。
解决办法:正确对队列进行操作,不忘记任何操作。
条件语句和循环语句太多,容易导致嵌套太乱的问题
解决办法:直接在通过循环找到需要的元素之后退出循环,将所需要的元素直接保存在变量中。
6 🍂实验程序以及实验报告下载链接
操作系统原理实验:内含实验报告和实验视频希望能够给正在写实验报告的同学提供一定程度上的帮助如果需要讨论可以与我私信,相帮助-OS文档类资源-CSDN文库