2011-08-31 36 views
6

我有点糊涂在Linux的glibc如何分配内存以各种program.These是几个问题:不同的程序是从一个共同的堆还是从一个单独的堆中获取内存?

  1. 是它是由一个共同的堆分配(即是有一个共同的堆 所有的在Linux中的进程)或者是否有一个堆分配给系统中的每个进程的 。

  2. 另外假设如果我正在编译一个静态库,它最终得到静态链接到主进程,它将如何获得它的内存?它是否已经与其他堆相关联(正如我们已经编译过的那样),还是会从主进程的堆中获取内存。

+1

下面是说明了Linux内存模型答案: http://stackoverflow.com/questions/2048007/linux-ia-32-memory-model –

+1

参见[内核如何管理你的记忆](HTTP ://duartes.org/gustavo/blog/post/how-the-kernel-manages-your-memory)来进行概述...然后一些!非常“简单”;-) – 2011-08-31 05:37:18

回答

4
  1. 有一个在libc意义上的共同堆 - 这将违反进程保护和虚拟内存的规则。每个进程维护自己的堆。内核(在处理器中的MMU的帮助下)维护将虚拟地址映射到实际内存的虚拟内存表。

  2. 静态库只不过是在编译时链接代码 - 静态库没有运行时概念。它和过程是一样的,并且会使用它的堆。

+0

从你的观点来看2) - 这是否意味着共享内存将拥有自己的内存,并且它与系统主进程使用的堆不同? – pjain

+0

共享库将使用该进程的堆,但其代码将在进程之间共享。 –

+0

和动态库怎么样。他们也从主进程共享堆或为他们有不同的堆。 – pjain

0

堆(和任何其他可写内存栈,BSS等)对于每个进程是分开的。在这个过程中,内存可以在线程之间共享,并且它可能不是(在线程本地存储的情况下)。对于新创建的应用程序来说这是真的对于使用fork的应用程序,内存是共享的,直到任何进程写入(写入时复制)为止。

任何只读内存(如共享库或多次运行相同的应用程序)都可能在进程之间共享。这是内核可执行程序加载器的决定。

静态库直接链接到可执行文件,因此每个正在运行的可执行文件都有一个单独的副本(除非它是同一个可执行文件的多个实例)。

0

每个进程都有自己的虚拟堆。但是,它可能共享物理RAM,或者不共享,具体取决于访问权限。有关更多背景信息,请参见copy-on-write

相关问题