内存管理

来源:互联网 发布:mac如何设置两个桌面 编辑:程序博客网 时间:2024/06/12 19:55

概述

linux内核一般讲处理器的虚拟地址空间划分为两个部分。底部较大的部分用于用户进程,顶部则用于内核。虽然两个用户进程之间上下文切换期间会改变下半部分,但虚拟地址空间的内核部分始终保持不变。IA-32架构中,给出4GiB虚拟地址空间,3GiB将用于用户空间而1GiB将用于内核。

有两种类型计算机,分别以不同的方法管理物理内存。

UMA(一致访问内存,uniform memory access):将可用内存以连续的方式组织起来,SMP系统中每个处理器访问每个内存区都是同样快。

NUMA(非一致访问内存,non-uniform memory access):系统的每个CPU都有本地内存,可支持特别快速的访问。各处理器之间通过总线连接起来,以支持对其他CPU的本地内存的访问,比访问本地内存要慢。

(N)UMA模型中的内存组织

内核对一致和非一致内存的访问系统使用相同的数据结构,因此针对各种不同形式的内存布局,各个算法几乎没有什么差别。在UMA系统上,只使用一个NUMA结点管理整个内存系统。

概述

先定义几个概念。首先考虑NUMA系统。

首先内存划分为结点。每个结点关联到系统中的一个处理器,在内核中表示为pg_data_t的实例。

各个结点又划分为内存域,是内存的进一步细分。



每个内存域都关联了一个数组,用来组织属于该内存域的物理内存页(内核中称之为页帧)。对每个页帧,都分配了一个struct_page实例以及所需的管理数据。

每个内存结点保存在一个单链表中,供内核遍历。

出于性能的考虑,在为进程分配内存时,内核总是试图在当前运行的CPU相关联的NUMA结点上进行。但这并不总是可行的。

数据结构

结点管理

pg_data_t是用于表示结点的基本元素,定义如下。



如果系统中的结点多于一个,内核会维护一个位图,用以提供各个结点状态信息。状态是用位掩码指定的,可以用下列值。

N_POSSIBLE、N_ONLINE、N_CPU用以CPU和内存的热插拔。如果结点有普通或高端内存则使用N_HIGH_MEMORY,仅当结点没有高端内存才设置N_NORMAL_MEMORY。

内存域

该结构比较特殊的一点是它由ZONE_PADDING分隔为几个部分。对zone的访问十分频繁,在多处理器上通常会有不同的CPU试图同时访问结构成员。使用锁防止互相干扰(zone->lock,zone->lru_lock)。如果数据保存在CPU高速缓存中,内核使用ZONE_PADDING宏生成填充字段添加到结构中,确保每个自旋锁都处于自身的缓存行中。还使用了编译器_cacheline_maxaligned_in_smp,用以实现最优的高速缓存对齐方式。

内存域水印的计算

内存域水印:为关键性分配保留的内存空间的最小值,该值随可用内存的大小非线性增长,并保存在全局变量min_free_kbytes中。

冷热页

页帧

页帧代表系统内存的最小单位,对内存中的每个页都会创建一个struct page实例。

页表

层次化的页表用于支持对大地址空间的快速、高效的管理。页表用于建立用户进程的虚拟地址空间和物理内存之间的关联。页表用于向每个进程提供一致的虚拟地址空间,应用程序看到的地址空间是一个连续的内存区,该表将虚拟内存页映射到物理内存,因而可以支持共享内存的实现,还可以在不增加物理内存的情况下,将页换出到块设备来增加有效的可用内存空间。

内核管理内存总是假定使用四级页表,而不管底层处理器是否如此。页表管理分为两个部分,第一部分依赖于体系结构,第二部分是体系结构无关的。

数据结构

内存地址的分解

虚拟内存地址分为5个部分(4个表项用于选择页,一个索引表示页内位置)。

页表的格式


0 0
原创粉丝点击