本文根据 计算机操作系统 - 内存管理学习总结。
1、虚拟内存
(1)虚拟内存
- 目的:为了让每个进程认为自己拥有整个甚至大于内存空间大小的地址空间,便于地址的管理与访问。
- 方式:为了便于管理内存,操作系统将内存抽象成地址空间;利用分页技术,将每个进程的虚拟地址空间分为大小相同的块,称为页,其整个地址空间称为页表;而物理内存地址空间按相同大小进行分块,称为页框;页表项中存储着页框号,页框号加上偏移量即是实际的物理地址。
- 页表项不必要也不会全部映射到物理内存空间地址,当访问未映射的页表项时,引起页面中断,将访问最少的页表项对于的页框置换到磁盘,再将要访问的内容放入相应页框中,恢复执行程序指令。
(2)分页系统地址映射
- 每个程序拥有自己的虚拟地址空间,让程序误以为自己占有整个内存,虚拟空间按照需求分成相同大小的块,称为页;整块虚拟地址空间称为页表,其中每个页存储着实际物理内存的页框号(将物理内存按相同大小分成块,这些块称为页框);
- 当虚拟地址传入MMU时,其通过访问页表查询到页框号,并将页框号加上偏移地址,就组成了实际的物理内存地址。
- MMU还维护这一个快表(TLB),这个快表存储着经常访问的一些页表项信息,在传入虚拟地址时,MMU先快速查询TLB(并行查询),若没有再访问页表,同时更新快表内容;以此提高访问速度。
(3)页面置换算法
- 当程序运行过程中,若访问的页面不在内存中,那么将发生缺页中断陷入CPU内核,将缺页内容存入内存中,若内存已满,则需要将已存在内存中的页面置换出去。
- 最优页面置换算法
- 置换最长时间才访问到的页面,但是此算法不能实现,因为不能确定哪个页面是最长时间才访问到。
- 最近最少使用算法
- 使用链表维护,当进程访问到当前页面时,将当前页面放到链表头部;因此链表最尾端就是最近最少使用的页面。
- 最近未使用算法
- 每个页面维护着两个状态:R(访问:对页面进行读写),M(修改:对页面内容进行修改);
- R:0(未访问)1(访问)
- M:0(未修改)1(修改)
- 操作系统定期将R清零;
- 当发生缺页中断时,NRU算法随机地从类编号最小的非空类中挑选一个页面将它换出。
- NRU优先换出已经被修改的脏页面(R=0,M=1),而不是被频繁使用的干净页面(R=1,M=0)。
- 先进先出算法
置换最先进来的页面,会将经常使用的页面置换频繁。 - 第二次机会算法
先进先出算法的改进,检查最先进来的页面的R位,若为0,则立刻置换;若R为1,则将R为置为0,将其放到链表末尾,检查后续页面。 - 时钟置换算法
第二次机会算法的改进,使其不需要对页面进行移动,用一个环形链表维护。表针指向最老的页面,当当前页面R位为0时,立刻置换页面,表针前移;若当前页面R位为1时,将其改为0,表针向前检查,直到找到R为0的页面。
(4)分段
- 把程序整个虚拟地址空间表分成段,一个段构成一个独立的地址空间。每个段的长度可以不同,并且可以动态增长。
(5)分页与分段的区别
- 对程序员的透明性:分页透明,但是分段需要程序员显式划分每个段。
- 地址空间的维度:分页是一维地址空间,分段是二维的。
- 大小是否可以改变:页的大小不可变,段的大小可以动态改变。
- 出现的原因:分页主要用于实现虚拟内存,从而获得更大的地址空间;分段主要是为了使程序和数据可以被划分为逻辑上独立的地址空间并且有助于共享和保护。