请求调页+页面置换

1.虚拟存储系统

操作系统中,为了提高内存利用率,提供了内外存进程对换机制;内存空间的分配和回收均以页为单位进行;一个进程只需将其一部分(段或页)调入内存便可运行;还支持请求调页的存储管理方式。

当进程在运行中需要访问某部分程序和数据时,发现其所在页面不在内存,就立即提出请求(向CPU发出缺中断),由系统将其所需页面调入内存。这种页面调入方式叫请求调页。

2. 页面置换过程

当CPU接收到缺页中断信号,中断处理程序先保存现场,分析中断原因,转入缺页中断处理程序。该程序通过查找页表,得到该页所在外存的物理块号。如果此时内存未满,能容纳新页,则启动磁盘I/O将所缺之页调入内存,然后修改页表。如果内存已满,则须按某种置换算法从内存中选出一页准备换出,是否重新写盘由页表的修改位决定,然后将缺页调入,修改页表。利用修改后的页表,去形成所要访问数据的物理地址,再去访问内存数据。整个页面的调入过程对用户是透明的。

(1)   页表:放在系统空间的页表区,存放逻辑页与物理页帧的对应关系。 每一个进程都拥有一个自己的页表,PCB表中有指针指向页表。

(2)   页框:RAM块,来描述物理内存空间,由操作系统实现从逻辑页到物理页框的页面映射,同时负责对所有页的管理和进程运行的控制。模拟时对于页框的分配数量自主设定。

(3)   访问位:不论是读还是写(get or set),系统都会设置该页的访问位,记录本页在一段时间内被访问的次数,或最近已有多长时间未被访问,它的值用来帮助操作系统在发生缺页中断时选择要被淘汰的页,即用于页面置换。

(4)   修改位(脏位):用于页面的换出,如果某个页面被修改过(即为脏),在淘汰该页时,必须将其写回磁盘,反之,可以直接丢弃该页。

(5) 有效位(驻留位、中断位):表示该页是内存还是磁盘。

(6) 保护位:存取控制位,用于指出该页允许什么类型的访问,如果用一位来标识的话:1表示只读,0表示读写。

1.LRU

least recently used 最近时间内 最久未被使用的页面被置换

如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小,拿“最近的过去”预测“最近的未来”。

LRU算法的硬件支持

LRU算法虽然是一种比较好的算法,但是要求系统有较多的支持硬件。为了了解一个进程在内存中的各个页面各有多少时间未被进程访问,以及如何快速得知道哪一页是最近最久未使用的页面,须有寄存器和栈两类硬件之一的支持。 
1)寄存器 
为了记录某进程在内存中各页的使用情况,须为每个内存中的页面配置一个移位寄存器,可表示为

R=Rn−1Rn−2⋅⋅⋅R2R1R0

当进程访问某物理块时,要将相应的寄存器的Rn−1位置成1。此时,定时信号将每隔一定时间将寄存器右移一位。如果我们把n位寄存器的数看作是一个整数,那么,具有最小数值的寄存器所对应的页面,就是最近最久未使用的页面。 (e.g. 每100ms右移一位,最高位补0还是补1的问题)
2)栈 
可利用一个特殊的栈保持当前使用的各个页面的页面号。每当进程访问某页面是,便将该页面的页面号从栈中移出,将它压入栈顶。因此,栈顶始终是最近最久未使用页面的页面号。

模拟实现2:

采用双向链表+heapmap配合实现,靠近链表头部的越是最近访问过得,链表尾部是最久未被访问的,从而体现使用的时间顺序,heapmap记录表项地址。

过程:

要操作页面K

未在内存 1.内存未满->直接插入链表头部,记录地址

2.内存已满->先删除链表尾部节点,再插入新节点到链表头部,并且更新map中增加该节点

已在内存:更新节点的值,把当前访问的节点移到链表头部,并且更新map中该节点的地址。

class LRUBlock{
public:LRUBlock(int capacity) {size = capacity;}/**操作页面k*/void set(int blockId,int k) {///未在内存if(blockMap.find(k) == blockMap.end()){if(blockList.size() == size){///删除链表尾部节点(最少访问的节点)
                blockMap.erase(blockList.back().pageId);blockList.pop_back();}///插入新节点到链表头部,并且更新map中增加该节点
            blockList.push_front(BlockNode(blockId,k));blockMap[k] = blockList.begin();}///已在内存else{///更新节点的值,把当前访问的节点移到链表头部,并且更新map中该节点的地址
            blockList.splice(blockList.begin(), blockList, blockMap[k]);blockMap[k] = blockList.begin();}}list<BlockNode> getList(){return this->blockList;}
private:list<BlockNode> blockList;unordered_map<int, list<BlockNode>::iterator> blockMap;///记录结点地址int size;
};

void LRU(LRUBlock&lru,int address,map<int,TableEntry>&pageTable,map<int,int>&memoryBlock)
{int pageNum=address/unitBlockSize;if(pageTable[pageNum].entryStatus==1){cout<<"页面已在内存中\n";lru.set(pageTable[pageNum].blockId,pageNum);}else{int s=memoryBlock.size();if(memoryBlock[s-1]==1){///直接分cout<<"所分配内存块还未用完\n";int i=s-1;for(;i>=0;i--){if(memoryBlock[i]==0)break;}memoryBlock[i+1]=0;pageTable[pageNum].entryStatus=1;pageTable[pageNum].blockId=i+1;lru.set(i+1,pageNum);}else///先swap再分
        {cout<<"所分配内存块全被占用,需要置换操作\n";BlockNode blockNode=lru.getList().back();cout<<"置换出"<<blockNode.pageId<<"\t置换入"<<pageNum<<endl;///抢pageTable[blockNode.pageId].entryStatus=0;pageTable[blockNode.pageId].blockId=-1;pageTable[pageNum].entryStatus=1;pageTable[pageNum].blockId=blockNode.blockId;lru.set(blockNode.blockId,pageNum);}pageBreak++;}total++;
}

2.LFU:

least frequently used 最少使用置换

如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小,LRU的淘汰规则是基于访问时间,而LFU是基于访问次数的。

注意:

一般情况下,LFU效率要优于LRU,且能够避免周期性或者偶发性的操作导致缓存命中率下降的问题。但LFU需要记录数据的历史访问记录,一旦数据访问模式改变,LFU需要更长时间来适用新的访问模式,即:LFU存在历史数据影响将来数据的“缓存污染”效用。

实现:

用数组存储内存中表项情况,通过遍历查找最小值。

过程:

要操作页面K

未在内存 1.内存未满:更新页表,表项放入数组。

2.内存已满:更新页表,数组删除要淘汰的表项,加入新表项。

已在内存:更新页表,表项重新放入数组。

3.FIFO

first in first out 最早出现置换

队列实现

过程:

已在内存:none

不在内存:

  内存未满:表项加入队尾

  内存已满:pop队首,新表项加入队尾

4.CLOCK

NRU---Not Recently Used

用数组存储内存中表项情况,修改数组中表项访问情况选择置出页面。

置换策略:依次访问数组中的表项,遇到status=1的置为0,再给一次驻留内存的机会,遇到status=0的换出。

过程:

已在内存:none

不在内存:

  内存未满:表项加入数组

  内存已满:拿新来表项替换置出表项

转载于:https://www.cnblogs.com/kimsimple/p/7065929.html

模拟请求分页式存储管理 ---4种置换算法相关推荐

  1. 【操作系统⑫】——存储管理(下)【分段存储管理 虚拟存储管理 段页式存储管理方案 页面置换算法 OPT FIFO LRU】

  2. 存储管理的页面置换算法

    存储管理的页面置换算法 存储管理的页面置换算法在考试中常常会考到,操作系统教材中主要介绍了3种常用的页面置换算法,分别是:先进先出法(FIFO).最佳置换法(OPT)和最近最少使用置换法(LRU).大 ...

  3. 请求页式存储管理中页面置换算法的模拟设计_操作系统-存储管理与文件管理-笔记...

    存储管理 一.页式存储 将各进程的虚拟空间划分成若干个长度相等的页,页式管理把内存空间按页的大小划分成片或者页面,然后把页式虚拟地址与内存地址建立一一对应页表,并用相应的硬件地址变换机构,来解决离散地 ...

  4. 最佳页面置换算法代码_(存储管理)页面置换算法

    1. 最佳(OPT,Optimal) 所选择的被换出的页面将是永久或者是最长时间内不再被访问,通常可以保证获得最低的缺页率.是一种理论上的算法,因为无法知道一个页面多长时间不再被访问.所以常用于评价其 ...

  5. 虚拟存储页面置换算法c语言,虚拟存储器管理页面置换算法模拟实验.doc

    虚拟存储器管理页面置换算法模拟实验 淮海工学院计算机工程学院 实验报告书 课程名:< 操作系统原理A > 题 目: 虚拟存储器管理 页面置换算法模拟实验 班 级: 软件*** 学 号: 2 ...

  6. 操作系统之虚拟存储管理 java python 实现 最优(Optimal)置换算法 先进先出(FIFO)页面置换算法 LRU(Least Recently Used)置换算法

    操作系统之虚拟存储管理 实验内容:模拟请求分页虚拟存器管理技术中的硬件地址变换.缺页中断以及页式淘汰算法,处理缺页中断. 实验目的:清楚认识请求分页管理. 最佳(Optimal)置换算法 其所选择的被 ...

  7. 操作系统-内存管理(快表的地址变换机构,两级页表,虚拟内存的基本概念,基本页式管理下的页表和页面置换算法)

    文章目录 1.快表地址变换机构 2. 两级页表 3. 虚拟内存的基本概念 基本分页存储管理 1.快表地址变换机构 快表,又称联想寄存器(TLB,translation lookaside buffer ...

  8. java 最少使用(lru)置换算法_[内附完整源码和文档] 基于C#的可视化虚拟存储器管理(LUR算法)...

    一.目的要求 理解虚拟存储器概念,并掌握分页式存储管理地址转换和缺页中断的处理过程.用高级语言模拟请求分页式虚拟存储器的工作过程和页面置换算法LRU. 二.准备知识 2.1 分页式存储管理原理 在存储 ...

  9. 时钟页面置换算法c语言,clock置换算法例题(改进clock置换算法例题讲解)

    Clock页面置换算法: 6)动态给出页面调用序列并进行调度: 7)输出置换结. C++编程要? 考试用 哪位大侠 帮帮 快点 谢谢了 这很简单啊,要打字太多了.不过网上这类算法举例很少,就看你怎么理 ...

最新文章

  1. 设计模式---装饰模式
  2. 三目运算符_Java中的三目运算符
  3. 实现二维码-完整三种编码流程加代码解析(javascript)
  4. 成年人不懂这些道理,会吃很多亏
  5. C语言课后习题(41)
  6. php 参数 问号_php获取不到url问号之后的参数
  7. 程序员,Linux 下如何避免从删库到跑路的悲剧?
  8. HttpURLConnection请求数据流的写入(write)和读取(read)
  9. 百度贴吧诱导用户操作CPA项目
  10. 算法设计与分析 —— 排列问题
  11. Docker bridge 模式 容器如何访问外部世界?
  12. python怎样使用各个日期赤纬_行星的上合、下合、大冲、大距、方照、逆行、合月时间计算...
  13. 迅雷之CDN加速下载/离线下载
  14. Dmc雷赛板卡仿写(三):创建类
  15. C语言——从文本文件中读入及向文本文件中写入内容
  16. 微信小程序——简单饮食推荐(二)
  17. dataTable自定义搜索框位置
  18. 记一次使用开源代码的微博爬虫的经历
  19. A Unified Generative Framework for Aspect-Based Sentiment Analysis
  20. (转)名企工资一览表 更加明确 自己的目标。

热门文章

  1. thinkphp中URL传参数的几种方式
  2. 洛谷 P3521 [POI2011]ROT-Tree Rotations 解题报告
  3. Spring Cloud Dalston.SR5 BUG一记
  4. set built-in function
  5. Get Started Part 2
  6. PL/SQL七复合数据结构
  7. 原来还有这样一个东西,重来不知道过-linux ,ulimit
  8. jQuery防止多次提交
  9. [转载]Java数据库设计中的14个技巧
  10. hpuoj--1093: 回文数(一)