博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux内存管理学习笔记--物理内存分配
阅读量:6779 次
发布时间:2019-06-26

本文共 1775 字,大约阅读时间需要 5 分钟。

每次深入了解一个技术问题,随着挖据的深入,都发现其背后总非常深的背景知识,甚至需要深入到很多底层系统,这个过程有时会让自己迷失,会让自己忘了当初的目的。

在中介绍系统启动时内存的使用情况,本篇将介绍简要Linux如何接管主机的物理内存、组织内存,最后会较为详细的介绍Linux分配内存的一段代码。

前面说了,Linux MM系统细节非常多,自己在探究的时候,也是尝试尽量抓住主线,这里也只能抽取了一些“主线剧情”介绍,其中还可以扩展出很多细节,看客感兴趣可以自己深究,后续如果兴趣还在,我也还会继续写出来。内核版本如果没有特别说明,就是使用2.6.33版本。

1. 物理内存组织

先声明一下,这里说的Linux都是运行Intel X86架构的。从80386开始,为了更好支持内存管理、虚拟内存技术,x86架构开始支持处理器的分页模式(分页是基于分段)。系统将内存分为一个个固定大小的块,称作“page frames”,x86架构每一个“page frames”大小为4096字节。Linux中使用结构来描述一个“page frames”【链接中给出了2.6.18内核下的Page结构】,一个Page结构对应了一个物理内存页。

在Linux中,所有的struct page对象都放在一个数组mem_map,mem_map每一个元素对应一个Page。

2. NUMA下的内存结构

在NUMA架构下,系统根据CPU的物理颗数,将内存分成对应的Node。例如,两颗物理CPU,16GB内存的硬件:系统则将内存分成两个8GB,分别分配给两颗CPU:

my111.cm3:/root>#numactl --hardware
available: 2 nodes (0-1)
node 0 size: 8065 MB
node 1 size: 8080 MB

每一个Node,系统又将其分为多个Zone,64位x86架构下(参考:8.1.5),分为两个ZONE_DMA(低16MB,)、ZONE_NORMAL(其余内存)。所以NUMA架构下的内存分配,也就是在各个zone分配内存。

3. 内存分配函数栈

从底层系统的角度,内存分配有如下函数(这里介绍的底层函数,和上层函数的关系,以后再介绍):

这里来调查一下函数alloc_pages都做了些什么,都调用了哪些函数:

free_area是一个底层保存空闲内存页的数组,有着特殊的结构,它也是内存分配的核心变量。

4. get_page_from_freelist和zone_reclaim_mode

上面函数get_page_from_freelist【mm/page_alloc.c】通过遍历系统中各个zone,来寻找可用内存,根据Linux系统中zone_reclaim_mode的设置不同,遍历时的行为略有不同。zone_reclaim_mode是Linux中的一个可配置参数,为了解该参数如何影响内存分配,那就打开get_page_from_freelist的代码,仔细看看遍历各个zone的流程:

上面看到,zone_reclaim_mode非零时,如果某个zone内存不够,则会尝试出发一次内存回收工作(zone_reclaim),等于零时,则直接尝试写一个zone。

上面是2.6.33内核的代码流程图,2.6.18(RHEL5.4的内核)中则因为没有zcl相对简单一些:

流程图中可以看到,zone_reclaim_mode非零时,get_page_from_freelist【mm/page_alloc.c】函数中会调用zone_watermark_ok扫描free_area,如果当面有没有足够的可用内存,就会调用zone_reclaim【mm/vmscan.c】函数回收内存,zone_reclaim实际调用zone_reclaim【mm/vmscan.】收回内存。

最后

每次深入了解一个技术问题,随着挖据的深入,都发现其背后总非常深的背景知识,甚至需要深入到很多底层系统,这个过程有时会让自己迷失,会让自己忘了当初的目的。如果是Linux方面的技术问题,一般最后会收缩到“体系结构”、“Linux原理”和“算法”,这恰恰对应了计算机系考研时候的三门课程:体系结构、操作系统、和数据结构

转载地址:http://mlxro.baihongyu.com/

你可能感兴趣的文章
程序员如何写出一份好的文档?
查看>>
大型网站架构体系的演变(下)
查看>>
windows下实现win32俄罗斯方块练手,编程的几点心得
查看>>
杂七杂八
查看>>
JSP基础与提高(一)
查看>>
GitHub 新特性,使用新的 Marketplace 应用程序来升级工作流程
查看>>
《Linux From Scratch》第三部分:构建LFS系统 第六章:安装基本的系统软件- 6.18. Bzip2-1.0.6...
查看>>
端点安全性评估
查看>>
网页标题乱码的解决办法
查看>>
郭明錤:2018年苹果将保留iPhone X镜头设计
查看>>
ASP.NET Core的配置(3): 将配置绑定为对象[上篇]
查看>>
迁移到 Swift 3,这些陷阱在等你
查看>>
ubuntu17.04编译Tiny4412 Android5.0源代码
查看>>
关于字符的一些Tips
查看>>
Android5.0 Recovery源代码分析与定制(一)
查看>>
瑞为CEO詹东晖:从安防到零售,我在思考什么
查看>>
bgp选路原则【第二部】
查看>>
通过 itms:services://? 在线安装ipa ,跨过app-store
查看>>
安博会开幕前夕,大华股份高层齐聚谈如何应对 AI 崛起
查看>>
阿里云服务器搭建SVN仓库管理项目
查看>>