malloc()
去请求一个大年夜的内存块,C 库将会创建如许一个匿名映射而不是应用堆内存。这里所谓的“大年夜”表示是跨越了MMAP_THRESHOLD
设置的字节数,它的缺省值是 128 kB,可以经由过程 mallopt()
去调剂这个设置值。接下来讲的是“堆”,就在我们接下来的地址空间中,堆供给运行时内存分派,像栈一样,但又不合于栈的是,它分派的数据生计期要善于分派它的函数。大年夜多半编程说话都为法度榜样供给了堆治理支撑。是以,知足内存须如果编程说话运行时和内核合营来做的工作。在 C 中,堆分派的接口是 malloc()
一族,然而在支撑垃圾收受接收的编程说话中,像 C#,这个接口应用 new
关键字。
如不雅在堆中有足够的空间可以知足内存请求,它可以由编程说话运行时来处理内存分派请求,而无需内核介入。不然精晓过 brk()
体系调用(代码实现)来扩大年夜堆以知足内存请求所需的大年夜小。堆治理是比较 复杂的,在面对我们法度榜样的纷乱分派模式时,它经由过程复杂的算法,尽力在速度和内存应用效力之间取得一种均衡。办事一?堆请求所须要的时光可能是异常可不雅的。及时体系有一个 特定用处的分派器 去处理这个问题。堆也会出现 碎片化 ,如下图所示:
Fragmented Heap
最后,我们抵达了内存的低位段:BSS、数据、以及法度榜样文本。在 C 中,静态(全局)变量的内容都保存在 BSS 和数据中。它们之间的不合之处在于,BSS 保存 未初始化的 静态变量的内容,它的值袈溱源代码中并没有被法度榜样员设置。BSS 内存区域是 匿名 的:它没有映射到任何文件上。如不雅你在法度榜样中写如许的语句 static int cntActiveUsers
,cntActiveUsers
的内容就保存在 BSS 中。
反过来,数据段,用于保存在源代码中静态变量 初始化后 的内容。这个内存区域是 非匿名 的。它映射了法度榜样的二进值镜像上的一部分,包含了在源代码中给定初始化值的静态变量内容。是以,如不雅你在法度榜样中写如许的语句 static int cntWorkerBees = 10
,那么,cntWorkerBees
的内容就保存在数据段中,并且初始值为 10
。尽管可以经由过程数据段映射到一个文件,然则这是一个司有内存映射,意味着,如不雅改变内存,它并不会将这种变更反竽暌钩到底层的文件上。必须是如许的,不然,分派的全局变量将会改变你磁盘上的二进制文件镜像,这种做法就太弗成思议了!
用图去展示一个数据段是很艰苦的,因为它应用一个指针。在那种情况下,指针 gonzo
的内容(一个 4 字节的内存地址)保存在数据段上。然而,它并没有指向一个真实的字符串。而这个字符串存在于文本段中,文本段是只读的,它用于保存你的代码中的类似于字符串常量如许的内容。文本段也会在内存中映射你的二进制文件,然则,如不雅你的法度榜样写入到这个区域,将会触发一个段故障缺点。尽管在 C 中,它比不上大年夜一开端就避免这种指针缺点那么竽暌剐效,然则,这种机制也有助于避免指针缺点。这里有一个展示这些段和示例变量的图:
你可以经由过程攫取 /proc/pid_of_process/maps
文件来检查 Linux 过程中的内存区域。请记住,一个段可以包含很多的区域。例如,每个内存映射的文件一般都在 mmap 段中的它本身的区域中,而动态库有类似于 BSS 和数据一样的额外的区域。下一篇文┞仿中我们将具体解释“区域”的┞锋正含义是什么。此外,有时刻人们所说的“数据段”是指“数据 + BSS + 堆”。
你可以应用 nm 和 objdump 敕令去检查二进制镜像,去显示它们的符号、地址、段等等。最终,在 Linux 中膳绫擎描述的虚拟地址构造是一个“弹性的”构造,这就是这几年来的缺盛情况。它假设 RLIMIT_STACK
有一个值。如不雅没有值的话,Linux 将恢复到如下所示的“经典” 构造:
Classic Process Address Space Layout In Linux
这就是虚拟地址空间构造。接下来的文┞仿将评论辩论内核若何对这些内存区域保持跟踪、内存映射、文件若何攫取和写入、以及内存应用数据的意义。
【编辑推荐】
- 这里有一百道Linux笔试题,能拿90分以上的都去了BAT
- 如安在Linux上让一段时光不晃荡的用户主动登出
- 解决Linux和Windows双启动带来的时光同步问题
- 在多个Linux办事器,同时履行敕令
- 超全的 Linux 机械的渗入渗出测试敕令备忘表
推荐阅读
斯坦福的AI算法能预测死亡!这对临终关怀来说或许是件好事......
年前最后一场技巧盛宴 | 1月27日与京东、日记易技巧大年夜咖畅聊智能化运维成长趋势!应用人工智能技巧来猜测病人什么时刻会去世, 这听起来就像是反乌托邦科幻剧《黑镜》里才有的情节。>>>详细阅读
本文标题:剖析内存中的程序之秘,快来看吧!
地址:http://www.17bianji.com/lsqh/40381.html
1/2 1