在 Linux 中,交换何时移回物理内存?是否仅在需要时才移回,即在需要时才移回?还是在计算机负载不高时才将交换缓慢地转移到物理内存?
答案1
按需分配。实际上,Linux 会在空闲时缓慢地将物理内存转移到交换区(请参阅:“swappiness”)。
答案2
在常规操作期间,正如其他人所回答的那样,交换中的数据会根据需要加载到内存中,但还有一种情况会发生这种情况:当交换空间被禁用时,前提是有足够的物理内存来加载整个交换内容。
做就是了:
swapoff -a
…并且所有交换数据将“返回”到内存。副作用是磁盘缓冲区/缓存可能会被刷新。
有时可能需要这样做swapoff -a ; swapon -a
,例如在某些有缺陷的内存泄漏进程之后、崩溃之前,将更重要的进程清除出去 - 以确保系统中运行的任何进程都已加载到内存中,并且不会在几分钟内等待交换。
答案3
正如其他人指出的那样,页面只会在需要时(按需)被复制回 RAM,而不是占用可能更好地用于缓存/缓冲区的 RAM。
页面被复制回 RAM 而不是移动,这一点很重要,如果您不了解这一点,可能会导致混乱。除非不再需要该页面(即页面被完全释放)、在 RAM 中发生更改(因此交换中的副本不再正确)或交换空间不足(并且需要磁盘上的块来交换其他页面),否则不会从交换中释放该页面。这样,如果将来需要再次交换页面,则无需写入磁盘,因为内核知道磁盘上已经有一份好的副本 - 当可用 RAM 变得非常低但交换空间也没有拥塞时,这可以大大减少“抖动”。
您可以看到当前 RAM 和交换区中有多少页面cat /proc/meminfo
- 该SwapCached
行表示当前 RAM 和磁盘中的页面数据量。如果您认为当前交换区使用量高于预期,请检查 SwapCached 值,因为这可以很好地解释差异。
答案4
这通常与您使用的硬件有关。在大多数硬件(包括英特尔)上内存管理单元控制整个过程。
当程序分配内存时,它会向 MMU 请求内存并返回虚拟地址。反过来,MMU 会在全局地址空间映射中将该页面注册为“正在使用”。
当程序实际访问该内存空间时,MMU 将在地址映射中查找页面。如果该页面位于“活动”内存中,它将向操作系统发送一个“活动”指针,操作系统将代表程序处理内存读写。如果内存当前未分配,则将触发页面错误。然后操作系统会捕获此处理器异常,操作系统负责找出数据在交换文件中的位置,将其加载到物理内存中,并将页面返回给 MMU,以便初始进程可以继续。
这意味着,除非访问内存页面,否则一旦将其放入交换区,它就永远不会回到“活动”内存中。这就是为什么通常有一个 OS API 允许程序指定某个内存块不交换到磁盘,而应保留在内存中(我不知道 Linux 的情况,但在 Windows 中,它是 VirtualLock 函数)。