实验四 页式虚拟存储管理中地址转换和页式中断 FIFO LRU OPT C 版本
操作系统实验报告-页式虚拟存储管理中地址转换和缺页中断

操作系统实验报告-页式虚拟存储管理中地址转换和缺页中断实验四页式虚拟存储管理中地址转换和缺页中断一.实验目的(1)深入了解存储管理如何实现地址转换。
(2)进一步认识页式虚拟存储管理中如何处理缺页中断。
二.实验内容编写程序完成页式虚拟存储管理中地址转换过程和模拟缺页中断的处理。
三.实验原理页式存储管理把内存分割成大小相等位置固定的若干区域,叫内存页面,内存的分配以“页”为单位,一个程序可以占用不连续的页面,逻辑页面的大小和内存页面的大小相同,内外存的交换也以页为单位进行,页面交换时,先查询快表,若快表中找不到所需页面再去查询页表,若页表中仍未找到说明发生了缺页中断,需先将所需页面调入内存再进行存取。
四.实验部分源程序#define size 1024//定义块的大小,本次模拟设为1024个字节。
#include "stdio.h"#include "string.h"#includestruct plist{int number; //页号int flag; //标志,如为1表示该页已调入主存,如为0则还没调入。
int block; //主存块号,表示该页在主存中的位置。
int modify; //修改标志,如在主存中修改过该页的内容则设为1,反之设为0int location; //在磁盘上的位置};//模拟之前初始化一个页表。
struct plist p1[7]={{0,1,5,0,010},{1,1,8,0,012},{2,1,9,0,013},{3,1,1,0,021},{4,0,-1,0,022},{5,0,-1,0,023},{6, 0,-1,0,125}};//命令结构,包括操作符,页号,页内偏移地址。
struct ilist{char operation[10];int pagenumber;int address;};//在模拟之前初始化一个命令表,通过程序可以让其顺序执行。
模拟请求页式存储管理中硬件的地址转换和缺页中断处理

一.实验内容模拟请求页式存储管理中硬件的地址转换和缺页中断处理 二.实验原理装入新页置换旧页时,若旧页在执行中没有被修改过,则不必将该页重写磁盘。
因此,页表中增加是否修改过的标志,执行“存”指令和“写”指令时将对应的修改标志置成“1”三.要求及方法:① 设计一个地址转换程序来模拟硬件的地址转换和缺页中断。
当访问的页在主存时则形成绝对地址,但不去模拟指令的执行,可以输出转换后的绝对地址来表示一条指令已执行完成。
当访问的页不在主存中时,则输出“*页号”来表示硬件产生了一次缺页中断。
模拟地址转换流程见图1。
② 编制一个FIFO 页面调度程序;FIFO 页面调度算法总是先调出作业中最先进入主存中的哪一页。
因此可以用一个数组来表示(或构成)页号队列。
数组中每个元素是该作业已在主存中的页面号,假定分配给作业的页架数为m ,且该作业开始的m 页已装入主存,则数组可由m 个元素构成。
P[0],P[1],P[2],…,P[m-1]它们的初值为P[0]:=0,P[1]:=1,P[2]:=2,…,P[m-1]:=m-1用一指针K 指示当要调入新页时应调出的页在数组中的位置,K 的初值为“0”,当产生缺页中断后,操作系统总是选择P[K]所指出的页面调出,然后执行:P[K]:=要装入的新页页号 K :=(k+1)mod m在实验中不必实际地启动磁盘执行调出一页和装入一页的工作,而用输出“OUT 调出的页号”和“IN 要装入的新页页号”来模拟一次调出和装入过程,模拟程序的流程图见附图1。
按流程控制过程如下:提示:输入指令的页号和页内偏移和是否存指令⎩⎨⎧ 0 1非存指令存指令,若d 为-1则结束,否则进入流程控制过程,得P1和d,查表在主存时,绝对地址=P1×1024+d③假定主存中页架大小为1024个字节,现有一个共7页的作业,其副本已在磁盘上。
系统为该作业分配了4个页架,且该作业的第0页至第3页已装入内存,其余3页未装入主四.主要代码及其说明#include <stdio.h>#include <string.h>#include <stdlib.h>#define M 1024#define R 4typedef struct _PTable{int Number; //页号int Flag; //标志int Fnum; //页架号int Mflag; //修改标志int Position; //该页存放在磁盘上的位置}PTable;//初始化PTable ptable[]={{0, 1, 5, 0, 11},{1, 1, 8, 0, 12},{2, 1, 9, 0, 13},{3, 1, 1, 0, 21},{4, 0, -1, 0, 22},{5, 0, -1, 0, 23},{6, 0, -1, 0, 121},};void menu();int change(char op,int number,int add);void display();int p[]={0,1,2,3},k=0;void main(void){int number,add,n;char op;while(n){display();fflush( stdin );printf("输入:操作页号页内地址(存指令用\"c\"代表)\n");scanf("%c %d %d",&op,&number,&add);change(op,number,add);printf("\"是否继续! (按1 继续按任意键结束)\"\n");scanf("%d",&n);system( "cls ");if(n==1)continue;elsebreak;}}void menu(){printf("操作码\t页号\t页内地址页架标志修改标志出入状态绝对地址(L)\n");}int change(char op,int number,int add){bool flag1=false;bool flag2=false;int i,address,cout,temp;;for(i=0;i<7;i++){if(op=='c'){ptable[number].Mflag=1;}if(ptable[i].Number==number && ptable[i].Flag==1){address=ptable[i].Fnum*M+add;flag1=true;}if(ptable[i].Number==number && ptable[i].Flag==0){cout=i;temp = p[k]; //将要出的页if(ptable[temp].Mflag==1){flag2=true;}//修改页表ptable[number].Flag=1; //修改新页标志ptable[number].Fnum=ptable[temp].Fnum; //修改新页页架address=ptable[number].Fnum*M+add;ptable[temp].Flag=0; //修改旧页ptable[temp].Fnum=-1; //修改页架ptable[temp].Mflag=0; //修改修改标志p[k]=number; //新页k=(k+1)%R;}}menu();if(flag1)printf("%c\t %d\t %d\t %d\t %d\t %d\t 无出入\t%d\n",op,number,add,ptable[number].Fnum,ptable[number].Flag,ptable[number].Mflag,address);else if(flag2)printf("%c\t *%d\t %d\t %d\t %d\t%d OUT:%d,IN:%d %d\n",op,number,add,number,ptable[number].Fnum,ptable[number].Flag,ptable[number].Mflag,temp,number,address);elseprintf("%c\t *%d\t %d\t %d\t %d\t %d\t IN%d\t %d\n",op,number,add,ptable[number].Fnum,ptable[number].Flag,ptable[number].Mflag,number,address);return 0;}void display(){int i;printf("********当前页表中的状态*********\n");printf("页号标志页架修标志\n");for(i=0;i<7;i++){printf("%d\t%d\t%d\t%d\n",ptable[i].Number,ptable[i].Flag,ptable[i].Fnum,ptable[i]. Mflag);}printf("当前主存中的页号为: ");for(i=0;i<4;i++){printf("%d ",p[i]);}printf("\n*********************************\n");}五,实验截图。
实验四页式虚拟存储管理中地址转换和页式中断FIFOLRUOPTC++版本

实验四页式虚拟存储管理中地址转换和页式中断FIFO一、实验目的深入了解页式存储管理如何实现地址转换;进一步认识页式虚拟存储管理中如何处理缺页中断以及页面置换算法。
二、实验主要内容编写程序完成页式虚拟存储管理中地址转换过程和模拟缺页中断的处理。
实验具体内容包括:首先对给定的地址进行转换工作,若发现缺页则先进行缺页中断处理,然后再进行地址转换;最后编写主函数对所做工作进行测试。
假定主存64KB,每个主存块1024字节,作业最大支持到64KB,系统中每个作业分得主存块4块。
三、实验原理1)地址转换过程:首先从逻辑地址中的高位取得页号,然后根据页号查页表,得到块号;然后从逻辑地址中的低位取得页内地址,将块号和页内地址合并即得到物理地址。
2)缺页中断处理根据页号查找页表,判断该页是否在主存储器中,若该页标志位“0”,形成缺页中断。
操作系统让调出中断处理程序处理中断。
四、实验方法与步骤实现地址转换与缺页中断处理,主要考虑三个问题:第一,设计页式虚拟存储管理方式中页表的数据结构;第二,地址转换算法的实现;第三,缺页中断处理算法的实现。
1)设计页表的数据结构页式虚拟存储管理方式中页表除了页号和该页对应的主存块号外,至少还要包括存在标志(该页是否在主存),磁盘位置(该页的副本在磁盘上的位置)和修改标志(该页是否修改过)。
在实验中页表用数组模拟,其数据结构定义如下:struct{int lnumber; //页号int flag; //表示页是否在主存中,“1”表示在,“0”表示不在int pnumber; // 该页所在主存块的块号int write; //该页是否被修改过,“1”表示修改过,“0“表示没有修改过int dnumber; //该页存放在磁盘上的位置,即磁盘块号}page[n]; //页表定义2)地址转换算法的实现地址转换是由硬件完成的,实验中使用软件程序模拟地址转换过程。
在实验中,每个主存块1024字节,则块内地址占10位;主存64KB,则主存共64块,即块号占6位;物理地址共占16位;作业最大64KB,则作业最大占64块,即页号占6位,逻辑地址共占16位。
页式虚拟存储管理FIFO、LRU和OPT页面置换算法

目录1 需求分析 (2)1.1 目的和要求 (2)1.2 研究内容 (2)2 概要设计 (2)2.1 FIFO算法 (3)2.2 LRU算法 (3)2.3 OPT算法 (3)2.4 输入新的页面引用串 (3)3 详细设计 (4)3.1 FIFO(先进先出)页面置换算法: (4)3.2 LRU(最近最久未使用)置换算法: (4)3.3 OPT(最优页)置换算法 (4)4 测试 (5)5 运行结果 (5)6 课程设计总结 (9)7 参考文献 (10)8 附录:源程序清单 (10)1 需求分析1.1 目的和要求在熟练掌握计算机虚拟存储技术的原理的基础上,利用一种程序设计语言模拟实现几种置换算法,一方面加深对原理的理解,另一方面提高学生通过编程根据已有原理解决实际问题的能力,为学生将来进行系统软件开发和针对实际问题提出高效的软件解决方案打下基础。
1.2 研究内容模拟实现页式虚拟存储管理的三种页面置换算法(FIFO(先进先出)、LRU (最近最久未使用)和OPT(最长时间不使用)),并通过比较性能得出结论。
前提:(1)页面分配采用固定分配局部置换。
(2)作业的页面走向和分得的物理块数预先指定。
可以从键盘输入也可以从文件读入。
(3)置换算法的置换过程输出可以在显示器上也可以存放在文件中,但必须清晰可读,便于检验。
2 概要设计本程序主要划分为4个功能模块,分别是应用FIFO算法、应用LRU算法、应用OPT算法和页面引用串的插入。
1.1各模块之间的结构图2.1 FIFO 算法该模块的主要功能是对相应页面引用串进行处理,输出经过FIFO 算法处理之后的结果。
2.2 LRU 算法该模块的主要功功能是对相应的页面引用串进行处理,输出经过LRU 算法处理之后的结果。
2.3 OPT 算法该模块的主要功功能是对相应的页面引用串进行处理,输出经过OPT 算法处理之后的结果。
2.4 输入新的页面引用串该模块的主要功能是用户自己输入新的页面引用串,系统默认的字符串是0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,用户可以自定义全新的20个数字页面引用串。
存储管理调度_实验报告

一、实验目的1. 理解操作系统存储管理的基本概念和原理。
2. 掌握分页式存储管理中地址转换和缺页中断的产生。
3. 学习并分析常见的页面调度算法,如先进先出(FIFO)算法、最近最少使用(LRU)算法等。
4. 比较不同页面调度算法的性能,提高对虚拟存储技术特点的理解。
二、实验环境1. 操作系统:Linux2. 编程语言:C语言3. 实验工具:gdb、gcc三、实验内容1. 模拟分页式存储管理中硬件的地址转换和产生缺页中断。
2. 使用先进先出(FIFO)页面调度算法处理缺页中断。
3. 使用最近最少使用(LRU)页面调度算法处理缺页中断。
4. 比较FIFO和LRU算法的性能。
四、实验步骤1. 定义虚拟页和实页的结构体,包括页号、物理页号、时间戳等。
2. 模拟地址转换过程,当访问的虚拟页不在内存时,产生缺页中断。
3. 使用FIFO算法处理缺页中断,将最早的页面替换出内存。
4. 使用LRU算法处理缺页中断,将最近最少使用的页面替换出内存。
5. 比较FIFO和LRU算法的性能,包括页面命中率、页面置换次数等。
五、实验结果与分析1. 实验结果(1)地址转换过程在模拟实验中,我们使用了一个简单的地址转换过程。
当访问一个虚拟页时,系统会检查该页是否在内存中。
如果在内存中,则直接返回对应的物理地址;如果不在内存中,则产生缺页中断。
(2)FIFO算法在FIFO算法中,当产生缺页中断时,系统会将最早进入内存的页面替换出内存。
实验结果显示,FIFO算法在页面访问序列较长时,页面命中率较低。
(3)LRU算法在LRU算法中,当产生缺页中断时,系统会将最近最少使用的页面替换出内存。
实验结果显示,LRU算法在页面访问序列较长时,页面命中率较高。
2. 实验分析(1)FIFO算法的缺点FIFO算法简单,但性能较差。
当页面访问序列较长时,FIFO算法可能会频繁地发生页面置换,导致页面命中率较低。
(2)LRU算法的优点LRU算法可以较好地适应页面访问模式,提高页面命中率。
在四页虚拟存储管理中使用先进先出版本的地址转换和页面中断进行实验.doc

在四页虚拟存储管理中使用先进先出版本的地址转换和页面中断进行实验四页虚拟存储管理中的地址转换和页中断先进先出实验首先,实验的目的是深入理解基于页面的存储管理如何实现地址转换。
进一步了解在页面虚拟存储管理中如何处理分页和页面替换算法。
其次,实验的主要内容是编写一个程序来完成地址转换过程,并模拟基于页面的虚拟存储管理中缺页中断的处理。
实验的具体内容包括:首先,给定的地址被转换。
如果发现缺页,首先中断该页,然后转换地址。
最后,编写主要函数来测试所做的工作。
假设主内存为64KB,每个主内存块为1024字节,支持的最大作业数为64KB,系统中的每个作业分为4个主内存块。
3.实验原则1)地址翻译过程:首先,从逻辑地址中的高位获得页号,然后根据页号搜索页表以获得块号。
然后,从逻辑地址的低位获得页内地址,并且通过组合块号和页内地址获得物理地址。
2)缺页中断处理根据页码查找页表,以确定该页是否在主存储器中。
如果页面标志位为“0”,则形成缺页中断。
操作系统让调用中断处理程序处理中断。
四、实现地址翻译和分页处理的实验方法和步骤,主要考虑三个问题:首先,设计了页面虚拟存储管理模式下页面表的数据结构。
二是地址转换算法的实现;第三,缺页中断处理算法的实现。
1)设计页表的数据结构。
在页型虚拟存储管理模式中,除了对应于该页的页号和主存储器块号之外,页表还应至少包括存在标志(该页是否在主存储器中)、磁盘位置(该页在磁盘上的副本的位置)和修改标志(该页是否已被修改)。
在实验中,页表由数组模拟,其数据结构定义如下:结构{ int lnumber//页码int标志;//表示页面是否在主存中,“1”表示“0”表示不在整数中;//页面所在的主内存块的块号为int write//页面是否已被修改,“1”表示已被修改,“0”表示未被修改为数字;//页面在磁盘上存储的位置,即磁盘块号}页面[n];//页表定义2)地址转换算法由硬件实现。
在实验中,使用软件程序来模拟地址转换过程。
模拟分页式存储管理中硬件的地址转换和产生缺页中断

实验三
课程名称:操作系统
课程类型:必修
实验项目名称:存储器管理
实验题目:模拟分页式存储管理中硬件的地址转换和产生缺页中断。
一、实验目的
在计算机系统中,为了提高主存利用率,往往把辅助存储器(如磁盘)作为主存储器的扩充,使多道运行的作业的全部逻辑地址空间总和可以超出主存的绝对地址空间。
用这种办法扩充的主存储器称为虚拟存储器。
通过本实验帮助同学理解在分页式存储管理中怎样实现虚拟存储器。
二、实验要求
模拟分页式存储管理中硬件的地址转换。
需要为作业建立页表,应说明哪些页已在主存,哪些页尚未装入主存。
作业执行时,指令中的逻辑地址指出了参加运算的操作存放的页号和单元号,硬件的地址转换机构按页号查页表,若该页对应标志为“1”,则表示该页已在主存,这时根据关系式“绝对地址=块号×块长+单元号”计算出欲访问的主存单元地址。
若产生缺页中断,引出操作系统来处理这个中断事件。
如果主存中已经没有空闲块,则可用FIFO 页面调度算法把该作业中最先进入主存的一页调出,存放到磁盘上,然后再把当前要访问的页装入该块。
调出和装入后都要修改页表页表中对应页的标志。
三、设计思想
1、物理设计
全局变量定义如下:
struct info//页表
{
int block;//物理页架号
int disk;//在磁盘上的物理块号
int flag; //内外标志
}pagelist[10];
int po;//队列标记
int t[4];
2、程序流程图
(见下图)
图1-1主程序的流程图
图1-2 init( )的流程图。
操作系统实验4(虚拟内存页面置换算法)

操作系统实验报告四【实验题目】虚拟内存页面置换算法【实验目的】通过这次实验,加深对虚拟内存页面置换概念的理解,进一步掌握先进先出FIFO,最佳置换OPI和最近最久未使用LRU页面置换算法的实现方法。
【实验内容】问题描述:设计程序模拟先进先出FIFO,最佳置换OPI和最近最久未使用LRU页面置换算法的工作过程。
假设内存中分配给每个进程的最小物理块数为m,在进程运行过程中要访问的页面个数为n,页面访问序列为P1, …,Pn,分别利用不同的页面置换算法调度进程的页面访问序列,给出页面访问序列的置换过程,计算每种算法缺页次数和缺页率。
程序要求如下:1)利用先进先出FIFO,最佳置换OPI和最近最久未使用LRU三种页面置换算法模拟页面访问过程。
2)模拟三种算法的页面置换过程,给出每个页面访问时的内存分配情况。
3)输入:最小物理块数m,页面个数n,页面访问序列P1, … ,Pn,算法选择1-FIFO,2-OPI,3-LRU。
4)输出:每种算法的缺页次数和缺页率。
【实验要求】1) 上机前认真复习页面置换算法,熟悉FIFO,OPI,LRU三种页面分配和置换算法的过程;2) 上机时独立编程、调试程序;3) 根据具体实验要求,完成好实验报告(包括实验的目的、内容、要求、源程序、实例运行结果截图)。
【源代码】//--------------- YeMianZhiHuan.cpp -----------------#include "iostream.h"const int DataMax=100;const int BlockNum = 10;int DataShow[BlockNum][DataMax]; // 用于存储要显示的数组bool DataShowEnable[BlockNum][DataMax]; // 用于存储数组中的数据是否需要显示//int Data[DataMax]={4,3,2,1,4,3,5,4,3,2,1,5,6,2,3,7,1,2,6,1}; // 测试数据//int N = 20; // 输入页面个数int Data[DataMax]; // 保存数据int Block[BlockNum]; // 物理块int count[BlockNum]; // 计数器int N ; // 页面个数int M;//最小物理块数int ChangeTimes;void DataInput(); // 输入数据的函数void DataOutput();void FIFO(); // FIFO 函数void Optimal(); // Optimal函数void LRU(); // LRU函数///*int main(int argc, char* argv[]){DataInput();// DataInput();// FIFO();// Optimal();// LRU();// return 0;int menu;while(true){cout<<endl;cout<<"* 菜单选择*"<<endl;cout<<"*******************************************************"<<endl;cout<<"* 1-FIFO *"<<endl;cout<<"* 2-Optimal *"<<endl;cout<<"* 3-LRU *"<<endl;cout<<"* 0-EXIT *"<<endl;cout<<"*******************************************************"<<endl;cin>>menu;switch(menu){case 1: FIFO();break;case 2: Optimal();break;case 3: LRU();break;default: break;}if(menu!=1&&menu!=2&&menu!=3) break;}}//*/void DataInput(){cout<<"请输入最小物理块数:";cin>>M;while(M > BlockNum) // 大于数据个数{cout<<"物理块数超过预定值,请重新输入:"; cin>>M;}cout<<"请输入页面的个数:";cin>>N;while(N > DataMax) // 大于数据个数{cout<<"页面个数超过预定值,请重新输入:"; cin>>N;}cout<<"请输入页面访问序列:"<<endl;for(int i=0;i<N;i++)cin>>Data[i];}void DataOutput(){int i,j;for(i=0;i<N;i++) // 对所有数据操作{cout<<Data[i]<<" ";}cout<<endl;for(j=0;j<M;j++){cout<<" ";for(i=0;i<N;i++) // 对所有数据操作{if( DataShowEnable[j][i] )cout<<DataShow[j][i]<<" ";elsecout<<" ";}cout<<endl;}cout<<"缺页次数: "<<ChangeTimes<<endl;cout<<"缺页率: "<<ChangeTimes*100/N<<"%"<<endl; }void FIFO(){int i,j;bool find;int point;int temp; // 临时变量ChangeTimes = 0;for(j=0;j<M;j++)for(i=0;i<N;i++)DataShowEnable[j][i] = false; // 初始化为false,表示没有要显示的数据for(i=0;i<M;i++){count[i] = 0; // 大于等于BlockNum,表示块中没有数据,或需被替换掉// 所以经这样初始化(3 2 1),每次替换>=3的块,替换后计数值置1,// 同时其它的块计数值加1 ,成了(1 3 2 ),见下面先进先出程序段}for(i=0;i<N;i++) // 对有所数据操作{// 增加countfor(j=0;j<M;j++)count[j]++;find = false; // 表示块中有没有该数据for(j=0;j<M;j++){if( Block[j] == Data[i] ){find = true;}}if( find ) continue; // 块中有该数据,判断下一个数据// 块中没有该数据ChangeTimes++; // 缺页次数++if( (i+1) > M ) // 因为i是从0开始记,而M指的是个数,从1开始,所以i+1 {//获得要替换的块指针temp = 0;for(j=0;j<M;j++){if( temp < count[j] ){temp = count[j];point = j; // 获得离的最远的指针}}}else point = i;// 替换Block[point] = Data[i];count[point] = 0; // 更新计数值// 保存要显示的数据for(j=0;j<M;j++){DataShow[j][i] = Block[j];DataShowEnable[i<M?(j<=i?j:i):j][i] = true; // 设置显示数据}}// 输出信息cout<< endl;cout<<"FIFO => "<< endl;DataOutput();}void Optimal(){int i,j,k;bool find;int point;int temp; // 临时变量,比较离的最远的时候用ChangeTimes = 0;for(j=0;j<M;j++)for(i=0;i<N;i++)DataShowEnable[j][i] = false; // 初始化为false,表示没有要显示的数据// for(i=0;i<M;i++)// {// count[i] = 0 ; //// }for(i=0;i<N;i++) // 对有所数据操作{find = false; // 表示块中有没有该数据for(j=0;j<M;j++){if( Block[j] == Data[i] )find = true;}if( find ) continue; // 块中有该数据,判断下一个数据// 块中没有该数据,最优算法ChangeTimes++; // 缺页次数++for(j=0;j<M;j++){// 找到下一个值的位置find = false;for( k =i;k<N;k++){if( Block[j] == Data[k] ){find = true;count[j] = k;break;}}if( !find ) count[j] = N;}if( (i+1) > M ) // 因为i是从0开始记,而BlockNum指的是个数,从1开始,所以i+1 {//获得要替换的块指针temp = 0;for(j=0;j<M;j++){if( temp < count[j] ){temp = count[j];point = j; // 获得离的最远的指针}}}else point = i;// 替换Block[point] = Data[i];// 保存要显示的数据for(j=0;j<M;j++){DataShow[j][i] = Block[j];DataShowEnable[i<M?(j<=i?j:i):j][i] = true; // 设置显示数据}}// 输出信息cout<< endl;cout<<"Optimal => "<< endl;DataOutput();}void LRU(){int i,j;bool find;int point;int temp; // 临时变量ChangeTimes = 0;for(j=0;j<M;j++)for(i=0;i<N;i++)DataShowEnable[j][i] = false; // 初始化为false,表示没有要显示的数据for(i=0;i<M;i++){count[i] = 0 ;}for(i=0;i<N;i++) // 对有所数据操作{// 增加countfor(j=0;j<M;j++)count[j]++;find = false; // 表示块中有没有该数据for(j=0;j<M;j++){if( Block[j] == Data[i] ){count[j] = 0;find = true;}}if( find ) continue; // 块中有该数据,判断下一个数据// 块中没有该数据ChangeTimes++; // 缺页次数++if( (i+1) > M ) // 因为i是从0开始记,而BlockNum指的是个数,从1开始,所以i+1 {//获得要替换的块指针temp = 0;for(j=0;j<M;j++){if( temp < count[j] ){temp = count[j];point = j; // 获得离的最远的指针}}}else point = i;// 替换Block[point] = Data[i];count[point] = 0;// 保存要显示的数据for(j=0;j<M;j++){DataShow[j][i] = Block[j];DataShowEnable[i<M?(j<=i?j:i):j][i] = true; // 设置显示数据}}// 输出信息cout<< endl;cout<<"LRU => "<< endl;DataOutput();}【效果截图】以作业为测试数据:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
行地址转换,若访问的页面不在主存中,则产生一个“缺页中断”,由操作系统 把当前所需要的页面装入主存储器后,再次执行时才可以按上述方法进行地址转 换。
模拟地址转换流程度 3) 缺页中断处理算法的实现 缺页处理过程简单阐述如下: a) 根据当前执行指令中逻辑地址的页号查找页表,判断该页是否在主存储 器中,若该页标志为“0”,形成缺页中断。中断装置通过交换 PSW 让操作系统 的中断处理程序占用处理器。 b) 操作系统处理缺页中断的方法及时查主存分配表,找一个空闲主存块; 若无空闲块,查页表,选择一个已在主存的页面,把它暂时调出主存。若在执行 过程中该页被修改过,则需将该页信息写回磁盘,否则不比写回; c) 找出该页的位置,启动磁盘读出该页的信息,把磁盘上读出的信息装入第 2 不找到的主存块,修改页表中该页的标志为“1”; d) 由于产生缺页中断的那条指令还没有执行完,所以页面装入后应该重新 执行被中断的指令。当重新执行该指令时,由于要访问的页面已在主存中,所以 可以正常执行。 关于第二步的查找装入新页面的主存块处理方式,不同系统采用的策略可能 有所不同,这里采用局部置换算法,就是每个作业分得一定的主存块,只能在分 得的主存块内查找空闲块,若无空闲主存块,则从该作业中选择一个页面淘汰出 主存。实验中采用局部置换算法。 使用局部置换算法时,存在这样一个问题:就是在分配给作业主存空间时, 装入哪些页?有的系统采取不装入任何一页,当执行过程中需要时才将其调入。 有点系统采用页面预置的方法,事先估计可能某些页面会先用到,在分配主存块 后将这些页面装入。在本实验中采用第二种方法,分配主存空间时将前几页调入 主存,假定系统中每个作业分得主存块 m 块,则将第 0~m-1 页装入主存。 因为是模拟硬件工作,所有在实验中如果访问的页不再主存中时,则输入该 页页号,表示硬件产生缺页中断,然后直接转去缺页中断处理;由于采用页面预 置方法,在给定的主存块中一定无空闲块,只能淘汰已在主存的一页;没有启动 磁盘的工作,淘汰的页面需要写回磁盘时,用输入页号表示,调入新的一页时, 将该页在页表中的存在标志置为“1”,输出页号表示将该页调入主存。 当主存中无空闲块时,为装入一个页面,必须按照某种算法从已在主存的页 中选择一页,将它暂时调出主存,让出主存空间,用来存放装入的页面,这个工 作称为“页面调度”。常用的页面调度算法有:先进现出、最近最少用算法、和 最近最不常用算法。在本实验中采用先进现出调度算法。先进现出算法总是选择 驻留在主存时间最长的一页调出。实验中把主存储器的页的页号按照进入主存的 先后次序拍成队列,每次总是调出对首的页,当装入一个新页后,把新页的页号 排入对尾。实验中,用一个数组存放页号的队列。假定分配给作业的主存块数为 m,数组可由 m 个元素组成,p[0],p[1],p[2]……p[m-1];对首指针 head;采用页面预 置的方法,页号队列的长度总是 m,tail 等于(head+1)%m。因此可以使用一个指
cin.ignore (); if(write!=0&&write!=1) break; cout<<"输入逻辑地址:"; cin>>laddress; cin.ignore (); }//while }//main /*中断处理函数,采用先进先出的页面调度算法*/ void page_interrupt(int lnumber) { int j; cout<<"发生缺页中断"<<lnumber<<endl; j=p[head]; p[head]=lnumber; head=(head+1)%m; if(page[j].write==1) cout<<"将页 "<<j<<" 写回磁盘第 "<<page[j].dnumber<<" 块!\n"; page[j].flag=0; page[lnumber].pnumber=page[j].pnumber; page[lnumber].flag=1; page[lnumber].write=0; cout<<"淘汰主存块 "<<page[j].pnumber<<" 中的页 "<<j<<" ,从磁盘第 " <<page[lnumber].dnumber<<" 块中调入页 "<<lnumber<<endl; } /*地址转换函数,将逻辑地址转换成物理地址,如果要查找的页不在主存当中则 产生缺页中断*/ void command(unsigned laddress,int write) { unsigned paddress,ad,pnumber; int lnumber; kk: lnumber=laddress>>10; //取逻辑地址高 6 位,页号 ad=laddress&0x3ff; //页内地址 cout<<"该逻辑地址的页号为:"<<lnumber<<" 页内地址为:"<<ad<<endl; if(lnumber>=page_length) { //页号大于页表的长度,则无效页号 cout<<"该页不存在!\n"; return; } if(page[lnumber].flag==1){ //页号为 lnumber 在内存当中 pnumber=page[lnumber].pnumber; paddress=pnumber<<10|ad; cout<<"逻辑地址是:"<<laddress<<" 对应物理地址是: "<<paddress<<endl;
i++;
cout<<"请输入页号和辅存地址:";
cin>>lnumber>>dnumber;
}
//预先将输入的页调入主存块中
page_length=i;
cout<<"输入主存块号(输入少于或者等于"<<i<<"个数据,若块号数为-1,
则结束输入):";
cin>>pnumber;
cin.ignore ();
cin.ignore ();
cout<<"输入逻辑地址:";
cin>>laddress;
cin.ignore ();
while(write==0||write==1)
{
command(laddress,write); //将输入的逻辑地址转换成物理地址
cout<<"输入指令性质:";
cin>>write;
断处理,然后再进行地址转换;最后编写主函数对所做工作进行测试。
假定主存 64KB,每个主存块 1024 字节,作业最大支持到 64KB,系统中每
个作业分得主存块 4 块。
三、实验原理
1)地址转换过程:
首先从逻辑地址中的高位取得页号,然后根据页号查页表,得到块号;然后
从逻辑地址中的低位取得页内地址,将块号和页内地址合并即得到物理地址。
int pnumber; // 该页所在主存块的块号
int write; //该页是否被修改过,“1”表示修改过,“0“表示没有修改
过
int dnumber; //该页存放在磁盘上的位置,即磁盘块号
}page[n];
//页表定义
2)地址转换算法的实现 地址转换是由硬件完成的,实验中使用软件程序模拟地址转换过程。在实
if(write==1)
//该页被修改过
page[lnumber].write=1;
}
else
{ //页号为 lnumbee<iostream.h>
#define n 64
//页表的最大长度
#define length 4 //系统为每个作业分配的主存块数
struct{
int lnumber; //页号
int flag; //表示页是否在主存中,“1”表示在,“0”表示不在
int pnumber; // 该页所在主存块的块号
输入)\n";
cout<<"请输入页号和辅存地址:";
cin>>lnumber>>dnumber;
cin.ignore ();
i=0;
while(lnumber!=-1)
{
page[i].lnumber=lnumber;
page[i].flag=0;
page[i].write=0;
page[i].dnumber=dnumber;
m=0;
head=0;
while(m<length&&pnumber!=-1)
{
if(m<i)
{
page[m].pnumber=pnumber;
page[m].flag=1;//调入主存后,标志为置 1
p[m]=m;
//记录主存中的页号
m++;
}
cout<<"输入主存块号(输入少于或者等于"<<i<<"个数据,若块号数为-
针,只用 head 即可。在装入一个新的页时,装入页和淘汰页同时执行,当装入
一个新的页时,将其页号存入数组:
淘汰页的页号=p[head];
p[head]=新装入页的页号;