内存管理
来源:互联网 发布: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个表项用于选择页,一个索引表示页内位置)。
页表的格式
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 动态规划之三角形求值问题
- google code 免费svn服务器使用说明
- 将Vim改造为强大的IDE—Vim集成Ctags/Taglist/Cscope/Winmanager/NERDTree/OmniCppComplete(有图有真相)
- 如何更改ORACLE 用户的 expired状态
- Remove Nth Node From End of List
- 内存管理
- 动态规划之钢条切割问题
- 【2014-06-07】-珠海长隆海底世界
- linux命令点滴
- 面向对象--设计模式
- JavaScript获取地址栏中的参数
- ABAP通过OLEDB读取本地Access(MDB)文件
- 第十四周项目一-动物这样叫(虚函数)
- struts2 防止表单重复提交