基于《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: ...
随机推荐
- 洛谷 P3195 [HNOI2008] 玩具装箱
链接: P3195 题意: 给出 \(n\) 个物品及其权值 \(c\),连续的物品可以放进一个容器,如果将 \(i\sim j\) 的物品放进一个容器,产生的费用是 \(\left(j-i+\sum ...
- linux 内核源代码情景分析——几个重要的数据结构和函数
页面目录PGD.中间目录PMD和页面表PT分别是由表项pgd_t.pmd_t和pte_t构成的数组,而这些表项都是数据结构 1 /* 2 * These are used to make use of ...
- Spring事务的介绍,以及基于注解@Transactional的声明式事务
前言 事务是一个非常重要的知识点,前面的文章已经有介绍了关于SpringAOP代理的实现过程:事务管理也是AOP的一个重要的功能. 事务的基本介绍 数据库事务特性: 原子性 一致性 隔离性 持久性 事 ...
- 双链路接入(双出口)isp运营商(负载分担)
USG作为校园或大型企业出口网关可以实现内网用户通过两个运营商访问Internet,并保护内网不受网络攻击. 组网需求 某学校网络通过USG连接到Internet,校内组网情况如下: 校内用户主要分布 ...
- es6实现继承详解
ES6中通过class关键字,定义类 class Parent { constructor(name,age){ this.name = name; this.age = age; } speakSo ...
- 计算机网络tcp
tcp/ip协议 什么是这个协议:计算机与网络设备之间通信的时候,两者需要使用相同的语言,如何侦察到对方,如何传输,谁先传输,都需要规定有一系列的协议,而tcp/ip协议则是这样的一种 tcp/ip的 ...
- Spring @Component生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致
正确注入方式: @Autowired private TFeeMapper TFeeMapper; 错误注入方式 @Autowired private TFeeMapper tFeeMapper; 这 ...
- Django 小实例S1 简易学生选课管理系统 6 实现登录逻辑
Django 小实例S1 简易学生选课管理系统 第6节--实现登录逻辑 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 1 业务逻辑 本教程第四节里 ...
- 『学了就忘』Linux软件包管理 — 48、给源码包打补丁
目录 1.补丁的生成 2.补丁的打入 在以前的软件源码包,需要打补丁的时候比较多.现在的源码包很少进行打补丁了,因为根据需求安装不同的版本即可,比较商业化了.(也就是知道如何给源码包打补丁就可以了,了 ...
- etcd install & configuration
目录 概述 先决条件 相关术语 ETCD 部署 源码安装 其他方式 安装报错 配置文件详解 etcdctl 使用 日志独立 概述 etcd 是兼具一致性和高可用性的键值数据库,为云原生架构中重要的基础 ...