早期
早期系统:多个进程全部载入内存
问题:
- 内存撑爆(内存不够用)
- 互相打扰
由此诞生了现在的内存管理系统:虚拟地址,分页装入,软硬件结合寻址。
内存管理
- 内存撑满 的问题,用 交换分区 可以解决
- 互相打扰 的问题,用 虚拟内存 可以解决
交换分区
先要知道 页 的概念,将数据分页,在内存中有页框。
页框(page frame),用到哪一块页,这个框里装哪一页。
将程序分块,将内存分块,对应起来(最基本的分页是 4k)。
内存撑满时,将最不常用的部分放入 交换分区(swap)。
这就是著名的 LRU 算法。LRU,Least Recently Used。是指找到最不常用的一块(然后就它替换掉)。(用哈希表+双向链表)(leetCode 146 题)
虚拟内存
为了保证互不影响,让进程工作在虚拟空间。在进程中用的地址,都是虚拟地址,而不是物理地址。所以进程大家,都在用虚拟地址,就不会相互干扰了。
在虚拟空间的角度,每个进程独享自己的空间(爽)。
虚拟空间,如果是 64 位,虚拟空间就可以是 2^64 bit,因为 64 位可以寻址这么多。
内存映射
在虚拟的空间,内部格式也是固定的,如下图的格式。
在进程的角度,它占有独一无二的内存空间,这就是它的虚拟内存。
进程内部分了很多段,而段内分了许多页。比如某页放在 “只读的代码和数据”中。
当需要执行时,将页加载到真正的 物理内存。
那如何做到从 虚拟地址到物理地址 的映射,这就是 内存映射。
虚拟地址.png逻辑地址和线性地址
- 逻辑地址,就是物理磁盘上地址的一个偏移量。
- 线性地址,就是地址在自己内存空间的一个地址。
它们两个加一下,就是找到了此页的地址。此地址再与内存的物理地址映射。
MMU 就来做这件事。
内存映射.png
网友评论