13

当进程在运行时执行时,我不清楚内存管理

这是一个图表在此处输入图像描述

我不清楚图片中的以下内容:

  • 1)这个图像所指的堆栈是什么?
  • 2) 什么是指文件映射的内存映射段?
  • 3)堆与进程有什么关系。堆是仅在进程中处理还是由操作系统内核维护,然后当用户空间应用程序调用时由 malloc 分配内存空间(使用堆)?

文章提到 http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/

虚拟地址空间,在 32 位模式下始终是一个 4GB 的内存地址块。这些虚拟地址通过页表映射到物理内存,

  • 4) 这是否意味着一次只有一个程序在占用整个 4 GB RAM 的内存中运行?

同一篇文章还提到

Linux 通过将偏移量添加到它们的起始地址来随机化堆栈、内存映射段和堆。不幸的是,32 位地址空间非常紧凑,几乎没有留给随机化的空间并妨碍了它的有效性。

  • 5)它是指在进程中随机化堆栈还是指在计算所有进程的空间后剩下的东西?
4

3 回答 3

11

1)这个图像所指的堆栈是什么?

堆栈用于分配局部变量和函数调用帧(包括函数参数、函数调用后返回的位置等)。

2) 什么是指文件映射的内存映射段?

内存映射段保存链接库。它也是mmap分配呼叫的地方。通常,内存映射文件只是由文件支持的内存区域。

3)堆与进程有什么关系。堆是仅在进程中处理还是由操作系统内核维护,然后当用户空间应用程序调用时由 malloc 分配内存空间(使用堆)?

是特定于进程的,由进程本身管理,但是它必须从操作系统请求内存才能开始(并且根据需要)。你是对的,这通常malloc是分配调用的地方。但是,大多数malloc实现都使用mmap请求内存块,因此堆和内存映射段之间的区别实际上很小。实际上,堆可以被认为是内存映射段的一部分。

4) 这是否意味着一次只有一个程序在占用整个 4 GB RAM 的内存中运行?

不,这意味着程序可用的可寻址内存量限制为 4 GB RAM,在任何给定时间实际包含在内存中的内容取决于操作系统如何分配物理内存,并且超出了此问题的范围。

5)它是指在进程中随机化堆栈还是指在计算所有进程的空间后剩下的东西?

我从未见过任何暗示 4gb 空间“阻碍”操作系统使用的内存分配策略的有效性的东西。此外,正如@Jason 所指出的,堆栈、内存映射段和堆的位置是随机的“以防止可预测的安全漏洞,或者至少使它们比操作系统管理的每个进程都具有可执行文件的每个部分更难完全相同的虚拟内存位置。” 具体来说,操作系统正在随机化堆栈、内存映射区域和堆的虚拟地址。需要注意的是,进程看到的所有内容都是一个虚拟地址,然后根据特定页面所在的位置将其映射到内存中的物理地址。在这里

这篇关于分页的维基百科文章是学习操作系统如何管理进程之间的内存的一个很好的起点,也是回答问题 4 和 5 的一个很好的阅读资源。简而言之,内存是按页面分配给进程的,这些页面要么存在于主内存中,要么已被“分页”到磁盘中。当进程请求内存地址时,它会将页面从磁盘移动到主内存,并在需要时替换另一个页面。使用了多种页面替换策略,我建议您参阅文章以了解有关每种策略的优缺点的更多信息。

于 2013-01-13T05:58:03.787 回答
1

第 1 部分。堆栈...

一个函数可以调用一个函数,该函数可能调用另一个函数。通过每次迭代分配的任何变量最终都在堆栈上。并在每个函数退出时取消分配,因此是“堆栈”。您可能会考虑使用 Wikipedia 来获取这些内容... http://en.wikipedia.org/wiki/Stack_%28abstract_data_type%29

于 2013-01-13T05:57:38.133 回答
1

Linux 通过将偏移量添加到它们的起始地址来随机化堆栈、内存映射段和堆。不幸的是,32 位地址空间非常紧凑,几乎没有留给随机化的空间并妨碍了它的有效性。

在比较 32 位和 64 位的随机化能力时,我相信这更像是文章中的概括。3GB 的 32 位可寻址内存仍然是相当大的“移动”空间......它只是没有 64 位操作系统所能提供的那么多空间,并且有某些应用程序,例如图像-内存密集型的编辑器等,很容易用完他们可用的全部 3GB 可寻址内存。请记住,我说的是“可寻址”内存……这取决于平台,而不是系统中可用的物理内存量。

于 2013-01-13T06:08:38.193 回答