在用户态C语言程序中,我们对内存分配函数malloc()或calloc()非常熟悉;函数执行成功,就会返回需要的内存起始地址。显然这些函数在在内核态没法运行,在内核态有专门的内存申请/释放函数。
Linux内核中,如何分配和回收内存?空闲内存如何管理?本文以linux 2.6.32-220.el6版本内核源码为基础,介绍Linux内核中如何分配物理内存页面。
目 录
1 概述
2 内核页面分配与回收API
3 空闲页面的管理
3.1 物理内存空间描述
3.2 空闲页面的管理
4 伙伴算法
4.1 Buddy System
4.2 伙伴算法举例
4.2.1 页面分配过程
4.2.2 页面回收过程
4.3 Buddy系统信息查看
5 页面分配
5.1 UMA页面分配
5.2 NUMA页面分配
5.2.1 NUMA策略与cpuset功能
5.2.2 alloc_pages_current()
5.3 __alloc_pages_nodemask()
5.3.1 内存迁移类型与lockdep
5.3.2 __alloc_pages_nodemask()
5.4 get_page_from_freelist()
5.4.1 区域(Zone)水准
5.4.2 Hot-N-Cold页面
5.4.3 get_page_from_freelist()
5.4.4 __rmqueue()
5.5 __alloc_pages_slowpath()
5.5.1 __alloc_pages_direct_compact()
5.5.2 __alloc_pages_direct_reclaim()
6 影响页面分配行为的GFP标志
完整文章下载:Linux物理内存页面分配
你的内存系列的文章看也很多遍了,学到很多内存相关的知识,突然发现你的pdf文档的排版很漂亮,这些文档你是用latex做的吗?是的话,可不可以共享一份给我?网上找了一些模板,始终觉得不好看。
大咖:
4.2的图好像不太对,应该是:
order 0: 5
order 1: 1
order 2: 1
order 3: 1
在哪一页?具体哪个图?谢谢。
大神,文章写得很好,通俗易懂,大赞….但是有几个疑问,麻烦您抽时间看一下
问题1: pdf的第6页,有个疑问.想请教以下…
这样free_area[MAX_ORDER]数组中的第1个元素,指向内存块大小为20即1个页面
的空闲页面链表;数组中的第2个元素指向内存块大小为20即1个页面的空闲页面链表(这里是2的1次方,2个页面吗?是不是笔误还是我理解错了?)
问题2: pdf的第8页 图9 伙伴算法示例的下方有一段描述
此时空闲内存页面组织如下图。 order=1的链表(大小21-1个页面)上共有5个结点;
order=2的链表(大小22-1个页面)上共有3个结点; order=3的链表为空; order=4的链表上共有1个结点..
这个节点的个数是怎么计算的?我是这么理解的,如果是一个页面的话,有多少个free就有多少个节点,如果是两个节点的话,有多少个两个free连在一起就有多少个节点,不过貌似不是这样算的?而且为什么order=3的链表是空?order=4的节点却还有1呢?
问题3:我对order链表和free_area数据的理解是,说order=3的链表实际上指的是free_area[2],但是在pdf第9页—图10 伙伴算法示例 – 空闲页面组织中是order=0对应free_area.麻烦问一下order和free_area的具体对应关系是怎么样的?
大神,文章写得很好,通俗易懂,大赞….但是有几个疑问,麻烦您抽时间看一下
问题1: pdf的第6页,有个疑问.想请教以下…
这样free_area[MAX_ORDER]数组中的第1个元素,指向内存块大小为20即1个页面
的空闲页面链表;数组中的第2个元素指向内存块大小为20即1个页面的空闲页面链表(这里是2的1次方,2个页面吗?是不是笔误还是我理解错了?)
问题2: pdf的第8页 图9 伙伴算法示例的下方有一段描述
此时空闲内存页面组织如下图。 order=1的链表(大小21-1个页面)上共有5个结点;
order=2的链表(大小22-1个页面)上共有3个结点; order=3的链表为空; order=4的链表上共有1个结点..
这个节点的个数是怎么计算的?我是这么理解的,如果是一个页面的话,有多少个free就有多少个节点,如果是两个节点的话,有多少个两个free连在一起就有多少个节点,不过貌似不是这样算的?而且为什么order=3的链表是空?order=4的节点却还有1呢?
问题3:我对order链表和free_area数据的理解是,说order=3的链表实际上指的是free_area[2],但是在pdf第9页—图10 伙伴算法示例 – 空闲页面组织中是order=0对应free_area.麻烦问一下order和free_area的具体对应关系是怎么样的?
大神,文章写得很好,通俗易懂,大赞….但是有几个疑问,麻烦您抽时间看一下
问题1: pdf的第6页,有个疑问.想请教以下…
这样free_area[MAX_ORDER]数组中的第1个元素,指向内存块大小为20即1个页面
的空闲页面链表;数组中的第2个元素指向内存块大小为20即1个页面的空闲页面链表(这里是2的1次方,2个页面吗?是不是笔误还是我理解错了?)
问题2: pdf的第8页 图9 伙伴算法示例的下方有一段描述
此时空闲内存页面组织如下图。 order=1的链表(大小21-1个页面)上共有5个结点;
order=2的链表(大小22-1个页面)上共有3个结点; order=3的链表为空; order=4的链表上共有1个结点..
这个节点的个数是怎么计算的?我是这么理解的,如果是一个页面的话,有多少个free就有多少个节点,如果是两个节点的话,有多少个两个free连在一起就有多少个节点,不过貌似不是这样算的?而且为什么order=3的链表是空?order=4的节点却还有1呢?
问题3:我对order链表和free_area数据的理解是,说order=3的链表实际上指的是free_area[2],但是在pdf第9页—图10 伙伴算法示例 – 空闲页面组织中是order=0对应free_area.麻烦问一下order和free_area的具体对应关系是怎么样的?
为什么评论不上
一直显示Your comment is awaiting moderation是评论上了还是没评论上
请教大佬,空闲页块都是2的幂次,所以每个空闲块包含的页就是1,2,4,8……,都是偶数,没有奇数页。内存中空闲的块恰好是3个页的大小怎么办
3拆分,2+1
您好,在5.2 NUMA 页面分配 章节 第二段,您说内核需要的内存大于4M的时候只能连续多次申请4M拼成大块内存,这个过程是不是huge page 的分配过程(用户一次请求G级别的内存场景)。