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



我目前正在学习C中的内存布局。目前我知道C程序内存中有几个部分:textdatabssheapstack。他们还说heap与计划之外的其他东西共享。

我的问题是这些。

  1. heap究竟与什么共享?一个源表示必须始终释放堆,以便其他进程可以使用它,而另一个源则表示一个进程中的所有线程、共享库和动态加载模块共享堆区域如果它没有与其他进程共享,我真的必须在程序运行时释放它吗(而不是在程序结束时)
  2. 一些源代码还为命令行参数和环境变量单独列出高地址(第六部分)。这是否应被视为程序内存的另一层和一部分
  3. 其他部分是否与程序之外的其他部分共享
  1. heap每个进程的内存:每个进程都有自己的堆,只在相同的进程空间内共享(就像您所说的进程线程之间)。你为什么要解放它?这并不是为了给其他进程留出空间(至少在现代操作系统中,进程内存在进程死亡时由操作系统回收),而是为了防止进程内存中的堆耗尽:在C中,如果你不释放你使用的堆内存区域,即使它们不再使用,它们也会被认为是繁忙的。因此,为了防止不希望出现的错误,最好在不再需要时立即释放堆中的内存
  2. 在C程序中,命令行变量作为函数变量存储在堆栈中。通常情况下,堆栈被分配在进程内存的最高部分,该部分被映射到高地址(这可能是一些来源指出您所写内容的原因)。但是,一般来说,没有任何第六记忆区
  3. 正如其他人所说,text区域可以由进程共享。该区域通常包含二进制代码,对于共享相同二进制的不同进程,二进制代码是相同的。出于性能原因,操作系统可以允许共享这样的内存区域(例如,当您fork是一个子进程时)
  1. 堆与其他进程共享,因为所有进程都使用RAM。你使用的越多,其他程序可用的就越少。在你自己的程序中与其他线程共享堆意味着你的所有线程实际上都可以看到和访问同一个堆(相同的虚拟地址空间,相同的实际RAM,幸运的是还有相同的缓存)
  2. 没有
  3. CCD_ 11可以与其他进程共享。现在它被标记为只读,所以让几个进程共享text是有意义的。在实践中,这意味着如果您已经在运行top并运行另一个实例,那么再次加载text部分是没有意义的。这将浪费时间和物理RAM。如果操作系统足够智能,它可以将这些RAM页面映射到两个top实例的虚拟地址空间,从而节省时间和空间

关于官方方面:

术语线程进程文本部分数据部分bss以及堆栈甚至没有被C语言标准定义,并且每个平台都可以自由地实现这些组件;它可能喜欢";。

线程和进程通常在操作系统层实现,而所有不同的内存部分通常在编译器层实现。

在实践方面:

对于每个给定的进程,所有这些内存部分(文本部分、数据部分、bss、堆和堆栈)都由该进程的所有线程共享。

因此,在从不同线程访问这些内存段时,程序员有责任确保互斥。

通常,这是通过信号量、互斥和消息队列等同步实用程序实现的。

在进程之间,操作系统有责任确保相互排斥。

通常,这是通过虚拟内存抽象实现的,其中每个进程在其自己的逻辑地址空间内运行,并且每个逻辑地址空间被映射到不同的物理地址空间。

免责声明:有些人会声称每个线程都有自己的堆栈,但从技术上讲,这些堆栈通常是在进程的堆栈上连续分配的,通常没有人可以阻止线程访问其他线程的堆栈,无论是有意还是无意(又称堆栈溢出)。

最新更新