知方号

知方号

Linux 内存管理(三)物理地址管理

原图

内存管理发展史内存管理的“远古时代”

在分页机制出现之前,操作系统有很多不同的内存管理机制,如动态分区法。如图(a)所示。剩余的 4MB 内存不足以装载进程 D,如图(b)所示,因为进程 D 需要 5MB 内存,这个内存末尾就成了第一个空洞(内存碎片)。假设某个时刻,操作系统需要运行进程 D,因为系统中没有足够的内存,所以需要选择一个进程来换出,为进程 D 腾出足够的空间。假设操作系统选择进程 B 来换出,这样进程 D 就装载到了原来进程 B 的地址空间里,于是产生了第二个空洞,如图(c)所示。假设操作系统某个时刻需要运行进程 B,也需要选择一个进程来换出,假设进程 A 被换出,那么操作系统中又产生了第三个空洞,如图(d)所示。

这种动态分区法在开始时是很好的,但是随着时间的推移会出现很多内存空洞,内存的利用率随之下降,这些内存空洞便是我们常说的内存碎片,动态分区法依然存在以下问题。

进程地址空间保护问题。所有的进程都可以访问全部的物理内存,所以恶意的程序可以修改其他程序的内存数据,这使进程一直处于危险的状态下。内存使用效率低。如果即将运行的进程所需要的内存空间不足,就需要选择一个进程以进行整体换出,这种机制导致大量的数据需要换出和换入,效率非常低下。程序运行地址重定位问题。从上图中看到,进程在每次换出、换入时使用的地址都是不固定的,这给程序的编写带来一定的麻烦,因为访问数据和指令跳转时的目标地址通常是固定的,这就需要重定位技术。

因此产生了分段机制和分页机制。

分段机制把程序所需的内存空间的虚拟地址映射到某个物理地址空间中,解决地址空间保护问题。分段机制把进程分成若干段(代码段、数据段栈段与堆段等),每个段的大小是不固定的,有点类似于动态分区法,这些段的物理地址可以不连续这样可以一定程度上解决内存碎片问题。

分段机制是一个比较明显的改进,但是它的内存使用效率依然比较低。分段机制对虚拟内存到物理内存的映射依然以进程为单位。进程在运行时,根据局部性原理,只有一部分数据是一直在使用的,若把那些不常用的数据交换出磁盘,就可以节省很多系统带宽。

分页机制

分页机制把分段机制的单位继续细分成固定大小的页面(page),进程的虚拟地址空间也按照页面来分割,这样常用的数据和代码就可以以页面为单位驻留在内存中,而那些不常用的页面可以交换到磁盘中。物理内存也以页面为单位来管理,这些物理内存称为物理页面(physical page)或者页帧(page frame)。进程的虚拟地址空间中的页面称为虚拟页面(virtualpage)。操作系统为了管理这些页帧需要按照物理地址给每个页帧编号,这个编号称为页帧号(Page Frame Number,PFN)。

从进程的角度看内存管理

在 Linux 系统中,应用程序常用的可执行文件格式是可执行与可

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。