一实验内容:
模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺 页中断。
二.实验题目:
模拟分页式存储管理中硬件的地址转换和产生缺页中断。
用先进先出(FIFO)页面调度算法处理缺页中断。
由于是模拟调度算法,所以,不实际启动输出一页和装入一页的程序,而用输出调 出的页号和装入的页号来代替一次调出和装入的过程。
三.代码实现:
指令集包括pageNumber(页号) ,offset(单元号), operation(操作)三个成员组成,本次程序初始化指令集如下图所示:(该表已在“void Order_init() ”函数中预写入)

注:初始化(initial)时默认上表的0-3号页面已装入主存,且使用了内存块的第1,5,8,9块(Memory_used[Mnum])。
#include<stdio.h>
#include<stdlib.h>
#define Pnum 7 //页表长度
#define Mnum 10 //主存块数
#define Onum 12 //指令集总数
struct Page_table
{
int pageNumber; //页号
int memoryBlock; //主存块号
int flag; //标志位 0表示页不在主存 1表示页在主存
int diskLocation; //磁盘位置
}page_table[Pnum];
struct Order_table
{
int pageNumber;//页号
int offset; //单元号
char operation; //操作
}Order_table[Onum];
int before_page = -1;//保存被FIFO算法置换出的页号
int Memory_uesd[Mnum] = {1,0,1,1,1,0,1,1,0,0}; //数组下标表示块号,对应值为0表示未使用,
//1模拟被非页占用 2模拟内存分配给模拟作业的块数,本次模拟分配4块,块号依次为1,5,8,9
int Memory_list[4] = { 0,1,2,3 }; //表示已被装入内存的页号,共四个位置,初始默认0,1,2,3页已装入 若未装入,则用-1占位
void show_page_table() //打印当前页表
{
printf("【页表】:\n");
int i = 0;
for (i; i < Pnum; i++)
{
printf("页号:%d", page_table[i].pageNumber);
printf(" 块号:%2d", page_table[i].memoryBlock);
printf(" 标志位:%d", page_table[i].flag);
printf(" 磁盘位置:%.3d\n", page_table[i].diskLocation);
}
printf("\n");
}
void show_Memory_list() //打印已装入内存的页及其对应在内存中的块号
{
int i = 0;
for (i; i < 4; i++)
{
if (Memory_list[i] != -1)
{
printf("【%d】:第%d

本文通过详细介绍如何在模拟环境中实现分页式虚拟存储管理的地址转换、触发缺页中断,并利用先进先出(FIFO)页面调度算法处理中断,展示了内存管理和中断处理的基本原理。代码示例和运行结果展示了整个过程的操作和处理机制。
最低0.47元/天 解锁文章
1039

被折叠的 条评论
为什么被折叠?



