我正在阅读虚拟内存,其中进程的图像包含文本,数据,堆栈和堆。 堆和堆栈大小动态增长。我怀疑的是尺寸是如何决定的,还是所有工艺都有固定的尺寸。
感谢
答案 0 :(得分:1)
您尚未指定操作系统,所以我会说Linux,因为您可以检查源代码。
对于堆,人们通常会在使用malloc
时认为堆增长,但malloc
本身不会影响虚拟内存映射。真正发生的事情是malloc
使用系统调用sbrk
或mmap
来增加我们通常称为堆的虚拟内存区域,然后使用malloc
内存sbrk
管理器{已设置{1}}和mmap
。所以要记住的关键是,系统调用会增加虚拟内存,例如sbrk
和mmap
。
对于堆栈,当您进行函数调用时,堆栈会逐渐减少。最终,您将点击未映射的页面,并且您会收到页面错误。如果操作系统确定这是因为堆栈需要更多内存并且您没有超出堆栈限制或内存限制,它会将更多页面映射到堆栈,否则它是一个例外。另一种方法是使用固定大小的堆栈,当达到堆栈限制时,程序会导致异常。
答案 1 :(得分:0)
我认为你将内存划分为文本,数据,堆栈和堆是令人困惑的。用户记忆通常分为:
Readonly,可执行内存(代码 - 你调用文本 只读,非可执行内存(静态数据 - 你调用文本) 读/写,非可执行内存
堆栈和堆是读/写,非可执行内存的区域。他们没什么特别的。它与应用程序中用于静态,重写/写入变量的内存相同。
堆栈有点特殊,因为操作系统通常为每个线程分配。堆栈的初始大小可以在可执行文件中设置(某些系统将其作为链接器选项)或通过系统设置。尺寸通常不固定。如果堆栈超出其限制,大多数系统将尝试将下一页映射到进程地址空间并展开堆栈。
通常不会自动管理堆。堆只是库管理的一些内存区域。当您调用库函数(如malloc)作为内存时,它将尝试从其可用堆中分配内存。如果没有适合请求的可用内存,它将调用操作系统服务将其他页面映射到可以使用的进程地址空间。
多个内存管理器可能会创建多个堆。堆通常从零开始。