页式虚拟存储管理中地址转换和缺页中断实验报告

合集下载

操作系统实验报告-页式虚拟存储管理中地址转换和缺页中断

操作系统实验报告-页式虚拟存储管理中地址转换和缺页中断

操作系统实验报告-页式虚拟存储管理中地址转换和缺页中断实验四页式虚拟存储管理中地址转换和缺页中断一.实验目的(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.深入了解页式存储管理如何实现地址转换;2.进一步认识页式虚拟存储管理中如何处理缺页中断。

二.实验仪器PC、windows操作系统、Visual C++6.0三.实验原理编写程序完成页式存储管理中地址转换过程和模拟缺页中断的处理。

实验具体包括:首先对给定的地址进行地址转换工作,若发生缺页则先进行缺页中断处理,然后再进行地址转换;最后编写主函数对所做工作进行测试。

四.实验步骤代码一#include <stdio.h>#include <string.h>#define n 64 //模拟实验中假定的页表长度#define length 10struct{int lnumber;//页号int flag;//表示页是否在主存,"1"表示在,"0"表示不在int pnumber;//该页所在主存块的块号int write; //该页是否被修改过,"1"表示修改过,"0"表示没有被修改过int dnumber;//该页存放在磁盘上的位置,即磁盘块号}page[n];//页表定义int m; //作业在主存中的主存块块数int page_length;//页表实际长度int p[length];//存放在主存中页的页号int head;//主存中页号队列头指针page_interrupt(lnumber) //缺页中断int lnumber;{int j;printf("发生缺页中断* %d\n",lnumber);j=p[head];//淘汰页的页号p[head]=lnumber; //新装入的页号head=(head+1) %m;if (page[j].write==1) //如果该页被修改过printf("将页%d写回磁盘第%d块\n",j,page[j].dnumber);//输出页号page[j].flag=0; //该页不在主存,执行缺页中断,将标志改为不在主存page[lnumber].pnumber=page[j].pnumber; //使j转去执行缺页中断page[lnumber].flag=1;//将所需页重新调入内存page[lnumber].write=0;//将标志改为未被修改过printf("淘汰主存%2d 中的页数%2d,从磁盘第%d 块中调入页%2d\n",page[j].pnumber,j,page[lnumber].dnumber,lnumber);}command(laddress,write)unsigned laddress;int write;{unsigned paddress,ad,pnumber,lnumber;kk:lnumber=laddress >> 10;ad=laddress &0x3ff;if(lnumber >= page_length)//如果页号大于页表长度,则该页不存在{printf("不存在该页\n");return;}if(page[lnumber].flag==1)//如果页表在主存内{pnumber=page[lnumber].pnumber;//从页表中取得块号paddress=pnumber<<10|ad;//合并块号和块内地址形成物理地址paddress;printf("逻辑地址是: %x 对应物理地址是:%x\n",laddress,paddress);if(write==1)//如果需要写,修改页的修改标志位page[lnumber].write=1;}else{page_interrupt(lnumber);//执行缺页中断goto kk;}}//命令处理函数结束void main(){int lnumber,flag,pnumber,write,dnumber;unsigned laddress;int i;printf("输入页表的信息,创建页表(若页号为-1,则结束输入)\n");printf("输入页号和辅存地址:");scanf("%d %d",&lnumber,&dnumber);//读入页号和辅存地址i=0;while(lnumber!=-1)//当页号不存在时,修改页表的信息,将各种标志位置0 {page[i].lnumber=lnumber;page[i].flag=0;page[i].write=0;page[i].dnumber=dnumber;i++;printf("输入页号和辅存地址:");scanf("%d%d",&lnumber,&dnumber);//重新读入新的页号和辅存地址}page_length=i;//页表的长度为页面的数量printf("输入主存块号,主存块数要小于%d,(以-1结束):",i);scanf("%d",&pnumber);m=0;//作业在主存中的主存块块数head=0;//主存中页号队列头指针while(pnumber!=-1){if(m<=i)//块号小于页号{page[m].pnumber=pnumber;//将块号写入页表,并装入内存page[m].flag=1;p[m]=m;m++;}scanf("%d",&pnumber);}printf("输入指令性质(1-修改,0-不需要,其他一结束程序运行)和逻辑地址:");scanf("%d%x",&write,&laddress);while(write==0||write==1){command(laddress,write);//执行相应的指令printf("输入指令性质(1-修改,0-不需要,其他一结束程序运行)和逻辑地址:");scanf("%d%x",&write,&laddress);}}//main()结束代码二#include<iostream>#include<iomanip>#include<list>using namespace std;char useSign[12][5]={{'+'},{'-'},{'*'},{"存"},{"取"},{'-'},{"移位"},{'+'},{"存"},{"取"},{'+'},{"存"}}; int PageAddress[12]={70,50,15,21,56,40,53,23,37,78,01,84};int PageNum[12]={0,1,2,3,0,6,4,5,1,2,4,6};int S_Station;int pPageNum[7];//页号pPageint pSign[7];int pStool[7];//页架号int pModify[7];//修改标志int pStation[7];//磁盘位置static int z=0;void Store(){for(int i=0;i<7;i++){if(i<4){pSign[i]=1;}elsepSign[i]=0;pPageNum[i]=i;pModify[i]=0;}int p1=1,p2=2,p3=3;for(i=0;i<7;i++){if(i<3){pStation[i]=p1;p1++;}elseif(i<6){pStation[i]=p2;p2++;}elsepStation[i]=p3;}pStool[0]=5;pStool[1]=8;pStool[2]=9;pStool[3]=1;}void CShow(){cout<<"操作";cout<<"页号";cout<<"页内地址";cout<<"标志";cout<<"绝对地址";cout<<"修改页号";cout<<"页架号";cout<<endl;}void Find(){int m_Pagenum;int m_Station;int Y_Station;//绝对地址int m_Stool;cout<<"输入页号及页内地址查询操作:";cin>>m_Pagenum>>m_Station;CShow();int i,j=0;//string m_Modify;for(i=0;i<12;i++){if(PageAddress[i]==m_Station){break;}}Y_Station=pStool[m_Pagenum]*1024+m_Station; if(pSign[m_Pagenum]==1) {if(strcpy(useSign[i],"存")!=0){pModify[m_Pagenum]=1;}}cout<<useSign[i]<<"\t";cout<<m_Pagenum<<"\t";cout<<m_Station<<"\t ";cout<<pSign[m_Pagenum]<<"\t";if(Y_Station!=m_Station){cout<<Y_Station<<"\t";cout<<pStool[m_Pagenum]<<"\t";cout<<Y_Station<<endl;}else{cout<<"*"<<m_Pagenum<<" "; for(j=z;j<7;j++){if(pSign[j]==1){z++;break;}}cout<<m_Pagenum<<"->"<<j<<"\t";pStool[m_Pagenum]=pStool[j];pSign[j]=0;pStool[j]=0;cout<<pStool[m_Pagenum]<<"\t";cout<<pStool[m_Pagenum]*1024+m_Station<<endl; }}int main(void){Store();char judge='Y';while(judge=='Y'){Find();cout<<"是否继续输入(请输入大写字母)?Y = 是N=否"<<endl;judge='N';cin>>judge;}return 0;}五.实验现象、结果记录及整理代码一代码二。

页式虚拟存储器管理中地址转换和缺页中断心得体会

页式虚拟存储器管理中地址转换和缺页中断心得体会

页式虚拟存储器管理中地址转换和缺页中断心得体会
在页式虚拟存储器管理中,地址转换和缺页中断是非常重要的概念和机制。

地址转换是指将逻辑地址(在进程中使用的地址)转换为物理地址(实际存在于主存储器中的地址)的过程。

它实现了虚拟内存的核心功能,使得每个进程可以感觉到它有独立的连续内存空间,而不受实际的物理内存大小限制。

地址转换通过页表来实现,页表中记录了虚拟页面与物理页面的对应关系。

当进程引用一个虚拟页面时,地址转换会根据页表将其映射到相应的物理地址上。

地址转换过程中还需要使用页表维护一些权限位来控制对页面的读写权限,保障内存的安全性。

缺页中断是在地址转换过程中发现虚拟页面不存在于主存中时触发的事件。

当进程引用一个未加载到内存的页面时,操作系统会产生一个缺页中断。

处理缺页中断的过程一般包括以下几个步骤:首先,操作系统会将控制权转移到中断处理程序,保存当前执行进程的上下文。

然后,操作系统会查找该虚拟页面是否在辅存(如硬盘)上,并将其加载到空闲的物理页面中。

最后,更新页表,将虚拟页面的记录指向新加载的物理页面。

完成这些步骤后,操作系统可以重新执行原进程,并使其继续访问该页面。

通过地址转换和缺页中断机制,页式虚拟存储器管理可以实现更高效的内存管理。

它允许系统在有限的物理内存的情况下运行多个进程,减少了进程间的内存冲突。

同时,通过将未使用的页面交换到辅存中,它也能够提供更大的可用内存空间,提高系统的整体性能。

以上是我对地址转换和缺页中断的心得体会,希望对您有所帮助。

实验四页式虚拟存储管理中地址转换和页式中断FIFOLRUOPTC++版本

实验四页式虚拟存储管理中地址转换和页式中断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)页面调度算法处理缺页中断的程序。

四、示例程序源代码#include "stdio.h"#define blockLength 128typedef enum {NO=0,YES}FLAG;typedef struct pagetable {int pageNumber;FLAG flag;int memoryBlock;int place;}PAGETAB;typedef struct job{int pageNumber;int unitNumber;}JOB;PAGETAB pageTAB[7]={0,YES,5,11,1,YES,8,12,2,YES,9,13,3,YES,1,21,4,NO,-1,22,5,NO,-1,23,6,NO,-1,121};JOB work[12] = {0,70,1,50,2,15,3,21,0,56,6,40,4,53,5,23,1,37,2,78,4,1,6,84};int main(int argc, char* argv[]){//first init page table// and work list// look for the work list and pick one to fix the page tablefor(int i=0; i<12;i++){printf("Instruction sequence :%d\n",i+1);int j = work[i].pageNumber;printf("The page %d is in the memory? %s!\n",j,(pageTAB[j].flag == YES)?"YES":"NO");if(pageTAB[j].flag == YES){int absoluteAddress = pageTAB[j].memoryBlock*blockLength+work[i].unitNumber; printf("Instruction absolute address:%d\n",absoluteAddress);}else{printf("missing page interrupt, page fault interrupt!\n");}}return 0;}存储器管理(二)一、实验目的:掌握分页式存储管理的基本概念和实现方法。

存储管理调度_实验报告

存储管理调度_实验报告

一、实验目的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算法可以较好地适应页面访问模式,提高页面命中率。

缺页中断算法实验报告

缺页中断算法实验报告

一、实验目的1. 理解缺页中断的概念及其在操作系统中的作用。

2. 掌握常见的页面置换算法,如先进先出(FIFO)、最近最少使用(LRU)等。

3. 通过模拟实验,验证不同页面置换算法对缺页中断次数的影响。

4. 深入了解页式虚拟存储管理中地址转换的过程。

二、实验环境1. 操作系统:Windows 102. 编程语言:C/C++3. 实验工具:Visual Studio三、实验内容1. 模拟缺页中断的产生2. 实现不同的页面置换算法3. 分析页面置换算法对缺页中断次数的影响4. 模拟地址转换过程四、实验步骤1. 模拟缺页中断的产生(1)定义一个模拟指令序列,包含多个页面号。

(2)创建一个模拟的页表,用于记录每个页面是否在内存中。

(3)根据指令序列,遍历页表,判断访问的页面是否在内存中。

(4)如果页面不在内存中,则产生缺页中断。

2. 实现不同的页面置换算法(1)先进先出(FIFO)算法:- 定义一个队列,用于存储内存中的页面号。

- 当发生缺页中断时,将新页面号入队,同时判断队列长度是否超过内存块数。

- 如果队列长度超过内存块数,则将队首元素出队,模拟页面置换过程。

(2)最近最少使用(LRU)算法:- 定义一个链表,用于存储内存中的页面号。

- 当发生缺页中断时,将新页面号插入链表尾部。

- 如果链表长度超过内存块数,则从链表头部删除元素,模拟页面置换过程。

3. 分析页面置换算法对缺页中断次数的影响(1)定义一个变量,用于记录缺页中断次数。

(2)遍历模拟指令序列,根据不同的页面置换算法处理缺页中断。

(3)统计不同算法下的缺页中断次数,并进行比较。

4. 模拟地址转换过程(1)根据指令中的逻辑地址,计算页号和偏移量。

(2)根据页号,查找页表,判断页面是否在内存中。

(3)如果页面在内存中,则根据偏移量计算物理地址。

(4)如果页面不在内存中,则产生缺页中断。

五、实验结果与分析1. 模拟缺页中断的产生通过模拟指令序列,成功产生了缺页中断。

虚拟页面管理实验报告(3篇)

虚拟页面管理实验报告(3篇)

第1篇一、实验目的1. 理解虚拟存储器的概念和作用。

2. 掌握分页式存储管理的基本原理和地址转换过程。

3. 熟悉几种常见的页面置换算法,并比较其优缺点。

4. 通过实验,加深对虚拟存储器管理机制的理解。

二、实验内容1. 模拟分页式存储管理中的地址转换过程。

2. 比较几种常见的页面置换算法:FIFO、LRU、LFU和OPT。

三、实验原理虚拟存储器是一种将内存和磁盘结合使用的存储管理技术,它允许程序使用比实际物理内存更大的地址空间。

虚拟存储器通过将内存划分为固定大小的页(Page)和相应的页表(Page Table)来实现。

1. 分页式存储管理分页式存储管理将内存划分为固定大小的页,每个页的大小相同。

程序在运行时,按照页为单位进行内存访问。

分页式存储管理的主要优点是内存碎片化程度低,便于实现虚拟存储器。

2. 页面置换算法当内存中没有足够的空间来存放新请求的页面时,需要将某个页面从内存中移除,这个过程称为页面置换。

以下介绍几种常见的页面置换算法:(1)FIFO(先进先出):优先淘汰最早进入内存的页面。

(2)LRU(最近最少使用):优先淘汰最近最少被访问的页面。

(3)LFU(最不频繁使用):优先淘汰最不频繁被访问的页面。

(4)OPT(最佳置换):优先淘汰未来最长时间内不再被访问的页面。

四、实验步骤1. 模拟分页式存储管理中的地址转换过程(1)创建一个模拟内存的数组,表示物理内存。

(2)创建一个模拟页表的数组,用于存放虚拟页号和物理页号之间的映射关系。

(3)模拟进程对内存的访问,将访问的虚拟页号转换为物理页号。

2. 比较几种常见的页面置换算法(1)创建一个模拟进程的数组,包含访问的虚拟页号序列。

(2)对每个页面置换算法,模拟进程的运行过程,记录缺页中断次数。

(3)计算不同页面置换算法的缺页率,并比较其性能。

五、实验结果与分析1. 分页式存储管理中的地址转换过程实验结果表明,分页式存储管理能够有效地将虚拟地址转换为物理地址,实现虚拟存储器。

在四页虚拟存储管理中使用先进先出版本的地址转换和页面中断进行实验.doc

在四页虚拟存储管理中使用先进先出版本的地址转换和页面中断进行实验.doc

在四页虚拟存储管理中使用先进先出版本的地址转换和页面中断进行实验四页虚拟存储管理中的地址转换和页中断先进先出实验首先,实验的目的是深入理解基于页面的存储管理如何实现地址转换。

进一步了解在页面虚拟存储管理中如何处理分页和页面替换算法。

其次,实验的主要内容是编写一个程序来完成地址转换过程,并模拟基于页面的虚拟存储管理中缺页中断的处理。

实验的具体内容包括:首先,给定的地址被转换。

如果发现缺页,首先中断该页,然后转换地址。

最后,编写主要函数来测试所做的工作。

假设主内存为64KB,每个主内存块为1024字节,支持的最大作业数为64KB,系统中的每个作业分为4个主内存块。

3.实验原则1)地址翻译过程:首先,从逻辑地址中的高位获得页号,然后根据页号搜索页表以获得块号。

然后,从逻辑地址的低位获得页内地址,并且通过组合块号和页内地址获得物理地址。

2)缺页中断处理根据页码查找页表,以确定该页是否在主存储器中。

如果页面标志位为“0”,则形成缺页中断。

操作系统让调用中断处理程序处理中断。

四、实现地址翻译和分页处理的实验方法和步骤,主要考虑三个问题:首先,设计了页面虚拟存储管理模式下页面表的数据结构。

二是地址转换算法的实现;第三,缺页中断处理算法的实现。

1)设计页表的数据结构。

在页型虚拟存储管理模式中,除了对应于该页的页号和主存储器块号之外,页表还应至少包括存在标志(该页是否在主存储器中)、磁盘位置(该页在磁盘上的副本的位置)和修改标志(该页是否已被修改)。

在实验中,页表由数组模拟,其数据结构定义如下:结构{ int lnumber//页码int标志;//表示页面是否在主存中,“1”表示“0”表示不在整数中;//页面所在的主内存块的块号为int write//页面是否已被修改,“1”表示已被修改,“0”表示未被修改为数字;//页面在磁盘上存储的位置,即磁盘块号}页面[n];//页表定义2)地址转换算法由硬件实现。

在实验中,使用软件程序来模拟地址转换过程。

模拟分页式虚拟存储管理中硬件的地址转换和缺页中断--选择页面调度算法处理缺页中断

模拟分页式虚拟存储管理中硬件的地址转换和缺页中断--选择页面调度算法处理缺页中断

操作系统实验二〔第一题〕一.实验内容模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断。

二.实验目的在电脑系统总,为了提高主存利用率,往往把辅助存储器作为主存储器的扩充,使多道运行的作业的全部逻辑地址空间综合可以超出主存的绝对地址空间。

用这种方法扩充的主存储区成为虚拟存储器。

三.实验题目模拟分页式存储管理中硬件的地址转换和产生缺页中断。

四.程序清单//// 操作实验二.cpp : 定义控制台应用程序的入口点。

//#include "stdafx.h"#include<iostream>#include<string>#include<fstream>using namespace std;class ins{private:string ope;long int page;long int unit;public:ins(){ }ins(string o,long int p,long int u):ope(o),page(p),unit(u){}void setope(string o){ ope=o;}void setpage(long int p){ page=p;}void setunit(long int u){ unit=u;}string getope(){return ope;}long int getpage(){return page;}long int getunit(){return unit;}};class work{private:long int Page;int sym;long int inum;long int onum;public:work(){}work(long int P, int s,long int i,long int o):Page(P),sym(s),inum(i),onum(o){} void setPage(long int P){ Page=P;}void setsym( int s){ sym=s;}void setinum(long int i){ inum=i;}void setonum(long int o){ onum=o;}long int getPage(){return Page;}int getsym(){return sym;}long int getinum(){return inum;}long int getonum(){return onum;}};void diaodu(work *w,ins * i,int numofins){ for(int j=0;j<numofins;j++){long int tempofk;long int a =i[j].getpage();for(int k=0;k<7;k++) //7是页表的页数if(w[k].getPage()!=a)continue;else{tempofk=k;break;}if(w[tempofk].getsym()==1)cout<<"绝对地址:"<<w[tempofk].getinum()*128+i[j].getunit()<<" "<<"磁盘地址为:"<<w[tempofk].getonum()<<" "<<"操作为:"<<i[j].getope()<<endl;else cout<<"*"<<"发生缺页中断"<<endl;}}int main(){ins*INS=new ins[12];INS[0].setope ("+");INS[0].setpage(0);INS[0].setunit(70);INS[1].setope ("+");INS[1].setpage(1);INS[1].setunit(50);INS[2].setope ("×");INS[2].setpage(2);INS[2].setunit(15);INS[3].setope ("存"); INS[3].setpage(3);INS[3].setunit(21);INS[4].setope ("取"); INS[4].setpage(0);INS[4].setunit(56);INS[5].setope ("-");INS[5].setpage(6);INS[5].setunit(40);INS[6].setope ("移位"); INS[6].setpage(4);INS[6].setunit(53);INS[7].setope ("+");INS[7].setpage(5);INS[7].setunit(23);INS[8].setope ("存"); INS[8].setpage(1);INS[8].setunit(37);INS[9].setope ("取"); INS[9].setpage(2);INS[9].setunit(78);INS[10].setope ("+"); INS[10].setpage(4);INS[10].setunit(1);INS[11].setope ("存"); INS[11].setpage(6);INS[11].setunit(84);work*W =new work[7]; ifstream in("g://operate1.txt");long int p;int s;long int i;long int o;for(int jj=0;jj<7 ;jj++){in>>p;in>>s;in>>i;in>>o ;W[jj].setPage(p);W[jj].setsym(s);W[jj].setinum(i);W[jj].setonum(o);}diaodu(W,INS,12);}五.结果显示操作系统实验二〔第二题〕一.用先进先出〔FIFO〕九.程序清单/ 操作系统实验二.cpp : 定义控制台应用程序的入口点。

虚拟存储器管理实验报告

虚拟存储器管理实验报告

虚拟存储器管理实验报告防灾科技学院实验报告系别灾害信息工程系专业班级0950412 学号095041219学生姓名郑平贞实验日期2011-12-8 成绩课程名称计算机操作系统实验题目虚拟存储器管理实验记录实验目的:1 理解虚拟存储器的概念2 掌握分页式存储管理地址转换和缺页中断实验环境:Windows XP VC++6.0实验内容:1 模拟分页式存储管理中硬件的地址转换和产生缺页中断2 用先进先出页面调度算法处理缺页中断实验过程:1.实验设计(1)模拟分页式存储管理中硬件的地址转换和产生缺页中断。

分页式虚拟存储系统是把作业信息的副本存放在磁盘上,当作业被选中时,可把作业的开始几页先装入主存且启动执行。

为此,在为作业建立页表时,应说明哪些页已在主存,哪些页尚未装入主存。

作业执行时,指令中的逻辑地址指出了参加运算的操作存放的页号和单元号,硬件的地址转换机构按页号查页表,若该页对应标志为“1”,则表示该页已在主存,这时根据关系式“绝对地址=块号×块长+单元号”计算出欲访问的主存单元地址。

如果块长为2 的幂次,则可把块号作为高地址部分,把单元号作为低地址部分,两者拼接而成绝对地址。

若访问的页对应标志为“0”,则表示该页不在主存,这时硬件发“缺页中断”信号,有操作系统按该页在磁盘上的位置,把该页信息从磁盘读出装入主存后再重新执行这条指令。

设计一个“地址转换”程序来模拟硬件的地址转换工作。

当访问的页在主存时,则形成绝对地址,但不去模拟指令的执行,而用输出转换后的地址来代替一条指令的执行。

当访问的页不在主存时,则输出“* 该页页号”,表示产生了一次缺页中断。

(2)用先进先出(FIFO)页面调度算法处理缺页中断。

FIFO 页面调度算法总是淘汰该作业中最先进入主存的那一页,因此可以用一个数组来表示该作业已在主存的页面。

假定作业被选中时,把开始的m 个页面装入主存,则数组的元素可定为m 个。

2.程序代码:(1)模拟分页式存储管理中硬件的地址转换和产生缺页中断。

虚拟储存管理实验报告

虚拟储存管理实验报告

一、实验目的1. 理解虚拟存储管理的基本概念和原理。

2. 掌握分页式虚拟存储管理的地址转换和缺页中断处理过程。

3. 学习并分析几种常见的页面置换算法,如FIFO、LRU、OPT等。

4. 比较不同页面置换算法的性能,提高对虚拟存储管理的认识。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3. 虚拟存储器模拟工具:虚拟机(VirtualBox)三、实验内容1. 模拟分页式虚拟存储器(1)定义分页式虚拟存储器的参数,如页大小、内存大小、虚拟地址空间大小等。

(2)创建页表,记录每个页在内存中的位置和是否已加载。

(3)模拟进程的指令序列,生成虚拟地址。

(4)根据虚拟地址进行地址转换,得到物理地址。

(5)处理缺页中断,选择合适的页面置换算法。

2. 页面置换算法模拟(1)实现FIFO(先进先出)页面置换算法。

(2)实现LRU(最近最少使用)页面置换算法。

(3)实现OPT(最优页面置换)算法。

3. 比较不同页面置换算法的性能(1)设置不同的页面置换算法,模拟进程运行。

(2)记录每次缺页中断时的页面命中率。

(3)比较不同页面置换算法的页面命中率,分析其性能。

四、实验结果与分析1. 分页式虚拟存储器模拟(1)通过模拟,成功实现了分页式虚拟存储器的地址转换和缺页中断处理过程。

(2)实验结果表明,分页式虚拟存储器能够有效地提高内存利用率,减少内存碎片。

2. 页面置换算法模拟(1)实现了FIFO、LRU和OPT三种页面置换算法。

(2)通过模拟,比较了三种算法在不同进程下的页面命中率。

3. 页面置换算法性能比较(1)FIFO算法的页面命中率较低,适用于进程较稳定的情况。

(2)LRU算法的页面命中率较高,适用于进程频繁访问同一页面的情况。

(3)OPT算法的页面命中率最高,但实现复杂度较高,适用于进程访问序列可预测的情况。

五、实验结论1. 通过本次实验,加深了对虚拟存储管理的基本概念和原理的理解。

基本分页实验报告

基本分页实验报告

基本分页实验报告一、实验目的在计算机系统中,为了提高主存利用率,往往把辅助存储器(如磁盘)作为主存储器的扩充,使多道运行的作业的全部逻辑地址空间总和可以超出主存的绝对地址空间。

用这种办法扩充的主存储器称为虚拟存储器。

通过本实验帮助同学理解在分页式存储管理中怎样实现虚拟存储器。

二、实验要求1.模拟分页式存储管理中硬件的地址转换和产生缺页中断。

分页式虚拟存储系统是把作业信息的副本存放在磁盘上,当作业被选中时,可把作业的开始几页先装入主存且启动执行。

为此,在为作业建立页表时,应说明哪些页已在主存,哪些页尚未装入主存。

2.用先进先出(FIFO)页面调度算法处理缺页中断。

在分页式虚拟存储系统中,当硬件发出“缺页中断”后,引出操作系统来处理这个中断事件。

如果主存中已经没有空闲块,则可用FIFO 页面调度算法把该作业中最先进入主存的一页调出,存放到磁盘上,然后再把当前要访问的页装入该块。

调出和装入后都要修改页表页表中对应页的标志。

三、实验内容使用线性表保存页表。

每个节点信息包括调入主存的标志,主存块号,在磁盘上的位置,修改标志等。

使用线性表保存FIFO 算法使用的对应关系数组P,用数组模拟实现调度的队列。

该队列需支持查找,插入和删除操作(即替换操作)。

四、实验结果五、实验小结在这几个实验中,对于我来说,基本分页是最难的,主要是自己对代码的不理解,最初弄不懂这个实验是做什么的,是用哪一个算法,只知道基本分页存储管理的理论知识,于是就去网上搜索别人做好的实验报告,仔细的看别人的实验目的,实验要求,实验内容,所以,耗费的时间也最长。

当然出现的问题也最多。

在系统设计时能够想到应该用怎样的类和方法来模拟每个进程的页面映像表以及相关函数所用的算法思想,但在实际编写代码的时候却遇到不少困难,不能把自己的设计通过代码实现出来,费了很多周折。

一些常用的操作,比如类的定义和使用都出现了不该有的错误。

暴漏了自己在学习中眼高手低的缺点。

模拟分页式存储管理中硬件的地址转换和缺页中断2

模拟分页式存储管理中硬件的地址转换和缺页中断2

模拟分页式存储管理中硬件的地址转换和产生缺页中断分页式虚拟存储系统是把作业信息的副本存放在磁盘上,当作业被选中时,可把作业的开始几页先装入主存且启动执行。

为此,在为作业建立页表时,应说明哪些页已在主存,哪些页尚未装入主存。

作业执行时,指令中的逻辑地址指出了参加运算的操作存放的页号和单元号,硬件的地址转换机构按页号查页表,若该页对应标志为“1”,则表示该页已在主存,这时根据关系式“绝对地址=块号×块长+单元号”计算出欲访问的主存单元地址。

如果块长为2 的幂次,则可把块号作为高地址部分,把单元号作为低地址部分,两者拼接而成绝对地址。

若访问的页对应标志为“0”,则表示该页不在主存,这时硬件发“缺页中断”信号,有操作系统按该页在磁盘上的位置,把该页信息从磁盘读出装入主存后再重新执行这条指令。

设计一个“地址转换”程序来模拟硬件的地址转换工作。

当访问的页在主存时,则形成绝对地址,但不去模拟指令的执行,而用输出转换后的地址来代替一条指令的执行。

当访问的页不在主存时,则输出“* 该页页号”,表示产生了一次缺页中断。

①定义相关数据结构如下typedef struct{int address; //进程的逻辑地址int meaddress; //进程的物理地址int page; //进程所在页号int add; //进程的位移量}arccell,AdjMatrix[MAX];typedef struct{char vex[MAX]; //进程名AdjMatrix arcs; //指向进程地址的数组int vexnum; //进程总数}Pro;typedef struct{int page; //页号int block; //块号int status; //该页是否在内存的状态位}pa_cell,pa_matrix[MAX];typedef struct{pa_matrix ptab; //指向页表相关信息的数组}pa_tab;②定义必要函数:void create_ptable(pa_tab & pa) //创建页表void exchange(Pro & P,pa_tab & pa) //地址转换函数③具体实验代码:#include<iostream.h>#define MAX 64#define eachpage 1024 // eachpage为每页(每块大小)int m; //m为简化后的页表行数typedef struct{int address; //进程的逻辑地址int meaddress; //进程的物理地址int page; //进程所在页号int add; //进程的位移量}arccell,AdjMatrix[MAX];typedef struct{char vex[MAX]; //进程名AdjMatrix arcs; //指向进程地址的数组int vexnum; //进程总数}Pro;void Create_pro(Pro & P)//创建进程{int i;cout<<"请输入进程总数:";cin>>P.vexnum;cout<<"请输入各进程名:";for(i=0;i<P.vexnum;i++)cin>>P.vex[i];cout<<"请输入各进程地址: ";for(i=0;i<P.vexnum;i++)cin>>P.arcs[i].address;for(i=0;i<P.vexnum;i++){P.arcs[i].page=P.arcs[i].address/eachpage;P.arcs[i].add=P.arcs[i].address%eachpage; // 逻辑地址=页号*页大小+位移量}}void print(Pro & P) //输出进程的相关信息{cout<<"各进程的页号页内地址为:"<<endl;for(int i=0;i<P.vexnum;i++)cout<<"进程名"<<P.vex[i]<<" 页号"<<P.arcs[i].page<<" 页内地址"<<P.arcs[i].add<<endl;cout<<endl;}//-------------页表的结构体-----------------typedef struct{int page; //页号int block; //块号int status; //该页是否在内存的状态位(为1表示在内存,为0表示不在内存)}pa_cell,pa_matrix[MAX];typedef struct{pa_matrix ptab; //指向页表相关信息的数组}pa_tab;void create_ptable(pa_tab & pa) //创建页表{int a,b,c;cin>>m; //输入页表行数cout<<"请输入页表相关信息:"<<endl;for(int i=0;i<m;i++){cin>>a>>b>>c;pa.ptab[i].page=a;pa.ptab[i].block=b;pa.ptab[i].status=c; //依次输入每行的页表信息}}//--------------地址转换函数-----------------void exchange(Pro & P,pa_tab & pa){for(int i=0;i<P.vexnum;i++)for(int j=0;j<m;j++)if(pa.ptab[j].page==P.arcs[i].page) //查询到页表里相对应的页号{if(pa.ptab[j].status==1) //若进程访问的页状态位为1,输出该进程物理地址{P.arcs[i].meaddress=pa.ptab[j].block*eachpage+P.arcs[i].address;//物理地址=块号*块大小+位移量cout<<"第"<<i+1<<"个进程物理地址为: "<<P.arcs[i].meaddress<<endl;}else //若访问的页状态位为0,表示该页不在主存,发生“缺页中断”信号cout<<"第"<<i+1<<"个进程地址转换发生缺页中断!"<<endl;}}void main(){Pro P;Create_pro(P); //创建进程cout<<endl;print(P);pa_tab pa;cout<<"由于页表信息太大,为了简化运算,请输入想输入的页表行数: ";create_ptable(pa); //创建页表exchange(P,pa); //调度地址转换函数}。

黄天实验五虚拟存储器管理实验报告

黄天实验五虚拟存储器管理实验报告

实验五虚拟存储器管理学号 1415251011 姓名黄天班级 14集成1班华侨大学电子工程系设计目的1、理解虚拟存储器概念。

2、掌握分页式存储管理地址转换和缺页中断。

设计内容与基本要求1、模拟分页式存储管理中硬件的地址转换和产生缺页中断。

2、用先进先出页面调度算法处理缺页中断。

设计报告内容1、分页式存储管理和先进先出页面调度算法原理。

1).分页式存储管理原理在存储器管理中,连续分配方式会形成许多“碎片”,虽然可通过“紧凑”方法将许多碎片拼接成可用的大块空间,但须为之付出很大开销。

如果允许将一个进程直接分散地装入到许多不相邻的分区中,则无须再进行“紧凑”。

基于这一思想而产生了离散分配方式。

如果离散分配的基本单位是页,则称为分页存储管理方式。

在分页存储管理方式中,如果不具备页面对换功能,则称为基本分页存储管理方式,或称为纯分页存储管理方式,它不具有支持实现虚拟存储器的功能,它要求把每个作业全部装入内存后方能运行。

请求式分页系统是建立在基本分页基础上的,为了能支持虚拟存储器功能,而增加了请求调页功能和页面置换功能。

2).先进先出页面调度算法原理优先淘汰最早进入内存的页面,亦即在内存中驻留时间最久的页面。

该算法实现简单,只需把调入内存的页面根据先后次序链接成队列,设置一个指针总指向最早的页面。

但该算法与进程实际运行时的规律不适应,因为在进程中,有的页面经常被访问。

2、程序流程图LAB5_HT_14152510113、程序及注释。

#include<cstdio>#include<cstring>#define SizeOfPage 100 //定义页面#define SizeOfBlock 128#define M 4struct info//页表信息结构体{bool flag; //页标志,1表示该页已在主存,0表示该页不在主存long block;//块号4、运行结果以及结论。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

页式虚拟存储管理中地址转换和缺页中断实验报告一.实验目的1.深入了解页式存储管理如实现地址转换;2.进一步认识页式虚拟存储管理中如处理缺页中断。

二.实验仪器PC、windows操作系统、Visual C++6.0三.实验原理编写程序完成页式存储管理中地址转换过程和模拟缺页中断的处理。

实验具体包括:首先对给定的地址进行地址转换工作,若发生缺页则先进行缺页中断处理,然后再进行地址转换;最后编写主函数对所做工作进行测试。

四.实验步骤代码一#include <stdio.h>#include <string.h>#define n 64 //模拟实验中假定的页表长度#define length 10struct{int lnumber;//页号int flag;//表示页是否在主存,"1"表示在,"0"表示不在int pnumber;//该页所在主存块的块号int write; //该页是否被修改过,"1"表示修改过,"0"表示没有被修改过int dnumber;//该页存放在磁盘上的位置,即磁盘块号}page[n];//页表定义int m; //作业在主存中的主存块块数int page_length;//页表实际长度int p[length];//存放在主存中页的页号int head;//主存中页号队列头指针page_interrupt(lnumber) //缺页中断int lnumber;{int j;printf("发生缺页中断* %d\n",lnumber);j=p[head];//淘汰页的页号p[head]=lnumber; //新装入的页号head=(head+1) %m;if (page[j].write==1) //如果该页被修改过printf("将页%d写回磁盘第%d块\n",j,page[j].dnumber);//输出页号page[j].flag=0; //该页不在主存,执行缺页中断,将标志改为不在主存page[lnumber].pnumber=page[j].pnumber; //使j转去执行缺页中断page[lnumber].flag=1;//将所需页重新调入存page[lnumber].write=0;//将标志改为未被修改过printf("淘汰主存%2d 中的页数%2d,从磁盘第%d 块中调入页%2d\n",page[j].pnumber,j,page[lnumber].dnumber,lnumber);}command(laddress,write)unsigned laddress;int write;{unsigned paddress,ad,pnumber,lnumber;kk:lnumber=laddress >> 10;ad=laddress &0x3ff;if(lnumber >= page_length)//如果页号大于页表长度,则该页不存在{printf("不存在该页\n");return;}if(page[lnumber].flag==1)//如果页表在主存{pnumber=page[lnumber].pnumber;//从页表中取得块号paddress=pnumber<<10|ad;//合并块号和块地址形成物理地址paddress;printf("逻辑地址是: %x 对应物理地址是:%x\n",laddress,paddress);if(write==1)//如果需要写,修改页的修改标志位}else{page_interrupt(lnumber);//执行缺页中断goto kk;}}//命令处理函数结束void main(){int lnumber,flag,pnumber,write,dnumber;unsigned laddress;int i;printf("输入页表的信息,创建页表(若页号为-1,则结束输入)\n");printf("输入页号和辅存地址:");scanf("%d %d",&lnumber,&dnumber);//读入页号和辅存地址i=0;while(lnumber!=-1)//当页号不存在时,修改页表的信息,将各种标志位置0 {page[i].lnumber=lnumber;page[i].flag=0;page[i].write=0;i++;printf("输入页号和辅存地址:");scanf("%d%d",&lnumber,&dnumber);//重新读入新的页号和辅存地址}page_length=i;//页表的长度为页面的数量printf("输入主存块号,主存块数要小于%d,(以-1结束):",i);scanf("%d",&pnumber);m=0;//作业在主存中的主存块块数head=0;//主存中页号队列头指针while(pnumber!=-1){if(m<=i)//块号小于页号{page[m].pnumber=pnumber;//将块号写入页表,并装入存page[m].flag=1;p[m]=m;m++;}scanf("%d",&pnumber);}printf("输入指令性质(1-修改,0-不需要,其他一结束程序运行)和逻辑地址:");scanf("%d%x",&write,&laddress);while(write==0||write==1){command(laddress,write);//执行相应的指令printf("输入指令性质(1-修改,0-不需要,其他一结束程序运行)和逻辑地址:");scanf("%d%x",&write,&laddress);}}//main()结束代码二#include<iostream>#include<iomanip>#include<list>using namespace std;char useSign[12][5]={{'+'},{'-'},{'*'},{"存"},{"取"},{'-'},{"移位"},{'+'},{"存"},{"取"},{'+'},{"存"}};int PageAddress[12]={70,50,15,21,56,40,53,23,37,78,01,84};int PageNum[12]={0,1,2,3,0,6,4,5,1,2,4,6};int S_Station;int pPageNum[7];//页号pPageint pSign[7];int pStool[7];//页架号int pModify[7];//修改标志int pStation[7];//磁盘位置static int z=0;void Store(){for(int i=0;i<7;i++){if(i<4){pSign[i]=1;}elsepSign[i]=0;pPageNum[i]=i;pModify[i]=0;}int p1=1,p2=2,p3=3;for(i=0;i<7;i++){if(i<3){pStation[i]=p1;p1++;}elseif(i<6){pStation[i]=p2;p2++;}elsepStation[i]=p3;}pStool[0]=5;pStool[1]=8;pStool[2]=9;pStool[3]=1;}void CShow(){cout<<"操作";cout<<"页号";cout<<"页地址";cout<<"标志";cout<<"绝对地址";cout<<"修改页号";cout<<"页架号";cout<<endl;}void Find(){int m_Pagenum;int m_Station;int Y_Station;//绝对地址int m_Stool;cout<<"输入页号及页地址查询操作:";cin>>m_Pagenum>>m_Station;CShow();int i,j=0;//string m_Modify;for(i=0;i<12;i++){if(PageAddress[i]==m_Station){break;}}Y_Station=pStool[m_Pagenum]*1024+m_Station; if(pSign[m_Pagenum]==1) {if(strcpy(useSign[i],"存")!=0){pModify[m_Pagenum]=1;}}cout<<useSign[i]<<"\t";cout<<m_Pagenum<<"\t";cout<<m_Station<<"\t ";cout<<pSign[m_Pagenum]<<"\t";if(Y_Station!=m_Station){cout<<Y_Station<<"\t";cout<<pStool[m_Pagenum]<<"\t";cout<<Y_Station<<endl;}else{cout<<"*"<<m_Pagenum<<" "; for(j=z;j<7;j++){if(pSign[j]==1){z++;break;}}cout<<m_Pagenum<<"->"<<j<<"\t";pStool[m_Pagenum]=pStool[j];pSign[j]=0;pStool[j]=0;cout<<pStool[m_Pagenum]<<"\t";cout<<pStool[m_Pagenum]*1024+m_Station<<endl; }}int main(void){Store();char judge='Y';while(judge=='Y'){Find();cout<<"是否继续输入(请输入大写字母)?Y = 是N=否"<<endl;judge='N';cin>>judge;}return 0;}五.实验现象、结果记录及整理代码一代码二。

相关文档
最新文档