vlambda博客
学习文章列表

linux基础——文件系统

我读书的时候,信息化还远远没有普及,手机和电脑都是上大学的时候买的。 家里唯一的多媒体就是一台厚重的大彩电。 那时候每个周末我都会守在电视机前观看CCTV5的NBA比赛直播,那是我枯燥的学习生涯难得的快乐时光,也是我铭记的珍贵回忆。 虽然现在很少看NBA比赛了,但偶尔还是会看看最新的新闻信息,看看东西部的排名。 我想你应该也猜到了,我看NBA的时候,03一代还刚进联盟,我见证了姚麦,见证了牛马,见证了热火,当然也见证OK的解散,见证了KOBE的巅峰。 其实我大可不必如此感伤,只是感叹,青春易逝,世事无常,你我皆在其中。祝福每一个人都能平平安安健健康康的活着!


文件系统

在 Linux 中一切皆文件,文件系统是对存储设备上的文件,进行组织管理的机制。为了方便管理,Linux 文件系统为每个文件都分配两个数据结构,索引节点(index node)和目录项(directory entry)。它们主要用来记录文件的元信息和目录结构。简单地说,索引节点是每个文件的唯一标志,而目录项是文件系统的树状结构,目录项和索引节点的关系是多对一。磁盘读写最小单位是扇区512B,文件系统把多个连续扇区组成了逻辑块,以此为最小单位来管理数据,常见的逻辑块大小为4KB。超级块存储整个文件系统的状态。目录项、索引节点、逻辑块以及超级块,构成了 Linux 文件系统的四大基本要素。


虚拟文件系统

为了支持各种不同的文件系统,Linux 内核在用户进程和文件系统的中间,又引入了一个抽象层,也就是虚拟文件系统 VFS(Virtual File System)。VFS 定义了一组所有文件系统都支持的数据结构和标准接口。这样就不用关心底层文件系统的实现细节了。按存储位置不同分为:网络文件系统(nfs,smb),基于磁盘的文件系统(XFS,Ext4),基于内存的文件系统,也就是虚拟文件系统(proc)。


文件系统I/O

文件读写方式的各种差异,导致 I/O 的分类多种多样。最常见的有,缓冲与非缓冲 I/O、直接与非直接 I/O、阻塞与非阻塞 I/O、同步与异步 I/O 。

1.缓冲 I/O,是指利用标准库缓存来加速文件的访问,而标准库内部再通过系统调度访问文件。非缓冲 I/O,是指直接通过系统调用来访问文件,不再经过标准库缓存。

2.直接 I/O,是指跳过操作系统的页缓存,直接跟文件系统交互来访问文件(O_DIRECT)。非直接 I/O 正好相反,文件读写时,先要经过系统的页缓存,然后再由内核或额外的系统调用,真正写入磁盘。还有一种跳过文件系统读写磁盘的情况,也就是我们通常所说的裸 I/O

3.阻塞 I/O,是指应用程序执行 I/O 操作后,如果没有获得响应,就会阻塞当前线程,自然就不能执行其他任务。非阻塞 I/O,是指应用程序执行 I/O 操作后,不会阻塞当前的线程,可以继续执行其他的任务,随后再通过轮询或者事件通知的形式,获取调用的结果(O_NONBLOCK )。

4.同步 I/O,是指应用程序执行 I/O 操作后,要一直等到整个 I/O 完成后,才能获得 I/O 响应( O_SYNC)。异步 I/O,是指应用程序执行 I/O 操作后,不用等待完成和完成后的响应,而是继续执行就可以。等到这次 I/O 完成后,响应会用事件通知的方式,告诉应用程序(O_ASYNC)。



参考资料:倪朋飞,Linux性能优化实战



部分内容来自网络,如有侵权请联系作者删除。