基于《CSAPP第九章 虚拟内存》的思考和总结
在csapp的描述中,虚拟内存的形象更加具化,虚拟内存被组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组,内存充当了磁盘的缓存,粗呢内存的许多概念与SRAM缓存是相似的。虚拟页面有以下三种状态:
- 未分配(pte的有效位为0,且pte的地址段为空)
- 未缓存(pte的有效位为0,且pte的地址段指向磁盘的某一位置)
- 已缓存(pte的有效位为1,且pte的地址段指向内存的某一位置)
这是将物理地址的范围扩大到除了内存之外,还包含磁盘。虚拟地址照常根据MMU进行多级页表转换,得到的地址可能是物理页号(内存中)或者磁盘地址。虚拟内存系统是虚拟地址的扩展应用。

在xv6系统和JOS系统中,并没有使用到磁盘上的虚拟内存,MMU得到的结果始终在内存上,否则就是缺页,在内存上分配新的页面,并无磁盘的利用。推测应该使用swap交换区来实现。
当操作系统调用malloc分配一个新的虚拟内存页的时候,首先会在磁盘上创建空间,并更新PTE。
在磁盘和内存之间传送页面的活动称为交换(swapping)或者页面调度,分为换入和换出。页面调度通常发生在有不命中发生的时候,这叫做按需页面调度。也可以通过预测的方式提前将可能用到的页面调入内存,这就有点像分支预测,但通常不被使用,可能是因为比起分支预测的惩罚,页面调度失败的代价比较大。由于程序的局部性,页面调度可能不需要频繁发生,如果工作集的大小超过了物理内存的大小,就不可避免地会发生频繁的换入换出,这种状态称为抖动,会大大影响程序的性能。不管虚拟地址翻译的结果在不在磁盘,最终cpu都要从内存读数据,因此如果不在内存,有效位会是0,发生正常的缺页,进行页面调度,如果内存已满,则要根据一些策略选择换出页面,这里还涉及到像缓存里相似的直写和写回的选择。
【缺页异常可能有三种原因】
- 段错误,访问一个不存在的页面;
- 正常缺页,则进行页面调度,然后重新执行;
- 保护异常,违反了页面的权限许可,返回错误码即可。
此外,pte上不止有有效位,还有各种标志位,控制了不同程序对页面的访问和读写权限。正因为此,我们说虚拟内存可以更好地管理内存。
【关于共享内存】
比如图中的PP6,操作系统对共享内存的控制是:不允许进程修改任何与其他进程共享的虚拟页面,除非所有的共享者都显式地允许它这么做。
在Copy-On-Write中,当需要写一段共享内存的时候,会将这段内存在另一个内存区域复制出副本,此时便不再是共享的内存,不必受到共享内存的限制。在其它情况下,如果要写共享内存,则需要对共享者之间的进程通信,得到所有进程的允许信号后才写入。
【由共享内存,可以扩展到C++多线程编程中的共享对象】
进程与线程的区别是,不同进程有不同的页表基地址,不容易出现共享内存,而线程作为一个进程内的子单元,使用同样的页表基地址,内存都是共享的。(在xv6实验multithreading中,提到linux对多线程的支持,待总结。)当一个对象被多个线程同时使用的时候,常常采用加锁的方式、或者shared_ptr/weak_ptr这种智能指针的方式保证数据读写安全,尤其是对象析构时期的安全,此时,这段共享内存的安全读写需要另一段内存里的对象的锁成员,或者栈上的智能指针来保护,这些都是在用户进程中显式约定的,而不是由OS控制。

【虚拟地址到物理地址的翻译过程】

虚拟内存的映射和高速缓存比较相似,那么虚拟内存和高速缓存是怎么结合,共同为CPU提供数据服务的呢?
答案是,CPU查找数据的时候,首先去cache中查找,cache查找失败的话,也是先从内存load到cache中,总之是一定经过cache的,这样的缓存原理也可以解释为什么近期浏览的网页记录丢失的话,可以从缓存里找到踪迹,因为近期访问过的内存都会存入缓存。

除了cache高速缓存之外,为了让cpu更快地访问内存,还有第二个措施,就是TLB快表。cache缓存的是物理地址对应的数据,快表缓存的是虚拟地址对应的物理地址,存放于MMU中,与处理器同在CPU芯片内。

基于《CSAPP第九章 虚拟内存》的思考和总结的更多相关文章
- CSAPP:第九章 虚拟内存
CSAPP:第九章 虚拟内存 关键点:虚拟内存.物理内存 9.1 物理地址和虚拟地址9.2 地址空间9.3 虚拟内存作为缓存的公工具 9.1 物理地址和虚拟地址 计算机的主存被组织成一个由M个连续 ...
- csapp第九章笔记-虚拟内存
目录 物理与虚拟寻址 地址空间 虚拟内存作为缓存的工具 虚拟内存作为内存管理的工具 虚拟内存作为内存保护的工具 地址翻译 使用TLB(翻译后备缓冲器)加速地址翻译 多级页表 物理与虚拟寻址 计算机系统 ...
- 深入理解计算机系统 第九章 虚拟内存 Part1 第二遍
这次花了4小时40分钟,看了第 559~575 页,共 17 页 第一遍对应地址 https://www.cnblogs.com/stone94/p/10264044.html 注意:本章的练习题一定 ...
- 第九章 基于HTTP的功能追加协议
第九章 基于HTTP的功能追加协议 通过在HTTP的基础上添加新的功能来提高性能和功能. 一.消除HTTP瓶颈的SPDY SPDY(SPeeDY)目的是提高HTTP性能,缩短Web页面的加载时间(50 ...
- 《汇编语言 基于x86处理器》第九章字符串与数组部分的代码
▶ 书中第九章的程序,主要讲了字符串相关的输入.输出,以及冒泡排序.二分搜索 ● 代码,Irvine32 中的字符串库函数代码范例 INCLUDE Irvine32.inc .data str1 BY ...
- 精通Web Analytics 2.0 (11) 第九章: 新兴分析—社交,移动和视频
精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第九章: 新兴分析-社交,移动和视频 网络在过去几年中发生了不可思议的发展变化:从单向对话到双向对话的转变; 由视频,Ajax和 ...
- [转]Windows Shell 编程 第九章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987969】
第九章 图标与Windows任务条 如果问一个非程序人员Windows最好的特色是什么,得到的答案应该是系统最有吸引力的图标.无论是Windows98现在支持的通用串行总线(USB)还是WDM(看上去 ...
- JavaScript DOM编程艺术-学习笔记(第八章、第九章)
第八章 1.小知识点: ①某些浏览器要根据DOCTYPE 来决定页面的呈现模式(标准模式 / 怪异模式--也称兼容模式): 兼容模式意味着浏览器要模仿老一辈的浏览器的怪异行为,来让老站点得到运行,并让 ...
- jQuery第九章
第九章 jQuery Mobile 一.HTML5.0简介 谈到Web设计,我们经常把Web分为三个层: (1)结构层:(2)表现层:(3)行为层. 对应的技术分别是: (1)HTML:(2)CSS: ...
随机推荐
- Python触发异常
我们可以使用raise语句自己触发异常,raise语法格式如下: raise [Exception [, args [, traceback]]] 语句中 Exception 是异常的类型(例如,Na ...
- 面试官:JavaScript如何实现数组拍平(扁平化)方法?
面试官:JavaScript如何实现数组拍平(扁平化)方法? 1 什么叫数组拍平? 概念很简单,意思是将一个"多维"数组降维,比如: // 原数组是一个"三维" ...
- 云主机新增swap分区
云主机内存不够用,如何新增swap 分区. 如何启用swap分区? 步骤如下: 1.查看当前系统中是否已经启用swap分区 1 2 cat /proc/swaps top 2.如果没有启用swa ...
- Linux部署Apollo+.Net Core简单使用
Apollo官方网站非常详细,以下只是本人学习过程的整理 一.概念 Apollo(阿波罗)是一款可靠的分布式配置管理中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并 ...
- 用tsc编译ts文件的时候报错,tsc : 无法加载文件,因为在此系统上禁止运行脚本;
用tsc编译ts文件的时候报错,tsc : 无法加载文件,因为在此系统上禁止运行脚本:SecurityError 在vscode的控制台或者Windows PowerShell中用tsc命令编译ts文 ...
- 自动下载MarkDown格式会议论文的程序
近期师兄发给我一个压缩包让我整理文献,而我发现压缩包里的内容是这样: 这样: 和这样的: 我大概看了一下,可能有270多篇文章是这种格式,俗话说的好,没有困难的工作,只有勇敢的研究僧.所以决定用Pyt ...
- ofd文件电子签章实现方法
前言 文档处理一般经过三个环节:流.版.签:流式软件负责编辑,如:office.wps等.版式软件负责文档定型,保证显示样式不跑偏:版式文件格式有两种:pdf.ofd.签章软件负责对版式文档签章.签章 ...
- 第五周PTA笔记 后缀表达式+后缀表达式计算
后缀表达式 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右进行(不用考虑运算符的优先级). 如:中缀表达式 3(5–2 ...
- 大爽Python入门教程 1-5 答案
大爽Python入门公开课教案 点击查看教程总目录 1 方向变换 >>> 51//4 12 >>> 51%4 3 答: 向左转51次之后, 小明面朝东方, 转过了1 ...
- [cf1421E]Swedish Heroes
令$p_{i}$为最终$a_{i}$之前的系数($p_{i}\in \{-1,1\}$),则有$n+\sum_{i=1}^{n}[p_{i}=-1]\equiv 1(mod\ 3)$ 证明:对于两个满 ...