内存布局如何与其他进程/线程共享?

Kai*_*kha 5 c heap-memory memory-layout

目前,我正在学习记忆布局C.现在我知道在C程序的内存存在几个部分:textdatabssheapstack。他们还说heap是与程序之外的其他东西共享。

我的问题是这些。

  1. heap共享到底是什么?一个源指出堆必须始终以使其可用于被释放的其它过程而另一个表示堆区由所有线程,共享库,并且动态加载的模块共享的过程如果它不与其他进程共享,我真的必须在我的程序运行时(不是在程序结束时)释放它吗?
  2. 一些来源还为命令行参数和环境变量挑选了高地址(第六部分)。这是否应被视为另一层和程序存储器的一部分?
  3. 其他部分是否与程序以外的其他部分共享?

Pas*_*ale 2

  1. heap是每个进程的内存:每个进程都有自己的堆,仅在同一进程空间内共享(就像您所说的进程线程之间)。为什么要释放它?不正确地为其他进程提供空间(至少在现代操作系统中,进程死亡时操作系统会回收进程内存),但要防止进程内存中的堆耗尽:在 C 中,如果不释放堆您使用过的内存区域,即使不再使用,它​​们也将始终被视为繁忙。因此,为了防止出现不需要的错误,最好在不再需要时立即释放堆中的内存。
  2. 在 C 程序中,命令行变量作为main函数变量存储在堆栈中。发生的情况是,通常堆栈被分配在进程内存的最高部分,该部分被映射到高地址(这可能是某些来源指出您所写内容的原因)。但是,一般来说,没有第六存储区。
  3. 正如其他人所说,该text区域可以由进程共享。该区域通常包含二进制代码,对于共享相同二进制文件的不同进程来说,二进制代码是相同的。出于性能原因,操作系统可以允许共享此类内存区域(例如当您是fork子进程时)。