我的操作系统是 Ubuntu 12.10 64 位。我很久以前就遇到过这个问题,以前所有版本的 Ubuntu 也都遇到过。如果我启动一个进程,它会占用所有内存,完成后,计算机仍然瘫痪,这意味着速度不如启动该进程之前快。
这是一种常见的情况吗?我们可以做些什么来抵抗/治愈它?
答案1
首先,您可能不应该运行占用所有内存的进程。
发生这种情况的原因是由于swap space
。
类比时间
你有一辆公交车。这辆公交车在车内有“首选”座位,在车顶有“溢出”座位。只有当所有首选座位都被占满并且人们仍然需要乘坐公交车时,人们才会坐在车顶上。
这辆巴士有以下独特之处特性:
- 座位非常小;一般一个人会占据很多座位,一个小孩可能占 2 到 4 个座位,一个成年人占 8 到 10 个座位,有的甚至多达 40 个。
- 优先座位的乘客上下车所需的时间比超额座位的乘客快 20 倍。
还有三个文化规则关于这辆巴士:
- 有一条规则是,刚上车的人可以“挤”一下先上车的人,这样就迫使先上车的人从自己喜欢的座位起身,坐到车顶的额外座位上。每个人都习惯了这种行为,所以不会引起争吵或误解;这只是文化的一部分。
- 第二条规则是,如果公交车已满,那么当有人试图登上满载的公交车时,占据公交车最多座位的人必须立即离开。
- 第三条规则是,每当有首选座位空出来时,可能坐在超额座位上的人会立即从车顶起身,下来坐在首选座位上。
现在,假设你把所有优先座位都坐满了。然后更多的人想上车。于是有人上了车,所有优先座位都被占了,所以根据文化习俗,他们会强迫坐在优先座位上的人爬上车顶。这个过程可以重复,直到车顶上的额外座位也坐满了。
一旦所有优先座位和超额座位都坐满了,会发生什么?个头最大的人必须下车。如果他们下车时坐在优先座位上,他们可以很快离开;但个头较小的人(或多人)可以按照规定从车顶下来坐在可用的优先座位上。
现在,将这个类比应用到现实中:“溢出座位”是硬盘驱动器上的交换空间,“优先座位”是 RAM。公交车的规则非常明确地适用。
实际情况是,当您的“大人物”(占用大量 RAM 的进程)被杀死时,系统会开始将交换空间(溢出座位)中的进程移回 RAM(首选座位)。这是因为从首选座位上车和下车要快得多,而且人们总是上车和下车,所以您不想在车站等很长时间,等着人们从车顶上车和下车。
虚拟内存操作系统始终会使用尽可能多的 RAM。最高优先级用途是用于正在执行并访问 RAM 的这些段的程序的实际映射数据。中等优先级用途是用于未执行的程序的映射页面。最低优先级用途是用于“页面缓存”,它基本上是硬盘驱动器最常访问的文件的缓存,这样每次访问时就不必从磁盘读取它们。
当您的大程序占用了所有 RAM 时,系统上的大多数程序(除了占用所有 RAM 的程序)都会被推入交换空间(溢出位置),因此当您结束大程序时,所有内容都会开始移回 RAM,以便您的桌面保持响应。在进行此传输时,由于速度非常慢,您的系统会陷入停滞,因为它必须平衡来自虚拟内存管理器的 I/O 请求和来自应用程序的 I/O 请求。这就是发生这种情况的更技术性的定义。
“治愈”有三个方面:
- 首要任务:购买更多 RAM。这可以永远不会伤害你并且可以只帮助你。如果您有足够的钱,并且您的主板有能力容纳更多的 RAM,那就这么做吧。
- 第二要务:不要运行占用所有 RAM 的程序。
- 优先级三:减少交换分区的大小,或者完全消除它,或者购买更快的硬盘(例如 SSD)。