计算机系统之文件系统 | 青训营笔记

129 阅读5分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第4天,今天学习整理了一部分计算机系统文件系统的内容,简单做个总结。

文件系统

文件系统的基本组成

文件系统的基本单位是文件

一切皆文件,包括设备管道,socket

linux为每个文件分配索引节点(inode)和目录项(dentry)两个数据结构

  • inode记录文件元信息,包括文件大小,编号等

  • inode是文件的唯一标识,储存在硬盘中,占用磁盘空间

  • dentry记录文件名,inode指针以及与其他目录项的层级关联。

  • 目录项由内核维护,存放在内存中

目录也是文件,普通文件存文件数据,目录文件存子目录或文件

目录项与目录不同,目录为磁盘的文件,目录项为内核的数据结构,在内存中。

目录如果频繁读取,内核会把已读目录存在内核的目录项中,下次读写直接从内存读取。

目录项不仅表示目录,同样可以表示文件

文件数据的存储

磁盘读写的最小单位是扇区,512B,文件系统把多个组成逻辑块(数据块),Linux逻辑块大小为4KB,即8个扇区。

总结,如图

为加速访问,硬盘的索引节点通常会加载到内存中。

另外格式化内存时,磁盘分成三个区域,超级块,索引节点区和数据块区。

  • 超级块,用来存储文件系统的详细信息,比如块个数、块大小、空闲块等等。
  • 索引节点区,用来存储索引节点;
  • 数据块区,用来存储文件或目录数据

系统不会把超级块和索引节点全部加载到内存,只有需要的时候才会,其时机各不相同。

  • 超级块:当文件系统挂载时进入内存;
  • 索引节点区:当文件被访问时进入内存;

虚拟文件系统

文件系统种类多,Linux操作系统为给用户提供一个统一接口,把虚拟文件系统(VFS)作为中间层注入用户层和文件系统层之间

VFS 定义了一组所有文件系统都支持的数据结构和标准接口,这样程序员不需要了解文件系统的工作原理,只需要了解 VFS 提供的统一接口即可。

Linux系统中各部件关系如下:

linux支持的文件系统分为三类:

  • 磁盘的文件系统,它是直接把数据存储在磁盘中,比如 Ext 2/3/4、XFS 等都是这类文件系统。

  • 内存的文件系统,这类文件系统的数据存储在内存空间,我们经常用到的 /proc 和 /sys 文件系统都属于这一类,读写这类文件,实际上是读写内核中相关的数据。

  • 网络的文件系统,用来访问其他计算机主机数据的文件系统,比如 NFS、SMB 等等。


文件的使用

  1. 读取一个文件的过程,通过open系统调用打开文件
  2. write操作时使用open返回的文件描述符,而不是文件名做参数。
  3. 通过close系统调用关闭文件

打开了一个文件后,操作系统会跟踪进程打开的所有文件.

跟踪就是操作系统为每个进程维护一个打开文件表,文件表里的每一项代表「文件描述符」

所以说文件描述符是打开文件的标识

操作系统在打开文件表中维护着打开文件的状态和信息:

  • 文件指针:系统跟踪上次读写位置作为当前文件位置指针,这种指针对打开文件的某个进程来说是唯一的;
  • 文件打开计数器:文件关闭时,操作系统必须重用其打开文件表条目,否则表内空间不够用。因为多个进程可能打开同一个文件,所以系统在删除打开文件条目之前,必须等待最后一个进程关闭文件,该计数器跟踪打开和关闭的数量,当该计数为 0 时,系统关闭文件,删除该条目;
  • 文件磁盘位置:绝大多数文件操作都要求系统修改文件数据,该信息保存在内存中,以免每个操作都从磁盘中读取;
  • 访问权限:每个进程打开文件都需要有一个访问模式(创建、只读、读写、添加等),该信息保存在进程的打开文件表中,以便操作系统能允许或拒绝之后的 I/O 请求;

文件的存储

  • 文件数据存在磁盘的方式有两种

连续存放方式

空间,效率高

  • 必须知道文件大小

  • inode需要指定起始块的位置和长度

  • 缺点:磁盘空间有碎片,文件长度难拓展

非连续存放方式

链表方法

1.隐式链表

  • 实现方式

    文件头inode包含第一块与最后一块的位置,每个数据块留出一个指针指向下一个数据块

  • 缺点

    无法直接访问数据块,指针消耗一定空间,稳定性差,指针损坏导致文件数据丢失

2.显式链表

  • 实现方式

把用于链接文件各数据块的指针,显式地存放在内存的一张链接表中,整个磁盘仅设置一张

内存中这样一个表格称为文件分配表(FAT)

  • 缺点

    不适合大磁盘,越大磁盘,FAT方案的表占有越大,200g硬盘可达800MB.


索引方式