当进程执行时,我不清楚内存管理 在运行期间
这是一张图
我不清楚图片中的以下内容:
文章提到 http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/
虚拟地址空间,在32位模式下始终为4GB块 内存地址。这些虚拟地址映射到物理地址 内存按页表,
同一篇文章也提到了
Linux通过添加随机化堆栈,内存映射段和堆 抵消他们的起始地址。不幸的是32位地址 空间非常紧张,几乎没有随机化的空间 妨碍其有效性。
答案 0 :(得分:9)
1)此图像所指的堆栈是什么?
stack用于分配局部变量和函数调用帧(包括函数参数,函数调用后返回的位置等)。
2)什么是内存映射段,它指的是文件映射?
Memory mapping segment包含链接库。它也是分配mmap
个调用的地方。通常,内存映射文件只是文件支持的内存区域。
3)堆与进程有什么关系。堆只是在进程中处理还是由操作系统内核维护的堆,然后当用户空间应用程序调用它时,malloc(使用堆)分配内存空间?
heap是特定于进程的,由进程本身管理,但它必须从操作系统开始请求内存(并根据需要)。你是对的,这通常是分配malloc
个调用的地方。但是,大多数malloc
实现使用mmap
来请求内存块,因此堆与内存映射段之间的区别实际上更少。实际上,堆可以被视为内存映射段的一部分。
4)这是否意味着一次只有一个程序在内存中运行占用整个4 GB的RAM?
不,这意味着程序可用的可寻址内存量限制为4 GB RAM,任何给定时间内存中实际包含的内容取决于操作系统分配的物理内存的方式,超出了这个问题的范围。
5)它是指在一个进程中随机化堆栈还是指在计算所有进程的空间后留下的东西?
我从未见过任何暗示4gb空间“阻碍”操作系统使用的内存分配策略有效性的东西。另外,正如@Jason所说,堆栈,内存映射段和堆的位置是随机的“以防止可预测的安全漏洞,或者至少使它们比操作系统管理的每个进程都具有可执行文件的每个部分要困难得多完全相同的虚拟内存位置。“具体而言,操作系统正在为堆栈,内存映射区域和堆随机化虚拟地址。在该注释中,进程看到的所有内容都是virtual address,然后根据特定页面的位置将其映射到内存中的物理地址。有关虚拟和物理地址之间映射的更多信息,请参见here。
关于分页的这个维基百科article是了解操作系统如何在进程之间管理内存的一个很好的起点,并且是一个很好的资源来阅读回答问题4和5.简而言之,内存分配在页面到进程,这些页面存在于主内存中,或者已经“分页”到磁盘。当进程请求内存地址时,它会将页面从磁盘移动到主内存,如果需要则替换另一个页面。使用了各种页面替换策略,我将向您介绍该文章,以了解有关每种方法的优缺点。
答案 1 :(得分:1)
第1部分。堆栈......
函数可以调用一个函数,该函数可能会调用另一个函数。通过每次迭代,分配的任何变量都会在堆栈中结束。并且在每个函数退出时取消分配,因此“堆叠”。你可以考虑维基百科这个东西...... http://en.wikipedia.org/wiki/Stack_%28abstract_data_type%29
答案 2 :(得分:1)
Linux通过向起始地址添加偏移来随机化堆栈,内存映射段和堆。不幸的是,32位地址空间非常紧张,几乎没有随机化的空间,妨碍了它的有效性。
我认为,在比较32位与64位随机化的能力时,这更多地是在文章中进行的概括。 32位的3GB可寻址存储器仍然是“移动”的相当大的空间......它只是没有64位操作系统所能提供的空间那么多,并且有某些应用,例如图像 - 编辑器等,内存密集,可以轻松使用可用的整个3GB可寻址内存。请记住,我说的是“可寻址的”内存......这取决于平台,而不是系统中可用的物理内存量。