免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 瀚海书香

linux内存管理讨论——欢迎大家围观! [复制链接]

论坛徽章:
0
发表于 2012-04-05 14:28 |显示全部楼层
瀚海书香 发表于 2012-04-04 20:30
回复 64# titer1

对应arm架构来说就是这样的,这块空间按Document的描述来说,的确是用于kernel module ...


谢谢版主指正,原来arm x86 内存上细节上差别如此!!

论坛徽章:
0
发表于 2012-04-05 23:31 |显示全部楼层
本帖最后由 titer1 于 2012-04-05 23:34 编辑

在阅读 Understanding the Linux® Virtual Memory Manager,第二章中关于swap有下图:




涉及swap,有三个参数,page_min,page_max,pages_low,
下文中简称(min,max,low)

当可用页数 (available pages)小于min,启动kswapd

当可用页数               小于low,依然可以分配,只不过只能是fgp_atomic类型。
问题:图中,从min到low,页消耗率明显降低。但是小于low后,为何页消耗率会又增加?
在书上的注释说:

pages_min When pages_min is reached, the allocator will do the kswapd work in a synchronous fashion, sometimes referred to as the direct-reclaim path. Solaris does not have a real equivalent, but the closest is the desfree or minfree, which determine how often the pageout scanner is woken up.
我看完注释,依然不解。

当可用页数 恢复到max,此时kswap休眠。
期间,从min到low,从low 到high,前个区间回收页面的速率低,我认为前段区间有内存分配器的帮忙,后者只有kswapd工作。不知各位看法。

论坛徽章:
2
数据库技术版块每日发帖之星
日期:2015-07-30 09:40:01数据库技术版块每日发帖之星
日期:2015-10-13 06:20:00
发表于 2012-04-06 11:01 |显示全部楼层
本帖最后由 sun5411 于 2012-04-06 11:05 编辑

回复 40# 瀚海书香
哈哈,谢谢!

   

论坛徽章:
2
季节之章:冬
日期:2015-01-20 17:08:47IT运维版块每日发帖之星
日期:2016-02-24 06:20:00
发表于 2012-04-06 11:29 |显示全部楼层
我不讨论,只要包,行不?

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2012-04-06 15:35 |显示全部楼层
回复 74# 大邪神
我不讨论,只要包,行不?

可以不讨论,但是得分享经验和对内存管理的理解
   

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
发表于 2012-04-06 16:20 |显示全部楼层
看内存管理可以从不同的角度去看。
从虚拟地址上去看,自然联想到的知识点就是3:1的内存模型。在就是用户空间地址的安排诸如红黑树之类知识点。内核空间地址知识点就有固定映射、直接映射之类的知识点。
从物理地址的管理上看,很容易就联想到了伙伴系统,页表设置等等
这些知识点都可以从《深入理解Linux内核》的第八第九章学习到。大部分介绍内核的书籍也会介绍相关的知识点。

论坛徽章:
0
发表于 2012-04-06 16:46 |显示全部楼层
想高人学习

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
发表于 2012-04-06 22:06 |显示全部楼层
虽然说现在的内存价格越来越便宜了,但是在任何一个操作系统中,内存管理都是OS的一个主要任务,不仅仅是Linux。
因为受操作系统限制,比如32位的OS就只能支持3G左右的内存,所以就算你有N多的钱,买N多的内存,但受系统支持的限制,现在你也只能使用其中的3G内存。
所以,内存管理很重要。综合如下::
1. 内核初始化:

    * 内核建立好内核页目录页表数据库,假设物理内存大小为len,则建立了[3G--3G+len]::[0--len]这样的虚地址vaddr和物理地址paddr的线性对应关系;
    * 内核建立一个page数组,page数组和物理页面系列完全是线性对应,page用来管理该物理页面状态,每个物理页面的虚地址保存在page->virtual中;
    * 内核建立好一个free_list,将没有使用的物理页面对应的page放入其中,已经使用的就不用放入了;

2. 内核模块申请内存vaddr = get_free_pages(mask,order):

    * 内存管理模块从free_list找到一个page,将page->virtual作为返回值,该返回值就是对应物理页面的虚地址;
    * 将page从free_list中脱离;
    * 模块使用该虚拟地址操作对应的物理内存;

3. 内核模块使用vaddr,例如执行指令mov(eax, vaddr):

    * CPU获得vaddr这个虚地址,利用建立好的页目录页表数据库,找到其对应的物理内存地址;
    * 将eax的内容写入vaddr对应的物理内存地址内;

4. 内核模块释放内存free_pages(vaddr,order):

    * 依据vaddr找到对应的page;
    * 将该page加入到free_list中;

5. 用户进程申请内存vaddr = malloc(size):

    * 内存管理模块从用户进程内存空间(0--3G)中找到一块还没使用的空间vm_area_struct(start--end);
    * 随后将其插入到task->mm->mmap链表中;

6. 用户进程写入vaddr(0-3G),例如执行指令mov(eax, vaddr):

    * CPU获得vaddr这个虚地址,该虚地址应该已经由glibc库设置好了,一定在3G一下的某个区域,根据CR3寄存器指向的current->pgd查当前进程的页目录页表数据库,发现该vaddr对应的页目录表项为0,故产生异常;
    * 在异常处理中,发现该vaddr对应的vm_area_struct已经存在,为vaddr对应的页目录表项分配一个页表;
    * 随后从free_list找到一个page,将该page对应的物理页面物理首地址赋给vaddr对应的页表表项,很明显,此时的vaddr和paddr不是线性对应关系了;
    * 将page从free_list中脱离;
    * 异常处理返回;
    * CPU重新执行刚刚发生异常的指令mov(eax, vaddr);
    * CPU获得vaddr这个虚地址,根据CR3寄存器指向的current->pgd,利用建立好的页目录页表数据库,找到其对应的物理内存地址;
    * 将eax的内容写入vaddr对应的物理内存地址内;   

7. 用户进程释放内存vaddr,free(vaddr):

    * 找到该vaddr所在的vm_area_struct;
    * 找到vm_area_struct:start--end对应的所有页目录页表项,清空对应的所有页表项;
    * 释放这些页表项指向物理页面所对应的page,并将这些page加入到free_list队列中;
    * 有必要还会清空一些页目录表项,并释放这些页目录表项指向的页表;
    * 从task->mm->mmap链中删除该vm_area_struct并释放掉;

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2012-04-07 08:07 |显示全部楼层
回复 78# renxiao2003
多谢分享!

   

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2012-04-07 08:08 |显示全部楼层
回复 78# renxiao2003
比如32位的OS就只能支持3G左右的内存,所以就算你有N多的钱,买N多的内存,但受系统支持的限制,现在你也只能使用其中的3G内存

linux系统虽然支持的总内存数会大于4G,但应用程序可用的用户态内存的确是3G(1:3模型)。64位应该是趋势了

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP