基本概念与实现

1)局部性原理

在一段时间内,运行的作业程序仅访问(涉及到)一部分作业代码,即不会涉及整个地址空间。即在一段时间间隔内,仅装入一部分代码,作业照样能正常运行

2)虚拟存储器的引入

作业(进程)运行时,仅装入其代码的一部分到物理内存,待需要时再装入其余部分,同时还可将不再运行的部分调出物理内存。变相地扩充了内存容量,即实现了虚拟存储器。

虚拟内存

①虚拟内存将内存抽象成一个巨大的、统一的存储数组,进而将用户看到的逻辑内存与物理内存分开
②只要部分程序需要放在内存中就能使程序执行
③逻辑地址空间可以比物理地址空间大
④允许地址空间被多个进程共享
⑥允许更多进程被创建
 
 
 
虚拟地址空间
 
 
 
当处理器读或写入内存位置时,它会使用虚拟地址。作为读或写操作的一部分,处理器将虚拟地址转换为物理地址。通过虚拟地址访问内存有以下优势
 
①程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区。
 
②程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。当物理内存的供应量变小时,内存管理器会将物理内存页(通常大小为 4 KB)保存到磁盘文件。数据或代码页会根据需要在物理内存与磁盘之间移动。
 
③不同进程使用的虚拟地址彼此隔离。一个进程中的代码无法更改正在由另一进程或操作系统使用的物理内存。
 
 
进程可用的虚拟地址范围称为该进程的虚拟地址空间。每个用户模式进程都有其各自的专用虚拟地址空间。 对于 32 位进程,虚拟地址空间通常为 2 GB,范围从 0x00000000 至 0x7FFFFFFF。对于 64 位进程,虚拟地址空间为 8 TB,范围从 0x000'00000000 至 0x7FF'FFFFFFFF。一系列虚拟地址有时称为一系列“虚拟内存”
 
 
虚拟内存可以用以下方式来实现
 
①覆盖与交换技术
②请求页式调度
③请求段式调度
 
 
 
①覆盖与交换技术
 
 
 
 
②请求页式调度
 

算法思想:

作业分页(page),内存分块(帧,frame),页与块的大小相等。先装入部分页到物理内存,待运行需要时再调入新的页,淘汰旧的页(交换)

只在页面需要时,才把它们载入物理内存:需要更少的输入输出,更小的内存,更快的响应,更多的用户
 
有效-无效位:
 
页表中的每一项与一有效无效位与之关联。(1表示该页在物理内存中,0表示不在物理内存)
有效无效位初始为0
当进程试图访问那些尚未调入到物理内存的页时,对标记为无效的页面的访问会产生页错误陷阱(page-fault trap,缺页)
 
 
 
 
当有些页不在内存中时的页表:
 
 
 
 
缺页(中断)
 
 
1.检查进程的页表,以确定该引用是合法还是非法的地址访问。
2.如果引用非法,那么终止进程。如果引用有效但是尚未调入页面,引起缺页中断。
3.找到一个空闲块(从空闲块链表中取一个)
4.调度一个磁盘操作,以便将所需要的页调入刚分配的块
5.当磁盘读操作完成后,修改进程的内部表和页表,以表示该页已在内存中。
6.重新开始因非法地址陷阱而中断的指令。进程现在能访问所需的页,就好像它似乎总在内存中。
 
 
处理缺页的步骤:
 
 
 
处理缺页的流程:
 
 
 
 
 
那么。。没有空闲块时该如何处理?
 
页替换: 在内存中找到一些不再使用的页,将它换出。
 
 
页面置换
 
 
给原有的缺页中断服务程序增加页置换,可以防止内存的过度分配(over-allocating)。
使用修改位(脏位)来降低页传输的开销 - 只有被修改过的页才写回至磁盘。
页置换分开了逻辑内存与物理内存 - 采用这种机制,小的物理内存能为程序员提供巨大的虚拟内存。
 
 
页置换的基本方法
 
1.查找所需页在磁盘上的位置;
2.查找一空闲块;
 如果有空闲块,那么就使用它;
 如果没有空闲块,那么就使用页置换算法以选择一个“牺牲”块(victim frame);
 将“牺牲”块的内容写到磁盘上;修改页表;
3.将所需页读入(新)空闲块;修改页表;
4.重启用户进程;
 
 
页面置换算法
 
主要追求最低的缺页
 
常用的页面置换算法模拟:见文章 页面调度算法模拟
 
 
块分配
 
 
每个进程需要最低数量的页

例如:IBM 370至少需要6页用来处理SS MOVE指令

 指令是多字节指令,可能跨越2页
 要移动的字符的块和要移动到目的的区域也可能都要跨页。
 
两种主要的分配方案:固定分配,优先级分配
 
 
固定分配
 
平均分配:如100块,5个进程,则给每个进程20块
比例分配:根据进程的大小按比例分配
特点:每个进程所分配的数量会随着多道程序的级别而有所变化;优先级进程与低优先级进程在这种分配方式下没有任何区别。
 
 
优先级分配
 
按优先级比例而非进程的大小来分配
 
如果进程 Pi 产生了一个缺页,那么:
  从自身的块中选择用于替换
  从比自身优先级低的进程中选取块用于替换
 
 
全局置换:允许一个进程从所有块集合中选择一个置换块,而不管该块是否已分配给其他进程;一个进程可以从另一个进程中取块。
局部置换:要求每个进程仅从其自己的分配块中进行选择
 
 
 
系统颠簸(抖动)
 
 
抖动:进程一直忙于将页面换进换出。
如果一个进程没有足够的页,那么缺页率就会非常高。这会导致CPU使用率低,这时OS认为必须提高多道程序的程度,因此,新的进程会加入到系统中来。
 
 
 

OS存储器管理(三) 虚拟存储器的更多相关文章

  1. OS存储器管理(一)

    存储器的层次: 分为寄存器.主存(内存)和 辅存(外存)三个层次. 主存:高速缓冲存储器.主存储器.磁盘缓冲存储器, 主存又称为可执行存储器: 辅存:固定磁盘存储器.可移动的外部存储器: 其可长期保存 ...

  2. OS存储器管理(二)

    离散分配 分页(Paging),分段,段页式 一.分页   一个进程的物理地址可以是非连续的:   将物理内存分成固定大小的块,称为块(frame): 将逻辑内存分为同样大小的块,称为页(page): ...

  3. Intel 80386 微处理器的存储器管理

    一.存储器的管理       存储器的管理是一种硬件机制,微处理器在总线地址上对物理存储器进行寻址.但是,为了给程序提供比物理存储器容量更大的空间,就引入了虚拟存储器的概念,它在外存(比如磁盘)的支持 ...

  4. MMU——存储器管理单元

    更多文档参见:http://pan.baidu.com/s/1qW0hjwo MMU,全称Memory Manage Unit, 中文名——存储器管理单元. 许多年以前,当人们还在使用DOS或是更古老 ...

  5. 从内存管理原理,窥探OS内存管理机制

    摘要:本文将从最简单的内存管理原理说起,带大家一起窥探OS的内存管理机制,由此熟悉底层的内存管理机制,写出高效的应用程序. 本文分享自华为云社区<探索OS的内存管理原理>,作者:元闰子 . ...

  6. Django之学员管理三

    Django之学员管理三 web框架的本质: 本质是客户端和服务端的交互.用socket实现. socket客户端(浏览器) 2.发送ip和端口,http://www.baidu.com:80/ind ...

  7. 异数OS 星星之火(三)--异数OS-织梦师云 微服务编写入门

    . 异数OS 星星之火(三)–异数OS-织梦师云 微服务编写入门 本文来自异数OS社区 github: https://github.com/yds086/HereticOS 异数OS社区QQ群: 6 ...

  8. 8、Cocos2dx 3.0三,找一个小游戏开发3.0存储器管理的版本号

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27693365 复杂的内存管理 移动设备上的硬件资源十 ...

  9. Linux内存描述之内存区域zone–Linux内存管理(三)

    服务器体系与共享存储器架构 日期 内核版本 架构 作者 GitHub CSDN 2016-06-14 Linux-4.7 X86 & arm gatieme LinuxDeviceDriver ...

随机推荐

  1. JavaScript学习笔记–(new关键字)

    作用 是创建一个对象实例.这个对象可以是用户自定义的,也可以是一些系统自带的带构造函数的对象. 描述 创建一个对象类型需要创建一个指定了名称和属性的函数:其中这些属性可以指向它本身,也可以指向其他对象 ...

  2. Java api 入门教程 之 JAVA的String 类

    1.String对象的初始化 由于String对象特别常用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下: String s = “abc”; s = “Java语 ...

  3. 自定义SeekBar的使用

    一.seekbar是进度条,可以使用系统的,也可以自己定义,下面我们将自己定义一个seekbar. 1.自定义滑条,包括对背景,第一进度,第二进度的设置,通过一个xml来实现,在drawable下创建 ...

  4. Android开发中XML布局的常用属性说明

    <!-- 常用属性说明: android:id="@+id/button" 为控件指定Id android:text="NNNNNNNNNN" 指定控件的 ...

  5. SQLServer中比较末尾带有空格的字符串遇到的坑

    最近发现SQLServer中比较字符串的时候 如果字符串末尾是空格 那么SQLServer会无视那些空格直接进行比较 这和程序中平时的字符串判断逻辑不统一 );set @a=N'happycat198 ...

  6. 再不写,我怕就再也不写了-LAMP基础

    hi 经历了4天大餐的洗礼,整个人都思密达了...昨天的懒,是没有原因的懒,总之就是该提笔了亲 1.Ubuntu下的LAMP配置 -----Ubuntu基础知识----- ----管理员权限 出于安全 ...

  7. 清除浮动clear/BFC

    浮动的清除有两种方式: 一.clear clear:both/left/right; 二.创建BFC (1)什么是BFC? BFC,块级格式化上下文,是一个独立的渲染区域,只有Block-level ...

  8. 从〇开始构架前端(NLDV框架)

    从〇开始构架前端(NLDV框架) 框架 设计模式 摘要:一个普通应用,大到微信, 小到豆瓣FM,必不可少的都包括四部分:Network.Logic.Data.View(NLDV).如何把他们组合起来, ...

  9. NOIP2011pj表达式的值[树形DP 笛卡尔树 | 栈 表达式解析]

    题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例如:计算表达式A⊕B × ...

  10. XML(DOM解析)

    //创建book.xml 文件 <?xml version="1.0" encoding="UTF-8"?> <books> <b ...