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

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

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

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

  • 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)它是指在一个进程中随机化堆栈还是指在计算所有进程的空间后留下的东西?

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

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

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

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

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

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

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

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

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

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

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

第1部分。堆栈……

函数可以调用一个函数,该函数可能调用另一个函数。 通过每次迭代,分配的任何变量都会在堆栈中结束。 并在每个函数退出时取消分配,因此“堆栈”。 你可能会考虑维基百科这个东西…… http://en.wikipedia.org/wiki/Stack_%28abstract_data_type%29

Linux通过向起始地址添加偏移量来随机化堆栈,内存映射段和堆。 不幸的是,32位地址空间非常紧张,几乎没有随机化空间并妨碍其有效性。

我相信在比较32位与64位随机化的能力时,这更多地是在文章中进行的概括。 32位的3GB可寻址存储器仍然是“移动”的相当大的空间……它只是没有64位操作系统所能提供的空间那么多,并且有某些应用,例如图像 – 编辑器等,内存密集,可以轻松使用可用的整个3GB可寻址内存。 请记住,我说的是“可寻址的”内存……这取决于平台,而不是系统中可用的物理内存量。