2010-06-13 183 views
5

docs内存页错误究竟是什么?

注:核心数据避免术语 unfaulting,因为它是混乱的。 虚拟 内存页面错误没有“不合格”。页面错误是 触发,引起,解雇或 遇到。当然,你可以通过 多种方式(使用函数 vm_deallocate,munmap或sbrk)将内存释放回内核。核心 数据将此描述为“将 对象变为故障”。

是核心数据中的错误本质上是内存页错误?对于内存页面的内容我只有一点点的想法。我相信这是一种“内存中的代码片段”,它需要执行这样的过程和类似的东西,而且当应用程序运行时,代码片段会作为“页面”被吸引到内存中,因为它们不是需要了。大概99%是错的;)

有人吗?

回答

7

我对存储器页面的内容只有一点点的想法。我相信这是一种“内存中的代码片段”,它需要执行这样的过程和类似的东西,而且当应用程序运行时,代码片段会作为“页面”被吸引到内存中,因为它们不是需要了。

东西(即代码和数据)存在于内存中。

存储器中存在的每件事物都有一个地址(一个存储器地址)。

内存地址空间(例如,32位机器上的4GB)被分成'页面',其中每页是连续的内存块(例如每页4KB)。

地址空间被映射(由CPU和O/S)到RAM(或可能映射到I/O端口,但这是一个不同的故事)。

安装的RAM可能比地址空间(例如4 GB)少(例如1 GB),因此可能会换出一些东西(例如最近最少使用的东西)(由O/S)从RAM到磁盘上的页面文件。整体,整体页面(例如4KB块)是交换的内容(而不是单个字节)。

当应用程序尝试访问当前未映射到RAM的地址时,那就是所谓的页面错误。为了处理页面故障时,O/S可能:

  • 释放一些RAM,通过交换的东西(如最近最少使用),RAM磁盘
  • 地图是新释放的现在可用的RAM应用程序试图访问的地址
  • 从磁盘交换到RAM,无论应该在哪个地址(过去某些时候已将该地址换出到磁盘)
  • 继续应用程序停止运行:应用程序再次尝试访问该内存地址,只是这次没有其他页面错误。
+1

I不要介意你对整个虚拟记忆的描述(就像我一样),但考虑到你提供的详细程度,你不觉得你应该提及它吗?您描述它的方式,听起来像每个应用程序映射到物理内存。一般来说,换出的内容不是绑定到物理地址,而是与您自己的应用程序的另一个(虚拟)页面绑定。无需您的应用程序的内存使用特性来影响其他人的应用程序。 – tvanfosson 2010-06-13 13:01:47

+1

@tvanfosson我没有提到它,现在你已经提出了它,我不知道如何总结它。但是,每个应用程序*都映射到物理内存:每个应用程序都可以看到整个(或大部分)地址空间,就好像地址空间仅由该应用程序拥有一样,而O/S将地址空间映射到RAM 。多个应用程序意味着多个地址空间实例,并且不同的实例彼此竞争RAM。 – ChrisW 2010-06-13 13:11:28

+0

决定要交换的内容(例如,是否选择由此应用程序或其他应用程序使用的页面)是O/S特定的实现细节(我不知道iPhone的细节是什么)。 – ChrisW 2010-06-13 13:14:30

2

当你的程序运行时并不是全部存储在RAM中。
作为操作系统的一部分存在分页机制,它只将最常用的内存页面存储在RAM中以便更快速地访问。
当您尝试访问当前未加载到RAM的内存位置时,会发生页面错误,并从磁盘中读取该页面。
由于可用RAM仅限制存储在RAM中的最重要的存储器页面。

该机制受操作系统实施的限制。
对于操作系统理论的更全面的探索,我会推荐A.S.Tenenbaum撰写的Modern Operating Systems一书。

3

从操作系统的角度来看,内存页面是应用程序的基本数据单元。您的所有代码和数据均按页面组排列。当您的程序在您的应用程序中引用合法的内存位置时 - 通过尝试读取或写入数据或加载指令,该地址将转换为其中一个页面中的某个位置。当持有地址的页面实际上不存在于物理内存中时,会发生页面错误。此时操作系统需要将页面从磁盘加载到内存中,以便您的程序可以继续。

+0

因此,当指针指向当前未加载的位置时,页面会自动加载到内存中? – dontWatchMyProfile 2010-06-13 11:49:23

+0

是的 - 它由OS加载。当您的应用程序消耗太多内存时,例如,有很多页面错误会导致控件返回内核,以便从磁盘读取页面,并且通常会导致程序非常慢。 – 2010-06-13 11:54:19

+0

是否与所谓的“交换文件”相关? – dontWatchMyProfile 2010-06-13 12:48:38