磁盘高速缓存

相信通过前面的虚拟文件系统VFS及一个具体的Ext2文件系统博文,大家对基本的VFS体系有一个大致的掌握了吧。从本章开始,我们将讨论一些VFS底层的技术细节,磁盘高速缓存就是其中一个重要的技术。磁盘高速缓存是一种软件机制,它允许系统把通常存放在磁盘上的一些数据保留在RAM中,以便对那些数据的进一步访问而不用再访问磁盘。

 

因为对同一磁盘数据的反复访问频繁发生,所以磁盘高速缓存对系统性能至关重要。与磁盘交互的用户态进程有权反复请求读或写同一磁盘数据。此外,不同的进程可能也需要在不同的时间访问相同的磁盘数据。例如,你可以使用cp命令拷贝一个文本文件,然后调用你喜欢的编辑器修改它。为了满足你的请求,命令shell将创建两个不同的进程,它们在不同的时间访问同一个文件。

 

我们曾在前面的博文中提到过其他的磁盘高速缓存:目录项高速缓存和索引节点高速缓存,前者存放的是描述文件系统路径名的目录项对象,而后者存放的是描述磁盘索引节点的索引节点对象。不过要注意,目录项对象和索引结节点对象不只是存放一些磁盘块内容的缓冲区,而是还加了一些内核感兴趣的其他信息,这些内容并不是从磁盘的某一个块上读取出来的;由此而知,目录项高速缓存和索引节点高速缓存是特殊的磁盘高速缓存,但不是属于我们这里讲的磁盘高速缓存概念的范围。

 

我们这里介绍的磁盘高速缓存其实是页高速缓存——一种对完整的数据页进行操作的磁盘高速缓存,下面我们就从这个概念开始入手:

 

1 页高速缓存

 

页高速缓存(page cache)是Linux内核所使用的主要磁盘高速缓存。在绝大多数情况下,内核在读写磁盘时都引用页高速缓存。新页被追加到页高速缓存以满足用户态进程的读请求。如果页不在高速缓存中,新页就被加到高速缓存中,然后用从磁盘读出的数据填充它。如果内存有足够的空闲空间,就让该页在高速缓存中长期保留,使其他进程再使用该页时不再访问磁盘。

 

同样,在把一页数据写到块设备之前,内核首先检查对应的页是否已经在高速缓存中;如果不在,就要先在其中增加一个新项,并用要写到磁盘中的数据填充该项。I/O数据的传送并不是马上开始,而是要延迟几秒之后才对磁盘进行更新,从而使进程有机会对要写入磁盘的数据做进一步的修改(换句话说,就是内核执行延迟的写操作)。

 

内核的代码和内核数据结构不必从磁盘读,也不必写入磁盘(如果要在关机后恢复系统的所有状态——其实几乎不会出现这种情况,可以执行“挂起到磁盘”操作(hibernation),RAM的全部内容保存到交换区,时此我们不做更多的讨论。),因此,页高速缓存中的页可能是下面的类型:

 

- 含有普通文件数据的页。我们会在后面的博文描述内核如何处理它们的读、写和内存映射操作。


- 含有目录的页。其实,Linux采用与普通文件类似的方式操作目录文件。


- 含有直接从块设备文件(跳过文件系统层)读出的数据的页。内核处理这种页与处理含有普通文件的页使用相同的函数集合。


- 含有用户态进程数据的页,但页中的数据已经被交换到磁盘。内核可能会强行在页高速缓存中保留一些页面,而这些页面中的数据已经被写到交换区(可能是普通文件或磁盘分区)。


- 属于特殊文件系统文件的页,如共享内存的进程间通信(Interprocess Communication, IPC)所使用的特殊文件系统shm。

 

从上面我们可以得出结论,页高速缓存中的每个页所包含的数据肯定属于某个文件。这个文件(或者更准确地说是文件的索引节点)就称为页的

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值