📄 node65.html
字号:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><!--Converted with LaTeX2HTML 96.1-h (September 30, 1996) by Nikos Drakos (nikos@cbl.leeds.ac.uk), CBLU, University of Leeds --><HTML><HEAD><TITLE>The buffer cache</TITLE><META NAME="description" CONTENT="The buffer cache"><META NAME="keywords" CONTENT="sag"><META NAME="resource-type" CONTENT="document"><META NAME="distribution" CONTENT="global"><LINK REL=STYLESHEET HREF="sag.css"></HEAD><BODY LANG="EN" > <A NAME="tex2html1108" HREF="node66.html"><IMG WIDTH=37 HEIGHT=24 ALIGN=BOTTOM ALT="next" SRC="./next_motif.gif"></A> <A NAME="tex2html1106" HREF="node59.html"><IMG WIDTH=26 HEIGHT=24 ALIGN=BOTTOM ALT="up" SRC="./up_motif.gif"></A> <A NAME="tex2html1102" HREF="node64.html"><IMG WIDTH=63 HEIGHT=24 ALIGN=BOTTOM ALT="previous" SRC="./previous_motif.gif"></A> <A NAME="tex2html1110" HREF="node1.html"><IMG WIDTH=65 HEIGHT=24 ALIGN=BOTTOM ALT="contents" SRC="./contents_motif.gif"></A> <A NAME="tex2html1111" HREF="node108.html"><IMG WIDTH=43 HEIGHT=24 ALIGN=BOTTOM ALT="index" SRC="./index_motif.gif"></A> <BR><B> Next:</B> <A NAME="tex2html1109" HREF="node66.html">Boots And Shutdowns</A><B>Up:</B> <A NAME="tex2html1107" HREF="node59.html">Memory Management</A><B> Previous:</B> <A NAME="tex2html1103" HREF="node64.html">Allocating swap space</A><BR> <P><H1><A NAME="SECTION00660000000000000000">高速缓存</A></H1><P><A NAME="secbuffercache"> </A><P>与存取(真正的)内存相比,从磁盘读是很慢的<A NAME="tex2html27" HREF="footnode.html#1868"><IMG ALIGN=BOTTOM ALT="gif" SRC="./foot_motif.gif"></A>另外,在相对短的一端时间里,多次读硬盘相同的部分是很常见的。例如,你可能先读了一封电子邮件,然后回复时又将它读入编辑器,然后复制它到一个文件夹时又用邮件程序读它。或者,考虑命令<tt>ls</tt><A NAME="1927"> </A>可能被系统上的很多用户多么频繁地使用。只从磁盘读一次信息,并保持在硬盘中,知道不再需要,除了第一次读,其他都会较快。这就叫<b>磁盘缓存disk buffering</b>,用于此目的的内存叫<b>buffer cache</b>。<P>不幸的是,由于内存是有限且缺乏的资源,buffer cache一般不会足够大(大到能够装下所有人可能用到的数据)。当cache满时,最长时间不用的数据将被丢弃,内存释放给最新的数据。<P>磁盘缓冲也用于写操作。要写的数据经常马上又被读(例如一个源代码文件保存到文件中后又被编译器读出),所以将要写的数据放在缓冲里是个好主意。另外,只将数据放如cache而不马上写到磁盘,写操作的程序执行速度更快。写操作然后可以在后台完成,而不降低其他程序的速度。<P>许多操作系统有buffer caches (即使名称不同),但并非都根据上述原理。有些是<b>透写write-through</b>: 数据马上写到磁盘(当然也同时写到cache)不马上写的cache叫<b>回写write-back</b>。回写比透写更有效,但也更容易出错:如果系统崩溃,或电源突然掉电,或软盘在cache回写前被取出,那么cache中改变的数据将丢失。这可能意味着文件系统is not in full working order, 可能由于未写数据包含了系统记录信息的重要的变化。<P>因此,千万不要不经过正常的关闭过程直接关闭电源(见<A HREF="node66.html#chboothalt">6</A>章), 或没有unmount就取出软盘(如果是mount的),或什么程序还在用着软盘,或软盘灯还在闪。<tt>sync</tt><A NAME="1933"> </A>命令<b>刷新</b>缓冲,即强制将所有未写数据写回磁盘,如果要确保所有数据安全回写,可以用它。传统的UNIX系统中,有个<tt>update</tt><A NAME="1936"> </A>程序在后台运行,它每30秒运行一次<tt>sync</tt><A NAME="1938"> </A>,所以通常无须使用<tt>sync</tt><A NAME="1940"> </A>。Linux有一个另外的守侯程序<tt>bdflush</tt><A NAME="1942"> </A>,它克服了<tt>sync</tt><A NAME="1944"> </A>有时因磁盘I/O负荷太重(因为频繁的操作)而导致有时系统突然呆住的问题。<P>Linux下,<tt>bdflush</tt><A NAME="1946"> </A>由<tt>update</tt><A NAME="1948"> </A>启动。一般无须考虑它,但如果<tt>bdflush</tt><A NAME="1950"> </A>偶尔因为什么原因死了,核心会给出警告,此时应该手工启动它(<tt>/sbin/update</tt><A NAME="1952"> </A>)。<P>cache并不真正缓冲文件,而是块,就是磁盘I/O的最小单元(Linux下,一般是1kB)。这样,所有的目录、超级块、其他文件系统记录数据和无文件系统磁盘都可以被缓冲。<P>cache的效果决定于其大小。太小的cache几乎无用;它只能cache很少的数据,而可能在被重用前就被清除了。大小有赖于有多少数据被读写,相同的数据的存取频度。唯一的方法是实验。<P>如果cache是固定大小,那么不应该太大,否则,会由于空闲内存空间太小而使用swap(也很慢)。为了最有效地使用真实内存,Linux自动使用所有空闲内存作为buffer cache,当程序需要更多内存时,自动减少cache。<P>Linux下,对cache使用无须做任何工作,它完全是自动的。除了要正常关闭系统和取出软盘,无须关心cache。<P><HR><A NAME="tex2html1108" HREF="node66.html"><IMG WIDTH=37 HEIGHT=24 ALIGN=BOTTOM ALT="next" SRC="./next_motif.gif"></A> <A NAME="tex2html1106" HREF="node59.html"><IMG WIDTH=26 HEIGHT=24 ALIGN=BOTTOM ALT="up" SRC="./up_motif.gif"></A> <A NAME="tex2html1102" HREF="node64.html"><IMG WIDTH=63 HEIGHT=24 ALIGN=BOTTOM ALT="previous" SRC="./previous_motif.gif"></A> <A NAME="tex2html1110" HREF="node1.html"><IMG WIDTH=65 HEIGHT=24 ALIGN=BOTTOM ALT="contents" SRC="./contents_motif.gif"></A> <A NAME="tex2html1111" HREF="node108.html"><IMG WIDTH=43 HEIGHT=24 ALIGN=BOTTOM ALT="index" SRC="./index_motif.gif"></A> <BR><B> Next:</B> <A NAME="tex2html1109" HREF="node66.html">Boots And Shutdowns</A><B>Up:</B> <A NAME="tex2html1107" HREF="node59.html">Memory Management</A><B> Previous:</B> <A NAME="tex2html1103" HREF="node64.html">Allocating swap space</A><P><ADDRESS><I>Lars Wirzenius <BR>Sun Jun 29 13:31:22 EEST 1997</I></ADDRESS></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -