免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2007 | 回复: 6

[内存管理] 一个伙伴系统的疑问 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2016-10-26 14:50 |显示全部楼层
最近在看伙伴系统。
内核是通过zone来描述物理内存的,zone中有free_area域。
我首先看获取page的流程, 都是从 free_area 域 中获取page,但是没找到哪里将page插入到free_area中?

问题
1:如果系统有16G,PAGE_SIZE = 16K,order最大为10,系统初始时不会吧 16G 分成 1024000 个order为10的pages,放在free_area[10]中吧,我觉得不会。
2:free_area中时如何插入page的?例如我看到expand函数是高order 的free_area获取pages,然后分半,插入到低order 的free_area,可是高order的free_area中page哪来的?

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
发表于 2016-10-26 15:34 |显示全部楼层
1: 就是这样。系统哪些情况需要连续的物理页面我目前还不太清楚,一般都是一个一个分配的,虚拟页面连续即可。所以你不用太想着,为什么free_area[]数组为什么不搞大点,这样物理页面就不会“天生就被切碎”,那是因为也没有什么情况必须要求那么大的连续物理页面块。
2: 一方面,分配物理页面时,expand()会往一些free_area[]添加页面块,比如需要分配order为2的连续页面块,但free_area[2]~free_area[4]链表都已经空了,就从free_area[5]取一块下来,分别放16个到free_area[4]、放8个到free_area[3]、放4个到free_area[2],剩余4个就作为要分配的order为2的页面块,这个过程中,原本free_area[2]~free_area[4]链表都为空,后来都不为空了;另一方面,释放的时候,也会尝试将释放的块,和现有的块,不断往上合并成大块,放到高order的free_area。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2016-10-26 15:49 来自手机 |显示全部楼层
_nosay 发表于 2016-10-26 15:34
1: 就是这样。系统哪些情况需要连续的物理页面我目前还不太清楚,一般都是一个一个分配的,虚拟页面连续即 ...

谢谢答复。
还有疑问,如果如我所说,系统初始化时把所有物理内存大小的page加入到order为10的free_area
1:这个操作具体在哪个函数,刚开始看代码,不太熟没找到。
2:理论上我遍历order 0-10的free_area,加权乘上nr_free的值,是不是就是内核可用的总内存?

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
发表于 2016-10-26 16:08 |显示全部楼层
回复 3# mrpre


我看的是Linux2.4.0代码:
start_kernel()->mem_init()->free_all_bootmem()->free_all_bootmem_core(),顺着这个过程看看,我也不太确定。猜测应该是这样:bootmem可能就是自检时收集的内存信息,这个函数对每个page调用__free_page(),转移到伙伴系统管理。

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
发表于 2016-10-28 14:38 |显示全部楼层
印象中是对每个page交给buddy system,在这个过程中完成相邻page的合并的。
并没有显式的放到order 10的操作。

论坛徽章:
13
程序设计版块每日发帖之星
日期:2016-06-29 06:20:00每日论坛发贴之星
日期:2016-08-14 06:20:00操作系统版块每日发帖之星
日期:2016-08-14 06:20:00每日论坛发贴之星
日期:2016-08-13 06:20:00数据库技术版块每日发帖之星
日期:2016-08-13 06:20:00程序设计版块每日发帖之星
日期:2016-08-13 06:20:00IT运维版块每日发帖之星
日期:2016-08-13 06:20:00每日论坛发贴之星
日期:2016-08-12 06:20:00数据库技术版块每日发帖之星
日期:2016-08-12 06:20:00程序设计版块每日发帖之星
日期:2016-08-12 06:20:00操作系统版块每日发帖之星
日期:2016-08-12 06:20:00综合交流区版块每日发帖之星
日期:2016-08-09 06:20:00
发表于 2016-11-02 23:18 |显示全部楼层
我看过2..4版本的ULK,的确是逐个的把page交给buddy system的, 这些page会在buddy system里“两两聚合”逐渐冒泡到order 10的freelist里。
为什么“逐个”而不是直接按“大块儿的order 10”来初始化。。。我也不知道。
是不是因为那时候内存比较小?不知道2.6以后怎么样了。
在我的内核里, 先是模仿2.4来的, 但发现初始化很慢(bochs会放大这种”慢“), 后来改为“一口吃4M", 初始化加快了很多。

论坛徽章:
0
发表于 2016-11-21 12:14 |显示全部楼层
回复 1# mrpre
最近也在看linux-2.4的内核,以下是我的看法,如有不对,还望指出:
问题
1:如果系统有16G,PAGE_SIZE = 16K,order最大为10,系统初始时不会吧 16G 分成 1024000 个order为10的pages,放在free_area[10]中吧,我觉得不会。  我的理解是:就是合并在free_area[10]中,这是在page_alloc.c中__free_pages_ok这个函数做的,这个函数会把所有的pages按照buddy算法进行合并。
  因为刚开始除了在bootm中分配的及kernel占用+mem_map占用之外,都是空闲的内存,所以buddy算法都会合并到free_area[10]中。

2:free_area中时如何插入page的?例如我看到expand函数是高order 的free_area获取pages,然后分半,插入到低order 的free_area,可是高order的free_area中page哪来的?
我的理解是: 在__free_pages_ok这个函数做的

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP