与访问(真实)内存相比,从磁盘读取数据非常慢。此外,在相对较短的时间内多次读取磁盘的同一部分是很常见的。例如,一个人可能首先读取一封电子邮件,然后在回复时将这封信读入编辑器,然后在将其复制到文件夹时让邮件程序再次读取它。或者,考虑一下在拥有许多用户的系统上运行命令 ls 的频率。通过仅从磁盘读取一次信息,然后将其保存在内存中直到不再需要,可以加快除第一次读取之外的所有读取速度。这被称为 磁盘缓冲,用于此目的的内存称为 缓冲缓存。
不幸的是,由于内存是有限的,甚至是稀缺的资源,缓冲缓存通常不能足够大(它无法容纳人们想要使用的所有数据)。当缓存填满时,最长时间未被使用的数据将被丢弃,从而释放的内存将用于新数据。
磁盘缓冲也适用于写入。一方面,写入的数据通常很快会被再次读取(例如,源代码文件被保存到文件中,然后被编译器读取),因此将写入的数据放入缓存中是一个好主意。另一方面,通过仅将数据放入缓存中,而不是立即写入磁盘,写入数据的程序运行得更快。然后可以在后台完成写入,而不会减慢其他程序的速度。
大多数操作系统都有缓冲缓存(尽管它们可能被称为其他名称),但并非所有操作系统都按照上述原则工作。有些是 写穿透:数据立即写入磁盘(当然,它也保存在缓存中)。如果写入操作在稍后的时间完成,则缓存称为 写回。写回比写穿透更有效,但也更容易出错:如果机器崩溃,或者在糟糕的时刻断电,或者在缓存中等待写入的数据被写入之前从磁盘驱动器中取出软盘,则缓存中的更改通常会丢失。这甚至可能意味着文件系统(如果存在)未完全正常工作,可能是因为未写入的数据包含对簿记信息的重要更改。
因此,在未使用正确的关机程序的情况下,切勿关闭电源,或者在软盘驱动器灯不再亮起之前,不要从磁盘驱动器中取出软盘,直到它已被卸载(如果已挂载)或任何正在使用它的程序已发出信号表明已完成。 sync 命令 刷新 缓冲区,即强制将所有未写入的数据写入磁盘,并且可以在想要确保所有内容都安全写入时使用。在传统的 UNIX 系统中,有一个名为 update 的程序在后台运行,每 30 秒执行一次 sync,因此通常没有必要使用 sync。 Linux 还有一个额外的守护程序 bdflush,它更频繁地执行更不完美的同步,以避免 sync 有时引起的因繁重的磁盘 I/O 导致的突然冻结。
在 Linux 下,bdflush 由 update 启动。通常没有理由担心它,但如果 bdflush 由于某种原因碰巧死掉,内核会警告这一点,您应该手动启动它 (/sbin/update)。
缓存实际上不缓冲文件,而是块,块是磁盘 I/O 的最小单位(在 Linux 下,它们通常为 1 KB)。这样,目录、超级块、其他文件系统簿记数据和非文件系统磁盘也被缓存。
缓存的有效性主要由其大小决定。小缓存几乎没用:它将保存很少的数据,以至于所有缓存的数据在被重用之前都会从缓存中刷新。临界大小取决于读取和写入多少数据,以及访问相同数据的频率。唯一的了解方法是进行实验。
如果缓存大小固定,那么将其设置得太大也不是很好,因为这可能会使可用内存太小并导致交换(这也很慢)。为了最有效地利用真实内存,Linux 自动使用所有空闲 RAM 用于缓冲缓存,但也自动在程序需要更多内存时缩小缓存。
在 Linux 下,您无需执行任何操作即可使用缓存,它完全自动发生。除了遵循正确的关机和移除软盘的程序外,您无需担心它。