内存

1. 内核空间和用户空间

在32位的系统下,内存拥有4G(2^32)的寻址能力。大多数操作系统会将4G空间中的一部分给内核使用,应用程序无法直接访问,这块内存称为内核内存空间。

  • Windows系统会将高地址的2G空间分给内核(可配置为1G)
  • Linux默认是将高地址1G空间分给内核

剩余空间按称为用户内存空间。

2. 内存区域
  • 栈:通常在用户内存空间的最高地址处分配,一般数M大小。
  • 堆:通常在栈的低地址方向,也可能内存位置不固定,一般比栈大很多。
  • 可执行文件映像:由装载器在装载时将可执行文件内存读取到此部分位置。
  • 保留区:内存中收到保护而禁止访问的内存区域的总称,例如大多数操作系统中极小的地址是不允许访问的,如指针指向nullptr(NULL)。所以在清理完之后将指针指向nullptr。这里多说一下,在清理指针或者初始化指针的时候尽量使用nullptr/nullptr_t,而不是NULL
  • 动态链接库映射区:用于装载动态链接库,linux中如果可执行文件依赖其它共享库,那么系统会为此文件从0x40000000的地址分配相应空间,载入动态库。
  • 代码段:存储程序执行代码的空间,其大小在程序运行前已经确定,并且通常是只读的状态。某些架构中也允许代码段可写,可修改程序。也有可能存放一些制度的常量。
  • 数据段:存储程序中已经初始化的全局变量的空间。
  • 未初始化数据段(BSS段):存储程序中未初始化或者初始化未0的全局变量和静态变量的空间。
    栈从高到低增长,堆从低到高增长
3. 实现方式

操作系统是通过内存管理器实现内存的申请和划分的,并且负责将虚拟内存地址和物理内存地址映射起来。映射方式是内部的结构体存储指向空间地址。

4. malloc的实现

将内存的处理交给内核去做无疑是可行的,但是系统中存在着无数程序的无数申请和释放内存操作,内核调用的性能消耗是很大的,进而影响应用程序性能。
比较好的做法是程序向操作系统申请空间,由程序自己的运行库去管理,当此处空间被使用完,再根据需要向操作系统申请。

5. Linux的堆管理

Linux下堆分配方式有两种系统调用,bk()和mmap(),分配的都是虚拟内存空间。标准C语言库中的malloc/free进行申请和释放内存,底层都是由brk/mmap/munmap实现的。

  • brk():设置进程数据段的结束地址,可以扩大或者缩小数据段(linux系统中的数据段和BSS段统称数据段)。如果将数据段的结束地址向高地址位移动,那么扩大的部分就可以供程序使用,然后将这部分作为堆使用。
  • mmap():向操作系统申请一块虚拟内存空间,此空间位于文件映射区,就是堆和栈中间。linux中的glibc的malloc是小于128k的空间在现有堆中分配出来,大于128k的空间调用mmap函数分配一块匿名空间,在匿名空间中分配空间。
6. 最大malloc(linux)

最大申请空间受到诸多因素干扰,比如系统限制或者物理内存和交换空间总和等。mmap申请匿名空间时系统会为它在内存或交换空间中预留下地址,但是不能超过空闲内存和空闲交换空间的总和。

7. 堆分配算法
  • malloc
    将堆中各个空闲块根据链表链接。申请空间时遍历查找合适大小,拆分出来;释放空间时则合并进链表中。最后链表存在很多细碎空间,在申请一块大内存时候malloc会请求延时,以便整理细碎空间,合并成一块大内存。
  • 位图
    将堆划分为大量相等的块。申请空间时,分配整倍数的块大小,第一个块称为head,其余称为body,我们可以使用一个整数数组记录块的使用情况。每个块均只有头、主体和空闲三种状态,那么只需要两位就可以表示出来所有块的状态,所以称为位图。
  • 对象池
    将堆空间划分为大小相等的块(与位图类似),它认为某种情况下每次分配的空间都相等,所以每次返回一个块的大小,可以变化为链表或者位图。因为不用每次查找合适的大小内存,所以效率很高。

实际上,堆的分配算法是多种算法复合而成的,并不是单一的算法。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容

  • 内存是计算机非常关键的部件之一,是暂时存储程序以及数据的空间,CPU只有有限的寄存器可以用于 存储计算数据,而大部...
    dreamer_lk阅读 1,198评论 2 10
  • 内存的历史 现代的intel处理器可以追溯到最早期的intel芯片。1.8085处理器充分利用了芯片整合技术,它将...
    Mr_Bluyee阅读 711评论 0 0
  • 2017年末,手Q春节红包项目期间,为保障活动期间服务正常稳定,我对性能不佳的Ark Server进行了改造和重写...
    90后老码农阅读 10,351评论 1 12
  • 本文转载自 https://juejin.im/post/59f8691b51882534af254317 参考:...
    xingdong阅读 2,718评论 0 3
  • 姓名:王康 公司:扬州市方圆建筑工程有限公司 2018年3月16日~3月18日上海361期 《六项精进》感谢二组 ...
    王小康KK阅读 125评论 0 0