文件
FD文件描述符
Linux 系统中,把一切都看做是文件,当进程打开现有文件或创建新文件时,内核向进程返回一个文件描述符,文件描述符就是内核为了高效管理已被打开的文件所创建的索引,用来指向被打开的文件,所有执行I/O操作的系统调用都会通过文件描述符。
1 | 用户级限制 查看当前进程的最大fd数 |
文件描述符表
Linux系统中的每个进程会在其进程控制块(PCB)内维护属于自己的文件描述符表(file descriptor table)。表中每个条目包含两个域:一是控制该描述符的标记域(flags),二是指向系统级别的打开文件表中对应条目的指针。
打开文件表&句柄
内核会维护系统内所有打开的文件及其相关的元信息,该结构称为打开文件表(open file table)。表中每个条目包含以下域:
- 文件的偏移量。read()/write()/seek()函数都会修改该值;
- 打开文件时的状态和权限标记。通过open()函数的参数传入;
- 文件的访问模式(只读、只写、读+写等)。通过open()函数的参数传入;
- 指向其对应的inode对象的指针。
各条目称为打开文件句柄(open file handle)。文件描述符是进程级别的,文件句柄是系统级别的,不能混用。它们在不同级别表示已打开的文件。文件描述符与文件句柄直接关联,文件句柄与inode直接关联。
1 | lsof |
INODE
文件储存在硬盘上,硬盘的最小存储单位叫做扇区(Sector)。每个扇区储存512字节。
操作系统读取硬盘的时候,是一次性连续读取多个扇区,即一次性读取一个块(block)。这种由多个扇区组成的块,是文件存取的最小单位。块的大小,最常见的是4KB,即连续八个 sector组成一个 block。
文件数据都储存在块中,还需要一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,即索引节点。
每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。
1 | 查看文件inode信息 |
inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。
1 | 查看每个硬盘分区的inode总数和已使用的数量 |