Linux操作系统内存管理

  • 格式:doc
  • 大小:36.50 KB
  • 文档页数:6

下载文档原格式

  / 6
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Linux操作系统内存管理

摘要:

Linux支持虚拟内存, 就是使用磁盘作为RAM的扩展,使可用内存相应地有效扩大。核心把当前不用的内存块存到硬盘,腾出内存给其他目的。当原来的内容又要使用时,再读回内存。这对用户全透明:运行于Linux的程序只看到大量的可用内存而不甘心哪部分在磁盘上。当然,读写硬盘比真的内存慢(慢千倍),所以程序运行较慢。用做虚拟内存的这部分硬盘叫对换空间。

Linux可以使用文件系统中的普通文件或单独的分区作为对换空间。对换分区更快,但对换文件更易于改变大小(无须对硬盘重分区)。如果知道要多少对换空间,应该用对换分区;如果不能确认,可以先用对换文件,用一段时间后再根据所需空间建立对换分区。

Linux允许同时使用多个对换分区和/或对换文件。即如果偶尔需要更多的对换空间,可以随时建立一个额外的对换文件。

Linux是一个遵循POSIX(Portable Operating System Interface)标准的操作系统,它继承了UNIX系统优秀的设计思想,拥有简练、容错强、高效而且稳定的内核。此外Linux还具备其他操作系统所不能比拟的优点。①:完全免费;

②:内核源代码完全公开。

Linux内核拥有一个功能完备的内存管理子系统,它增加了对NUMA(非均匀存储结构)体系结构的支持并且使用了基于区(ZONE)的物理内存管理方法,从而保持了物理上连续分布、而逻辑上统一的内存模式和传统的共享内存编程模型,使得系统的性能得以极大的扩展。这样Linux不仅能够满足传统的桌面应用,而且还能满足高端服务器市场的需要。目前,Linux不仅在Internet服务器上表现出色,而且还可以胜任大型数据库系统的服务器。

关键字:虚拟内存,物理内存管理,虚拟内存管理

一、Linux存储管理的基本框架

Linux内核采用虚拟页式存储管理,采用三次映射机制实现从线性地址到物理地址的映射。其中PGD为页面目录,PMD为中间目录,PT为页面表。具体的映射过程为:

⑴从CR3寄存器中找到PGD基地址;

⑵以线性地址的最高位段为下标,在PGD中找到指向PMD的指针;

⑶以线性地址的次位段为下标,在PMD中找到指向PT的指针;

⑷同理,在PT中找到指向页面的指针;

⑸线性地址的最后位段,为在此页中的偏移量,这样就完成了从线性地址到物理地址的映射过程。

32位的微机平台如Intel的X86采用段页式的两层映射机制,而64位的微处理器采用三级分页。对于传统的32位平台,Linux采用让PMD(中间目录)全0来消除中间目录域,这样就把Linux逻辑上的三层映射模型落实到X86结构物理上的二层映射,从而保证了Linux对多种硬件平台的支持。

二、Linux对虚拟内存的管理

虚拟内存不仅可以解决内存容量的问题,还可以提供以下附加的功能:大地址空间;进程保护;内存映射;灵活的物理内存分配;共享虚拟内存。

Linux对虚拟内存的管理以进程为基础。32位的线性地址映射的4G的虚拟空间中,从0XC0000000到0XFFFFFFFF的1G空间为所用进程所共享的内核空间,每个进程都有自己的3G用户空间。

Linux的虚拟内存管理需要各种机制的支持,首先内存管理程序通过映射

机制把用户程序的逻辑地址映射到物理地址,在用户程序运行时时如果发现程序中要用的虚拟地址没有对应的物理地址,就发出请页要求①:如果有空闲的内存可供分配,就请求分配内存②,并把正在使用的物理页记录在页缓存中③,如果没有足够的内存分配,就调用交换机制,腾出一部分内存④⑤。另外在地址映射中要通过TLB(翻译后援存储器)来寻找物理页⑧,交换机制中要用到交换缓存⑥,并且把物理页内容交换到交换文件中也要修改页表来映射文件地址⑦。

一个进程的虚拟地址映射靠三个数据结构来描述:mm_struct、

vm_area_struct、page。其中mm_struct结构用来描述一个进程的虚拟内存;vm_area_struct描述一个进程的虚拟地址区域,在这个区域中的所有页面具有相同的访问权限和一些属性;page描述一个具体的物理页面。

当进程通过系统调用动态分配内存时,Linux首先分配一个vm_area_struct 结构,并链接到进程的虚拟内存链表,当后续指令访问这一内存区域时,产生缺页异常。系统处理时,通过分析缺页原因、操作权限之后,如果页面在交换文件中,则进入do_page_fault()中恢复映射的代码,重新建立映射关系。如果因

为页面不再内存中,则Linux会分配新的物理页,并建立映射关系。

当物理内存出现不足时,就需要换出一些页面。Linux采用LRU(Least Recently Used最近最少使用)页面置换算法选择需要从系统中换出的页面。系统中每个页面都有一个“age”属性,这个属性会在页面被访问的时候改变。Linux根据这个属性选择要回收的页面,同时为了避免页面“抖动”(即刚释放的页面又被访问),将页面的换出和内存页面的释放分两步来做,而在真正释放的时候仅仅只写回“脏”页面。这一任务由交换守护进程kswapd完成。

free_pages_high,free_pages_low是衡量系统中现有空闲页的标准,当系统

中空闲页的数量少于free_pages_high,甚至少于free_pages_low时,kswapd 进程会采用三种方法来减少系统正在使用的物理页的数量。①调用

shrink_mmap()减少buffer cache和page cache的大小;②调用shm_swap()将system V共享内存页交换到物理内存;③调用swap_out()交换或丢弃页。

三、Linux对物理内存的管理

Linux2.4内核加入了对NUMA的支持,如果系统是NUMA结构的处理机系统,则物理内存被划分为三个层次来管理:存储节点(Node),管理区(Zone),页面(Page)。处理器的本地内存组成的区域叫做一个节点(Node),它通过pglist_data数据结构来描述。各个节点的物理内存根据不同的作用又分为ZONE_DMA、ZONE_NORMAL、ZONE_HIGH,ZONE_DMA面积小,且专供DMA使用,ZONE_NORMAL则供大多数的程序使用,对于ZONE_HIGH仅仅只有页面缓存以及用户进程能够使用该区域的空间。每个管理区对应一个free_area数组来组织空闲页面队列,该数组的每一项描述某一种页块的信息,第一个元素描述大小为1

页的内存块的信息,第二个元素描述大小为2 页的内存块的信息,依此类推,所描述的页块大小以 2 的倍数增加。free_area 数组的定义如下:Typedef struct free_area_struct{

Struct list_head free_list;

Unsigned int *map;

}free_area_t;

list_head是一个双向指针结构,在这里用于将物理页块结构mem_map_t 连结成一个双向链表,而map则是记录这种页块组分配情况的位图,例如,位图的第N位为1,表明第N个页块是空闲的。