💻 Computer Basics
1、计算机网络
1.1 传输层:TCP和UDP
1.1.1 三次握手
1.1.2 四次挥手
1.1.3 流量控制
1.1.4 拥塞控制
1.1.5 TCP和UDP的区别
1.1.6 TCP如何保证传输的可靠性
1.1.7 TCP长连接和短连接
1.1.8 应用层提高UDP协议可靠性的方法
1.1.9 UDP和IP的首部结构
1.2 应用层:HTTP和HTTPS
1.2.1 HTTP和HTTPS的区别
1.2.2 GET和POST的区别
1.2.3 Session与Cookie的区别
1.2.4 从输入网址到获得页面的过程(越详细越好)
1.2.5 HTTP请求有哪些常见的状态码
1.2.6 什么是RIP,算法是什么
1.2.7 HTTP1.1和HTTP2.0的主要区别
1.2.8 DNS
1.2.9 HTTPS加密和认证过程
1.2.10 常见网络攻击
1.2.11 REST
1.3 计算机网络体系结构
1.4 网络层协议
1.4.1 IP地址的分类
1.4.2 划分子网
1.4.3 什么是ARP协议
1.4.4 NAT协议
2、操作系统
2.1 进程和线程
2.1.1 进程和线程的区别
2.1.2 进程间通信方式
2.1.3 同步原语
2.1.4 进程状态
2.1.5 进程调度策略
2.1.6 僵尸进程和孤儿进程
2.1.7 协程
2.1.8 异常控制流
2.1.9 IO多路复用
2.1.10 用户态和内核态
2.2 死锁
2.3 内存管理
2.3.1 分段与分页
2.3.2 虚拟内存
2.3.3 页面置换算法
2.3.4 局部性原理
2.3.5 缓冲区溢出
2.4 磁盘调度
-
+
tourist
register
Sign in
虚拟内存
## 1 为什么需要虚拟内存 1. 内存是计算机系统的重要计算资源,在介绍虚拟内存之前,让我们先思考一个问题,**当多个应用程序同时运行时**,**操作系统该如何让他们共同使用物理内存资源呢**: 1. 一种简单的方法是当一个应用程序$A$运行时,**允许他访问所有的物理内存资源**,在切换到另一个应用程序$B$运行的过程中,操作系统**将应用程序**$A$**的所有内存数据保存到存储设备**(如磁盘)**中**,然后**将应用程序**$B$**的数据从存储设备加载到内存中**,但是这种方法存在明显的弊端,由于读写存储设备的速度很慢,这将导致**切换程序的时间开销太大**。 2. 另一种简单的方法是**让每个应用程序独立使用物理内存的一部分**,**数据一致驻留在内存中**,在程序切换时不再需要操作存储设备,该方法在性能方面优于前一种方法,但是也存在两个严重的弊端,一是**无法保证不同应用程序所使用的的物理内存之间的隔离性**,比如应用程序$A$在运行过程中可能意外地写了应用程序$B$的物理内存,进而导致后者错误运行,二是**无法保证应用程序可用的地址空间是连续的和统一的**,**增加了程序编写及编译的复杂性**。 2. 为了让不同的应用程序能够既高效又安全地共同使用物理内存资源,现代操作系统的一个普遍做法是**在应用程序与物理内存之间加入一个新的抽象**,即**虚拟内存**,它具有如下特点: 1. 应用程序是**面向虚拟内存编写**的而不再是面向物理内存编写的,应用程序在**运行时只能使用虚拟地址**,而且每个应用程序**只能看到自己的虚拟地址空间**,从而保证**不同应用程序所用内存之间的隔离**,**每个应用程序的虚拟地址空间是统一的**、**连续的**,**从而降低了编程的复杂性**。 2. **CPU负责将虚拟地址翻译成物理地址**,**操作系统负责设置虚拟地址与物理地址之间的映射**,**将应用程序实际使用的虚拟地址映射到物理地址**,**从而提高内存资源的利用率**。 3. 虚拟内存的设计具有如下三个方面的目标: 1. **高效性**: 1. **虚拟内存抽象不能在应用程序运行过程中造成明显的性能开销**。 2. **虚拟内存抽象不应该占用过多的物理内存资源**,**从而导致物理内存的有效利用率**(即存储应用程序的物理内存大小占总物理内存大小的比例)**明显降低**。 2. **安全性**: 1. **虚拟内存抽象需要使不同应用程序的内存相互隔离**,**即一个应用程序只能访问属于自己的物理内存区域**。 3. **透明性**: 1. **虚拟内存抽象需要考虑到对应用程序的透明性**,**使得应用程序开发者在编程时无需考虑虚拟内存抽象**。 ## 2 虚地址与物理地址 1. 逻辑上,我们可以把物理内存看成一个大数组,其中每个字节都可以通过与之唯一对应的地址进行访问,这个地址就是物理地址,在应用程序或操作系统运行过程中,**CPU通过总线发送访问物理地址的请求**,**从内存中读取数据或者象棋中写入数据**。 2. 在引入虚拟内存的抽象后,**应用程序使用虚拟地址访问存储在内存中的数据和代码**,在程序执行过程中,**CPU会把虚拟地址转换成物理地址**,然后**通过物理地址访问内存**。 3. 虚拟地址转换成物理地址的过程,通常被称为**地址翻译**,由CPU中的**内存管理单元**(Memory Management Unit, MMU)**负责**,程序在CPU核心上运行期间,他使用的虚拟地址都会由MMU进行翻译,当需要**访问物理内存设备**的时候,MMU翻译出的物理地址将会**通过总线传到相应的物理内存设备**,从而**完成相应的物理内存读写请求**。 ![](https://notebook.ricear.com/media/202206/2022-06-28_210407_106559.png) > 运行Hello World程序的第一条指令的具体过程如下: > > 1. 操作系统首先把程序从磁盘/SSD加载到物理内存中,然后让CPU去执行程序的第一条指令,但是此时**该指令存在于内存中**。 > 2. 在使用虚拟内存的情况下,**CPU取指令时发出的是指令的虚拟地址**,该虚拟地址被**MMU翻译为对应的物理地址**,**包含该物理地址的内存读请求被发送到物理内存设备**,然后**物理内存设备把该物理地址对应的内容**(即Hello World程序的第一条指令)**发送给CPU**。 > ## 3 地址翻译原理 MMU将虚拟地址翻译为物理地址的主要机制有两种,分别为**分段机制**和**分页机制**。 ## 4 虚拟内存的功能 虚拟内存抽象**使应用程序能够拥有一个独立而连续的虚拟地址空间**,其通过页表与硬件的配合能够**在对应用程序透明的前提下自动地进行虚拟地址到物理地址的翻译**,除此之外,虚拟内存还带来了许多有用的功能,主要包括**共享内存**、**写时拷贝**和**内存去重**。 ### 4.1 共享内存 1. 共享内存**允许同一个物理页在不同的应用程序间共享**,例如,应用程序$A$的虚拟页$V1$被映射到物理页$P$,若应用程序$B$的虚拟页$V2$也被映射到物理页$P$,则物理页$P$是应用程序$A$和应用程序$B$的共享内存,应用程序$A$读取虚拟页$V1$和应用程序$B$读取虚拟页$V2$将得到相同的内容,互相也能看到对方修改的内容。 2. 共享内存的一个基本用途是**可以让不同的应用程序之间互相通信**、**传递数据**。 3. 基于共享内存的思想,操作系统又从中衍生出诸如写时拷贝、内存去重等功能。 ![](https://notebook.ricear.com/media/202207/2022-07-05_202717_267329.png) ### 4.2 写时拷贝 > - 我们可以思考以下两个场景: > - 第一个场景是两个应用程序拥有很多的内存数据(比如加载了相同的动态链接库) ,如果把这些**数据相同的内存页在物理内存中仅存储一份**,然后**以只读的方式映射给两个应用程序**,那么就能够显著地**节约物理内存资源**。 > - 第二个场景是在Linux操作系统中,一个应用程序可以用 `fork`系统调用创建子程序,初始时,**父子程序的全部内存数据和地址空间完全一样**,如何能够高效地实现这种应用程序创建机制呢? > - 下面介绍的写时拷贝技术能够很好地应用于这两个场景。 > 首先我们回顾一下虚拟内存中的核心数据结构页表,每个页表项中除了记录物理页号,还记录了别的信息,具体来说,一个页表项的大小是64位,其中第47位至第12位用来存储物理地址(物理页号),剩下的位多为**属性位**,包括**用于标识虚拟页的权限**(该页是否可行、可执行)**的前限位**等,**写时拷贝正是利用表示是否可写的权限位来实现的**。 1. **写时拷贝技术允许应用程序**$A$**和应用程序**$B$**以只读的方式**(在页表项中清除可写位)**共享同一段物理内存**,**一旦某个应用程序对该内存区域进行修改**,**就会触发缺页异常**,**值得注意的是**,**这里的缺页异常是由于违反权限导致的**,**不同于之前所说的换页机制下的缺页异常是由于未映射导致的**。 2. **在触发了缺页异常后**,**CPU同样会将控制流传递给操作系统预先设置的缺页异常处理函数**,**在该函数中**,**操作系统会发现当前的缺页异常是由于应用程序写了只读内存**,**而且相应的内存区域又是被操作系统标记成写时拷贝的**,**于是**,**操作系统会在物理内存中将缺页异常对应的物理页重新拷贝一份**,**并且将新拷贝的物理页以可读可写的方式重新映射给触发异常的应用程序**,**此后再恢复应用程序的执行**。 > 针对上面提到的两个场景,写时拷贝技术一方面能够**节约物理内存资源**,比如**不同的应用程序以写时拷贝的方式映射相同的动态链接库**,另一方面可以**让父子程序以只读的方式共享全部内存数据**,**避免内存拷贝操作带来的时间和空间开销**。 > ![](https://notebook.ricear.com/media/202207/2022-07-05_205734_179700.png) ### 4.3 内存去重 1. 基于写时拷贝机制,操作系统进一步地涉及了内存去重的功能。 2. 操作系统可以**定期地在内存中扫描具有相同内容的物理页**,并且**找到映射到这些物理页的虚拟页**,然后**只保留其中一个物理页**,并**将具有相同内容的其他虚拟页都用写时拷贝的方式映射到这个物理页**,然后**释放其他的物理页以供将来使用**。 3. 内存去重通常**由操作系统主动发起使用**,**对于用户态应用程序完全透明**。 4. 内存去重功能同时也具有一些不足: 1. **会对应用程序访存时延造成影响**,**当应用程序写一个被去重的内存页时**,**既会触发缺页异常**,**又会导致内存拷贝**,**从而可能导致性能下降**。 2. **可能带来安全问题**,一个简单的攻击是**攻击者可以在内存中通过穷举的方式不断构造数据**,然后**等待操作系统去重**,**若访问延迟变长**,**则表明整个系统中存在相同的数据**,因此**攻击者可以通过这种猜测的方式去确认系统中是否存在某些敏感数据**,一种防御这种攻击的可能方法是**操作系统仅在同一用户的应用程序内存之间进行内存去重**,从而**使得攻击者无法猜测别的用户的应用程序中的数据**。 ## 参考文献 1. 《现代操作系统:原理与实现》
ricear
July 5, 2022, 9:15 p.m.
©
BY-NC-ND(4.0)
转发文档
Collection documents
Last
Next
手机扫码
Copy link
手机扫一扫转发分享
Copy link
Markdown文件
share
link
type
password
Update password