我对linux上的glibc如何将其内存分配给各种程序感到有点困惑。这些是几个问题:
是否已从公共堆分配(即是否存在公共堆 遍及linux中的所有进程)或者是否有一个堆分配 对于系统中的每个进程。
还假设我是在编译一个静态库,它最终静态链接到主进程,它将如何获取其内存?它是否已经与其他堆链接(因为我们已经编译它)或者将从主进程的堆中获取其内存。
答案 0 :(得分:4)
libc
意义上没有公共堆 - 这会违反进程保护和虚拟内存规则。每个进程都维护自己的堆。内核(在处理器中的MMU的帮助下)维护虚拟内存表,将虚拟地址映射到实际内存。
静态库只不过是在编译时链接代码 - 静态库没有运行时概念。它与进程是同一个,并将使用它的堆。
答案 1 :(得分:0)
堆(以及任何其他可写内存 - 堆栈,BSS等)对于每个进程是分开的。在进程内,内存可能在线程之间共享,而且可能不是(在线程本地存储的情况下)。这适用于新创建的应用程序。对于fork
- ed应用程序,内存将被共享,直到任一进程写入它(写时复制)。
任何只读内存(如共享库或多次运行相同的应用程序)都可能在进程之间共享。这是内核可执行加载程序的决定。
静态库直接链接到可执行文件,因此每个可执行文件都有一个单独的副本(除非它是同一个可执行文件的多个实例)。
答案 2 :(得分:0)
每个进程都有自己的虚拟堆。但是,它可以共享物理RAM,具体取决于访问权限。有关更多背景信息,请参阅copy-on-write。