基于《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: ...
随机推荐
- xiaoxiaole
common.cpp #include "common.h" common.h #ifndef COMMON_H_INCLUDED #define COMMON_H_INCLUDE ...
- (一)lamp 环境搭建之编译安装apache
apache的编译安装: 安装步骤大概参考:http://www.cnblogs.com/iyoule/archive/2013/10/24/3385540.html 简单的将分为三步: (1)安装a ...
- Iptables 代理局域网内的主机上网
参考连接:https://developer.aliyun.com/article/607330 环境为云环境,有外网主机的IP为192.168.0.39,无外网主机的IP为192.168.0.228 ...
- k8s入坑之路(10)kubernetes coredns详解
概述 作为服务发现机制的基本功能,在集群内需要能够通过服务名对服务进行访问,那么就需要一个集群范围内的DNS服务来完成从服务名到ClusterIP的解析. DNS服务在kubernetes中经历了三个 ...
- Java测试开发--Comparable和Comparator接口(五)
Comparable 简介Comparable 是排序接口.若一个类实现了Comparable接口,就意味着"该类支持排序".此外,"实现Comparable接口的类的对 ...
- redis-sentinel "DENIED Redis is running in protected mode"
protected-mode no in sentinel.conf https://github.com/antirez/redis/issues/3106
- Idea tomcat debug按钮灰色无法运行
打开Project Structure 2.选中src,点击按钮关闭界面,重启idea即可
- 作为Bootstrap中文站维护者-我们再次翻译BootstrapVue项目
点击立即进入BootstrapVue中文站 http://code.z01.com/bootstrap-Vue Bootstrap-Vue 基于全球最流行的前端框架组合应用系统 项目介绍 Bootst ...
- go微服务框架Kratos笔记(七)使用jwt认证中间件
引言 Json web token (JWT) 是一个开放标准(RFC 7519),它定义了一种紧凑的.自包含的方式,特别适用于分布式站点的单点登录(SSO)场景.JWT的声明一般被用来在身份提供者和 ...
- liunx基础知识点2:文件操作命令、系统资源查询、权限赋予命令、安装命令、解压命令