分段(Segmentation)
分段的思想很简单,之前不是一大块都是连在一起的么,现在要把你们都分开,code / stack / heap 各自成为一段,段内的空间是连续的,段与段之间不必连续,这样空间利用率上就更高了。
接下来问题就来了,一个进程会有多个段,如何知道一个内存地址对应的是哪个段呢?一个方法是用地址的前两个字节来表示:
比如 00 表示 code, 01 表示 heap
分页(Paging)
Paging 的思想是把地址空间切分成固定大小的单元。比如下面一个只有 64 字节的地址空间,每个 Page 16 个字节.
地址空间是连续的,但物理地址并不是。这样的好处是,不用去考虑 heap / stack 会被申请多少 size,比如要申请 64 字节地址空间,只要给 4 个 free 的 page 即可,这样 OS 管理起来也很简单,比如只要维护一份 free pages list,然后给出前 4 个。为了记录虚拟页(Virtual Page)跟物理地址之间的关系,OS 需要维护给每个进程维护一份 Page Table,它的作用就是地址翻译