CSDN|真棒!20 张图揭开内存管理的迷雾( 三 )
本文插图
换入换出 更进一步地 , 分页的方式使得我们在加载程序的时候 , 不再需要一次性都把程序加载到物理内存中 。 我们完全可以在进行虚拟内存和物理内存的页之间的映射之后 , 并不真的把页加载到物理内存里 , 而是只有在程序运行中 , 需要用到对应虚拟内存页里面的指令和数据时 , 再加载到物理内存里面去 。分页机制下 , 虚拟地址和物理地址是如何映射的?在分页机制下 , 虚拟地址分为两部分 , 页号和页内偏移 。 页号作为页表的索引 , 页表包含物理页每页所在物理内存的基地址 , 这个基地址与页内偏移的组合就形成了物理内存地址 , 见下图 。
本文插图
内存分页寻址 总结一下 , 对于一个内存地址转换 , 其实就是这样三个步骤: 下面举个例子 , 虚拟内存中的页通过页表映射为了物理内存中的页 , 如下图:
本文插图
虚拟页与物理页的映射 这看起来似乎没什么毛病 , 但是放到实际中操作系统 , 这种简单的分页是肯定是会有问题的 。简单的分页有什么缺陷吗?有空间上的缺陷 。因为操作系统是可以同时运行非常多的进程的 , 那这不就意味着页表会非常的庞大 。在 32 位的环境下 , 虚拟地址空间共有 4GB , 假设一个页的大小是 4KB(2^12) , 那么就需要大约 100 万 (2^20) 个页 , 每个「页表项」需要 4 个字节大小来存储 , 那么整个 4GB 空间的映射就需要有 4MB 的内存来存储页表 。这 4MB 大小的页表 , 看起来也不是很大 。 但是要知道每个进程都是有自己的虚拟地址空间的 , 也就说都有自己的页表 。那么 , 100 个进程的话 , 就需要 400MB 的内存来存储页表 , 这是非常大的内存了 , 更别说 64 位的环境了 。多级页表要解决上面的问题 , 就需要采用的是一种叫作多级页表(Multi-Level Page Table)的解决方案 。在前面我们知道了 , 对于单页表的实现方式 , 在 32 位和页大小 4KB 的环境下 , 一个进程的页表需要装下 100 多万个「页表项」 , 并且每个页表项是占用 4 字节大小的 , 于是相当于每个页表需占用 4MB 大小的空间 。我们把这个 100 多万个「页表项」的单级页表再分页 , 将页表(一级页表)分为 1024 个页表(二级页表) , 每个表(二级页表)中包含 1024 个「页表项」 , 形成二级分页 。 如下图所示:
本文插图
二级分页你可能会问 , 分了二级表 , 映射 4GB 地址空间就需要 4KB(一级页表)+ 4MB(二级页表)的内存 , 这样占用空间不是更大了吗?当然如果 4GB 的虚拟地址全部都映射到了物理内上的 , 二级分页占用空间确实是更大了 , 但是 , 我们往往不会为一个进程分配那么多内存 。其实我们应该换个角度来看问题 , 还记得计算机组成原理里面无处不在的局部性原理么? 每个进程都有 4GB 的虚拟地址空间 , 而显然对于大多数程序来说 , 其使用到的空间远未达到 4GB , 因为会存在部分对应的页表项都是空的 , 根本没有分配 , 对于已分配的页表项 , 如果存在最近一定时间未访问的页表 , 在物理内存紧张的情况下 , 操作系统会将页面换出到硬盘 , 也就是说不会占用物理内存 。如果使用了二级分页 , 一级页表就可以覆盖整个 4GB 虚拟地址空间 , 但如果某个一级页表的页表项没有被用到 , 也就不需要创建这个页表项对应的二级页表了 , 即可以在需要时才创建二级页表 。 做个简单的计算 , 假设只有 20% 的一级页表项被用到了 , 那么页表占用的内存空间就只有 4KB(一级页表) + 20% * 4MB(二级页表)= 0.804MB , 这对比单级页表的 4MB 是不是一个巨大的节约? 那么为什么不分级的页表就做不到这样节约内存呢?我们从页表的性质来看 , 保存在内存中的页表承担的职责是将虚拟地址翻译成物理地址 。 假如虚拟地址在页表中找不到对应的页表项 , 计算机系统就不能工作了 。 所以页表一定要覆盖全部虚拟地址空间 , 不分级的页表就需要有 100 多万个页表项来映射 , 而二级分页则只需要 1024 个页表项(此时一级页表覆盖到了全部虚拟地址空间 , 二级页表在需要时创建) 。我们把二级分页再推广到多级页表 , 就会发现页表占用的内存空间更少了 , 这一切都要归功于对局部性原理的充分应用 。对于 64 位的系统 , 两级分页肯定不够了 , 就变成了四级目录 , 分别是:
推荐阅读
- CSDN|由 Apache 说开,中国开源项目已经走向世界!
- 科学探索|为对抗美国,俄想和中国建月球基地,却被一张图扎心了,还能拿出什么?
- AI人工智能|OpenAI新模型曝光:给它半张图片,能够猜测补全
- DeepTech深科技|OpenAI新模型曝光:给它半张图片,能够猜测补全
- CSDN|软件对于英特尔意味着什么?
- CSDN|中国首家苹果零售店重开业,苹果CEO库克发文揭幕;“携号转网”服务用户破千万;GitHub 完成北极源代码存档|极客头条
- 智能机器人|快商通智能客服云平台荣获CSDN“AI优秀案例实践奖”
- 百度|一张图看中美互联网科技公司对比,中国真能和美国势均力敌了吗?
- CSDN|万亿美元软件浪潮来临,开发者是核心!
- 行业互联网|快商通智能客服云平台荣获CSDN“AI优秀案例实践奖”