实验五 存储管理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五存储管理
1.实验目的:
存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。
本实验的目的是通过请求页式存储管理中页面置换算法的模拟设计,了解虚拟存储技术的特点,掌握请求页式管理的页面置换算法
2.实验内容:
设计程序实现下述三个算法,并计算下述算法的命中率。
A.OPTIMAL:最佳置换算法
B.FIFO:先进先出置换算法
C.LRU:最近最久未使用置换算法
[预备内容]
地址映射过程中,若发现所要访问的页面不再内存中,则产生缺页中断。当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。以下分别是三个算法的设计思想。
OPTIMAL:最佳置换算法。其所选择的被淘汰页面,将是以后永不使用的,或是在未来最长时间内不再被访问的页面。
FIFO:先进先出置换算法。该算法总是淘汰最先进入内存的页面,既选择在内存中驻留时间最久的页面予以淘汰。
LRU :最近最久未使用置换算法。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的的时间T ,当须淘汰一个页面时,选择现有页面中其T 值最大的给予淘汰。在该实现中是选择Timer 值最大的淘汰。 2)举例即将被访问的页面如下 page
7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
内存情况 Block
FIFO
OPT
……
……
……
LRU
具体实现:
7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
Block
Block Block
参考程序如下: #include
int content;//页面号 int timer;//被访问标记 }page;
page block[Bsize];//物理块
FIFO
OPT
LRU
page page[Psize];//页面号串
void Init(void)
{//初始化
int QString[20]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};
for(int i=0; i { block[i].content = -1; block[i].timer = 0; } for(i=0; i { page[i].content = QString[i]; page[i].timer = 0; } } int findSpace(void) {//查找是否有空闲内存 for(int i=0; i if(block[i].content == -1) return i;//找到空闲内存,返回BLOCK中位置return -1; } int findExist(int curpage) {//查找内存中是否有该页面 for(int i=0; i if(block[i].content == page[curpage].content) return i;//找到内存中有该页面,返回BLOCK中位置return -1; } int findReplace(void) {//查找应予置换的页面,被置换的页面的Timer值最大int pos = 0; for(int i=0; i if(block[i].timer >= block[pos].timer) pos = i;//找到应予置换页面,返回BLOCK中位置return pos; } void display(void) {//显示 for(int i=0; i if(block[i].content != -1) cout< cout< } void Optimal(void) {//OPTIMAL算法 int exist,space,position ; for(int i=0; i { exist = findExist(i); if(exist != -1) { cout<<"不缺页"< else { space = findSpace(); if(space != -1) {block[space]=page[i];//block[space].content=page[i].content,block[spac e].timer=page[i].timer display(); } else {//没有找到空闲分区,需找一个页面进行置换 for(int k=0; k for(int j=i; j { if(block[k].content != page[j].content) { block[k].timer = 1000; }//将来不会用,设置TIMER为一个很大数 else { block[k].timer = j; break; } } position = findReplace(); block[position] = page[i]; display(); } } } } void LRU(void) {//