linux中存在虚拟内存的位置?

时间:2013-07-25 11:00:45

标签: linux

程序存储在闪存/磁盘上。对于它的执行,程序被加载到虚拟内存中,并由虚拟管理器映射到RAM。在执行过程中,在RAM中。那么虚拟内存在哪里(它有.text,.data,.stack,.heap)?

3 个答案:

答案 0 :(得分:3)

虚拟内存是RAM的视图,也可能是虚拟内存管理器提供的一些交换空间。现代操作系统具有虚拟内存管理器并为进程提供虚拟内存,以便执行程序的行为就像它具有连续的地址空间,其大小不受实际RAM的限制。构成虚拟内存的页面或块可以映射到RAM中的任何位置,因此连续虚拟页面需要存储在连续RAM区域中。或者它们可以换成页面空间或交换空间,在那里等待直到需要,然后它们被操作系统读取并映射到某个RAM页面。

当你说

  

在执行过程中,在RAM中。

这不完全正确。如所解释的,可以交换属于该过程的一些或所有存储页面。

关于答案和评论的另一个词,即“虚拟”意味着它不存在。这毫无意义。相反,根据韦伯斯特的说法:

  

本质或效果......

因此,虚拟内存(因此,它存在!)就像是内存一样。

答案 1 :(得分:0)

虚拟内存就像是一种RAM幻觉。它使用分页来获取可供操作系统中的进程使用的额外RAM。

答案 2 :(得分:0)

虚拟内存意味着您可以使用“普通”momory访问方法访问内存,但不清楚数据实际存储在何处。

可能是

  • 实际上在RAM中
  • 在交换区域
  • 在另一个文件(内存映射文件)中

将适当处理对它的访问。

这是一个很好的虚拟化层,因此您作为程序员不必担心实际放置数据的位置。

最初的目的主要是为了能够为进程提供比实际拥有更多的内存,并通过交换空间扩展它,但还有更多:

  • 操作系统可以随意使用RAM,例如: G。缓存。在某些情况下,使用RAM进行缓存可能比保存长时间未使用的程序部分更有效。
  • 在程序请求时为程序提供额外的内存:如果你调用malloc(),程序的库可能会要求操作系统提供一部分内存,可以无缝地连接到地址空间。
  • 避免堆栈溢出:如果堆栈越来越大,相应的内存部分也可以透明地扩展,以便程序不必担心它。
  • 系统甚至可以对内存进行“过度使用”:如果进程请求大量内存,操作系统可能会说“是,确定”,即。即为程序提供内存。这意味着首先“允许程序访问某个地址空间区域”,但此地址空间不会立即由内存支持。只有在程序访问此内存时,映射才会完成,如果无法实现,程序将被Out of emory killer(至少在Linux下)崩溃。

所有这一切都通过页面方式(1页= 4 kiB)为程序分配物理内存,通过程序的地址空间查看,以及需要的数量和频率。