基本概念与实现

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. JS代码判断字符串中有多少汉字

    $("form").submit(function () { var content = editor.getContentTxt(); var sum = 0; re = /[\ ...

  2. spring项目的 context root 修改之后,导致 WebApplicationContext 初始化两次的解决方法

    修改了 spring web 项目的 context root 为 / 之后,在启动项目时,会导致 WebApplicationContext  初始化两次,下面是其初始化日志: 第一次初始化: 四月 ...

  3. 烂泥:nginx负载均衡

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 今天我们来学习下有关nginx的负载均衡配置.nginx的负载均衡是通过nginx的upstream模块和proxy_pass反向代理来实现的. 说明: ...

  4. Linux和开源已经在2013年开始悄悄主宰世界?

    提到Linux,很多人觉得它依旧不温不火,实际上在这个即将过去的一年,Linux和开源软件已经悄悄主宰了计算领域的各方面,这具体表现在开源项目遍地、Chromebook崛起、SteamOS备受瞩目、A ...

  5. jmeter 如何将上一个请求的结果作为下一个请求的参数——使用正则提取器

    1.简介 Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域. 它可以用于测试静态和动态资源例如 ...

  6. Sqlserver2008R2 数据库镜像配置步骤

    Sqlserver2008镜像功能可以保障数据库的高可用性.数据库镜像维护着数据库的两个副本,这两个副本必须分别放置在不同的SQL Server数据库实例中.可以用两台服务器也可以用一台服务器的不同实 ...

  7. 我所了解的各公司使用的 Ceph 存储集群 (携程、乐视、有云、宝德云、联通等)

    Ceph 作为软件定义存储的代表之一,最近几年其发展势头很猛,也出现了不少公司在测试和生产系统中使用 Ceph 的案例,尽管与此同时许多人对它的抱怨也一直存在.本文试着整理作者了解到的一些使用案例. ...

  8. Windows系统小知识

    前言 本文写作于Window10发布后的2015-08-01,新系统发布后我做了新系统的小白鼠,所以写此文以作记录. WIN10各版本下载地址:http://www.ithome.com/html/w ...

  9. LoadRunner 12.02 安装教程及中文语言包安装

    注意事项: 安装前,把所有的杀毒软件和防火墙关闭. 若以前安装过LoadRunner,则将其卸载. 安装路径不要带中文字符. LoadRunner 12已经不再支持xp系统,仅支持win7和win8系 ...

  10. Java手动添加SSL证书

    出现错误为 SSLHandshakeException - unable to find valid certification path to requested target 在服务器上找到对应的 ...