c - 程序如何在内存中运行以及操作系统处理内存的方式

标签 c memory memory-management

我不清楚进程正在执行时的内存管理 在运行期间

这是一个图表 enter image description here

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

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

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

virtual address space, which in 32-bit mode is always a 4GB block of memory addresses. These virtual addresses are mapped to physical memory by page tables,

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

同一篇文章也提到

Linux randomizes the stack, memory mapping segment, and heap by adding offsets to their starting addresses. Unfortunately the 32-bit address space is pretty tight, leaving little room for randomization and hampering its effectiveness.

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

最佳答案

1) What is the stack which this image is referring to?

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

2) What is memory mapping segment which is referring to file mappings?

Memory mapping segment拥有链接库。它也是分配 mmap 调用的地方。通常,内存映射文件只是由文件支持的内存区域。

3) What does the heap have to do with a process. Is the heap only handled in a process or is the heap something maintained by the operating system kernel and then memory space is allocated by malloc (using the heap) when ever a user space application invokes this?

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

4) Does this mean that at a time only one program runs in memory occupying entire 4 GB of RAM?

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

5) Is it referring to randomizing the stack within a process or is it referring to something which is left after counting the space of all the processes?

我从未见过任何表明 4gb 空间会“阻碍”操作系统使用的内存分配策略有效性的情况。此外,正如@Jason 所指出的,堆栈、内存映射段和堆的位置是随机的“以防止可预测的安全漏洞,或者至少使它们比操作系统管理的每个进程都具有可执行文件的每个部分更难完全相同的虚拟内存位置。”具体来说,操作系统正在随机化堆栈、内存映射区域和堆的虚拟地址。在那一点上,进程看到的所有内容都是 virtual address ,然后映射到内存中的物理地址,具体取决于特定页面所在的位置。有关虚拟地址和物理地址之间映射的更多信息,请参阅 here .

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

关于c - 程序如何在内存中运行以及操作系统处理内存的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14301038/

相关文章:

c - unsigned int T = 0xFFFFFFFF 在 C 中等于 -1?它不应该在未签名后立即充当 2 恭维吗?

c++ - 内存泄漏是永久性的吗?

Java GC 概念 : CMSInitiatingOccupancyFraction

c - 谁响应内存管理用malloc()

python - 如何应用最大缓存大小来内存?

c - C中的递归仅在打印不相关的东西时有效

python - ctypes - 查看返回结构的 c_char_p 字段

c - 哪种方法可以更快地确定奇偶性?

multithreading - 操作系统如何确定应为每个线程分配多少堆栈空间?

c - 用C反转BMP文件中像素的颜色