这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

文件管理

主要在选择题中考察,在大题中也会涉及到对概念的考察。文件的物理结构以及外存空闲空间管理方法要熟练掌握。
# 文件管理

## 文件

- 基本概念
- 元数据和索引结点
- 文件的操作
- 文件的保护
- 文件的逻辑结构
- 文件的物理结构

## 目录

- 基本概念
- 树形目录
- 目录的操作
- 硬链接和软链接

## 文件系统

- 全局结构
- 外存空闲空间管理方法
- 虚拟文件系统
- 文件系统挂载

1 - 文件

重点内容,需熟练掌握文件的物理结构,也需了解文件的元信息和逻辑结构,常在选择题中考察,也会在大题中考察。

文件元信息

在UNIX和类UNIX操作系统中,inode(索引节点)是一个非常重要的数据结构,用于表示文件系统中的文件和目录。每个文件或目录都有一个与之对应的inode,它包含了关于该文件的大部分元数据,但不包括文件名和文件实际内容。

inode信息

  • 文件类型:文件是普通文件、目录还是链接文件等。
  • 权限:文件的访问控制信息,如用户、组和其他用户的读、写、执行权限。
  • 所有者:文件的所有者和组ID。
  • 大小:文件的大小(字节数)。
  • 时间戳:文件的创建时间、最后修改时间和最后访问时间。
  • 链接计数:指向该文件的硬链接数量。当计数为0时,文件会被删除。
  • 数据块指针:文件内容所在的数据块(block)的位置信息。这包括直接指针、间接指针、二级间接指针和三级间接指针,用于指向存储文件内容的磁盘块。

进程文件管理

  • 文件描述符表:每个进程都有自己的文件描述符表,这个表对应于该进程打开的文件描述符。文件描述符是进程范围内的一个小的非负整数。
  • 文件表:操作系统维护一个全局的文件表,该表记录了所有打开文件的状态信息。每次 open 调用成功时,都会创建一个新的文件表条目。
  • inode表:系统还维护了一个inode表,该表包含了文件的元数据和指向文件实际数据的指针。如果多个进程打开同一个文件,它们的文件表条目将指向inode表中的同一inode。

在进程1中执行fdA1 = open("fileA.txt", O_RDONLY)fdAdup = dup(fdA)系统调用,在进程2中执行fdA2 = open("fileA.txt", O_RDONLY),系统中的数据结构如下图所示:

file descriptor
file pointer
fdA1
1
file descriptor
file pointer
fdA2
3
fdAdup
1
file offset
access mode
reference count
inode pointer
0
O_RDONLY
2
4
1
O_RDONLY
1
4
0
1
2
3
4
5
file type
file locks
file properties
Regular
...
...
0
1
2
3
4
5
6
Process A File Descriptor Table
Process B File Descriptor Table
Open File Table
Inode Table

文件的逻辑结构

  1. 顺序文件
    • 记录顺序:顺序文件中的数据以记录的顺序排列。每个记录都按顺序存储在文件中,一个接一个。
    • 访问方式:顺序文件通常按照记录的顺序进行访问。要查找或修改文件中的某个记录,必须从文件的开头开始逐个读取记录,直到找到所需的记录或到达文件末尾。
    • 应用场景:适用于需要按顺序读取和处理数据的应用程序,如批处理任务和日志文件。
  2. 随机文件(或称为索引文件)
    • 记录随机排列:在随机文件中,数据记录可以按任意顺序排列,而不需要按照特定的顺序。
    • 访问方式:随机文件支持随机访问,这意味着可以直接访问文件中的任何记录,而不必按照顺序逐个读取。
    • 索引结构:为了支持随机访问,随机文件通常使用索引结构(如哈希表或B树)来跟踪记录的位置。
    • 应用场景:适用于需要快速查找和访问特定记录的应用程序,如数据库系统和文件系统。

文件的物理结构

1. 连续分配方案(Contiguous Allocation)

连续分配该方案中,每个文件占用磁盘上一个连续的块集。例如,如果一个文件需要n个块,并且给定一个块b作为起始位置,那么分配给该文件的块将是b, b+1, b+2,……b+n-1。这意味着给定起始块地址和文件的长度,我们可以确定文件占用的块。具有连续分配的文件的目录条目包含分配部分的起始块长度的地址。

连续分配方案对应的目录包含如下信息:

  • 文件的其实地址
  • 分配块数量

下图中的文件 “file3” 从区块19开始,长度为6个区块。因此,它占用19、20、21、22、23、24个块。

0
1
2
3
4
5
6
7
8
9
10
3
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
file
start
length
file1
0
2
file2
14
3
file3
19
6
file4
28
4
file5
6
2
Directory
  • 优点:因为由于文件块的连续分配,查找的次数很少,访问速度非常快。
  • 缺点:存在内部和外部碎片化的问题,使得内存利用效率低下。增加文件大小困难,因为它取决于特定实例中连续内存的可用性。

2. 基于链表的分配(Linked List Allocation)

在这个方案中,每个文件都是一个不需要连续的磁盘块链表。磁盘块可以分散在磁盘上的任何地方。目录项包含指向起始和结束文件块的指针。每个块包含一个指针,指向文件所占用的下一个块。

目录项包含指向起始和结束文件块的指针。每个块包含一个指针,指向文件所占用的下一个块。

下图中的文件 “file1” 显示了块是如何随机分布的。最后一个块(25)包含-1,表示空指针,不指向任何其他块。

0
1:10
2
3
4
5
6
7
8
9:16
10:25
3
12
13
14
15
16:1
17
18
19
20
21
22
23
24
25:-1
26
27
28
29
30
31
file
start
end
file1
9
25
Directory
  • 优点:可以充分利用磁盘空间,不会遭遇到碎片的问题。
  • 缺点:因为文件是在磁盘上随机分配的,所以访问一个文件的过程需要经历多次磁盘的检索,这使得文件读取的速度变慢。

3. 基于文件分配表(File Allocation Table)的分配

基于链表的链接为隐式链接,每个磁盘块的末尾包含文件的下一个盘块号。

文件分配表FAT也是基于链接的方式,不过文件的链接方式是存储在一个表格当中,表格包含两列,一列是盘块号,另一列是在该文件盘块之后的下一个盘块号,这种方式也叫做显式链接。

FILENAME
· · · · · ·
START
file1
· · · · · ·
2
file2
· · · · · ·
7
BLOCK NUM
START
0
-2
1
-1
2
8
3
-2
4
-2
5
-1
6
-2
7
1
8
5
9
-2
· · · ·
· · · · 
98
-2
99
-2

4. 索引分配(Index Allocation)

在这个方案中,一个称为Index块的特殊块包含指向文件所占用的所有块的指针。每个文件都有自己的索引块。索引块中的第i项包含第i个文件块的磁盘地址。目录条目包含索引块的地址,如下图所示:

0
1
2
3
4
5
6
7
8
9
10
3
12
13
14
15
16
17
18
20
21
22
23
24
25
26
27
28
29
30
31
file
start
end
file1
9
25
Directory
19

如果文件非常大的话,可以使用多级索引的方式来存储文件所在盘块。

  • 优点:克服了磁盘碎片的问题。
  • 缺点:对于非常小的文件,比如只扩展2-3个块的文件,索引分配将为指针保留一个完整的块(索引块),这样索引块中的很多空间都没有使用,这在内存利用率方面是低效的。

5. 混合索引

还有一种混合索引的方式,可以解决上述提到的缺点,这种方式针对小文件或者大文件进行不同的处理。如果文件比较小的话,使用直接块即可(文件的inode中会包含直接块的下标),如果文件比较大的话,可以使用单级或多级索引。

UNIX系统采用的就是这种方式。

mode
owners(2)
timestamps(3)
size block count
direct blocks
single indirect
double indirect
triple indirect
data
data
data
data
data
data
data
data

2 - 目录

了解目录的基本概念和组织方式即可,可能在选择题中考察。

目录概念

目录是计算机文件系统中用于组织和存储文件和其他目录的一种重要概念。目录也被称为文件夹,它是文件系统中的一个重要组成部分,用于创建层次结构,方便用户管理和浏览文件。

树形目录

树形目录(Tree Directory)是一种用于组织和管理文件和文件夹的层次结构,类似于树状结构,其中根目录是整个目录结构的起点,而子目录和文件以树状分支方式连接到根目录。树形目录结构在计算机操作系统和文件系统中非常常见,它提供了一种直观的方式来组织和访问文件和文件夹,使用户能够轻松地定位和管理他们的数据。

/
dev
home
bin
usr
fd0
video0
ls
cp
· · · · 
· · · 
· · · · 
· · · 
· · · 
· · · 
· · · 

目录的操作

  • 创建、删除、移动、显示、修改目录
  • 创建、删除、搜索文件

在linux中,可在shell中通过如下命令进行目录操作

# 创建目录
mkdir dir_name
# 移动目录
mv dir_name new_dir_name
# 删除目录
rm -r dir_name
# 显示目录
ls -l dir_name
# 创建文件
touch filename
# 删除文件
rm filename

硬链接和软链接

硬链接:硬链接是通过在文件系统中创建一个额外的目录项,将多个目录项指向相同的索引节点(inode)实现的。这意味着硬链接的多个文件名实际上指向相同的数据块,删除其中一个硬链接并不会影响其他硬链接。

  • 硬链接不会创建新的数据副本,而是共享同一份数据。
  • 所有硬链接的文件都有相同的inode号。
  • 硬链接不可跨越文件系统。
  • 硬链接不能链接目录。
  • 只有当所有相关的硬链接都被删除时,数据块才会被释放。

软链接:软链接是一个独立的文件,其中包含了指向另一个文件或目录的路径。软链接实际上是一个指向目标文件的符号,删除原始文件不会影响软链接,但如果目标文件不存在,软链接将失效。

  • 软链接创建了一个新的文件,包含了指向目标文件或目录的路径。
  • 软链接可以跨越文件系统,甚至可以链接到不存在的目标。
  • 软链接可以链接目录。
  • 删除目标文件不会立即删除软链接,但访问失效的软链接会引发错误。
inode
inode
hard link
hard link
hard link
hard link
inode
inode
hard link
hard link
symbolic link
symbolic link
Text is not SVG - cannot display

3 - 文件系统

需熟练掌握文件系统的结构以及外存空闲空间管理方法,常在选择题中考察,也会在大题中考察相关知识点。

文件系统的全局结构

MBR
Parition 1
Partition 2
Partition Table
boot sector
super block
free space management
inodes
file and directory data
Disks
File System Metadata
Data Area

磁盘从逻辑上分为如下部分:

  1. 引导区(Boot Sector): 引导区位于磁盘的起始位置,通常是磁盘的第一个扇区。它包含引导加载程序(boot loader),用于引导操作系统。引导加载程序负责启动计算机并加载操作系统内核。
  2. 分区表(Partition Table): 分区表通常存储在磁盘的第一个扇区之后,用于记录磁盘上的分区信息。分区表指示了磁盘上每个分区的起始位置、大小和文件系统类型。不同操作系统使用不同的分区表格式,如MBR(Master Boot Record)和GPT(GUID Partition Table)。
  3. 文件系统元数据: 文件系统的元数据,包含如下部分:
    • 超级块:包含文件系统的关键信息,在计算机启动时,超级块会被载入内存。超级块中包含的典型信息包括分区的块的数量、块的大小、空闲空间的管理方式等。
    • 空闲块信息:管理磁盘中空闲块的存储数据,具体方法见下文空闲空间管理方法
    • inodes:管理文件的元数据
  4. 数据区: 文件系统的数据区存储了实际的文件数据。这是存储文件内容的地方。文件系统会将文件数据分为一个或多个块或簇,并将这些块分布在磁盘上的不同位置。文件系统的数据区通常占据了磁盘上的大部分空间。

以下是一个简单文件系统的具体存储方式:

D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
Data Region
Data Region
Inode Region
0
7
8
15
16
23
24
31
32
39
40
47
48
55
56
63
I
I
I
I
I
d
i
S
Abbreviation
Meaning
S
Superblock
i
inode bmap
d
data bmap
I
inode region
D
data region
Super
i-bmap
d-bmap
0
4
8
12
1
5
9
13
2
6
10
14
3
7
11
15
16
20
24
28
17
21
25
29
18
22
26
30
19
23
27
31
32
36
40
44
33
37
41
45
34
38
42
46
35
39
43
47
48
52
56
60
49
53
57
61
50
54
58
62
51
55
59
63
64
68
72
76
65
69
73
77
66
70
74
78
67
71
75
79
0KB
4KB
8KB
12KB
16KB
20KB
24KB
28KB
32KB
iblock 0
iblock 1
iblock 2
iblock 3
iblock 4
The Inode Table

外存空闲空间管理方法

1. 空闲表法

文件连续分配方案中的目录保存内容类似,这里用一个表格记录连续空闲块在存储空间中的位置。

序号第一个空闲盘块号空闲盘块数
124
293
3155
4

2. 空闲链表法

使用链表数据结构,其中每个节点代表一个空闲数据块。链表的头节点存储了第一个空闲块的位置(磁盘块号),每个节点的下一个节点指向下一个空闲块。因此,整个链表由一系列相邻的空闲块组成。

0
1
2
3
4
5
6
7
8
9
10
3
12
13
14
15
16:1
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
free-space
linked list head

3. 位示图法

位图是一个二进制位数组,其中的每个位对应于磁盘上的一个数据块。通常,位图中的每个位可以表示两个状态:

  • 0:表示相应的数据块是空闲的,可以分配给文件。
  • 1:表示相应的数据块已经被分配给文件,不再空闲。
col/row12345678910111213141516
11100011100100110
20001111110000111
31110001111110000
4
$\dots$
16

4. 成组链接法

文件混合索引分配方式思路类似,用一个磁盘块A来存储所有的空闲盘号,如果A满了,就用一个新的空闲磁盘B来作为头结点,并且将其中的一个盘块号标记为A的盘块号(作为一阶间址)。

size: 4
8
(single indirect)
4
5
6
· · · · · 
size: 10
23
53
16
77
· · · · · 
56
null
free block
free block
free block
free block
free block
free block
free block
free block

虚拟文件系统

虚拟文件系统(Virtual File System,VFS)是一种操作系统内核设计模式或框架,它允许不同的文件系统在一个统一的接口下协同工作。VFS 提供了一个抽象层,允许应用程序和系统调用与文件系统交互,而不必关心底层文件系统的类型。

VFS 的主要目标是提供一个标准接口,使不同类型的文件系统(如本地文件系统、网络文件系统、CD-ROM文件系统等)能够以一致的方式与操作系统内核进行通信。这有助于增强操作系统的可扩展性和可移植性,同时使应用程序更容易编写,因为它们可以依赖统一的文件系统接口。

VFS Interface
local file system
type 1
local file system
type 2
remote file system
type 1
disk
disk
network
file-system interface

文件系统挂载

文件系统挂载是指将一个文件系统与操作系统的目录结构关联起来,以便可以访问文件和目录。在大多数操作系统中,文件系统挂载是一种将存储设备(如硬盘分区、CD-ROM、网络共享等)上的文件系统连接到操作系统的文件树中的过程。

文件系统挂载是文件系统管理中的一个重要概念,它使操作系统能够有效地访问和管理不同类型的存储设备上的数据。通过挂载,不同文件系统可以在一个统一的文件树中协同工作,使文件和目录对用户和应用程序来说似乎是在同一个系统中。

/
sbin
etc
opt
fs
cups
/dev/sda1
/
app1
app2
/dev/sda2
mkdir /opt/mount_fs
mount /dev/sda2 /opt/mount_fs
/
sbin
etc
opt
fs
cups
/dev/sda1
mount_fs
app1
app2