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

Reg*_*ser 10 c memory memory-management

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

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

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

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

Ale*_*rlo 10

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

堆栈是分配局部变量和函数调用框架(其中包括像函数的参数,其中的功能后返回呼吁,等等).

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

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

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

是特定的过程,并且由程序本身管理,但它必须从OS请求存储器开始与(并视需要).你是对的,这通常malloc是分配呼叫的地方.但是,大多数malloc实现都使用mmap来请求内存块,因此堆和内存映射段之间的区别实际上更少.实际上,堆可以被认为是内存映射段的一部分.

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

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

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

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

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