第七章 文件管理
7.1基本概念
1.文件的属性
文件名:文件名是用于识别文件的字符串。它通常由字母、数字、下划线和某些特殊字符组成,并且反映了文件的内容或用途。
标识符:在操作系统中,每个文件都有一个唯一的标识符,通常称为inode号(在类Unix系统中)或文件索引(在Windows系统中)。这个标识符用于系统内部跟踪文件。
类型:文件类型指示文件的内容和格式。它可以是文本文件、二进制文件、图像文件、视频文件等。
位置:文件位置指的是文件在文件系统中的路径,即从根目录到文件所在目录的完整路径。
大小:文件大小表示文件占用的存储空间量,通常以字节为单位。较大的文件可能以KB(千字节)、MB(兆字节)或GB(千兆字节)为单位。
创建时间:这是文件在文件系统中创建的日期和时间。
上次修改时间:这是文件内容最后一次被修改的日期和时间。
文件所有者信息:文件所有者信息包括拥有该文件的用户和用户组的名称。在多用户系统中,这用于确定谁可以访问或修改文件。
保护信息:保护信息通常以权限的形式存在,它决定了用户和用户组对文件的访问级别。这包括读(read)、写(write)和执行(execute)权限。
2.文件的存储逻辑结构
无结构文件(无格式文件):
这种文件没有固定的结构,数据以连续的字节流形式存储。
适用于文本文件和二进制文件,其中数据只是简单地顺序写入文件,没有特定的格式或组织。
读取时需要知道数据的格式和长度,通常由应用程序来解释。
有结构文件: 有结构文件具有定义良好的数据格式和组织方式,可以进一步分为以下几种类型:
顺序文件:
数据记录按照一定的顺序排列,通常是按照记录的插入顺序。
适用于记录固定长度的数据,如数据库的某些类型。
访问时通常需要从头开始,顺序读取直到找到所需记录,效率较低。
索引文件:
文件包含一个索引部分和一个数据部分。
索引部分包含指向数据记录的指针,允许快速访问任何记录。
适用于随机访问大量数据记录的情况。
索引文件可以提高查找效率,但会增加额外的存储开销用于索引。
索引顺序文件:
结合了顺序文件和索引文件的特性。
数据记录按顺序存储,但同时也维护了一个索引来快速定位记录。
适用于需要频繁顺序访问和偶尔随机访问的场合。
通过索引可以快速定位到记录所在的块,然后顺序访问该块以找到具体记录。
7.2.文件目录
文件目录的实现
文件目录通常通过以下方式实现:
目录表:一个包含文件名和对应文件控制块(FCB)指针的表。
文件控制块(FCB):包含文件属性(如文件大小、创建时间、最后修改时间、文件权限等)的数据结构。
目录结构
文件目录的结构主要有以下几种类型:
单级目录结构:
在单级目录结构中,所有的文件都存储在系统的根目录下。
每个文件都有一个唯一的文件名。
简单但只适合文件数量较少的系统。
两级目录结构:
在两级目录结构中,系统有一个根目录,根目录下可以创建多个子目录。
用户可以将文件存储在根目录或任何子目录下。
提高了文件管理的灵活性,但仍然有限制。
多级(树形)目录结构:
多级目录结构类似于树状结构,其中根目录位于顶部,每个子目录可以包含更多的子目录和文件。
提供了良好的文件组织和管理能力。
允许用户创建复杂的目录层次结构。
无环图目录结构:
在无环图目录结构中,目录可以像无环图一样组织,允许文件和目录之间存在多个链接。
这种结构更为灵活,但管理起来也更复杂。
现代文件系统中,如NTFS,通过硬链接和软链接实现了类似无环图的结构。
索引节点
索引节点(inode)是文件系统中的一个概念,用于存储文件的元数据,包括以下信息:
文件的大小
文件的创建时间、最后修改时间、最后访问时间
文件的权限和所有权信息
文件的数据块指针(直接指针、间接指针)
索引节点通常具有以下特点:
每个文件或目录都有一个唯一的索引节点。
索引节点通常存储在磁盘上的特定区域。
索引节点不包含文件名,文件名与索引节点的关联在目录项中维护。
7.3.物理结构
1. 连续分配(Contiguous Allocation)
连续分配是最简单的文件物理结构,在这种结构中,每个文件在磁盘上占据一段连续的磁盘空间。
特点:
优点:访问速度快,因为读取连续块时不需要额外的寻址操作。
缺点:可能导致外部碎片,即磁盘空间中有足够的空间,但不是连续的,因此无法分配给文件。
实现方式:
文件的起始块号和长度记录在目录项中。
当文件需要扩展时,如果后续空间不足,可能需要移动文件以找到足够大的连续空间。
2. 链式分配(Linked Allocation)
链式分配使用磁盘块中的指针来链接文件的各个块。
特点:
优点:不会有外部碎片,因为每个文件块可以分散在磁盘的任何位置。
缺点:访问速度较慢,因为每次访问都需要读取一个块以获取下一个块的地址。
实现方式:
每个磁盘块包含文件数据和指向下一个块的指针。
文件的目录项包含指向文件第一个块的指针。
3. 索引分配(Indexed Allocation)
索引分配为每个文件维护一个索引块,该索引块包含指向文件各个数据块的指针。
特点:
优点:解决了外部碎片问题,并且允许快速随机访问文件。
缺点:对于小文件,索引块可能会造成内部碎片,因为索引块的大小可能远大于存储文件实际数据所需的磁盘空间。
实现方式:
文件的目录项包含一个指向索引块的指针。
索引块包含一系列的指针,每个指针指向文件的一个数据块。
索引分配可以是直接索引、一级间接索引、二级间接索引,甚至三级间接索引,以支持大文件。
4.对比总结:
连续分配:适合顺序访问,但不灵活,容易产生碎片。
链式分配:灵活,避免了外部碎片,但访问效率低。
索引分配:提供了灵活性和快速访问,但可能对小文件造成内部碎片。
在选择文件物理结构时,需要根据文件系统的具体需求和应用场景来决定最合适的结构。例如,对于需要快速访问的大文件,索引分配可能是最佳选择;而对于频繁更新和扩展的小文件,链式分配可能更合适。
7.4文件存储空间管理
存储空间的划分与初始化
文件卷(逻辑卷)的概念:
文件卷是文件系统中的一个逻辑存储单元,它可以是一个磁盘分区、一个完整的磁盘或者是一个由多个物理磁盘组成的逻辑单元。
文件卷通常包含一个文件系统的所有数据,包括文件数据、目录结构和元数据。
目录区与文件区:
目录区:用于存储文件系统的目录结构信息,包括目录项和文件控制块(FCB)。
文件区:用于存储文件的实际数据块。
存储空间的管理方法
空闲表:
空闲表是一个数据结构,用于记录哪些磁盘块是空闲的。
系统启动时,空闲表被初始化,记录所有空闲的磁盘块。
当文件需要存储空间时,文件系统会从空闲表中查找足够大小的连续空闲块进行分配。
空闲链表:
空闲盘块链:将所有空闲的磁盘块链接成一个链表。分配时从链表头部取下一个或多个块,回收时将块添加到链表头部。
空闲盘区链:与空闲盘块链类似,但是链表中的元素是连续的磁盘块区域,而不是单个块。
位示图:
位示图是一个位向量,其中每个位代表磁盘上的一个块,用于指示该块是否空闲。
0表示空闲,1表示已分配。
位示图可以快速定位空闲块,适用于大容量存储设备。
成组链接:
成组链接是一种管理空闲磁盘空间的方法,它将空闲块分组,并在每个组的最后一个空闲块中存储指向下一个组的指针。
这样,不需要在内存中维护整个空闲表或链表,只需要知道第一组的起始块号和该组中的空闲块数量。
当文件系统启动时,它会读取第一组的最后一个块来获取下一组的信息。
每种管理方法都有其优缺点,适用于不同的场景:
空闲表:适合于小规模系统,但可能导致外部碎片。
空闲链表:减少了外部碎片,但可能需要额外的空间来存储链表指针。
位示图:适合于快速查找空闲块,但可能需要较大的内存空间来存储位示图。
成组链接:减少了内存使用,但可能增加查找空闲块的时间。
7.5 文件的基本操作
创建文件(Create):
在文件系统中创建一个新的文件,通常会涉及到分配一个文件控制块(FCB)来存储文件的元数据,如文件名、创建时间、最后修改时间、文件大小等。
删除文件(Delete):
从文件系统中移除一个文件。删除操作会释放该文件所占用的存储空间,并移除其在目录中的引用。
打开文件(Open):
在对文件进行读写操作之前,需要先打开文件。打开文件操作会读取文件的元数据,并可能涉及到设置文件指针的位置。
打开文件后,会返回一个文件描述符或文件句柄,后续的操作可以通过这个标识符来引用文件。
关闭文件(Close):
完成文件操作后,应该关闭文件。关闭文件会释放与文件句柄关联的资源,并确保所有缓冲的数据都被写入存储介质。
读取文件(Read):
从文件中读取数据。读取操作通常需要指定读取的起始位置和读取的数据量。
写入文件(Write):
向文件中写入数据。写入操作同样需要指定写入的起始位置,并且可能涉及到文件的扩展,如果写入的数据超出了文件的当前大小。
截断文件(Truncate):
将文件的大小减小到指定的大小。如果指定的尺寸小于文件当前大小,则文件会被截断,释放额外的存储空间;如果指定尺寸大于当前大小,则文件会被扩展。
重命名文件(Rename):
更改文件的名称,但保留文件的内容和属性不变。
查看文件属性(Stat):
查询文件的元数据,如文件大小、创建时间、最后修改时间等,而不需要读取文件的内容。
设置文件属性(Chmod/Chown):
更改文件的权限(如读、写、执行权限)或所有者信息。
移动文件(Move):
将文件从一个目录移动到另一个目录,可能会涉及到跨文件系统的操作。
复制文件(Copy):
创建文件的一个副本,可能是在同一个文件系统内,也可能是在不同的文件系统之间。
7.6 文件共享和保护
文件共享
基于索引节点(硬链接)
硬链接(Hard Link)是文件系统中的一种特殊类型的文件,它指向另一个文件的位置。硬链接与原始文件共享相同的索引节点(inode),这意味着它们实际上是文件系统中相同文件内容的两个不同名称。以下是硬链接的特点:
硬链接不能跨文件系统创建。
删除硬链接或原始文件中的一个不会影响另一个,只有当所有的硬链接和原始文件都被删除时,文件的数据才会被真正删除。
硬链接不会链接目录,以防止形成循环的文件系统结构。
基于符号链(软连接)
软链接(Symbolic Link),也称为符号链接或symlink,是另一种类型的文件,它指向另一个文件的位置,但与硬链接不同,它不直接指向索引节点,而是包含了一个路径名,指向目标文件或目录。以下是软链接的特点:
软链接可以跨文件系统创建。
如果删除了软链接指向的原始文件,链接将变成“悬挂链接”。
软链接可以链接目录。
文件保护
口令保护
口令保护是通过设置密码来限制对文件的访问。用户在访问文件之前需要输入正确的密码。这种方法相对简单,但安全性较低,因为密码可能会被共享或猜测。
加密保护
加密保护是通过加密算法对文件内容进行加密,只有拥有正确密钥的用户才能解密并访问文件内容。加密提供了更高的安全性,但需要妥善管理密钥。
加密可以采取以下几种形式:
对称加密:使用相同的密钥进行加密和解密。
非对称加密:使用一对密钥(公钥和私钥),公钥用于加密,私钥用于解密。
访问控制
访问控制是通过定义用户和组的权限来限制对文件的访问。以下是几种常见的访问控制机制:
文件权限:通过设置读(r)、写(w)、执行(x)权限来限制用户对文件的访问。
访问控制列表(ACL):允许更细粒度的权限设置,可以为单个用户或组指定权限。
安全标签:在某些系统中,文件可以被打上安全标签,系统根据标签来决定谁可以访问文件。
这些文件保护方法可以单独使用,也可以组合使用,以提供更高级别的安全性。
7.7 文件层次结构,全局结构
文件层次结构
全局结构
原始磁盘是指未经任何格式化处理的磁盘,它包含了磁盘制造商在生产过程中设置的原始数据结构,但并不适合直接存储文件数据。为了能够在磁盘上存储和管理数据,需要进行格式化处理,这通常分为两个步骤:物理格式化和逻辑格式化。
物理格式化
物理格式化(Low-Level Formatting)是磁盘准备的第一个步骤,它涉及到在磁盘表面创建实际的磁道和扇区。这个过程通常由磁盘制造商在出厂时完成,以下是物理格式化的主要任务:
初始化磁道和扇区:在磁盘表面创建用于数据存储的磁道和扇区,并为每个扇区分配唯一的地址。
写入扇区标识:在每个扇区的开始位置写入扇区标识信息,比如同步标记、扇区地址等。
检测坏扇区:检查磁盘表面是否有损坏的扇区,并将这些坏扇区标记出来,以便在后续的数据存储过程中避免使用。
物理格式化通常不需要用户手动执行,因为现代磁盘在出厂时已经完成了这一步骤。而且,多次物理格式化可能会缩短磁盘的使用寿命。
逻辑格式化
逻辑格式化(High-Level Formatting)是创建文件系统并准备磁盘以供操作系统使用的步骤。这个过程通常在磁盘首次使用时进行,或者在磁盘需要重新初始化时执行。以下是逻辑格式化的主要任务:
创建文件系统:在磁盘上创建文件系统结构,如文件分配表(FAT)、主文件表(MFT)等,这取决于所选的文件系统类型(如FAT32、NTFS、EXT4等)。
分配空间:为文件系统分配磁盘空间,确定数据存储区域。
设置引导记录:在磁盘的引导扇区写入引导记录(如MBR或GPT),以便操作系统可以启动。
逻辑格式化通常由操作系统提供的格式化工具来完成,例如Windows中的格式化命令或Linux中的mkfs命令。
虚拟文件系统(VFS)
虚拟文件系统是操作系统的一个抽象层,它为用户空间的应用程序提供统一的文件操作接口,同时允许不同的文件系统类型在操作系统中共存。以下是VFS的一些主要特点:
抽象层:VFS为上层应用程序提供统一的文件操作接口,而不管底层实际使用的是哪种文件系统。
通用性:VFS支持多种文件系统,如FAT32、NTFS、EXT4、XFS等,它们都可以通过VFS提供的接口进行操作。
模块化:不同的文件系统以模块的形式存在于操作系统中,可以根据需要加载或卸载。
透明性:应用程序无需关心底层文件系统的具体实现细节,它们只需要通过VFS提供的接口进行文件操作。
VFS的主要组件包括:
超级块(Superblock):包含文件系统的全局信息,如块大小、inode数量等。
inode:代表文件系统中的一个文件或目录,包含元数据如文件大小、创建时间、权限等。
文件操作:定义了对文件执行操作的方法,如打开、读取、写入、关闭等。
目录操作:定义了对目录执行操作的方法,如创建、删除、列出目录内容等。
文件系统挂载
文件系统挂载是指将一个文件系统与操作系统的文件层次结构中的一个目录关联起来的过程。挂载后,用户可以通过访问这个目录来访问文件系统中的文件和目录。以下是文件系统挂载的关键点:
挂载点:挂载点是文件系统在操作系统目录树中的位置。在挂载之前,这个位置必须是一个已经存在的空目录。
挂载操作:操作系统通过挂载操作将文件系统的根目录与挂载点连接起来。在Linux系统中,可以使用
mount
命令来挂载文件系统。卸载操作:当不再需要访问某个文件系统时,可以通过卸载操作将其从目录树中移除。在Linux系统中,使用
umount
命令来卸载文件系统。
挂载文件系统时,通常需要以下信息:
设备文件:代表存储设备的文件,如
/dev/sda1
或/dev/nvme0n1p1
。文件系统类型:要挂载的文件系统类型,如
ext4
、ntfs
、vfat
等。挂载选项:指定挂载时的一些选项,如读写权限、是否允许执行文件等。
例如,以下是一个在Linux系统中挂载ext4文件系统的命令:
这个命令将设备/dev/sda1
上的ext4文件系统挂载到目录/mnt/mydisk
。
Last updated