研究分布式文件存储系统,少不了与底层操作系统,文件系统,存储设备等打交道。了解这些基本原理对我们全方位理解分布式存储,问题定位,性能优化等有很大帮助。
大家都知道,在linux中,一切都是文件,对文件的操作都是通过打开此文件拿到文件描述符,然后通过文件描述符来操作的,今天来看下文件描述符在内核中是用什么样的数据结构保存的。
多个文件描述符可能指向同一个打开的文件,这些文件描述符可能是在同一个进程中,也可能是在不同的进程中。
为了弄懂文件描述符原理,我们需要知道内核中维护的三个数据结构:
- 每个进程的 file descriptor table
- 系统层面的 open file description table (注意第三个单词,不是descriptor)
- 文件系统 i-node table
我们分别来介绍一下这个三个数据结构所保存的信息以及它们之间的关系。
首先第一个,对于每个进程来说,内核都维护了该进程的open file descriptors表,这个表里面的每条记录(entry)描述一个文件描述符的信息,包括:
- 控制文件描述符相关操作的flag集合
- 指向open file description 的引用
第二个,内核维护了一个系统层面的所有打开文件的描述表( open file descriptions)。上文提到的文件描述符里面的指向open file description的引用就是指向的这个表里的一个文件。此表里的一个 open file description保存了一个打开文件的所有信息。包括:
- 当前打开文件的offset