内存管理
内存分配、内存回收、地址转换、内存保护
内存管理机制
分块管理:把内存分为大小相等且固定的几个块,每个进程占用一个块。
分页管理:把内存分为若干相同大小的页面,通过页表对应页的逻辑地址和物理地址。
分段管理:把内存分为大小不等的有逻辑意义的段,比如代码段、局部变量段,通过段表对应段的逻辑地址和物理地址。
段页式管理:先把主存分为若干个段,再把段分为若干个页,先通过段表找对应的页表,再通过页表找对应的逻辑地址和物理地址。
分段分页异同
相同点:都是离散式存储,提高内存利用率。
不同点:分页页面大小固定,由操作系统分页。分段段大小不固定,由应用程序分段。段具有逻辑意义。
快表(TLB)
处理器引入MMU(内存管理单元)后,读取指令、数据需要访问两次内存:首先通过查询页表得到物理地址,然后访问该物理地址读取指令、数据。为了减少因为MMU导致的处理器性能下降,引入了TLB。
快表可以认为是一个 Cache,内容是页表的一部分或者全部内容。
根据局部性原理,被访问后的内存块儿很可能在短时间内再次被访问,可能程序在一段时间内会多次访问同一个页表项。
多级页表
解决了页表在内存中占用空间太大的问题的。
虚拟地址
如果没有虚拟地址,用户可以直接访问底层物理地址,很容易破坏操作系统。
运行个程序时,可能会对同一块地址进行操作。
通过虚拟地址,程序可以使用离散的物理地址表示相邻的虚拟地址。
通过虚拟地址,程序可以访问大于内存物理地址空间大小的虚拟地址。
虚拟内存
传统内存管理会一次性将进程所需的资源全部装载到内存中,浪费内存资源。
基于局部性原理,把很快就会用到的部分放入内存中,暂时用不到的部分留在磁盘上。在程序执行的过程中,当信息不在内存时,再从外存把信息加载到内存里。当内存不够的时候,根据一些策略把用不到的内存换出到外存中,从而腾出空间给要调入内存的信息。而在 os 的管理下,让应用程序认为自己拥有一连续可用的内存,产生独享主存的错觉,这就是虚拟内存。
虚拟内存的实现
请求分页式存储管理
请求分段式存储管理
请求段页式存储管理
页面置换算法
OPT 最佳页面置换算法:不可实现,不可预测哪个是不用的。
FIFO 先到先出算法:把在内存中停留时间最长的页面置换出去
LRU 最近最久未使用算法:LRU 算法赋予每一个页面一个访问字段,来记录一个页面最近一次访问到现在所经历的时间 T,需要淘汰一个页面时,把最久没有使用的页面淘汰掉就可以了。
LFU 最少使用算法:把使用最少的页面淘汰掉。