免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 994 | 回复: 0
打印 上一主题 下一主题

[内核入门] brk() [复制链接]

论坛徽章:
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
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-10-11 17:30 |只看该作者 |倒序浏览
  • 内存管理的本质
    对于社会来讲,“管理”是人类发展到一定阶段才产生的。拿时下最疯狂的一件事“买房”来举例,当我抵上未来20年的青春买到一套房子后,并不是将房子从地上挖起来送到我面前,而只是在合法部门将房子的所属权跟我的**号关联起来,我就有权住进这个房子了。腿长在我自己身上,按道理我想进谁的房子就进谁的房子呀,但除非是在原始社会,在有了“管理”的当今社会,乱跑就会被抓起来!原始社会只生活着一个或少量猿猴(需<<求),随便找个洞穴就是房子,一文不值,猿猴不会因为房子而发生冲突,所以才不需要管理。
    对计算机来讲,从加电到启动完成,也经历了“原始社会”到“当今社会”的过程,即“实模式→保护模式”,实模式时只有一个进程,一个巴掌拍不响,所以不担心干扰,只管为进入保护模式作好准备,并切换到保护模式。一旦进入保护模式,实际上就是启动一些防止相互干扰的“管理”,其中内存管理就是其中之一,从而多个进程才能和谐共处。
    内核要保证各个进程对物理内存(系统范围唯一)的使用不发生干扰,也要保证每个进程中不同的程序片段对虚拟内存(进程范围唯一)的使用不发生干扰:
    ① 每个进程有自己独立的映射关系表,内核的视野能看见系统所有进程,自然也能保证各个进程对物理页面的使用不冲突。
    ② 程序中的全局变量、static变量、函数名等,由编译器安排不冲突的虚拟地址,动态分配/释放时,对虚拟页面的使用都建立记录信息,所以也不会发生冲突。

    所以内存管理的本质就是为防止干扰、效率、换入换出等建立记录信息,并利用这些信息达到相应的目的。
    以下就是分配内存时,建立管理信息的大致示意图:
   

  • brk()
    从上图也可以看出Linux对虚拟空间的使用安排,brk()就是操作动态分配区间的虚拟地址(分配/释放)。glibc库中的malloc()函数,就是用brk()系统调用分配/释放虚拟页面。
    注意:
    char *p = malloc();  // 不能free(p+1)
    brk()得到的一个虚拟地址区间(图中灰色区域,用vm_area_struct结构表示),可以释放当中一部分,而裂为两个区域

    OK,了解这些道理,就可以看代码了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP