1)这个图像所指的堆栈是什么?
堆栈用于分配局部变量和函数调用帧(包括函数参数、函数调用后返回的位置等)。
2) 什么是指文件映射的内存映射段?
内存映射段保存链接库。它也是mmap
分配呼叫的地方。通常,内存映射文件只是由文件支持的内存区域。
3)堆与进程有什么关系。堆是仅在进程中处理还是由操作系统内核维护,然后当用户空间应用程序调用时由 malloc 分配内存空间(使用堆)?
堆是特定于进程的,由进程本身管理,但是它必须从操作系统请求内存才能开始(并且根据需要)。你是对的,这通常malloc
是分配调用的地方。但是,大多数malloc
实现都使用mmap
请求内存块,因此堆和内存映射段之间的区别实际上很小。实际上,堆可以被认为是内存映射段的一部分。
4) 这是否意味着一次只有一个程序在占用整个 4 GB RAM 的内存中运行?
不,这意味着程序可用的可寻址内存量限制为 4 GB RAM,在任何给定时间实际包含在内存中的内容取决于操作系统如何分配物理内存,并且超出了此问题的范围。
5)它是指在进程中随机化堆栈还是指在计算所有进程的空间后剩下的东西?
我从未见过任何暗示 4gb 空间“阻碍”操作系统使用的内存分配策略的有效性的东西。此外,正如@Jason 所指出的,堆栈、内存映射段和堆的位置是随机的“以防止可预测的安全漏洞,或者至少使它们比操作系统管理的每个进程都具有可执行文件的每个部分更难完全相同的虚拟内存位置。” 具体来说,操作系统正在随机化堆栈、内存映射区域和堆的虚拟地址。需要注意的是,进程看到的所有内容都是一个虚拟地址,然后根据特定页面所在的位置将其映射到内存中的物理地址。在这里。
这篇关于分页的维基百科文章是学习操作系统如何管理进程之间的内存的一个很好的起点,也是回答问题 4 和 5 的一个很好的阅读资源。简而言之,内存是按页面分配给进程的,这些页面要么存在于主内存中,要么已被“分页”到磁盘中。当进程请求内存地址时,它会将页面从磁盘移动到主内存,并在需要时替换另一个页面。使用了多种页面替换策略,我建议您参阅文章以了解有关每种策略的优缺点的更多信息。