索引文件使用到的场景是:要找到第i个记录,必须先顺序查找到第i-1个记录,但很多情况下,其记录又是变长的,因此传统的顺序存储跟链表存储文件就效率很低。因此有了索引文件
索引文件
Linux 文件系统会为每个文件分配两个数据结构:索引节点(index node)和目录项(directory entry),它们主要用来记录文件的元信息和目录层次结构。
索引节点,也就是 inode,用来记录文件的元信息,比如 inode 编号、文件大小、访问权限、创建时间、修改时间、数据在磁盘的位置等等。索引节点是文件的唯一标识,inode存储在硬盘中
目录项,也就是 dentry,用来记录文件的名字、索引节点指针以及与其他目录项的层级关联关系。多个目录项关联起来,就会形成目录结构,目录项缓存在内存,是内核的一个数据结构。
磁盘读写的最小单位是扇区,扇区的大小只有 512 字节大小,而Linux文件系统把多个扇区组成了一个逻辑块,每次读写的最小单位就是逻辑块,逻辑块大小为 4KB
索引节点、目录项以及文件数据的关系:
文件描述符
打开一个文件之后,操作系统会跟踪这个文件,我们称他为文件描述符
- 文件指针:系统跟踪上次读写位置作为当前文件位置指针
- 文件打开计数器:文件关闭时,操作系统必须重用其打开文件表条目,否则表内空间不够用。因为多个进程可能打开同一个文件,系统在删除打开文件条目之前,必须等待最后一个进程关闭文件,当该计数为 0 时,系统关闭文件,删除该条目;
- 文件磁盘位置:绝大多数文件操作都要求系统修改文件数据,该信息保存在内存中,以免每个操作都从磁盘中读取;
- 访问权限:每个进程打开文件都需要有一个访问模式(创建、只读、读写、添加等),该信息保存在进程的打开文件表中,以便操作系统能允许或拒绝之后的 I/O 请求;
目录存储
- 目录本身就是一种有结构文件,由条条记录组成。每条记录对应一个在该放在该目录下的文件