1 初识目录结构
2 初识文件
2.1 文件类型
2.1.1 文件
第一个属性为 [-]。最常用的类型,包括:
2.1.2 目录
第一个属性为 [d]
2.1.3 链接文件
第一个属性为 [l]
2.1.4 管道
第一个属性为 [p]
2.1.5 块设备
第一个属性为 [b] 。储数据以供系统存取的接口设备,简单而言就是硬盘。
ll /dev/vda1
brw-rw---- 1 root disk 253, 1 11月 28 19:17 /dev/vda1
2.1.6 字符设备文件
第一个属性为 [c] 。即串行端口的接口设备,例如键盘、鼠标等等。
2.1.7 套接字
第一个属性为 [s]。最常在 /var/run目录中看到这种文件类型。
查看文件类型的方法:
#file, stat, ls
讲到这里,可以有些疑问,到底文件是个什么东东?
2.2 文件是什么?
如上图所示,一般文件包括两部分:元数据和用户数据
为了有效管理文件,引入了文件系统。
2.3 文件系统
文件系统,本身是对存储设备上的文件,进行组织管理的机制。所以根据组织机制的不同,可以分为不同的文件系统。
文件系统系统包括4大要素:索引节点,目录项,逻辑块,超级块。
2.3.1 索引节点
同上面讲的元数据部分,索引节点和文件是一一对应的,它和文件内容一样,是存储在磁盘中的。所以索引节点是占用磁盘空间的。所以它不会随着进程的消亡而消失。
2.3.2 目录项
简称dentry,用来记录文件的名称,索引节点指针以及目录项之间的关联关系,会形成一棵树状结构。多个关联的目录项,就形成了目录结构。
它是由内存维护的一个内存数据结构,所以通常被称作“目录项缓冲”。
2.3.3 逻辑块
索引节点和目录项记录了文件的元数据,那么文件内容是怎么存储的?
实际上,磁盘上最小的读写单位是“扇区”,只有512B大小,也就是0.5K,为了读写效率,系统会将连续的扇区组合一个”块“,一般一个“块”是8个扇区,也就是4K,4096B。
从磁盘中读取内容是特别慢的,所以系统会将读取的内容存到“页缓冲”中。
2.3.4 超级块
一个超级块对应一个文件系统。超级块会保存文件系统的大小和状态、块设备的引用和元数据信息(比如空闲列表等等)
文件系统有多种,比如Ext4, NFS等,根据存储位置不一样,可以分为三类。
每个文件系统是独立的,有自己的组织方法,操作方法。那么对于用户来说,不可能所有的文件系统都了解,那么怎么做到让用户透明的去处理文件呢?
2.4 VFS虚拟文件系统
虚拟文件系统定义了一组所有文件系统都支持的数据结构和标准接口。用户进程和内核中的其他子系统,只需要跟VFS提供的统一接口交互就OK,不需要关心底层文件系统实现细节。
磁盘的操作是非常慢的,所以为了协调磁盘的访问速度,内核提供了“索引节点缓存”,“目录项缓存”,“页缓冲”。
2.5 文件系统I/O
根据文件读写方式的各种差异,导致I/O的分类多种多种。最常见的为以下4类:
2.5.1 缓冲IO和非缓冲IO
第一种,根据是否利用标准库缓存,分为:
需要说明的是:“缓冲”指的是标准库的缓冲,而不是内核提供的高速缓冲区(也就是页缓冲)
2.5.2 直接IO和非直接IO
是否跳过页缓冲。
要想实现直接IO,可以在系统调用的时候,指定O_DIRECT标志。
直接IO和非直接IO,本质上还是和文件系统打交道,如果跳过文件系统直接读写磁盘,就是我们通常说的裸IO。
2.5.3 阻塞和非阻塞IO
设置O_NONBLOCK
2.5.4 同步和非同步IO
设置O_SYNC或者O_DSYNC标志,就代表同步IO。设置O_DSYNC,会等待数据写入磁盘才返回;设置O_SYNC,则是在O_DSYNC的基础上,要求文件元数据也要返回磁盘后,才返回。
·················· END ··················