请求调页存储管理方式的模拟

请求调页存储管理方式的模拟
请求调页存储管理方式的模拟

实验3请求调页存储管理方式的模拟

1实验目的

通过对页面、页表、地址转换和页面置换过程的模拟,加深对请求调页系统的原理和实现过程的理解。

2实验内容

(1)假设每个页面中可存放10条指令,分配给一作业的内存块数为4。

(2)模拟一作业的执行过程。该作业共有320条指令,即它的地址空间为32页,目前它的所有页都还未调入内存。在模拟过程中,如果所访问的指令已经在内存中,则显示其物理地址,并转下一条指令。如果所访问的指令还未装入内存,则发生缺页,此时需记录缺页的次数,并将相应页调入内存。如果4个内存块中均已装入该作业,则需进行页面置换。最后显示其物理地址,并转下一条指令。在所有320条指令执行完毕后,请计算并显示作业运行过程中发生的缺页率。

(3)置换算法:请分别考虑OPT、FIFO和LRU算法。

(4)作业中指令的访问次序按下述原则生成:

?50%的指令是顺序执行的。

?25%的指令是均匀分布在前地址部分。

?25%的指令时均匀分布在后地址部分。

代码:

package mainDart;

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

public class FIFO {

private static int times=0; //记录置换内存页面的次数

/**

* 随机产生0~319之间的数

* 产生320条指令

*

* @return 包含320条指令的数组

*/

public static int[] productNumber()

{

int order[] = new int[320]; //数组存储的数字表示指令

Random rand = new Random();

for(int i=0;i<320;i++)

{

if(i%4==0)

{

order[i]=rand.nextInt(319); //0<=order<319

}

else if(i%4==1)

{

order[i]=order[i-1]+1; //1<=order<320

}

else if(i%4==2)

{

order[i]= rand.nextInt(order[i-1]);

}

else if(i%4==3)

{

order[i]=order[i-1]+rand.nextInt(320-order[i-1]);

}

}

return order;

}

/**

* 打印链表

* @param list

*/

public static void printList(List list)

{

for(int temt:list)

{

System.out.print(temt+"\t");

}

System.out.println();

}

/**

* 先进先出算法

* 总是淘汰最先进入内存的页面

* 在实现的时候,记录上一次所替换的页面在内存的下标,则本次要替换的位置就是上次下标+1的位置,并且下标是0~3循环的

* @param memoryNum

* @param page

*/

public static void FIFOChangePage(List memoryNum,int page)

{

int index = FIFOChangePage(memoryNum,page,++times);

memoryNum.remove(index);

memoryNum.add(index, page);

}

/**

* 返回本次替换的页面在内存中的位置

* @param memoryNum

* @param page

* @param times 记录替换页面的次数,第一次替换的是内存第0个单元* @return

*/

public static int FIFOChangePage(List memoryNum,int page,int times) {

if(times==1)

{

return 0;

}

int index = (FIFOChangePage(memoryNum,page,times-1)+1)%4;

return index;

}

public static void main(String[] args) {

int[] order = productNumber();

System.out.println("320条随机指令数:");

for(int i =0;i

{

System.out.print(order[i]+"\t");

if((i+1)%10==0)

{

System.out.println();

}

}

List memoryNum= new ArrayList(4); //内存块存储的页面

int count=0; //记录缺页次数

for(int i=0;i<320;i++)

{

int page = order[i]/10;

if(memoryNum.contains(page)) //若该指令所在页面已经在内存,输出该页面所在内存块的号

{

}

else //没在内存,发生缺页,需要判断内存块是否存满,

{

if(memoryNum.size()<4) //内存没满,直接将所需页面调入内存

{

memoryNum.add(page);

}

else //内存存满,需要调用页面置换算法,进行页面置换

{

FIFOChangePage(memoryNum,page); //先进先出算法

}

count++; //记录缺页次数

}

printList(memoryNum); //打印内存所调入页面的情况

}

System.out.println("缺页率:"+(double)count/320);

}

}

package mainDart;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.Random;

public class LRU {

/**

* 随机产生0~319之间的数

* 产生320条指令

*

* @return 包含320条指令的数组

*/

public static int[] productNumber()

{

int order[] = new int[320]; //数组存储的数字表示指令

Random rand = new Random();

for(int i=0;i<320;i++)

{

if(i%4==0)

{

order[i]=rand.nextInt(319); //0<=order<319

}

else if(i%4==1)

{

order[i]=order[i-1]+1; //1<=order<320

}

else if(i%4==2)

{

order[i]= rand.nextInt(order[i-1]);

}

else if(i%4==3)

{

order[i]=order[i-1]+rand.nextInt(320-order[i-1]);

}

}

return order;

}

/**

* 打印链表

* @param list

*/

public static void printList(List list)

{

for(int temt:list)

{

System.out.print(temt+"\t");

}

System.out.println();

}

/**

* 最近最久未使用算法

* @param order

*/

public static void LRUChangePage(int [] order)

{

List memoryNum = new ArrayList(4); //内存块

int[] timeFlag =new int[]{-1,-1,-1,-1}; //用来记录内存当中各单元未被访问的时间值

int count=0; //记录缺页次数

for(int i=0;i<320;i++)

{

int page = order[i]/10;

if(memoryNum.contains(page)) //若该指令所在页面已经在内存

{

int index = memoryNum.indexOf(page);

timeFlag[index]=0; //将时间变为0 }

else //没在内存,发生缺页,需要判断内存块是否存满,

{

if(memoryNum.size()<4) //内存没满,直接将所需页面调入内存

{

//将没有命中的所有页面的时间加一

for(int in=0;in<4;in++)

{

if(timeFlag[in]!=-1)

{

timeFlag[in]+=1;

}

}

//将page加入内存并将时间置为0

memoryNum.add(page);

timeFlag[memoryNum.indexOf(page)]=0;

}

else //内存存满,需要调用页面置换算法,进行页面置换

{

int maxIn=-1;//记录拥有最大时间值的标记的下标

int maxT=-1;//记录最大的时间值

for(int in=0;in<4;in++)//找出内存中时间值最大的进行替换

{

if(timeFlag[in]>maxT)

{

maxT=timeFlag[in];

maxIn=in;

}

}

memoryNum.remove(maxIn);

memoryNum.add(maxIn,page);

timeFlag[maxIn]=0;

//将没有命中的所有页面的时间加一

for(int in=0;in<4;in++)

{

if(in!=maxIn)

{

timeFlag[in]+=1;

}

}

}

count++; //记录缺页次数

}

printList(memoryNum); //打印内存所调入页面的情况

}

System.out.println("缺页率:"+(double)count/320);

}

public static void main(String[] args) {

int[] order = productNumber();

System.out.println("320条随机指令数:");

for(int i =0;i

{

System.out.print(order[i]+"\t");

if((i+1)%10==0)

{

System.out.println();

}

}

LRUChangePage(order);

}

}

package mainDart;

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

public class Optimal {

/**

* 随机产生0~319之间的数

* 产生320条指令

*

* @return 包含320条指令的数组

*/

public static int[] productNumber()

{

int order[] = new int[320]; //数组存储的数字表示指令

Random rand = new Random();

for(int i=0;i<320;i++)

{

if(i%4==0)

{

order[i]=rand.nextInt(319); //0<=order<319

}

else if(i%4==1)

{

order[i]=order[i-1]+1; //1<=order<320

}

else if(i%4==2)

{

order[i]= rand.nextInt(order[i-1]);

}

else if(i%4==3)

{

order[i]=order[i-1]+rand.nextInt(320-order[i-1]);

}

}

return order;

}

/**

*

* @param order 320条指令数组

* @return 返回一个链表,依次保存着320条指令每条指令所在的页面*/

public static List pageSeq(int[] order)

{

List pageSeq = new ArrayList();

for(int temp:order)

{

pageSeq.add(temp/10);

}

return pageSeq;

}

/**

* 打印链表

* @param list

*/

public static void printList(List list)

{

for(int temt:list)

{

System.out.print(temt+"\t");

}

System.out.println();

}

/**

* 最佳置换算法

* 根据当前已经在内存中的页面在之后被需要的先后进行置换

*

* @param pageSeq 整个320条指令,从头到尾所需要的页面

* @param memoryNum 已满的内存空间

* @param page 等待被调入内存的页面

*/

public static void OptimalChangePage(List pageSeq,int start,List memoryNum,int page)

{

int maxSeq=-1,index=0;

for(int pageNum:memoryNum) //遍历内存

{

for(int i=start;i

{

if(pageNum==pageSeq.get(i))

{

if(i>maxSeq)

{

maxSeq=i;

}

break;

}

}

}

if(maxSeq>-1)//maxSeq==-1说明内存当中的四个页面在将来都不会再被使用,这时默认将内存块中的第一个页面置换出

{

index = memoryNum.indexOf(pageSeq.get(maxSeq)); //记录将要被置换的那个页面所在内存位置

}

memoryNum.remove(index); //将内存中将来最久被使用的页面删除

memoryNum.add(index, page); //将需要调入的页面加入内存}

public static void main(String[] args) {

int[] order = productNumber();

System.out.println("320条随机指令数:");

for(int i =0;i

{

System.out.print(order[i]+"\t");

if((i+1)%10==0)

{

System.out.println();

}

}

List pageSeq = pageSeq(order); //依次存放着指令所在的页面号

List memoryNum= new ArrayList(4); //内存块存储的页面

int count=0; //记录缺页次数

for(int i=0;i<320;i++)

{

int page = order[i]/10;

if(memoryNum.contains(page)) //若该指令所在页面已经在内存,输出该页面所在内存块的号

{

}

else //没在内存,发生缺页,需要判断内存块是否存满,

{

if(memoryNum.size()<4) //内存没满,直接将所需页面调入内存

{

memoryNum.add(page);

}

else //内存存满,需要调用页面置换算法,进行页面置换

{

OptimalChangePage(pageSeq,i+1,memoryNum,page); //最佳置换算法

}

count++; //记录缺页次数

}

printList(memoryNum); //打印内存所调入页面的情况

}

System.out.println("缺页率:"+(double)count/320);

}

}

package mainDart;

import java.util.ArrayList;

import java.util.List;

public class TestAPP {

public static void main(String[] args) {

List list = new ArrayList();

list.add(1);

list.add(3);

list.add(45);

System.out.println(list);

list.remove(1);

list.add(1, -1);

System.out.println(list);

}

}

内存的存储管理段式和页式管理的区别

内存的存储管理段式和页式管理的区别 页和分段系统有许多相似之处,但在概念上两者完全不同,主要表现在: 1、页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率;或者说,分页仅仅是由于系统管理的需要,而不是用户的需要。 段是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好的满足用户的需要。 2、页的大小固定且由系统确定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而一个系统只能有一种大小的页面。 段的长度却不固定,决定于用户所编写的程序,通常由编辑程序在对源程序进行编辑时,根据信息的性质来划分。 3、分页的作业地址空间是维一的,即单一的线性空间,程序员只须利用一个记忆符,即可表示一地址。 分段的作业地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。 参考资料:/ctsn/os/skja4.htm 添加评论 炎炎1981|2009-08-2618:28:33 有0人认为这个回答不错|有0人认为这个回答没有帮助 一页式管理 1页式管理的基本原理将各进程的虚拟空间划分成若干个长度相等的页(page),页式管理把内存空间按页的大小划分成片或者页面(pageframe),然后把页式虚拟地址与内存地址建立一一对应页表,并用相应的硬件地址变换机构,来解决离散地址变换问题。页式管理采用请求调页或预调页技术实现了内外存存储器的统一管理。 它分为 1静态页式管理。静态分页管理的第一步是为要求内存的作业或进程分配足够的页面。系统通过存储页面表、请求表以及页表来完成内存的分配工作。静态页式管理解决了分区管理时的碎片问题。但是,由于静态页式管理要求进程或作业在执行前全部装入内存,如果可用页面数小于用户要求时,该作业或进程只好等待。而且作业和进程的大小仍受内存可用页面数的限制。 2动态页式管理。动态页式管理是在静态页式管理的基础上发展起来的。它分为请求页式管理和预调入页式管理。 优点:没有外碎片,每个内碎片不超过页大小。一个程序不必连续存放。便于改变程序占用空间的大小(主要指随着程序运行而动态生成的数据增多,要求地址空间相应增长,通常由系统调用完成而不是操作系统自动完成)。 缺点:程序全部装入内存。 要求有相应的硬件支持。例如地址变换机构,缺页中断的产生和选择淘汰页面等都要求有相应的硬件支持。这增加了机器成本。增加了系统开销,例如缺页中断处理机,请求调页的算法如选择不当,有可能产生抖动现象。虽然消除了碎片,但每个作业或进程的最后一页内总有一部分空间得不到利用果页面较大,则这一部分的损失仍然较大。 二段式管理的基本思想 把程序按内容或过程(函数)关系分成段,每段有自己的名字。一个用户作

请求页式存储管理中常用页面置换算法模拟

请求页式存储管理中常用页 面置换算法模拟 -标准化文件发布号:(9456-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII

信息工程学院实验报告 课程名称:操作系统Array 实验项目名称:请求页式存储管理中常用页面置换算法模拟实验时间: 班级姓名:学号: 一、实验目的: 1.了解内存分页管理策略 2.掌握调页策略 3.掌握一般常用的调度算法 4.学会各种存储分配算法的实现方法。 5.了解页面大小和内存实际容量对命中率的影响。 二、实验环境: PC机、windows2000 操作系统、VC++6.0 三、实验要求: 本实验要求4学时完成。 1.采用页式分配存储方案,通过分别计算不同算法的命中率来比较算法的优劣,同时 也考虑页面大小及内存实际容量对命中率的影响; 2.实现OPT 算法 (最优置换算法)、LRU 算法 (Least Recently)、 FIFO 算法 (First IN First Out)的模拟; 3.会使用某种编程语言。 实验前应复习实验中所涉及的理论知识和算法,针对实验要求完成基本代码编写、实验中认真调试所编代码并进行必要的测试、记录并分析实验结果。实验后认真书写符合规范格式的实验报告,按时上交。 四、实验内容和步骤: 1.编写程序,实现请求页式存储管理中常用页面置换算法LRU算法的模拟。要求屏幕 显示LRU算法的性能分析表、缺页中断次数以及缺页率。 2.在上机环境中输入程序,调试,编译。 3.设计输入数据,写出程序的执行结果。 4.根据具体实验要求,填写好实验报告。 五、实验结果及分析: 实验结果截图如下:

利用一个特殊的栈来保存当前使用的各个页面的页面号。当进程访问某页面时,便将该页面的页面号从栈中移出,将它压入栈顶。因此,栈顶始终是最新被访问页面的编号,栈底是最 近最久未被使用的页面号。 当访问第5个数据“5”时发生了缺页,此时1是最近最久未被访问的页,应将它置换出去。同理可得,调入队列为:1 2 3 4 5 6 7 1 3 2 0 5,缺页次数为12次,缺页率为80%。 六、实验心得: 本次实验实现了对请求页式存储管理中常用页面置换算法LRU算法的模拟。通过实验,我对内存分页管理策略有了更多的了解。 最近最久未使用(LRU)置换算法的替换规则:是根据页面调入内存后的使用情况来进行决策的。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间,当需淘汰一个页面的时候选择现有页面中其时间值最大的进行淘汰。 最佳置换算法的替换规则:其所选择的被淘汰页面,将是以后永不使用的或许是在最长(未来)时间内不再被访问的页面。 先进先出(FIFO)页面置换算法的替换规则:该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。该算法实现简单只需把一个进程已调入内存的页面,按先后次序链接成一个队列,并设置一个指针,称为替换指针,使它总是指向最老的页面。 三种替换算法的命中率由高到底排列OPT>LRU>FIFO。 本次的程序是在网上查找的相关代码然后自己进行修改,先自己仔细地研读了这段代码,在这过程中我对C++代码编写有了更深的了解。总之,本次实验使我明白要学会把课堂上的理论应用到实际操作中。我需要在今后熟练掌握课堂上的理论基础,只有坚实的基础,才能在实际操作中更得心应手。

段式虚拟存储管理

学号: 课程设计 题目段页式虚拟存储管理 学院计算机科学与技术 专业 班级 姓名 指导教师吴利军 2013 年 1 月16 日

课程设计任务书 学生姓名: 指导教师:吴利军工作单位:计算机科学与技术学院题目: 模拟设计段页式虚拟存储管理中地址转换 初始条件: 1.预备内容:阅读操作系统的内存管理章节内容,理解段页式存储管理的思想及相应的分配主存的过程。 2.实践准备:掌握一种计算机高级语言的使用。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写 等具体要求) 1.实现段页式存储管理中逻辑地址到物理地址的转换。能够处理以下的情形: ⑴能指定内存的大小,内存块的大小,进程的个数,每个进程的段数及段内 页的个数; ⑵能检查地址的合法性,如果合法进行转换,否则显示地址非法的原因。 2.设计报告内容应说明: ⑴需求分析; ⑵功能设计(数据结构及模块说明); ⑶开发平台及源程序的主要部分; ⑷测试用例,运行结果与运行情况分析; ⑸自我评价与总结: i)你认为你完成的设计哪些地方做得比较好或比较出色; ii)什么地方做得不太好,以后如何改正; iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训); iv)完成本题是否有其他方法(如果有,简要说明该方法); 时间安排: 设计安排一周:周1、周2:完成程序分析及设计。 周2、周3:完成程序调试及测试。 周4、周5:验收、撰写课程设计报告。 (注意事项:严禁抄袭,一旦发现,一律按0分记) 指导教师签名:年月日 系主任(或责任教师)签名:年月日

一、需求分析: 页式管理基本原理: 各个进程的虚拟空间被划分成若干个长度相等的页。页长的划分和内存与外存之间的数据传输速度及内存大小等有关。一般每个页长大约为1----4K,经过页划分之后,进程的虚拟地址变为页号p与页内地址w所组成。 除了将进程的虚拟空间划分为大小相等的页之外,页式管理还把内存空间也按页的大小划分为片或者页面。这些页面为系统中的任一进程所共享。从而与分区管理不一样,分页管理时,用户进程在内存空间内除了在每个页面内地址连续之外,每个页面之间不再连续。第一是实现了内存中碎片的减少,因为任意碎片都会小于一个页面。第二是实现了由连续存储到非连续存储的这个飞跃,为在内存中局部地、动态地存储那些反复执行或即将执行的程序和数据段打下了基础。 怎样由页式虚拟地址转变为内存页面物理地址?页式管理把页式虚拟地址与内存页面物理地址建立一一对应页表,并用相应的硬件地址变换机构,来解决离散地址变换问题。 静态页面管理: 静态页面管理方法是在作业或进程开始执行之前,把该作业或进程的程序段和数据全部装入内存的各个页面,并通过页表和硬件地址变换机构实现虚拟地址到内存物理地址的地址映射。 1、内存页面的分配与回收 静态分页管理的第一步是为要求内存的作业或进程分配足够的页面。系统依靠存储页面表、请求页面表以及页表来完成内存的分配。 (1)页表 最简单的页表由页号与页面号组成,页表在内存中占有一块固定的存储区。页表的大小有进程或作业的长度决定。 每个进程至少要拥有一个页表。 (2)请求表 用来确定作业或进程的虚拟空间的各页在内存中的实际对应位置。系统必须知道每个作业或进程的页表起始地址和长度,以进行内存的分配和地址变换,另外请求表中还应包括每个作业或进程所要求的页面数。 (3)存储页面 存储页面表也是整个系统一张,存储页面表指出内存各个页面是否已被分配出去,以及未被分配页面总数。存储页面表也有两种构成方法,一种是在内存中划分一块固定区域,每个单元的每个比特代表一个页面,如果该页面已被分配,则对应比特位置置1,否则置0。 另一种方法空闲页面链,不占内存空间。 2、分配算法 3、地址变换 在程序执行过程中,执行的是虚拟空间中的代码,代码中的指令是相对于虚拟空间的,需要到内存的实际空间中寻找对应的要执行的指令。 静态页式管理的缺陷: 虽然解决了分区管理时的碎片问题,但是由于静态页式管理要求进程或作业在执行前全部装入内存,如果可用页面数小于用户要求时,改作业或进程只好等待。而且,作业或进程的大小仍受内存可用空间的限制。

操作系统-页式虚拟存储管理程序模拟

操作系统-页式虚拟存储管理程序模拟

FIFO页面置换算法 1在分配内存页面数(AP)小于进程页面数(PP)时,当然是最先运行的AP个页面放入内存。 2这时有需要处理新的页面,则将原来内存中的AP个页面最先进入的调出(是以称为FIFO),然后将新页面放入。 3以后如果再有新页面需要调入,则都按2的规则进行。 算法特点:所使用的内存页面构成一个队列。LRU页面置换算法 1当分配内存页面数(AP)小于进程页面数(PP)时,当然是把最先执行的AP个页面放入内存。2当需要调页面进入内存,而当前分配的内存页面全部不空闲时,选择将其中最长时间没有用到的那个页面调出,以空出内存来放置新调入的页面(称为LRU)。 算法特点:每个页面都有属性来表示有多长时间未被CPU使用的信息。 结果分析

#include #include using namespace std; const int MaxNum=320;//指令数 const int M=5;//内存容量 int PageOrder[MaxNum];//页面请求 int Simulate[MaxNum][M];//页面访问过程 int PageCount[M],LackNum;//PageCount用来记录LRU算法中最久未使用时间,LackNum记录缺页数 float PageRate;//命中率 int PageCount1[32]; bool IsExit(int i)//FIFO算法中判断新的页面请求是否在内存中 { bool f=false; for(int j=0;j

操作系统-页式虚拟存储管理程序模拟

实验3:页式虚拟存储管理程序模拟 实验目的:编写程序来模拟计算机的两种调度方式: (1)先进先出算法 (2)最近最少使用算法 程序设计 FIFO页面置换算法 1在分配内存页面数(AP)小于进程页面数(PP)时,当然是最先运行的AP个页面放入内存。2这时有需要处理新的页面,则将原来内存中的AP个页面最先进入的调出(是以称为FIFO),然后将新页面放入。 3以后如果再有新页面需要调入,则都按2的规则进行。 算法特点:所使用的内存页面构成一个队列。 LRU页面置换算法

1当分配内存页面数(AP)小于进程页面数(PP)时,当然是把最先执行的AP个页面放入内存。2当需要调页面进入内存,而当前分配的内存页面全部不空闲时,选择将其中最长时间没有用到的那个页面调出,以空出内存来放置新调入的页面(称为LRU)。 算法特点:每个页面都有属性来表示有多长时间未被CPU使用的信息。 结果分析

#include #include using namespace std; const int MaxNum=320;//指令数 const int M=5;//内存容量 int PageOrder[MaxNum];//页面请求 int Simulate[MaxNum][M];//页面访问过程 int PageCount[M],LackNum;//PageCount用来记录LRU算法中最久未使用时间,LackNum记录缺页数 float PageRate;//命中率 int PageCount1[32]; bool IsExit(int i)//FIFO算法中判断新的页面请求是否在内存中 { bool f=false; for(int j=0;j

请求页式存储管理的模拟实现_参考代码_

do_init(){ int i,j; srand(time(NULL)); for(i=0; i

实验五动态页式存储管理实现过程的模拟

实验五动态页式存储管理实现过程的模拟 一、实验目的与要求 在计算机系统中,为了提高主存利用率,往往把辅助存储器(如磁盘)作为主存储器的扩充,使多道运行的作业的全部逻辑地址空间总和可以超出主存的绝对地址空间。用这种办法扩充的主存储器称为虚拟存储器。通过本实验帮助学生理解在分页式存储管理中怎样实现虚拟存储器;掌握物理内存和虚拟内存的基本概念;掌握重定位的基本概念及其要点,理解逻辑地址与绝对地址;掌握动态页式存储管理的基本原理、地址变换和缺页中断、主存空间的分配及分配算法;掌握常用淘汰算法。 二、实验环境 VC++6.0集成开发环境或java程序开发环境。 三、实验内容 模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断。 四、实验原理 1、地址转换 (1)分页式虚拟存储系统是把作业信息的副本存放在磁盘上,当作业被选中时,可把作业的开始几页先装入主存且启动执行。为此,在为作业建立页表时,应说明哪些页已在主存,哪些页尚未装入主存,页表的格式如图10所示: 图10 页表格式 其中,标志----用来表示对应页是否已经装入主存,标志位=1,则表示该页已经在主存,标志位=0,则表示该页尚未装入主存。 主存块号----用来表示已经装入主存的页所占的块号。

在磁盘上的位置----用来指出作业副本的每一页被存放在磁盘上的位置。 (2)作业执行时,指令中的逻辑地址指出了参加运算的操作存放的页号和单元号,硬件的地址转换机构按页号查页表,若该页对应标志为“1”,则表示该页已在主存,这时根据关系式: 绝对地址=块号×块长+单元号 计算出欲访问的主存单元地址。如果块长为2的幂次,则可把块号作为高地址部分,把单元号作为低地址部分,两者拼接而成绝对地址。若访问的页对应标志为“0”,则表示该页不在主存,这时硬件发“缺页中断”信号,有操作系统按该页在磁盘上的位置,把该页信息从磁盘读出装入主存后再重新执行这条指令。 (3)设计一个“地址转换”程序来模拟硬件的地址转换工作。当访问的页在主存时,则形成绝对地址,但不去模拟指令的执行,而用输出转换后的地址来代替一条指令的执行。当访问的页不在主存时,则输出“* 该页页号”,表示产生了一次缺页中断。该模拟程序的算法如图11。 图11 地址转换模拟算法 2、用先进先出(FIFO)页面调度算法处理缺页中断。

内存的存储管理--段式和页式管理的区别

存储管理的基本原理 内存管理方法 内存管理主要包括内存分配和回收、地址变换、内存扩充、内存共享和保护等功能。 下面主要介绍连续分配存储管理、覆盖与交换技术以及页式与段式存储管理等基本概念和原理。 1.连续分配存储管理方式 连续分配是指为一个用户程序分配连续的内存空间。连续分配有单一连续存储管理和分区式储管理两种方式。 (1)单一连续存储管理 在这种管理方式中,内存被分为两个区域:系统区和用户区。应用程序装入到用户区,可使用用户区全部空间。其特点是,最简单,适用于单用户、单任务的操作系统。CP/M和DOS 2.0以下就是采用此种方式。这种方式的最大优点就是易于管理。但也存在着一些问题和不足之处,例如对要求内存空间少的程序,造成内存浪费;程序全部装入,使得很少使用的程序部分也占用—定数量的内存。 (2)分区式存储管理 为了支持多道程序系统和分时系统,支持多个程序并发执行,引入了分区式存储管理。分区式存储管理是把内存分为一些大小相等或不等的分区,操作系统占用其中一个分区,其余的分区由应用程序使用,每个应用程序占用一个或几个分区。分区式存储管理虽然可以支持并发,但难以进行内存分区的共享。 分区式存储管理引人了两个新的问题:内碎片和外碎片。前者是占用分区内未被利用的空间,后者是占用分区之间难以利用的空闲分区(通常是小空闲分区)。为实现分区式存储管理,操作系统应维护的数据结构为分区表或分区链表。表中各表项一般包括每个分区的起始地址、大小及状态(是否已分配)。 分区式存储管理常采用的一项技术就是内存紧缩(compaction):将各个占用分区向内存一端移动,然后将各个空闲分区合并成为一个空闲分区。这种技术在提供了某种程度上的灵活性的同时,也存在着一些弊端,例如:对占用分区进行内存数据搬移占用CPU~t寸间;如果对占用分区中的程序进行“浮动”,则其重定位需要硬件支持。 1)固定分区(nxedpartitioning)。 固定式分区的特点是把内存划分为若干个固定大小的连续分区。分区大小可以相等:这种作法只适合于多个相同程序的并发执行(处理多个类型相同的对象)。分区大小也可以不等:有多个小分区、适量的中等分区以及少量的大分区。根据程序的大小,分配当前空闲的、适当大小的分区。这种技术的优点在于,易于实现,开销小。缺点主要有两个:内碎片造成浪费;分区总数固定,限制了并发执行的程序数目。 2)动态分区(dynamic partitioning)。 动态分区的特点是动态创建分区:在装入程序时按其初始要求分配,或在其执行过程中通过系统调用进行分配或改变分区大小。与固定分区相比较其优点是:没有内碎片。但它却引入了另一种碎片——外碎片。动态分区的分区分配就是寻找某个空闲分区,其大小需大于或等于程序

请求页式管理的页面置换算法

实验报告 课程:操作系统班级:姓名:学号: 成绩:指导教师:实验日期: 实验密级:预习程度:实验时间: 仪器组次:必修/选修:实验序号: 实验名称:访问实验二请求页式管理中的置换算法 实验目的与要求: 1.采用FIFO(先进先出)置换算法,发生缺页中断时,给出相应的字地址及页号,计算缺页中断率。 2.采用LFU(最不经常使用)置换算法,发生缺页中断时,给出相应的字地址及页号,计算缺页中断率。 实验仪器:

一、实验内容 1.假设有一个用户进程P的地址空间为n(n=60)页,系统已在内存中给该进程分配有m(m

段页式虚拟存储管理

课程设计 题目段页式虚拟存储管理 学院计算机科学与技术 专业 班级 姓名 指导教师吴利军 2013年1月16日 课程设计任务书 学生姓名:

指导教师:吴利军工作单位:计算机科学与技术学院题目: 模拟设计段页式虚拟存储管理中地址转换 初始条件: 1.预备内容:阅读操作系统的内存管理章节内容,理解段页式存储管理的思想及相应的分配主存的过程。 2.实践准备:掌握一种计算机高级语言的使用。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写 等具体要求) 1.实现段页式存储管理中逻辑地址到物理地址的转换。能够处理以下的情形: ⑴能指定内存的大小,内存块的大小,进程的个数,每个进程的段数及段内页 的个数; ⑵能检查地址的合法性,如果合法进行转换,否则显示地址非法的原因。 2.设计报告内容应说明: ⑴需求分析; ⑵功能设计(数据结构及模块说明); ⑶开发平台及源程序的主要部分; ⑷测试用例,运行结果与运行情况分析; ⑸自我评价与总结: i)你认为你完成的设计哪些地方做得比较好或比较出色; ii)什么地方做得不太好,以后如何改正; iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训); iv)完成本题是否有其他方法(如果有,简要说明该方法); 时间安排: 设计安排一周:周1、周2:完成程序分析及设计。 周2、周3:完成程序调试及测试。 周4、周5:验收、撰写课程设计报告。 (注意事项:严禁抄袭,一旦发现,一律按0分记) 指导教师签名:年月日 系主任(或责任教师)签名:年月日 一、需求分析: 页式管理基本原理:

各个进程的虚拟空间被划分成若干个长度相等的页。页长的划分和内存与外存之间的数据传输速度及内存大小等有关。一般每个页长大约为1----4K,经过页划分之后,进程的虚拟地址变为页号p与页内地址w所组成。 除了将进程的虚拟空间划分为大小相等的页之外,页式管理还把内存空间也按页的大小划分为片或者页面。这些页面为系统中的任一进程所共享。从而与分区管理不一样,分页管理时,用户进程在内存空间内除了在每个页面内地址连续之外,每个页面之间不再连续。第一是实现了内存中碎片的减少,因为任意碎片都会小于一个页面。第二是实现了由连续存储到非连续存储的这个飞跃,为在内存中局部地、动态地存储那些反复执行或即将执行的程序和数据段打下了基础。 怎样由页式虚拟地址转变为内存页面物理地址页式管理把页式虚拟地址与内存页面物理地址建立一一对应页表,并用相应的硬件地址变换机构,来解决离散地址变换问题。 静态页面管理: 静态页面管理方法是在作业或进程开始执行之前,把该作业或进程的程序段和数据全部装入内存的各个页面,并通过页表和硬件地址变换机构实现虚拟地址到内存物理地址的地址映射。 1、内存页面的分配与回收 静态分页管理的第一步是为要求内存的作业或进程分配足够的页面。系统依靠存储页面表、请求页面表以及页表来完成内存的分配。 (1)页表 最简单的页表由页号与页面号组成,页表在内存中占有一块固定的存储区。页表的大小有进程或作业的长度决定。 每个进程至少要拥有一个页表。 (2)请求表 用来确定作业或进程的虚拟空间的各页在内存中的实际对应位置。系统必须知道每个作业或进程的页表起始地址和长度,以进行内存的分配和地址变换,另外请求表中还应包括每个作业或进程所要求的页面数。 (3)存储页面 存储页面表也是整个系统一张,存储页面表指出内存各个页面是否已被分配出去,以及未被分配页面总数。存储页面表也有两种构成方法,一种是在内存中划分一块固定区域,每个单元的每个比特代表一个页面,如果该页面已被分配,则对应比特位置置1,否则置0。 另一种方法空闲页面链,不占内存空间。 2、分配算法 3、地址变换 在程序执行过程中,执行的是虚拟空间中的代码,代码中的指令是相对于虚拟空间的,需要到内存的实际空间中寻找对应的要执行的指令。 静态页式管理的缺陷: 虽然解决了分区管理时的碎片问题,但是由于静态页式管理要求进程或作业在执行前全部装入内存,如果可用页面数小于用户要求时,改作业或进程只好等待。而且,作业或进程的大小仍受内存可用空间的限制。 动态页式管理: 动态页式管理是在静态页式管理的基础上发展起来的。它分为请求页式管理和与调入页式管理(调入方式上)。

请求调页存储管理方式的模拟NRU

请求调页存储管理方式的模拟NRU

#include #include #include #ifndef _UNISTD_H #define _UNISTD_H #include #include #endif #define TRUE 1 #define FALSE 0 #define INVALID -1 #define NULL 0 #define total_instruction 320 /*指令流长*/ #define total_vp 32 /*虚页长*/ #define clear_period 50 /*清0周期*/ typedef struct /*页面结构*/ { int pn,pfn,counter,time; } pl_type; pl_type pl[total_vp]; /*页面结构数组*/ struct pfc_struct

{ /*页面控制结构*/ int pn,pfn; struct pfc_struct *next; }; typedef struct pfc_struct pfc_type; pfc_type pfc[total_vp],*freepf_head,*busypf_h ead,*busypf_tail; int diseffect, a[total_instruction]; int page[total_instruction], offset[total_instru ction]; int initialize(int); int NUR(int) int main( ) { int s,i,j; srand(10*getpid()); /*由于每次运行时进程号

页式虚拟存储管理中地址转换和缺页中断实验参考2

页式虚拟存储管理中地址转换和缺页中断 一.实验目的 (1)深入了解存储管理如何实现地址转换。 (2)进一步认识页式虚拟存储管理中如何处理缺页中断。 二.实验内容 编写程序完成页式虚拟存储管理中地址转换过程和模拟缺页中断的处理。 三.实验原理 页式存储管理把内存分割成大小相等位置固定的若干区域,叫内存页面,内存的分配以“页”为单位,一个程序可以占用不连续的页面,逻辑页面的大小和内存页面的大小相同,内外存的交换也以页为单位进行,页面交换时,先查询快表,若快表中找不到所需页面再去查询页表,若页表中仍未找到说明发生了缺页中断,需先将所需页面调入内存再进行存取。 四.实验部分源程序 #define size 1024//定义块的大小,本次模拟设为1024个字节。 #include "stdio.h" #include "string.h" #include struct plist { int number; //页号 int flag; //标志,如为1表示该页已调入主存,如为0则还没调入。 int block; //主存块号,表示该页在主存中的位置。 int modify; //修改标志,如在主存中修改过该页的内容则设为1,反之设为0 int 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; }; //在模拟之前初始化一个命令表,通过程序可以让其顺序执行。 struct ilist p2[12]={{"+",0,72},{"5+",1,50},{"*",2,15},{"save",3,26},

页式虚拟存储管理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 课程设计总结 (10) 7 参考文献 (10) 8 附录:源程序清单 (11)

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个数字页面引用串。 主界面 FIFO 算法 LRU 算法 OPT 算法 新的页面引用 串

模拟请求页式存储管理中硬件的地址转换和缺页中断,并用先进先出调度算法(FIFO)处理缺页中断

实验报告 课程名称操作系统原理实验名称虚拟页式管理 姓名学号专业班级网络 实验日期成绩指导教师赵安科 (①实验目的②实验原理③主要仪器设备④实验内容与步骤⑤实验数据记录与处理⑥实验结果与分析⑦问题建议) 实验二模拟请求页式存储管理中硬件的地址转换和缺页中断,并用先进先出调度算法(FIFO)处理缺页中断 1.内容:模拟请求页式存储管理中硬件的地址转换和缺页中断处理 2.思想: 装入新页置换旧页时,若旧页在执行中没有被修改过,则不必将该页重写磁盘。因此,页表中增加是否修改过的标志,执行“存”指令和“写”指令时将对应的修改标志置成“1” 3.要求及方法: ①设计一个地址转换程序来模拟硬件的地址转换和缺页中断。当访问的页在主存时则形成绝对地址,但不去模拟指令的执行,可以输出转换后的绝对地址来表示一条指令已执行完成。当访问的页不在主存中时,则输出“*页号”来表示硬件产生了一次缺页中断。模拟地址转换流程见图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则结束,否则进 入流程控制过程,得P 1和d ,查表在主存时,绝对地址=P 1×1024+d ③ 假定主存中页架大小为1024个字节,现有一个共7页的作业,其副本已在磁盘上。系统为该作业分配了4个页架,且该作业的第0页至第3页已装入内存,其余3页未装入主 依次执行上述指令调试你所设计的程序(仅模拟指令的执行,不考虑序列中具体操作的执行)。

内存的存储管理段式和页式管理的区别

页和分段系统有许多相似之处,但在概念上两者完全不同,主要表现在: 、页是信息地物理单位,分页是为实现离散分配方式,以消减内存地外零头,提高内存地利用率;或者说,分页仅仅是由于系统管理地需要,而不是用户地需要.文档收集自网络,仅用于个人学习 段是信息地逻辑单位,它含有一组其意义相对完整地信息.分段地目地是为了能更好地满足用户地需要. 、页地大小固定且由系统确定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现地,因而一个系统只能有一种大小地页面.文档收集自网络,仅用于个人学习 段地长度却不固定,决定于用户所编写地程序,通常由编辑程序在对源程序进行编辑时,根据信息地性质来划分. 、分页地作业地址空间是维一地,即单一地线性空间,程序员只须利用一个记忆符,即可表示一地址. 分段地作业地址空间是二维地,程序员在标识一个地址时,既需给出段名,又需给出段内地址. 参考资料: 添加评论 炎炎 有人认为这个回答不错有人认为这个回答没有帮助 一页式管理 页式管理地基本原理将各进程地虚拟空间划分成若干个长度相等地页(),页式管理把内存空间按页地大小划分成片或者页面(),然后把页式虚拟地址与内存地址建立一一对应页表,并用相应地硬件地址变换机构,来解决离散地址变换问题.页式管理采用请求调页或预调页技术实现了内外存存储器地统一管理.文档收集自网络,仅用于个人学习 它分为 静态页式管理.静态分页管理地第一步是为要求内存地作业或进程分配足够地页面.系统通过存储页面表、请求表以及页表来完成内存地分配工作.静态页式管理解决了分区管理时地碎片问题.但是,由于静态页式管理要求进程或作业在执行前全部装入内存,如果可用页面数小于用户要求时,该作业或进程只好等待.而且作业和进程地大小仍受内存可用页面数地限制.文档收集自网络,仅用于个人学习 动态页式管理.动态页式管理是在静态页式管理地基础上发展起来地.它分为请求页式管理和预调入页式管理. 优点:没有外碎片,每个内碎片不超过页大小.一个程序不必连续存放.便于改变程序占用空间地大小(主要指随着程序运行而动态生成地数据增多,要求地址空间相应增长,通常由系统调用完成而不是操作系统自动完成).文档收集自网络,仅用于个人学习 缺点:程序全部装入内存. 要求有相应地硬件支持.例如地址变换机构,缺页中断地产生和选择淘汰页面等都要求有相应地硬件支持.这增加了机器成本.增加了系统开销,例如缺页中断处理机,请求调页地算法如选择不当,有可能产生抖动现象.虽然消除了碎片,但每个作业或进程地最后一页内总有一部分空间得不到利用果页面较大,则这一部分地损失仍然较大.文档收集自网络,仅用于个人学习 二段式管理地基本思想 把程序按内容或过程(函数)关系分成段,每段有自己地名字.一个用户作业或进程所包含地段对应一个二维线形虚拟空间,也就是一个二维虚拟存储器.段式管理程序以段为单位分配内存,然后通过地址影射机构把段式虚拟地址转换为实际内存物理地址.文档收集自网络,

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

页式虚拟存储管理中地址转换和缺页中断实验报告一.实验目的 1.深入了解页式存储管理如实现地址转换; 2.进一步认识页式虚拟存储管理中如处理缺页中断。 二.实验仪器 PC、windows操作系统、Visual C++6.0 三.实验原理 编写程序完成页式存储管理中地址转换过程和模拟缺页中断的处理。实验具体包括:首先对给定的地址进行地址转换工作,若发生缺页则先进行缺页中断处理,然后再进行地址转换;最后编写主函数对所做工作进行测试。 四.实验步骤 代码一 #include #include #define n 64 //模拟实验中假定的页表长度 #define length 10 struct { 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 块中调入

请求调页存储管理方式的模拟

实验3请求调页存储管理方式的模拟 1实验目的 通过对页面、页表、地址转换和页面置换过程的模拟,加深对请求调页系统的原理和实现过程的理解。 2实验内容 (1)假设每个页面中可存放10条指令,分配给一作业的内存块数为4。 (2)模拟一作业的执行过程。该作业共有320条指令,即它的地址空间为32页,目前它的所有页都还未调入内存。在模拟过程中,如果所访问的指令已经在内存中,则显示其物理地址,并转下一条指令。如果所访问的指令还未装入内存,则发生缺页,此时需记录缺页的次数,并将相应页调入内存。如果4个内存块中均已装入该作业,则需进行页面置换。最后显示其物理地址,并转下一条指令。在所有320条指令执行完毕后,请计算并显示作业运行过程中发生的缺页率。 (3)置换算法:请分别考虑OPT、FIFO和LRU算法。 (4)作业中指令的访问次序按下述原则生成: ?50%的指令是顺序执行的。 ?25%的指令是均匀分布在前地址部分。 ?25%的指令时均匀分布在后地址部分。 代码: package mainDart; import java.util.ArrayList; import java.util.List; import java.util.Random; public class FIFO { private static int times=0; //记录置换内存页面的次数 /** * 随机产生0~319之间的数 * 产生320条指令 * * @return 包含320条指令的数组 */ public static int[] productNumber() { int order[] = new int[320]; //数组存储的数字表示指令 Random rand = new Random(); for(int i=0;i<320;i++) { if(i%4==0) {

相关文档
最新文档