c运行时库 linux,共享库和可执行文件与Linux上的静态C运行时间链接。他们每个人都有像Windows一样的单独堆吗?...

我真的不知道该如何回答这个问题,但我会尽量给出足够的一般信息,以便我知道您需要知道的内容。

作为一名unix人员,我从你的问题中了解到有关Windows内存管理的知识,你们大量使用“堆”这个词。除了作为“由malloc管理的内存区域”的非正式同义词外,我们不这样做。

有两个主要的动态内存分配原语需要注意:brk和mmap。所有其他分配功能,包括malloc都建立在这些之上。

brk是旧的。它的工作原理是在bss段结束后,将更多内存添加到进程的虚拟内存映射中。您通过brk一个值,并且成为进程的“中断”地址 - 分配的虚拟内存的末尾。

每次需要更多的内存时,malloc都可以构建在brk之上,每次调用时都会使用更高的值,并且维护一些内部数据结构来跟踪已释放和仍在使用的内容。 (在经典实现中没有将内存回馈给系统)。一些malloc实现的内部数据结构必须是heap,它给出了brk段的绰号:“堆”。

这真是不寻常的程序直接调用brk。 (甚至薄包装sbrk)。正常程序中每次使用brk都是通过malloc。请记住,虽然您将C库(包括malloc)视为某种可选的额外内容,但我们有一个与C紧密耦合的操作系统,因此不会像内存管理那样使用libc来处理低级内容的程序非常奇怪的确如此。所以大多数情况下,brk段a.k.a.“堆”中的所有内存都由malloc管理。然而,相反是不正确的,因为...

mmap,比brk(mmap是从90年代; brk是从70年代)提供了很多选项。如果要将文件映射到内存中,或者分配多个不连续的内存块,而不是在原始数据块的末尾添加一些空间,则可以使用mmap。共享库加载器使用mmap来映射每个库的文本和数据。现代malloc实现使用mmap来处理大型请求,而使用brk来处理小型请求。我们也有mremap,它将映射重定位到一个新的虚拟地址,同时保持它在同一个物理地址,允许realloc避免昂贵的副本。

如果您在Linux上查看/proc/$PID/maps,您会看到标记为[heap]的内存区域。这是brk分部。每个过程只有一个。 (我已经看到一些例子,其中maps文件显示其中2个,但它们是连续的并具有相同的属性,因此真的等同于单个区域。我不知道是什么导致了双重列表。)

With记住所有这些背景,分配“额外堆”是什么意思?你可以用mmap从系统请求一些内存,给你一个独立于malloc的区域。然后,您可以对该区域进行自己的类似malloc的管理,以各种大小的块传递它,并跟踪哪些部分未被使用。但是你的新分配器不会是“堆”。这实际上并不意味着什么,因为系统并不知道有关堆的任何信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值