第419页 | 现代操作系统 | 阅读 ‧ 电子书库

同步阅读进度,多语言翻译,过滤屏幕蓝光,评论分享,更多完整功能,更好读书体验,试试 阅读 ‧ 电子书库

13.4.4 高速缓存

用于改进性能的一种众所周知的技术是高速缓存。在任何相同的结果可能需要多次的情况下,高速缓存都是适用的。一般的方法是首先做完整的工作,然后将结果保存在高速缓存中。对于后来的尝试,首先要检查高速缓存。如果结果在高速缓存中,就使用它。否则,再做完整的工作。

我们已经看到高速缓存在文件系统内部的运用,在高速缓存中保存一定数目最近用过的磁盘块,这样在每次命中时就可以省略磁盘读操作。然而,高速缓存还可以用于许多其他目的。例如,解析路径名就代价高昂得令人吃惊。再次考虑图4-35中UNIX的例子。为了查找/usr/ast/mbox,需要如下的磁盘访问:

1)读入根目录的i节点(i节点1)。

2)读入根目录(磁盘块1)。

3)读入/usr的i节点(i节点6)。

4)读入/usr目录(磁盘块132)。

5)读入/usr/ast的i节点(i节点26)。

6)读入/usr/ast目录(磁盘块406)。

只是为了获得文件的i节点号就需要6次磁盘访问。然后必须读入i节点本身以获得磁盘块号。如果文件小于块的大小(例如1024字节),那么需要8次磁盘访问才读到数据。

某些系统通过对(路径,i节点)的组合进行高速缓存来优化路径名的解析。对于图4-35的例子,在解析/usr/ast/mbox之后,高速缓存中肯定会保存图13-9的前三项。最后三项来自解析其他路径。

图 13-9 图4-35的i节点高速缓存的局部

当必须查找一个路径时,名字解析器首先查阅高速缓存并搜索它以找到高速缓存中存在的最长的子字符串。例如,如果存在路径/usr/ast/grants/stw,高速缓存会返回/usr/ast/是i节点26这样的事实,这样搜索就可以从这里开始,消除了四次磁盘访问。

对路径进行高速缓存存在的一个问题是,文件名与i节点号之间的映射并不总是固定的。假设文件/usr/ast/mbox从系统中被删除,并且其i节点重用于不同用户所拥有的不同的文件。随后,文件/usr/ast/mbox再次被创建,并且这一次它得到i节点106。如果不对这件事情进行预防,高速缓存项现在将是错误的,并且后来的查找将返回错误的i节点号。为此,当一个文件或目录被删除时,它的高速缓存项以及(如果它是一个目录的话)它下面所有的项都必须从高速缓存中清除。

磁盘块与路径名并不是能够高速缓存的惟一项目,i节点也可以被高速缓存。如果弹出的线程用来处理中断,每个这样的线程需要一个栈和某些附加的机构。这些以前用过的线程也可以被高速缓存,因为刷新一个用过的线程比从头创建一个新的线程更加容易(为了避免必须分配内存)。难于生产的任何事物几乎都能够被高速缓存。

请支持我们,让我们可以支付服务器费用。
使用微信支付打赏


上一页 · 目录下一页


下载 · 书页 · 阅读 ‧ 电子书库