目录
1.文件
1.1 文件名
如何工作:
-
进程创建一个文件,并给它一个名字
-
其他进程可以通过该名称访问该文件
命名规范:
-
跟操作系统有关
-
文本名称:由字母、数字和特殊字符组成的字符串
-
字符数:
-
所有操作系统都允许1到6个字符的字符串作为合法文件名
-
很多操作系统甚至能支持255个字符
-
-
区分大小写:UNIX系列的
-
不区分大小写:MS-DOS和Windows
这里有个有意思的东西,之前git发现bug,克隆项目后可能会导致电脑被远程控制,bug的原理就是因为这个,而linux由于文件区分大小写新免于难,具体可以看这个视频
文件扩展名:
-
附加到文件后面的后缀
-
与文件类型相关联
-
扩展名大小:
-
MS-DOS:1到3个字符
-
Unix:取决于用户
-
-
在UXIN中:文件扩展名并不被强制要求
-
而Windows则将应用程序与文件扩展名关联
1.2 文件结构
无结构:字节序列
-
简化操作系统的文件管理
-
应用程序可以强加他们自己的结构
-
用于UNIX、Windows和大多数现代操作系统
简单那的记录结构:记录序列
-
作为一个单位处理的字节集合
-
记录级别的操作
-
文件是记录的集合
-
操作系统可以优化对记录的操作
复杂结构:树形结构
-
可变长度的记录
-
每个都有一个关联的密钥
-
按键检索记录:用于一些数据处理系统,比如现代数据库
1.3 文件类型
文件可能有的类型:
-
由文件系统理解的类型:设备,目录,符号链接
-
由操作系统的其他部分或运行时库理解的类型:可执行的,动态链接库,源代码,目标代码,文本
-
由应用程序理解的类型:jpg,mpg,avi,mp3
常见的文件类型:
-
常规文件
-
目录
-
字符特殊文件:用于模拟串行I/O设备,例如terminals, printers
-
块特殊文件:用于模拟磁盘
常规文件:
-
ASCII 文件:
-
每一个字节表示一个字符,依据ASCII码
-
由文本行组成
-
行的长度不一定相同
-
优点:
-
可以用任何文本编辑器显示、打印、变基
-
便于信息交换
-
-
-
二进制文件:
-
内容必须事先了解其格式的程序或硬件处理器解释
-
有内部结构
-
示例:Unix可执行文件
-
Header
-
Text
-
Data
-
Relocation Bits
-
Symbol table
-
-
示例:Unix归档文件
-
包含一组已编译但未链接的程序库
-
-
1.4 文件访问
顺序访问:
-
从头开始,不能跳跃,可以倒退
-
当介质是磁带时很方便
-
读操作:读取文件的下一部分并推进文件指针
-
写操作:追加文件末尾(EOF),并将文件指针移动到新的EOF位置
-
文件指针跟踪I/O位置:允许文件指针重置到文件开始的位置
随机范围:
-
按任意顺序读取字节/记录
-
数据库系统必备
-
读操作(Read n):n是相对于文件开头的数字,而不是相对于磁盘物理位置的绝对数字
-
写操作(Write n)
-
当介质是磁盘时很方便
-
随机存取文件:文件被看作是块或记录的编号序列
1.5 文件属性
依赖于操作系统:
-
名称(Name):符号文件名只是以人类可读形式保存的信息
-
类型(Type):支持不同类型文件的系统需要
-
位置(Location):文件在设备上的位置指针
-
大小(Size):当前文件大小
-
保护(Protection):控制谁可以读、写、执行
-
时间,日期和用户标识:用于保护安全和使用监控的数据
关于文件的信息保存在目录结构中,目录结构保存在磁盘上
1.6 文件操作
字节序列文件的操作:
-
Crate:宣布文件即将到来并设置属性和分配空间
-
Delete:释放磁盘空间,调整目录结构
-
Open:允许系统从主存中获取磁盘地址的属性和列表
-
Close:释放内部表空间和写文件的最后一个块
-
Read:从文件中读取的数据放入内存,供用户访问
-
Write:数据通常在文件当前位置写入
-
Append:在文件末尾(EOF)添加数据
-
Seek:随机从文件中读取数据,重新定位文件指针进行读取
-
Rename:修改文件的名称
-
Get & Set Attributes:获取文件属性或设置文件属性
2.目录
概述:
-
目录是包含文件名和文件位置对应关系的文件
-
目录项包含文件属性
-
目录项在create file时创建,在delete file时删除
目录内容:
-
文件名:符号名称
-
文件类型:文件的格式
-
定位设备和位置
-
大小(Size)
-
保护位(Protection)
-
创建、访问、修改日期
-
所有者认证(Owner Identification)
需要目录的理由:
-
效率:快速定位文件
-
命名:方便用户使用
-
两个用户可以对不同的文件具有相同的名称
-
同一个文件可以有多个不同的名称
-
-
分组:按属性对文件进行逻辑分组
2.1 目录结构
单级目录系统:
-
所有用户使用一个目录
-
示例:
-
优点:容易实现和理解
-
缺点:
-
命名问题:所有文件不能有重复名称
-
分组问题:在大型文件系统中很难记住文件名
-
双极目录系统:
-
每个用户单独存放目录
-
文件名只需要在特定的用户目录中唯一
-
系统文件通常需要单独的目录
-
路径名称由用户名和文件名定义
-
示例:
-
优点:
-
解决名称冲突问题
-
高效搜索
-
文件共享和保护
-
-
缺点:未解决分组问题
层级目录系统:
-
两级目录的一般化
-
叶节点是文件
-
内部节点是目录
-
每个用户有一个工作目录:可以通过cd命令或系统调度改变工作目录
-
路径名可以是绝对的也可以是相对的
-
示例:
-
优点:
-
解决名称冲突问题
-
高效搜索
-
文件共享和保护
-
分组能力:可以通过目录的组织和嵌套结构,方便地对文件进行逻辑上的分组和管理
-
2.2 路径名
-
MULTICS:
-
Windows:\usr\harry\maibox
-
Unix:/usr/harry/mailbox
-
绝对路径:唯一的,从根节点开始
-
相对路径:相对于工作目录
2.3 目录操作
目录操作包括:
-
新建目录
-
删除目录
-
打开一个目录进行读取
-
关闭目录以释放内部表空间
-
返回目录下项
-
重命名目录
-
链接:创建一个链接,从现有的文件到路径名称(硬链接)
-
删除链接:删除一个 硬链接
内部表空间: 是指OS在其内部使用的数据结构和存储空间,具体来说,内部表空间通常用于存储和管理OS运行过程中所需的各种数据结构
-
文件系统的目录结构:每个目录和文件在文件系统中都有相应的数据结构来记录其名称、位置、大小、权限等信息。这些信息存储在内部表空间中,以便系统能够有效地管理和操作文件和目录
-
打开文件的状态信息:当应用程序或系统服务打开文件时,系统会维护有关文件的状态信息,如当前读写位置、文件描述符等。这些状态信息通常存储在内部表空间中,以便OS可以追踪和管理每个打开的文件
-
进程控制块(PCB):OS在管理进程时使用PCB来存储每个进程的状态信息,包括进程的标识符、优先级、程序计数器、寄存器状态等。这些信息也存储在内部表空间中
-
系统缓冲区和缓存:为了提高性能,OS会使用内存中的缓冲区和缓存来存储经常访问的数据块或文件内容。这些缓存管理的数据结构和内容也属于内部表空间的一部分
3.文件系统实现
3.1 文件系统布局
-
扇区0:Master Boot Record(MBR)
-
包含分区映射
-
-
其余的磁盘划分为分区
-
分区:一系列连续的扇区
-
-
每个分区可以容纳自己的文件系统
-
Unix文件系统
-
Windows文件系统
-
Apple 文件系统
-
-
每个分区以引导块(Boot block)开始
-
包含一个小程序
-
这个引导块从该分区中的文件系统读取操作系统
-
-
操作系统启动
-
BIOS读取MBR,然后读取并执行一个引导块
-
3.2 文件实现
File bytes vs. Disk Sectors:
-
文件是字节序列
-
文件IO粒度以字节为单位
-
-
磁盘为sector数列
-
磁盘IO粒度为sector
-
文件数据必须按sector存储
-
-
文件系统定义块大小
-
block size = 2n * sector size
-
将连续的sector分配给一个块
-
-
文件系统将磁盘视为块数列
-
必须为文件分配块
-
必须管理磁盘的可用空间
-
分配方法:
-
Three Methods:
-
Contiguous Allocation: 文件的所有块都是连续存储在磁盘上的。这种方法访问速度块,但容易导致外部碎片化,文件增长时也比较困难
-
Linked List Allocation: 每个文件块都包含一个指向下一个块的指针。适合文件增长,但随机访问速度较慢,容易导致内部碎片化
-
Indexed Allocation: 为每个文件维护一个索引块,其中包含指向所有数据块的指针。支持快速随机访问,较好地处理了文件增长问题,但需要额外的存储空间来存储索引
-
-
Key Metrics(关键指标):
-
Fragmentation(碎片化): 内部碎片化指的是分配的块中未使用的空间,外部碎片化指的是由于小块空间分散而导致的无法利用的空间
-
Grow file over time(文件增长): 文件在创建后能否方便地增长
-
访问速度:对于顺序和随机访问数据的速度
-
实现难度:实现起来的复杂程度
-
存储开销:管理和维护文件系统所需的额外存储空间
-
3.2.1 Contiguous Allocation
定义:在FS中,每个文件在disk上占据一组连续的存储块。这意味着文件的数据块在物理存储介质上是连续排序的
工作原理:
-
起始扇区和长度:文件在磁盘上的位置由起始扇区和文件长度来表示。OS只需记录文件的起始扇区位置和文件的总长度即可访问整个文件
-
存储布局:一个文件需要100个块,则从起始扇区开始的100个连续扇区将被分配给该文件
优点:
-
简单实现:只需记录文件的起始扇区和长度,管理和实现相对简单
-
高性能:由于数据块是连续存储的,顺序读取性能非常高,适合顺序访问的文件操作
-
易于恢复:在OS崩溃时,由于文件块是连续的,恢复数据较为容易
缺点:
-
外部碎片化:由于文件大小不易,删除文件后会留下不连续的空闲块,导致外部碎片化。为了重新利用这些零碎的空闲空间,可能需要进行碎片整理(compaction),这是一个耗时的过程
-
文件大小固定:文件在创建时必须确定最大可能的大小,文件一旦创建后就不能增长。如果文件需要增长,就必须找到一块足够大的连续空间来重新分配,这在实际应用中非常不便
-
空间管理复杂:需要管理空闲块列表,以跟踪disk上的可用空间
应用场景:
-
光盘媒体:连续分配方法非常适合如CD-ROM和DVD等一次写入的光盘媒体,这些媒体上的文件大小在写入前已经确定,文件不会被删除,也不会增长,因此不需要考虑碎片化和文件增长的问题
3.2.2 Linked List Allocation
Linked List Allocation:
-
定义:在FS中,每个文件在disk上由一个链表结构表示,每个文件块包含一个指向下一个块的指针,文件的所有数据块通过这些指针链接在一起,形成一个链表
-
工作原理:
-
文件块结构:每个文件块除了存储实际数据外,还包含一个指针,指向文件的下一个数据块
-
文件起始点:文件的起始点记录在文件目录中,指向文件的第一个数据块。通过这个指针,可以一次访问文件的所有块
-
-
优点:
-
无需外部碎片化:文件块可以分散存储在磁盘的任何位置,无需连续的空闲块,大大减少了外部碎片化问题
-
文件易于扩展:文件可以动态增长,只需将新的块链接到文件的最后一个块即可
-
简单的空间管理:管理空闲块较为简答,因为文件块不需要连续存储
-
-
缺点:
-
随机访问速度慢:由于文件通过指针链接,随机访问文件中的某个位置需要依次遍历链表,导致速度较慢
-
存储开销高:每个块需要存储指针信息,增加了存储开销
-
可靠性问题:如果指针损坏或丢失,整个链表可能会断裂,导致数据丢失或文件损坏(单点故障)
-
-
应用场景:
-
适合顺序访问的文件:Linked List Allocation适合那些主要进行顺序访问的文件操作,例如日志文件
-
不舍高频随机访问:不适合那些需要频繁进行随机访问的文件操作,例如数据库文件
-
Linked List Allocation Using FAT:
-
定义:FAT(File Allocation Table, 文件分配表)是一种Linked List Allocation 方法的改进和扩展,用于管理disk文件的存储。FAT文件系统在disk上维护一个FAT表,其中每个表项对应一个磁盘块,记录该块的状态和或指向文件的下一个块
-
工作原理:
-
FAT:FAT表存储在磁盘的特定区域,每个条目对应一个磁盘块。表中的条目可以是以下几种之一:
-
空闲块:表示该块未使用
-
终止标记:表示该块是文件的最后一个块
-
指针:指向文件的下一个块
-
-
文件存储:文件的起始位置记录在目录项中。文件数据块通过FAT表中的指针链接起来,形成一个链表
-
-
优点:
-
减少外部碎片化:文件垮可以分散在disk的任意位置
-
文件易于扩展
-
简单的管理和实现:FAT表结构简单,容易实现
-
-
缺点:
-
随机访问速度慢
-
存储开销,整个表要全部加载到内存中
-
可靠性问题:FAT表是整个文件系统的核心,一旦损坏可能导致整个文件系统不可用
-
-
应用场景:
-
适合嵌入式系统:FAT文件系统结构简单,适合嵌入式系统和小型存储设备
-
广泛使用在闪存设备上:例如USB闪存盘、SD卡等
-
3.2.3 Indexed Allocation
Indexed Allocation:
-
定义:每个文件都有一个索引块,索引块包含该文件所有数据块的指针
-
工作原理:
-
索引块:每个文件都有一个索引块,该索引块存储该文件所有数据块的指针。索引块中的每个条目指向文件的一个数据块
-
数据块指针:索引块中的指针指向文件的实际数据块。文件中所有数据块通过这些指针链接起来
-
-
优点:
-
随机访问效率高:由于每个数据块都有一个独立的指针,OS可以快读定位任意数据块,随机访问速度快
-
无外部碎片化:数据块可以分散在disk的任意位置,不需要连续存储
-
文件动态扩展:文件可以方便地扩展,只需在索引块中添加新的数据块指针
-
-
缺点:
-
索引块开销大:每个文件都需要一个索引块,增加了额外的存储开销,特别是对于小文件,索引块的开销相对较大
-
索引块大小限制:索引块的大小限制了文件的最大大小。如果文件非常大,一个索引块可能不足以存储所有数据块的指针
-
复杂性:相对于简单的Contiguous Allocation和Linked List Allocation ,indexed Allocation实现更加复杂
-
-
应用场景:
-
适用于大文件和频繁随机访问的文件:索引分配方法适用于需要频繁随机访问的大文件,如数据库文件和多媒体文件
-
文件大小不确定:适用于文件大小在创建时不确定,且需要动态扩展的场景
-
Multi-level Indexed Allocation:
-
定义:是Indexed Allocation的扩展,用于处理非常大的文件。通过使用多个级别的索引块来存储文件的所有数据块指针
-
工作原理:
-
单级索引:文件只有一个索引块,索引块中的指针直接指向数据块
-
多级索引:文件的索引块不仅包含指向数据块的指针,还包含指向其他索引块的指针,常见的包括二级索引和三级索引
-
-
二级索引:
-
一级索引块:文件的目录项指向一级索引块
-
二级索引块:一级索引块中的指针指向多个二级索引块
-
数据块:二级索引块中的指针指向文件的实际数据块
-
-
三级索引:
-
一级索引块:文件的目录项指向一级索引块
-
二级索引块:一级索引块中的指针指向多个二级索引块
-
三级索引块:二级索引块中的指针指向多个三级索引块
-
数据块:三级索引块中的指针指向文件的实际数据块
-
-
优点:
-
支持非常大的文件
-
高效的随机访问:尽管增加了索引级别,但多级索引仍然支持高效的随机访问
-
动态扩展能力:文件可以方便地动态扩展
-
-
缺点:
-
存储开销:多级索引块增加了额外的存储开销,尤其是对于较小的文件
-
实现复杂性:较为复杂
-
-
应用场景:
-
适用于超大文件
-
文件大小不确定且可能动态扩展
-
3.3 目录实现
概述:
-
目录存储方式与普通文件一样
-
目录项包含在数据块中
-
-
文件系统对这些文件的内容赋予了特殊的含义
-
目录文件是目录项的的列表
-
在Unix/Linux中,目录项包含文件名、属性和文件的i-node号
-
将面向人的文件名映射到面向系统的文件名
-
-
文件属性的位置:
-
在目录项中
-
固定大小的项
-
目录项包含文件磁盘地址和属性
-
被用在MS-DOS/Windows
-
-
在独立的数据结构中
-
目录项包含:
-
文件名
-
i-node号
-
-
i-node包含文件属性
-
被使用在Unix中
-
文件名:
-
短,固定长度的名
-
MS-DOS
-
文件名:1-8字符,扩展名是1-3个字符
-
每个目录项的名称为11个字节
-
-
Unix V7
-
最多14个字符
-
-
-
可变的长度名
-
Unix:
-
最多255个字符
-
目录结构变得更加复杂
-
-
目录实现:
-
线性列表:
-
一个目录下的所有字段都以单链表的方式维护,每个文件都包含指向分配给它的数据块的指针和目录中的下一个文件
-
当创建新文件时,将检查整个列表中新文件名是否与已有文件名匹配,如果它不存在,则可以在开始或结束时创建该文件
-
需要一个线性搜索找到一个特定的条目
-
简单的程序当性能差
-
-
哈希表:
-
为目录中的每个文件生成一个键值对,并存储在hash表重,可以通过对文件名应用哈希函数来确定键,而键指向存储在目录中的相应文件
-
Hashing可以大大减少目录搜索时间
-
哈希表的主要困难是它的固定大小和对哈希函数的依赖,还需要处理哈希冲突
-
3.4 共享文件
在FS中,Shared Files指的是同一个文件在多个目录中出现的情况。这种共享关系可以通过链接来实现,这种链接使得一个文件可以被多个目录引用,而不需要在存储设备上创建多个物理副本
Hard Links(硬链接):
-
定义:在Unix和类Unix操作系统中,Hard link是常见的实现共享文件的方式之一。硬链接是指多个目录项指向同一个文件的i-node。每个文件都有一个唯一的i-node,该i-node包含了文件的元数据和数据块的指针
-
创建硬链接:使用"ln file link"命令可以创建硬链接
-
特性:
-
硬链接和源文件没有区别,它们只是文件系统中不同位置的引用
-
删除原文件不会影响硬链接的可访问性,只有当所有硬链接和原文件都被删除时,文件系统才会释放文件的存储空间
-
硬链接不能跨越文件系统边界,即不能在不同的文件系统分区中创建硬链接
-
-
工作原理:
-
引用计数:
-
每个文件的i-node包含一个称为“引用计数“的整数字段
-
引用计数记录了指向该文件的硬链接(或目录项)的数量
-
-
创建硬链接:
-
当创建一个硬链接时,FS会增加目标文件的i-node中的引用计数
-
-
删除硬链接:
-
当删除一个硬链接时,FS会减少目标文件的i-node中的引用计数
-
如果引用计数为0,则FS会回收该文件所占有的所有存储空间,包括数据块和元数据
-
-
-
优点:
-
高效性:硬链接只是在文件系统中增加一个目录项,指向同一个i-node,不会增加数据存储空间
-
一致性:修改硬链接中的文件内容,所有硬链接都会反映这些更改,因为它们指向同一个i-node
-
持久性:只要有一个硬链接存在,文件数据就不会被删除,删除一个硬链接不会影响其他硬链接,只有所有硬链接删除了,文件才会在磁盘被删除
-
-
局限性:
-
硬链接只能在通过一个FS内部有效,不能跨越不同的FS建立
-
如果链接的任何一个文件被移动到不同的FS,那么OS会复制文件而不是而移动它,并调整两个文件的链接计数
-
通常硬链接不能指向目录,以避免产生循环结构,从而导致文件系统混乱
-
硬链接没有明显的标识,用户很难从表面区分硬链接和原始文件
-
Symbolic Links(符号链接):
-
定义:也称为软链接,是另一种共享文件的方法,它与硬链接不同,它们是指向文件路径的指针,而不是i-node(所以并不会增加”引用计数“的值)
-
创建符号链接:使用"ln -s file link"命令可以创建符号链接,link指向file路径
-
特性:
-
符号链接可以跨越文件系统边界,因为它们不直接指向i-node,而是指向文件的路径
-
删除原文件或目标文件会使符号链接失效,因为符号链接指向路径
-
符号链接可以指向目录或文件
-
-
优点:
-
灵活性:可以跨越不同的FS创建
-
目录链接:符号链接可以指向目录
-
可见性:符号链接是一个独立的文件,有明确的标识
-
-
缺点:
-
额外空间和i-node消耗:每个符号链接占据磁盘上的额外空间,并且需要一个额外的i-node来存储链接的路径信息
-
访问速度相对慢:访问符号链接需要额外的步骤,先读取符号链接文件,然后根据链接路径访问目标文件或目录
-
悬空链接:如果原始文件移动到不同的位置或删除,那么符号链接就会失效,称为悬空链接(dangling link),无法访问到目标文件或目录
-
使用场景:
-
共享系统库:多个程序可以通过符号链接共享同一个系统库文件,从而节省存储空间
-
创建快捷方式:符号链接经常用于创建桌面或文件管理器中的快捷方式,使用户可以方便地访问目标文件或目录
-
共享配置文件:不同用户或系统组件可以共享相同的配置文件,以确保设置的一致性和统一性
4.文件系统管理
4.1 磁盘空间管理
块大小:
-
块大小太大:
-
内部碎片化
-
最后的块有1/2浪费的空间
-
如果有很多小内存的文件,会造成很大的浪费
-
-
块大小太小:
-
需要更多的寻道,文件访问将会变慢
-
-
典型的块大小:
-
文件系统选择在1KB到4KB,但是现在的磁盘都超过1TB,最好将块大小增加到64KB
-
Unix:4KB或者8KB
-
MS-DOS:N*512
-
为了适应更大磁盘大小:
-
FAT-12: 512B, 1KB, 2KB, 4KB
-
FAT-16: 2KB, 4KB. 8KB, 16KB, 32KB
-
FAT-32: 4KB, 8KB, 16KB, 32KB
-
-
Windows:4KB
-
跟踪空闲块:
-
位图:
-
有n块就需要n位的位图
-
空闲块用1标识
-
已分配用0标识
-
优点:
-
简单移动
-
容易找到空闲块
-
支持连续分配,容易找到n个连续的空闲块
-
-
缺点:
-
位映射是低效的,除非整个位映射保存在主存中
-
对于较小的磁盘,将其保存在主存中是可能的,但是对于较大的磁盘则不一定
-
-
-
链表:
-
将空闲块组织成一个链表,每个链表节点包含一个空闲块的地址和大小信息(因为指向的地方有可能是连续的空闲块,所以需要大小信息,把这一部分连续的作为一个节点放到链表中)。
-
优点:适用于空闲块数量较多且大小差异较大的情况
-
缺点:遍历列表并找到给定大小的连续快并不容易
-
-
比较:
-
位图占用空间小
-
只有当磁盘空间几乎满时,链表方案才需要比位图更少的块
-
链表的问题:
-
只需要在主存中保存一个指针块,在某些情况下,这种方法会导致不必要的磁盘I/O
-
当指针块几乎为空时,一系列短暂的临时文件可能会导致大量的磁盘I/O
-
-
解决方案:保持磁盘上大部分指针块都是满的,但内存中的的指针块保持一半满
4.2 文件系统备份
备份到磁带:
-
可以从灾难中恢复数据
-
也可以从操作失误中恢复数据
备份问题:
-
备份全部还是部分系统?只备份特定目录和其中的所有内容,而不是备份整个文件系统
-
如果文件没有更改则不备份——增量备份
-
是否压缩备份?备份磁带上的一个坏点可以破坏解压缩算法,是否压缩应当考虑慎重
转储磁盘到磁带的两种策略:
-
物理转储
-
方法:
-
从磁盘的第0块开始
-
按顺序复制每个块
-
-
注意事项:
-
空闲块应该避免复制
-
磁盘是否存在坏扇区,应避免复制他们
-
-
优点:简单,速度快
-
缺点:
-
无法跳过选定的目录
-
无法进行增量备份
-
无法按需恢复单个文件
-
-
-
逻辑转储
-
从一个或多个指定目录开始,递归地备份从某个给定基准日期以来找到的所有更改过的文件和目录
-
能够增量备份
-
还必须复制包含任何修改文件的目录
-
-
逻辑转储算法:
-
从起始目录开始,检查其中的所有条目,标记每个修改的文件和每个目录
-
递归遍历目录树,取消标记任何没有修改文件的目录或其中的目录
-
转储所有已标记目录
-
转储所有已标记的文件
-
4.3 文件系统的一致性
概述:
-
多步骤更新会导致一致性问题
-
大多数操作系统都有一个检查文件系统一致性的实用程序
-
Windows:scandisk
-
UNIX:fsck
-
检查块
-
检查目录
-
-
-
fsck:
-
基本事实:每个磁盘块必须在一个文件或目录中,或在空闲列表中
-
建立两个表,表包含每个块的计数器,一个表记使用,一个表记空闲
-
读取所有节点并标记已使用的块
-
检查空闲列表并标记空闲块
-
块不一致状态:
-
一些块不在文件中或不在空闲列表中(丢失块):
-
将其加到空闲列表
-
一些块在空闲块列表中的计数大于1
-
不会发生这种事情如果使用的是位图跟踪空闲块
-
修正空闲块列表,让其为1
-
-
一些块在文件列表中的计数为大于1
-
一些块既在文件列表又在文件中:
-
从空闲块中移除
4.4 文件系统的性能
缓存:
-
许多文件被重复使用
-
最好在内存中保存一个副本
-
-
文件系统缓存
-
在内存中设置块缓存或缓冲缓存
-
缓存是逻辑上属于磁盘的块的集合,但出于性能原因将其保存在内存中
-
当进程试图读取块时,首先检查缓存
-
块预读:
-
是指在尝试需要之前将块放入缓存
-
比如说文件系统需要k块,但我们从磁盘中取出k+1块,因为文件系统可能还需要k+1这个块
-
这种技术仅适用于顺序访问
-
文件系统可以使用一个位来跟踪文件的访问模式(顺序或者随机)
磁臂运动:
-
寻道时间主导了磁盘访问时间
-
减少磁臂运动可以提高性能
-
通过将可能被访问的块按顺序彼此靠近,最好时放在同一个cylinder中来减少磁臂的运动
-
-
当输出文件被写入时:
-
如果系统对空闲块使用位图跟踪,它可以为靠近前一个块的文件分配一个新块(猜测文件将被顺序访问)
-
如果系统对空闲块使用链表,则系统可以在超级块中执行分配,超级块由几个连续的块组成
-