【发布时间】:2011-03-13 18:18:14
【问题描述】:
在谈到进程的内存时,我听说过诸如代码内存和数据内存之类的东西。
对于数据内存,有两种主要的管理机制,栈和堆。
我现在想知道 代码内存 是如何管理的?谁来管理它?
如果我的陈述不是很清楚,请原谅我。
谢谢。
【问题讨论】:
标签: c++ c operating-system
在谈到进程的内存时,我听说过诸如代码内存和数据内存之类的东西。
对于数据内存,有两种主要的管理机制,栈和堆。
我现在想知道 代码内存 是如何管理的?谁来管理它?
如果我的陈述不是很清楚,请原谅我。
谢谢。
【问题讨论】:
标签: c++ c operating-system
如果您有兴趣了解有关进程内存管理的详细信息,我推荐http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory(以及其他与内存相关的文章)。
代码内存 = 文本段
注意地址空间是 4GB。当内核创建一个进程时,它会给它虚拟内存。下面是一个 32 位操作系统的示例。内核通过处理器的MMU 管理映射到实际 RAM 的地址。因此,内核和 MMU 管理代码内存,就像它们管理进程的整个地址空间一样。
(来源:duartes.org)
【讨论】:
代码内存不需要管理,因为它不会改变。当可执行文件被加载到地址空间时,代码只是从可执行文件读取到内存中。事实上,在现代操作系统上,代码段只是映射到可执行文件的内存。
【讨论】:
由操作系统管理。当程序运行时,它的代码从可执行文件加载到某个内存地址。根据程序的性质,对代码部分进行了一些更改,例如解析到动态链接库的跳转。
根据 Space_C0wb0y 的建议,请查看 en.wikipedia.org/wiki/Dynamic_linker 了解正在发生的事情的详细信息。
【讨论】:
您的操作系统提供了所谓的系统调用来动态分配内存(malloc、free 等),它还提供了加载和执行程序的机制。
当操作系统加载程序时,文本段(代码内存)被设置并且程序中静态分配的内存立即可用。当您的代码调用函数时,函数中的(静态分配的)变量在堆栈上分配,而动态分配的内存(例如使用 malloc())在堆上分配。在您的程序运行期间,管理内存是您(程序员)的责任(不这样做会导致内存泄漏,最终会导致长时间运行的程序耗尽内存并崩溃,或者在极端情况下)情况下,取决于操作系统,请使用它来关闭整个操作系统)。
【讨论】: