虚拟地址:为了让每个进程都使用独立的物理内存,非必要时,不同进程之间不共享内存。虚拟地址就是实现这一功能的方案。
- 进程运行时,操作系统为进程分配独立的一套「虚拟地址」,虚拟地址和物理地址的映射由操作系统完成。操作系统保证了不同的进程使用的物理内存都是不一样的。
页表:存在内部碎片,不存在外部碎片
段表:存在外部碎片,不存在内部碎片
页表
- 32位系统中,每个虚拟地址都是一个32位的指针。假设页表项有2^20个,则代表虚拟地址的前20位代表页号,后12代表偏移量。
- 页表中并不存储虚拟页号,虚拟页号相当于数组中的索引,物理页号相当于数组中的元素,所以数组的元素中是不存储索引的。
以二级页表为例介绍多级页表:
二级页表:原本一个页表中存储所有物理页号,虚拟页号用索引表示。现在将一个页表拆分成多个页表,虚拟页号前缀相同的在同一个页表中,比如虚拟页号前10位相同的放在同一个页表中,如下图。由于每个页表中的前缀都是相同的,所以使用另一个页表保存这些前缀,所以就有了两个页表,即二级页表。
- 二级页表增加了一个页表,所以页表对内存的占用量升高了而不是降低了。二级页表通过如下方式减少内存消耗:如果存在最近一定时间未访问的页表,在物理内存紧张的情况下,操作系统会将页面换出到硬盘,也就是说不会占用物理内存。
- 不使用多级页表就不能将页表项移出内存吗?答:可以的,只是多级页表是较为高效的内存管理方式。在没有多级页表的情况下,仍然可以采取一些内存管理策略来优化页表项的存储:
- 页表划分: 将页表分为多个部分,每个部分负责一部分虚拟地址空间。这样可以将未使用的部分从内存中移出。
- 懒加载页表: 不一次性将所有的页表项加载到内存中,而是在需要访问某个虚拟地址时再加载对应的页表项。
- 多级页表需要访问多个页表,这就增加了访问内存的次数。
快表:把最常访问的几个页表项存储到cache中,这个cache就是TLB(快表)。有了 TLB 后,那么 CPU 在寻址时,会先查 TLB,如果没找到,才会继续查常规的页表。
段页式内存管理:先将程序进行分段(如代码段、数据段、栈段等),然后为每段构建一个页表。
标签:操作系统,多级,虚拟地址,虚拟,内存,页表 From: https://www.cnblogs.com/codingbigdog/p/17616568.html