计算机底层知识拾遗(五)理解块IO层

上一篇讲了文件系统计算机底层知识拾遗(四)理解文件系统,说了文件按照inode-block的结构存储在磁盘上。这篇说说操作系统是如何来读取磁盘上的块的


Linux把设备分为三种

1. 块设备,用来永久存储文件信息的,支持顺序访问和随机访问(按块号访问),比如磁盘,光盘等

2. 字符设备,只能顺序访问,比如键盘

3. 网络设备,只能顺序访问,比如网卡,蓝牙设备


我们常说的一句话是Linux把所有IO设备都当做文件,这句话部完全对,因为网络设备是个例外,块设备和字符设备都可以在文件系统的目录树上找到,一般都在/dev下面,但是网络设备不在目录树上。对应网络操作,Unix/Linux的设计者把它认为是一种进程间通信技术,是IPC的一种,而不是文件,所以没有把网络设备挂载到文件系统的目录树上。但是网络socket操作底层实现的时候还是抽象成了文件操作,以后会说。


字符设备和网络设备都只支持顺序访问,从内核的角度来说,仅仅需要控制一个当前读写位置,实现相对比较简单。而块设备要支持随机访问,需要实现数据的缓存,脏数据的回写等等,对块设备的每一分优化就能带来整个系统性能的提升,所以Linux设计了一个专门的块IO层子系统来处理块设备的访问。


块IO层在早期的Linux版本中也叫缓冲区高速缓存(buffer),早期的Linux版本不支持虚拟内存机制,所以不要页的操作,只关注于块的操作,只需要给定一个设备号和块号就能操作缓冲区高速缓存和块设备。现代的Linux采用虚拟内存机制来管理内存,页是虚拟内存管理的最小单位,所以采用了页缓存来作为虚拟内存机制的缓存。在Linux 2.4内核里面存在两个独立的缓存,一个是页缓存,针对页,一个是缓冲区高速缓存,针对块,同一份磁盘数据可能要存在于两个缓存中,需要额外的同步操作。在Linux 2.6内核中把这两个缓存进行了整合,因为页和块也是可以相互映射的,所以两者的整合是顺其自然的,这样一份磁盘的数据只需要存在于一个缓存就行了。页缓存面向的是虚拟内存,块IO层是面向块设备,这篇主要从块设备和内核的交互的角度来理解块IO层,也就是以前所说的缓冲区高速缓存。

当然缓冲区高速缓存还有一部分是独立存在的,因为有些情况下还需要块级别访问块设备的数据,比如超级块的读取直接用的块IO读写。这个独立的缓冲区高速缓存被实现成一个LRU的缓存。

比如我们用free命令查看操作系统的内存使用情况可以看到独立的buffer和cache区域,buffers就是独立的缓冲区高速缓存,cached就是页缓存。既然是缓存,那么在内存不够的情况下是可以被交换出去的,所以free命令提供了+ - buffers/cache的计算得到的空闲内存的值。



需要记住的是,对于文件操作的系统调用来说,比如read(), write(),它们是直接面向页缓存和缓冲区高速缓存的,页缓存和缓冲区高速缓存对进程来说就是一个存储系统,进程不需要关注底层的设备的读写,由页缓存和缓冲区高速缓存来喝底层设备交互。


计算机底层知识拾遗(三)理解磁盘的机制 中说了磁盘的基本工作原理,

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值