HACK#14 虚拟存储子系统的调整
本节介绍如何使用/proc进行虚拟存储子系统的调整。
虚拟空间存储方式
在Linux上向应用程序分配内存时,是通过以页面为单位的虚拟存储方式进行的。采用虚拟存储方式,在实际操作中具有不需要确保连续的物理内存(不用担心内存碎片)的优点。最近的处理器大部分都具备用于虚拟存储的处理器嵌入式TLB(Translation lookaside buffer,旁路转换缓冲区,或称为页表缓冲区)和处理不存在的页面访问的结构。除了部分嵌入式应用外,大多数Linux应用中都可以使用虚拟存储方式的内存管理。使用虚拟存储方式的内存管理,具有下列特点。
·程序使用的页面是在应用程序最初访问时由内核分配的。
·如果分配的页面为程序文本、有初始值的数据(.data)区域或(被mmap的)数据文件区域,则在页面分配的同时从对应的文件读取数据,页面通过这些数据初始化。
·如果对于不存在拥有初始值的数据的区域,则只进行页面分配处理。该页面作为匿名(anonymous)页面处理。
应用程序通过malloc()等分配可用的存储区时,不会立刻向该区域(空间)分配实际的页面。而是在必要时仅分配需要用到的页面。
多数应用程序一般都不会使用分配到的所有存储区。有时分配与最大数据量大小相等的缓冲区,有时也会需要为散列表(hash table)等分配没有实体的空间。这种情况下,使用虚拟存储方式延迟内存分配,就不需要向未使用的空间分配内存。
由于根据需要分配页面,因此应用程序启动时不能事先得知该应用程序最终使用的最大页面数,这是虚拟存储方式的缺点。进程在逻辑上的虚拟内存空间与实际分配给该空间(已使用)的实际内存空间之间不再有直接的关系,最大使用内存量会根据环境(处理的数据等)的变化而变化。
应用程序使用的内存量对系统稳定性有很大的影响,因此不能无限度地使用内存。