操作系统(六):文件系统

88. 文件系统的基本组成

文件系统是操作中负责管理持久数据的子系统,说简单点,就是负责把用户的文件存储到磁盘硬件中,因为即使计算机断电,磁盘里的数据也不会丢失,所以可以持久化的保存文件。

文件系统的基本数据单位是文件,它的目的是对磁盘上的文件进行组织管理,组织的方式不同,就会形成不同的文件系统。

Linux最经典的一句话是:一切皆文件。

Linux文件系统会为每个文件分配两个数据结构:索引节点(index node)和目录项(directory entry),它们主要用来记录文件的元信息和目录层次结构。

  • 索引节点,也就是 inode ,用来记录文件的元信息,比如 inode 编号、文件大小、访问权限、创建时间、修改时间、数据在磁盘中的位置等等。索引节点是文件的唯一标识,它们之间一一对应,也同样都会被存储在硬盘中,所以索引节点同样占用磁盘空间。
  • 目录项,也就是 dentry ,用来记录文件的名称、索引节点指针以及与其他目录项的层级关联关系。多个目录项关联起来,就会形成目录结构,但它与索引节点不同的是,目录项是由内核维护的一个数据结构,不存放在磁盘中,而是缓存在内存。

目录项和索引节点的关系是多对一,也就是说,一个文件可以有多个别名。

注意⚠️:目录也是文件,也是通过索引节点唯一标识,和普通文件不同的是,普通文件在磁盘里保存的是文件数据,而目录文件在磁盘里保存的是子目录或文件。

89. 目录项和目录是同一个东西吗?

目录项和目录不是同一个东西,目录是文件,持久化存储在磁盘,而目录项是由内核维护的一个数据结构,缓存在内存。

如果查询目录总是频繁从磁盘中读取,效率会很低,所以内核会把已经读过的目录用目录项这个数据结构缓存在内存,下次再次读取到相同的目录时,只需从内存中读取,大大提高了文件系统的效率。

90. 文件数据是如何存储在磁盘的呢?

磁盘读写的最小单位是扇区,扇区的大小只有 512 个字节,文件系统把多个扇区组成一个逻辑块,每次读写的最小单位是逻辑块(数据块),Linux 系统中的逻辑块大小为 4KB,也就是一次性读写 8 个扇区,这大大提高了磁盘的读写效率。

磁盘进行格式化时,会被分成三个存储区域,分别是超级块、索引节点区和数据块区。

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

超级块和索引节点被加载到内存的时机不同:超级块是当文件系统挂载时进入内存,而索引节点是当文件被访问时进入内存。

91. 为啥需要引入虚拟文件系统?Linux 的文件系统分为哪几类?

文件系统的种类众多,而操作系统希望对用户提供一个统一的接口,因此在用户层与文件系统层之间引入了虚拟文件系统(Virtual File System, VFS)这个中间层。

Linux 根据存储位置的不同,可以把文件系统分为以下三类:

  • 磁盘的文件系统,它是直接把数据存储在磁盘中,比如 Ext 2/3/4、XFS 等都是这类文件系统。
  • 内存的文件系统,这类文件系统的数据不是存储在硬盘的,而是占用内存空间,我们经常用到的 /proc 和 /sys 文件系统都属于这一类,读写这类文件,实际上是读写内核中相关的数据。
  • 网络的文件系统,用来访问其他计算机主机数据的文件系统,比如 NFS、SMB 等等。

92. 什么是文件描述符?打开文件表维护着文件的哪些信息?

当我们打开一个文件后,操作系统会为每个进程维护一个打开文件表,表里的每一项代表文件描述符。文件描述符是内核为了高效管理已被打开的文件所创建的索引,用于指向被打开的文件。文件描述符是打开文件的标识。

操作系统在打开文件表中维护着打开文件的状态和信息:文件指针、文件打开计数器、文件磁盘位置、访问权限。

93. 用户和操作系统对文件的读写操作时有差异的,那么文件系统对于读写文件的过程如何处理的?

用户习惯以字节的方式读写文件,而操作系统以数据块为单位读写文件,需要文件系统来处理这种差异。

  • 当用户进程从文件中读取 1 个字节大小的数据时,文件系统则先获取该字节所在的数据块,然后再返回数据块中对应的用户进程所需的数据部分。
  • 当用户进程把 1 字节大小的数据写入文件中时,文件系统则找到需要写入数据的数据块,然后修改数据块中对应的数据部分,最后再把数据块写回磁盘。

94. 文件数据在磁盘上的存储方式

文件数据在磁盘上有两种存放方式:连续空间存放方式、非连续空间存放方式。
(1)连续空间存放方式

  • 文件存放在磁盘的连续物理空间中,文件头里需要指定起始块的位置和长度。
  • 连续空间存放方式的读写效率很高,能够高效的顺序和随机访问文件数据,但是使用该方式存放文件数据有磁盘空间碎片和文件长度不易扩展的缺陷。
    (2)非连续空间存放方式
    非连续空间存放方式分为链表存储方式和索引存储方式。
    对于链表的存放方式
  • 文件数据可以离散不连续存放,也就能够消除磁盘碎片,提高磁盘空间的利用率,同时文件的长度可以动态扩展。
  • 根据实现方式的不同,可分为隐式链表和显式链表。
    • 隐式链接的实现方式是文件头包含要第一块和最后一块数据块的位置,并且每个数据块里有一个指针空间,用来存放下一个数据块的位置。缺点在于无法直接访问数据块,只能通过指针顺序访问文件数据,同时数据块指针消耗了一定的存储空间。隐式链表方式存放文件数据的稳定性较差,链表中的某个指针丢失或损坏,会导致文件数据的丢失。
    • 显式链接的实现方式是操作系统把链接文件各数据块的指针显示地存放在内存的的文件分配表中,该表在磁盘中仅设置一张,每个表项中存放链接指针,指向下一个数据块号。由于查找记录的过程是在内存中进行的,因而显著的提高了检索速度,大大减少了磁盘的访问次数。但整个表都存放于内存中,因此不适合与大磁盘。

对于索引的存储方式

  • 索引实现是为每个文件创建一个索引数据块,里面存放指向文件数据块的指针列表,文件头中包含指向索引文件块的指针。这样就可以通过文件头知道索引数据块的位置,再通过索引数据块中的索引信息找到对应的数据块。
  • 优点是文件的创建、扩展、缩小都很方便,不会产生碎片,支持顺序读写和随机读写文件数据。

组合的存储方式

如果文件很大,可通过链式索引或多级索引实现文件数据的存储。

  • 链式索引的实现方式是在索引数据块中留出一块空间用于存放指向下一个索引数据块的指针。
  • 多级索引的实现方式是通过一个索引块来存放多个索引数据块,一层套一层索引。

Unix文件的实现方式:顺序分配、链表分配和索引分配。对于小文件使用直接查找的方式可减少索引数据块的开销;对于大文件则以多级索引的方式来支持,所以大文件在访问数据块时需要大量查询,效率比较低。

95. 磁盘的空闲空间管理方法

常见的空闲空间管理方法有:空闲表法、空闲链表法和位图法。
在 Linux 文件系统中采用块位图的方式来管理空闲空间,不仅用于数据空闲块的管理,还用于 inode 空闲块的管理,因为 inode 也存储在磁盘中,也需要对其管理。

96. 软链接和硬链接

(1)硬链接

  • 硬链接是多个目录项中的索引节点指针指向同一个文件,也就是指向同一个 inode,但是 inode 是不可能跨越文件系统的,每个文件系统都有各自的 inode 数据结构和列表,所以硬链接只能用于同一个文件系统。
  • 由于多个目录项都是指向一个 inode,那么只有删除文件的所有硬链接以及源文件时,系统才会彻底删除该文件。

(2)软链接
软链接相当于重新创建一个文件,这个文件有独立的 inode,但是这个文件的内容是另外一个文件的路径,所以访问软链接的时候,实际上相当于访问到了另外一个文件,所以软链接是可以跨文件系统的,甚至目标文件被删除了,链接文件还是在的,只不过指向的文件找不到了而已。


97. 文件I/O

常见的文件I/O分类有:缓冲与非缓冲 I/O、直接与非直接 I/O、阻塞与非阻塞 I/O、同步与异步 I/O。
(1)根据是否利用标准库缓冲,可以把文件 I/O 分为缓冲 I/O 和非缓冲 I/O:

  • 缓冲 I/O,利用的是标准库的缓存实现文件的加速访问,而标准库再通过系统调用访问文件。
  • 非缓冲 I/O,直接通过系统调用访问文件,不经过标准库缓存。

(2)根据是否利用操作系统的缓存,可以把文件 I/O 分为直接 I/O 与非直接 I/O:

  • 直接 I/O,不会发生内核缓存和用户程序之间数据复制,而是直接经过文件系统访问磁盘。
  • 非直接 I/O,读操作时,数据从内核缓存中拷贝给用户程序,写操作时,数据从用户程序拷贝给内核缓存,再由内核决定什么时候写入数据到磁盘。

(3)I/O 可分为两个过程的:

  • 数据准备的过程
  • 数据从内核空间拷贝到用户进程缓冲区的过程

阻塞 I/O 会阻塞在「过程 1 」和「过程 2」,而非阻塞 I/O 和基于非阻塞 I/O 的多路复用只会阻塞在「过程 2」,所以这三个都可以认为是同步 I/O。

异步 I/O 则不同,「过程 1 」和「过程 2 」都不会阻塞。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小浩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值