基于《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: ...
随机推荐
- Flutter应用在夜神模拟器启动白屏问题
Flutter应用在夜神模拟器启动白屏问题 flutter run 出现如下错误 [ERROR:flutter/shell/gpu/gpu_surface_gl.cc(39)] Failed to ...
- 『学了就忘』Linux基础 — 6、VMware虚拟机安装Linux系统(超详细)
目录 1.打开VMware虚拟机软件 2.选择Linux系统的ISO安装镜像 3.开启虚拟机安装系统 (1)进入Linux系统安装界面 (2)硬件检测 (3)检测光盘 (4)欢迎界面 (5)选择语言 ...
- ASP.NET MVC 中使用 jQuery 实现异步搜索功能
常见的几种异步请求方式: Ajax.BeginForm 异步提交文本的形式 Ajax.ActionLinkk 文本链接的形式 Client Validataion 客户端的认证 一.用jQuer ...
- Educational Codeforces Round 113 (Rated for Div. 2)题解
\(A,B,C\)顺利签到,还是在\(D\)上面卡住了,之后在睡前还是想出来了,看来还是自己的思维不够敏捷和成熟... D. Inconvenient Pairs 简化题意,在一个直角坐标系中,有一些 ...
- Go语言核心36讲(Go语言进阶技术十四)--学习笔记
20 | 错误处理 (下) 在上一篇文章中,我们主要讨论的是从使用者的角度看"怎样处理好错误值".那么,接下来我们需要关注的,就是站在建造者的角度,去关心"怎样才能给予使 ...
- 欢迎加入XiyouLinuxGroup邮件列表
一:为什么要使用邮件列表? 与QQ,微信等即时通讯的交流方式相比,使用邮件列表交流有以下好处: 保存性好,易于阅读.它能将一个问题讨论的过程完全保存下来,但是QQ的话,聊天记录很容易就刷没了,再也无法 ...
- Go语言核心36讲(Go语言进阶技术十五)--学习笔记
21 | panic函数.recover函数以及defer语句 (上) 在本篇,我要给你展示 Go 语言的另外一种错误处理方式.不过,严格来说,它处理的不是错误,而是异常,并且是一种在我们意料之外的程 ...
- robot_framewok自动化测试--(5)Screenshot 库
Screenshot 库 Scrennshot 同样为 Robot Framework 标准类库,我们只将它提供的其它中一个关键字"TakeScreenshot",它用于截取到当前 ...
- 自定义实例默认值 axios.create(config)
自定义实例默认值 axios.create(config) 根据指定配置创建一个新的axios,也就就每个新 axios 都有自己的配置 新 axios只是没有取消请求和批量发请求的方法,其它所有语法 ...
- Linux usb 3. Host 详解
文章目录 1. 简介 2. Usb Core 驱动设备模型 2.1 Usb Device Layer 2.1.1 device (struct usb_device) 2.1.2 driver (st ...