Answers:
一经请求。实际上,Linux会在空闲时缓慢转移物理内存以进行交换(请参阅:“交换性”)。
在正常操作期间,交换数据将按需加载到内存中,如其他答复所述,但是还有一种情况发生:禁用交换空间,前提是有足够的物理内存来加载整个交换内容。
做就是了:
swapoff -a
…并且所有交换数据将“返回”到内存中。副作用是磁盘缓冲区/缓存可能会被刷新。
有时可能需要这样做swapoff -a ; swapon -a
,例如,在进行了一些有漏洞的内存泄漏过程之后,在崩溃之前清除了更重要的进程,以确保系统中正在运行的任何进程都已加载到内存中,而不会等待交换中的内容。几分钟。
swapoff
不会失败的风险,但是系统将在内存耗尽后立即用完,swapoff
并且OOM将终止随机进程(在最坏的情况下,即将调用的shell swapon
或swapon
命令)。实际上,这是不太可能的–缓存在swapoff
调用之前会占用大量内存,因此它应该有足够的RAM才能运行两个命令。
正如其他人指出的那样,仅在需要时(按需)将页面复制回RAM,而不是占用可能更好地留给缓存/缓冲区使用的RAM。
将页面复制回RAM而不是移动的事实很重要,如果您不了解,可能会造成混乱。除非完全不再需要页面(即,页面已完全释放),已在RAM中更改(因此,交换中的副本不再正确)或交换即将用尽(然后打开),否则不会从交换中释放该页面。 -disk块需要换出其他页面)。这样,如果将来需要再次换出页面,则无需进行磁盘写操作,因为内核知道磁盘上已经存在良好的副本-当可用RAM严重不足时,这可以大大减少“颠簸”,但是交换空间也不需要拥挤。
您可以看到当前在RAM中有多少页并且可以从中进行交换cat /proc/meminfo
-该SwapCached
行是当前在RAM和磁盘中的页中的数据量。如果您认为当前的交换使用的交换量高于预期,请检查SwapCached值,因为这很可能解释差异。
这通常绑定到您使用的硬件。在大多数硬件(包括英特尔)上,MMU控制着整个过程。
当程序分配内存时,它将向MMU请求并将其取回虚拟地址。反过来,MMU将在全局地址空间映射中将该页面注册为“正在使用”。
当程序实际访问该内存空间时,MMU会将页面查找到地址映射中。如果该页面位于“实时”内存中,它将向操作系统发送“实时”指针,该OS将代表程序处理对内存的读/写操作。如果当前未分配内存,则将触发页面错误。然后,操作系统会捕获该处理器异常,然后由操作系统负责确定数据在交换文件中的位置,将其加载到物理内存中,然后将页面返回给MMU,以便初始过程可以继续。
这意味着,除非访问内存页,否则一旦交换掉它就永远不会回到“活动”内存中。这就是为什么通常会有一个OS API,该API允许程序指定不将特定的内存块交换到磁盘上,而应该保留在内存中(我不了解Linux,但是在Windows中,它是VirtualLock函数) 。