logo资料库

操作系统原理实验-虚拟存储器.doc

第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
资料共12页,剩余部分请下载后查看
佛山科学技术学院 实 验 报 告 课程名称 实验项目 专业班级 姓 名 指导教师 操作系统原理实验 虚拟存储器 学 号 成 绩 日 期 一、实验目的 1、了解虚拟存储器的基本原理和实现方法。 2、掌握几种页面置换算法。 二、实验内容 设计模拟实现采用不同内外存调度算法进行页面置换,并计算缺页率。 三、实验原理 内存在计算机中的作用很大,电脑中所有运行的程序都需要经过内存来执行,如果执行的程序很大 或很多,就会导致内存消耗殆尽。为了解决这个问题,Window 中运用了虚拟内存技术,即拿出一部分硬 盘空间来充当内存使用,当内存占用完时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。 虚拟存储器是指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系 统。它是采用一定的方法将一定的外存容量模拟成内存,同时对程序进出内存的方式进行管理,从而得 到一个比实际内存容量大得多的内存空间,使得程序的运行不受内存大小的限制。虚拟存储区的容量与 物理主存大小无关,而受限于计算机的地址结构和可用磁盘容量。 虚拟内存的设置主要有两点,即内存大小和分页位置,内存大小就是设置虚拟内存最小为多少和最 大为多少;而分页位置则是设置虚拟内存应使用那个分区中的硬盘空间。 (一)页式虚拟存储器 在页式虚拟存储系统中,将程序按统一的大小划分成多个页,同时也将虚拟存储器划分为同样大小 的页,其中虚拟空间的页称为虚页(逻辑页),而主存空间的页称为实页(物理页),并对这些页按地址 从低到高的顺序编号。 在编程时,程序的虚地址由高位字段的虚页号和低位字段的页内地址两部分组成,虚页号标识页。 虚地址到实地址之间的变换是由页表来实现的。页表是一张存放在主存中的虚页号和实页号的对照表, 记录着程序的虚页调入主存时被安排在主存中的位置。若计算机采用多道程序工作方式,则可为每个用 户作业建立一个页表,硬件中设置一个页表基址寄存器,存放当前所运行程序的页表的起始地址。 页表中的每一行记录了与某个虚页对应的若干信息,包括虚页号、装入位和实页号等。页表基址寄 存器和虚页号拼接成页表索引地址。根据这个索引地址可读到一个页表信息字,然后检测页表信息字中 装入位的状态。若装入位为 1,表示该页面已在主存中,将对应的实页号与虚地址中的页内地址相拼接 就得到了完整的实地址;若装入位为 0,表示该页面不在主存中,于是要启动 I/O 系统,把该页从辅存 中调入主存后再供 CPU 使用,若主存已满,还需要使用替换算法替换页。 (二)页面置换算法 在地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断。当发生缺页中 断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘 汰哪一页的规则叫做页面置换算法。几中常见的页面置换方法如下: 1. 最佳置换算法(OPT):选择永不使用或是在最长时间内不再被访问(即距现在最长时间才会被 访问)的页面淘汰出内存。
2. 先进先出置换算法(FIFO):选择最先进入内存即在内存驻留时间最久的页面换出到外存。 3. 最近最久未使用置换算法(LRU): 以“最近的过去”作为“最近的将来”的近似,选择最近一 段时间最长时间未被访问的页面淘汰出内存 4. 时钟置换算法 Clock :为进入内存的页面设置一个访问位,当内存中某页被访问,访问位置一, 算法在选择一页淘汰时,只需检查访问位,若为 0,则直接换出,若为 1,置该访问位为 0,检测内存中 的下一个页面的访问位。 5. 最少使用置换算法(LFU):在内存中为每个页面设置一个移位寄存器,用来记录该页面被访问 的频率。选择在最近时期使用最少的页面作为淘汰页 6. 随机置换算法(S):产生一个取值范围在 0 和 N-1 之间的随机数,该随机数即可表示应被淘汰 出内存的页面。 四、实验步骤 1.定义页表的存储结构,设置作业进程所占内存空间为 640K,页面大小为 1K/2K/4K/8K,随机生成 100 个页面,用于分配页面大小的内存总空间为 32K。 2.初始化进程的页面引用序列。 3.选择下列六种置换算法中的三种编写程序,进行页面置换,并计算缺页次数和缺页率。 (1)最佳置换算法(OPT) (2)先进先出置换算法(FIFO): (3)最近最久未使用算法(LRU) (4)时钟置换算法(CLOCK) (5)最少使用置换算法(LFU) (6)随机置换算法(S) 4. 使用菜单形式,选择不同的置换方法,显示换页过程、缺页次数及缺页率。 五、实验代码 #include #include #include #define M 3 //内存页数 #define N 20 //页面引用序列数 #define Myprintf printf("---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---\n ") /*表格控制*/ //定义页面的存储结构 typedef struct page { int num; //记录页面号
int time; //记录调入内存时间 int visitBit; //访问位 }Page; Page P[M]; //内存单元数 int c[M][N]; //暂保存内存当前的状态 int queue[M]={-1,-1,-1}; //记录调入内存的页面 int front=0; //队列头指针 int current=0; //初始化内存单元、缓冲区 void Init(Page *p,int c[M][N]) { } int i,j; for(i=0;i
for(i=0;i
return 0; } //LRU 置换算法 //取得在内存中停留最久的页面,默认状态下为最早调入的页面 int GetMax(Page *p) { } int i; int max=-1; int tag=0; for(i=0;imax) { } max=p[i].time; tag=i; return tag; //LRU 核心部分 int LRU(int fold,Page *p) { int i; int val; val=Equation(fold,p); if (val>=0)
{ p[val].time=0; for(i=0;i
current=(current+1)%M; } } return current; } int Clock(int fold,Page *p) { } int val; val=Equation(fold,p); if(val<0) { } val=GetClockPage(p); p[val].num=fold; p[val].visitBit=1; return 1; return 0; //显示换页过程 void Printf(int a[],int q[],int k) { int i,j; printf("显示换页过程:\n"); Myprintf; for(j=0;j
for(i=0;i
分享到:
收藏