node65.html
来自「Linux帮助文档之系统管理员手册」· HTML 代码 · 共 78 行
HTML
78 行
<!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" WIDTH="15" HEIGHT="15"></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 + =
减小字号Ctrl + -
显示快捷键?