我不清楚进程执行时的内存管理
在运行时
Here is a diagram ![enter image description here](https://i.stack.imgur.com/erSUc.png)
我不清楚图像中的以下内容:
- 1)该图像所指的堆栈是什么?
- 2)什么是内存映射段,它指的是文件映射?
- 3)堆与进程有什么关系。堆是仅在进程中处理还是堆是由操作系统内核维护的东西,然后当用户空间应用程序调用它时由 malloc (使用堆)分配内存空间?
文章提到http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/ http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/
虚拟地址空间,在 32 位模式下始终是 4GB 块
内存地址。这些虚拟地址被映射到物理地址
按页表存储,
- 4) 这是否意味着一次只有一个程序在占用整个 4 GB RAM 的内存中运行?
同一篇文章还提到
Linux 通过添加随机化堆栈、内存映射段和堆
到它们起始地址的偏移量。不幸的是32位地址
空间非常紧张,几乎没有留下随机化的空间
妨碍其有效性。
- 5)它是指随机化进程内的堆栈还是指计算所有进程的空间后剩下的东西?
1)该图像所指的堆栈是什么?
The stack http://en.wikipedia.org/wiki/Stack-based_memory_allocation用于分配局部变量和函数调用框架(包括函数参数、函数调用后返回的位置等)。
2)什么是内存映射段,它指的是文件映射?
内存映射段 http://en.wikipedia.org/wiki/Memory-mapped_file保存链接库。也是在哪里mmap
呼叫已分配。一般来说,内存映射文件只是文件支持的内存区域。
3)堆与进程有什么关系。堆是仅在进程中处理还是堆是由操作系统内核维护的东西,然后当用户空间应用程序调用它时由 malloc (使用堆)分配内存空间?
The heap http://en.wikipedia.org/wiki/Heap_memory是特定于进程的,并且由进程本身管理,但是它必须首先从操作系统请求内存(并且根据需要)。你是对的,这通常是malloc
呼叫已分配。然而,大多数malloc
实现利用mmap
请求内存块,因此堆和内存映射段之间的区别实际上较少。确实,堆could被视为内存映射段的一部分。
4) 这是否意味着一次只有一个程序在占用整个 4 GB RAM 的内存中运行?
不,这意味着数量可寻址的程序可用的内存仅限于 4 GB RAM,在任何给定时间内存中实际包含的内容取决于操作系统如何分配物理内存,并且超出了本问题的范围。
5)它是指随机化进程内的堆栈还是指计算所有进程的空间后剩下的东西?
我从未见过任何表明 4GB 空间“阻碍”操作系统使用的内存分配策略有效性的内容。此外,正如 @Jason 所指出的,堆栈、内存映射段和堆的位置是随机的,“以防止可预测的安全漏洞,或者至少使它们比操作系统管理的每个进程都包含可执行文件的每个部分要困难得多”完全相同的虚拟内存位置。”具体来说,操作系统正在随机化虚拟地址对于堆栈、内存映射区域和堆。在这一点上,进程看到的一切都是虚拟地址 http://en.wikipedia.org/wiki/Virtual_address,然后根据特定页面所在的位置映射到内存中的物理地址。有关虚拟地址和物理地址之间映射的更多信息可以找到here http://en.wikipedia.org/wiki/Page_table.
这个维基百科article http://en.wikipedia.org/wiki/Page_replacement_algorithm关于分页是学习操作系统如何在进程之间管理内存的一个很好的起点,并且是回答问题 4 和 5 的一个很好的资源。简而言之,内存是以页的形式分配给进程的,这些页要么存在于主内存,或已“调出”到磁盘。当进程请求内存地址时,它将将该页面从磁盘移动到主内存,并在需要时替换另一个页面。有多种页面替换策略可供使用,我建议您参阅本文以了解有关每种策略的优点和缺点的更多信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)