📄 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" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/sag.css">
</HEAD>
<BODY LANG="EN" >
<A NAME="tex2html1108" HREF="node66.html" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/node66.html"><IMG WIDTH=37 HEIGHT=24 ALIGN=BOTTOM ALT="next" SRC="next_motif.gif" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/next_motif.gif"></A> <A NAME="tex2html1106" HREF="node59.html" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/node59.html"><IMG WIDTH=26 HEIGHT=24 ALIGN=BOTTOM ALT="up" SRC="up_motif.gif" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/up_motif.gif"></A> <A NAME="tex2html1102" HREF="node64.html" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/node64.html"><IMG WIDTH=63 HEIGHT=24 ALIGN=BOTTOM ALT="previous" SRC="previous_motif.gif" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/previous_motif.gif"></A> <A NAME="tex2html1110" HREF="node1.html" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/node1.html"><IMG WIDTH=65 HEIGHT=24 ALIGN=BOTTOM ALT="contents" SRC="contents_motif.gif" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/contents_motif.gif"></A> <A NAME="tex2html1111" HREF="node108.html" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/node108.html"><IMG WIDTH=43 HEIGHT=24 ALIGN=BOTTOM ALT="index" SRC="index_motif.gif" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/index_motif.gif"></A> <BR>
<B> Next:</B> <A NAME="tex2html1109" HREF="node66.html" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/node66.html">Boots And Shutdowns</A>
<B>Up:</B> <A NAME="tex2html1107" HREF="node59.html" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/node59.html">Memory Management</A>
<B> Previous:</B> <A NAME="tex2html1103" HREF="node64.html" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/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" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/footnode.html#1868"><IMG ALIGN=BOTTOM ALT="gif" SRC="foot_motif.gif" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/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" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/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" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/node66.html"><IMG WIDTH=37 HEIGHT=24 ALIGN=BOTTOM ALT="next" SRC="next_motif.gif" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/next_motif.gif"></A> <A NAME="tex2html1106" HREF="node59.html" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/node59.html"><IMG WIDTH=26 HEIGHT=24 ALIGN=BOTTOM ALT="up" SRC="up_motif.gif" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/up_motif.gif"></A> <A NAME="tex2html1102" HREF="node64.html" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/node64.html"><IMG WIDTH=63 HEIGHT=24 ALIGN=BOTTOM ALT="previous" SRC="previous_motif.gif" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/previous_motif.gif"></A> <A NAME="tex2html1110" HREF="node1.html" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/node1.html"><IMG WIDTH=65 HEIGHT=24 ALIGN=BOTTOM ALT="contents" SRC="contents_motif.gif" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/contents_motif.gif"></A> <A NAME="tex2html1111" HREF="node108.html" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/node108.html"><IMG WIDTH=43 HEIGHT=24 ALIGN=BOTTOM ALT="index" SRC="index_motif.gif" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/index_motif.gif"></A> <BR>
<B> Next:</B> <A NAME="tex2html1109" HREF="node66.html" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/node66.html">Boots And Shutdowns</A>
<B>Up:</B> <A NAME="tex2html1107" HREF="node59.html" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/node59.html">Memory Management</A>
<B> Previous:</B> <A NAME="tex2html1103" HREF="node64.html" tppabs="http://linux.ccpi.gov.cn/Linux/linuxadmin/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 + -