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