为什么部分满 RAM 会导致延迟?

Moh*_*din 54 memory

为什么部分完整的 RAM(比如说 80%)会使设备滞后很多,即使有一些空间可用于存储更多数据?我期望的是它一直运行良好,直到 99%。

我注意到在移动设备上比在 PC 上更多,因为它有更小的内存,例如我的手机有 2 GB 内存;当我的可用 RAM 少于 1 GB 时,它会滞后很多!为什么会发生这种情况,即使它仍有 ~ 1 GB 可用?

LMi*_*er7 71

这里涉及的内容很多,但我将尝试尽可能简单地解释它,并以适用于几乎任何操作系统的方式进行解释。

这里有两个基本原则:

  1. 需要在 RAM 中的所有东西和那些将从 RAM 中受益的东西的总和几乎总是大于 RAM 的大小。可以从 RAM 中受益的事情包括进程工作集和备用列表。后者包含曾经处于活动状态但此后不再活动的数据和代码。其中大部分将再次使用,其中一些很快就会被使用,因此将其保存在 RAM 中是有益的。该内存充当一种缓存,但并不是真正必要的,因此属于可用内存类别。就像空闲内存一样,它可以快速提供给任何需要它的程序。为了性能,备用内存应该很大。

  2. 内存块的使用频率远非随机,但可以相当准确地预测。内存被分成块,通常是 4K 字节。有些块每秒被访问多次,而其他块在很多分钟、几小时、几天甚至几周内都没有被访问,如果系统已经运行了足够长的时间。在这两个极端之间有广泛的用途。内存管理器知道哪些块最近被访问过,哪些块没有被访问过。一个合理的假设是,最近访问过的内存块将很快再次被需要。最近没有访问过的内存可能很快就不需要了。长期的经验证明这是一个有效的原则。

内存管理器利用第二个原则在很大程度上减轻第一个原则的不良后果。为此,它在将最近访问的数据保留在 RAM 中同时将很少使用的数据保留在原始文件或页面文件中进行了平衡操作。

当 RAM 充足时,这种平衡行为很容易。许多最近不使用的数据可以保存在 RAM 中。这是一个很好的情况。

当工作量增加时,事情会变得更加复杂。使用的数据和代码的总和更大,但 RAM 的大小保持不变。这意味着它的一个较小的子集可以保存在 RAM 中。一些最近不使用的数据不能再在 RAM 中,而必须留在磁盘上。内存管理器非常努力地在活动使用的内存和可用内存之间保持良好的平衡。但是随着工作负载的增加,内存管理器将被迫为正在运行的进程提供更多可用内存。这不是一个好情况,但内存管理器别无选择。

问题是在程序运行时将数据移入和移出 RAM 需要时间。当 RAM 充足时,它不会经常发生,甚至不会被注意到。但是当 RAM 使用率达到高水平时,它会更频繁地发生。情况可能变得如此糟糕,以至于将数据移入和移出 RAM 所花费的时间比实际使用它所花费的时间要多。这是颠簸,内存管理器极力避免的事情,但工作量很大,通常无法避免。

内存管理器就在您身边,即使在不利条件下也始终尽力保持最佳性能。但是当工作负载很大而可用内存不足时,它必须做坏事才能继续运行。这其实是最重要的。优先事项是首先保持运行,然后尽可能快地进行。

  • 内存管理器是操作系统的一部分。分页是内存管理器的一项基本功能,对于操作来说就像呼吸对你我一样重要。它无法停止。 (7认同)
  • 它是“显而易见的”或“众所周知的”,但也许仍应在此答案中添加:内存(ram)比硬盘驱动器快 1000 倍(好吧,取决于很多东西,例如 ssd/ide /sata 等)。操作系统从 ram(+缓存)而不是从磁盘执行代码。当内存变低时,操作系统需要将部分(“未使用”)代码从内存“交换”到磁盘,以释放内存以执行其他操作,这将需要“大量”时间(交换),并且如果这种情况经常发生(例如:你有很多程序,每个程序都需要一个交换来将它们的代码加载到内存中),它会大大减慢速度。 (6认同)
  • 我们通常不使用术语“交换”来指代将代码加载到内存中。这通常被称为“故障”。通常,术语“交换”仅用于在从 RAM 中弹出之前必须写入磁盘的信息。 (3认同)
  • @MohammedNoureldin:当您编写用户空间应用程序(其内存视图与内核和其他进程的内存视图隔离)时,您*不能*直接**访问*物理内存。您*可以访问的所有内存视图由内存管理器(您猜对了)及其所有功能(可能)包括分页管理。内存指针仅指内存视图地址空间中的点。它们是在内核和用户空间代码中使用的语言概念,但这并不意味着两个内存视图是相同的。不要将进程内存管理与内核 MM 混淆! (2认同)

Mik*_*ott 28

所有现代操作系统都使用其他未使用的内存来缓存数据,以便可以从快速 RAM 而不是较慢的存储中访问数据。他们通常会将此报告为可用内存,因为应用程序可以清除缓存并在需要时使用它,但它实际上仍在使用中。它越少,可以缓存的数据就越少,计算机也会越慢。

  • 实际上,应用程序不需要“清除”缓存。他们只是从操作系统请求 RAM。操作系统看到它没有未使用的 RAM,将清除部分文件缓存并将现在归零的 RAM 提供给应用程序。应用程序无法判断该 RAM 来自何处。 (11认同)
  • @MSalters 是的,我同意,应用程序需要 RAM,操作系统会在必要时清除缓存。我试图保持简单。 (5认同)