当 Ubuntu 上的 RAM 达到峰值时我经常会感到烦恼——例如启动 Android Studio 的模拟器时或者 Chrome 选项卡冻结时——整个 GUI 都会冻结,所以我不得不等待它恢复或转到 TTY 并杀死罪魁祸首。
Ubuntu 管理 RAM 的方式可能与 Windows 截然不同吗?在 Windows 上,应用程序本身会冻结,但整个 GUI 不会冻结。有没有办法让 Ubuntu 在这方面表现得更像 Windows?
答案1
现代操作系统使用分页来管理内存。它为系统提供了一些优势,例如能够使用比物理内存更多的内存,保护一些敏感内存区域(如内核保留内存)等,如果你想了解更多关于分页的信息,我可以给你一些参考。
但是分页是什么?
我就不说技术问题了,给你打个比方。假设你有一本百科全书,从 A 到 Z,你是个好奇的人,喜欢花上下午的时间阅读它。你把所有的百科全书都放在你的书架上,还有一张可以放 4 本书的阅读桌。
有一天,你正在阅读有关“航海”的内容,这是字母 S 百科全书的内容。在某个时候,你可能需要阅读其他相关内容,例如字母 W 书上的“风”。只要你把它放在你的阅读桌上,你就可以快速打开它并阅读你需要的内容,然后再回到“航海”这本书。问题是,由于你的阅读桌只能放 4 本书,所以很有可能你需要一本还没有的书。然后你需要从桌子上拿一本书放回书架上,把你需要的书拿到阅读桌上阅读。
好吧,这本书的故事和我的冻结有什么关系?其实,计算机一直在做类似的事情。为了能够使用比实际内存更多的内存,计算机将内存划分为页面,它们是连续的小块内存。它们不需要一直位于 RAM(“阅读台”)上,它们可能存储在磁盘(“书架”)上。如果 RAM 已满,并且 CPU 需要读取/写入存储在磁盘上的页面,则 RAM 上的其中一个页面将存储在磁盘上,并且请求的页面将加载到 RAM 上。
这是内核的工作,所以对用户和程序来说都是透明的。但由于读写磁盘是很多比在 RAM 上读写慢,您会注意到这些冻结。
在 Linux 上,有一个名为交换,用于存储这些额外的页面。Windows 也做同样的事情,但我认为它使用文件。系统内核本身不会冻结,因为它将位于锁定(“不可交换”)页面上。
下图(来自维基百科文章)说明了分页(和虚拟内存,我们不需要深入研究)的概念。这些块表示在内存或磁盘上分配的页面。
我认为 Linux 似乎也会冻结的原因在于 Unity(桌面 GUI)可能会遇到这种交换导致的延迟,而在 Windows 上,它们可能会将桌面 GUI 代码保留在锁定的(“不可交换”)页面中。不过这只是一个头脑风暴理论。
答案2
我以前也遇到过类似的问题。我更改了 ubuntu 的 swappiness,以便让操作系统更晚地将 RAM 写入硬盘。
在这里阅读改变交换性的答案:如何配置 swappiness?
我不能保证这有助于解决您的问题,但在我看来这是最好的选择。