文章目录
- @[toc]
- 一、文件与文件系统
- 1.1 文件
- 1.2 文件系统
- 二、文件的访问方式
- 2.1 顺序访问
- 2.2 随机访问
- 三、文件的组织
- 3.1 文件的逻辑组织
- 3.2 文件的物理组织
- 3.2.1 顺序结构
- 3.2.2 链接结构
- 3.2.3 索引结构
- 3.2.4 Hash 结构
- 3.2.5 倒排结构
- 3.3 UNIX文件物理结构(索引+链接)
- 四、文件目录
- 4.1 文件控制块与目录项
- 4.2 单级目录与多级目录
- 4.3 文件目录的改进
- 4.4 根目录与当前目录
- 4.5 文件目录的查找
- 五、文件的共享
- 5.1 文件共享目的
- 5.2 文件共享的模式
- 5.3 文件共享的实现
- 5.3 文件的保护、保密与安全
- 5.3.1 文件的保护
- 5.3.2 文件保密
- 5.3.3 文件系统的安全
- 六、文件系统的实现
- 6.1 内存所需表目
- 6.2 UNIX文件系统的实现
- 6.2.1 内存所需表目(UNIX)
- 6.2.2 外存空间的管理
- 6.3 外存空间管理
- 6.3.1 空闲块表
- 6.3.2 字位映像图
- 6.3.3 空闲链表
- 6.3.4 *成组链接法(UNIX)
- 6.3.4.1 空闲块管理方式:
- 6.3.4.2 空闲inode管理方式:
- 七、文件系统的界面
- 7.1 创建文件
- 7.2 打开文件
- 7.3 关闭文件
- 7.4 指针定位
- 7.5 读文件
- 7.6 建立连接
- 7.7 断开连接
- 八、日志结构文件系统
- 8.1 背景
- 8.2 日志结构文件系统
- 九、内存映射文件
- 九、内存映射文件
文章目录
- @[toc]
- 一、文件与文件系统
- 1.1 文件
- 1.2 文件系统
- 二、文件的访问方式
- 2.1 顺序访问
- 2.2 随机访问
- 三、文件的组织
- 3.1 文件的逻辑组织
- 3.2 文件的物理组织
- 3.2.1 顺序结构
- 3.2.2 链接结构
- 3.2.3 索引结构
- 3.2.4 Hash 结构
- 3.2.5 倒排结构
- 3.3 UNIX文件物理结构(索引+链接)
- 四、文件目录
- 4.1 文件控制块与目录项
- 4.2 单级目录与多级目录
- 4.3 文件目录的改进
- 4.4 根目录与当前目录
- 4.5 文件目录的查找
- 五、文件的共享
- 5.1 文件共享目的
- 5.2 文件共享的模式
- 5.3 文件共享的实现
- 5.3 文件的保护、保密与安全
- 5.3.1 文件的保护
- 5.3.2 文件保密
- 5.3.3 文件系统的安全
- 六、文件系统的实现
- 6.1 内存所需表目
- 6.2 UNIX文件系统的实现
- 6.2.1 内存所需表目(UNIX)
- 6.2.2 外存空间的管理
- 6.3 外存空间管理
- 6.3.1 空闲块表
- 6.3.2 字位映像图
- 6.3.3 空闲链表
- 6.3.4 *成组链接法(UNIX)
- 6.3.4.1 空闲块管理方式:
- 6.3.4.2 空闲inode管理方式:
- 七、文件系统的界面
- 7.1 创建文件
- 7.2 打开文件
- 7.3 关闭文件
- 7.4 指针定位
- 7.5 读文件
- 7.6 建立连接
- 7.7 断开连接
- 八、日志结构文件系统
- 8.1 背景
- 8.2 日志结构文件系统
- 九、内存映射文件
- 九、内存映射文件
一、文件与文件系统
1.1 文件
什么是文件?
**文件(file)**是具有符号名且在逻辑上有完整意义的信息项的有序序列。
-
文件的符号:即文件名,创建文件时确定,访问文件时使用
-
信息项:构成文件基本单位;可能等长也可能不等长;具有顺序关系
-
读写指针:记录当前信息项的读/写位置
文件系统通常提供一个读写指针定位命令,从而支持随机读写
文件分类:
-
系统文件,用户文件;
-
临时文件,永久文件;
-
只读文件,只写文件,读/写文件;
-
磁盘文件,磁带文件,磁鼓文件;
-
目录文件,普通文件;
-
程序文件,数据文件;
程序文件又可分为:源文件,目标文件,可执行文件,头文件,库文件
在UNIX中有如下文件分类:
- 普通文件
- 内容可以是程序、数据、图象、MP3等,保存在磁盘块中
- 目录文件
- 文件名,文件号序列,文件描述信息
- 特殊文件
- 设备
- 设备作为文件管理的好处
- 界面统一,使用文件与使用设备命令相同,申请设备open,释放close,读read,写write
- 利用文件保护功能可以保护设备
- 设备作为文件管理的好处
- 设备
1.2 文件系统
文件与管理信息资源的程序集合称为文件系统(file system)。
从上往下看,文件系统位于设备之上既需管理文件也需管理保存文件的外存空间。
文件系统为用户提供按名存取文件的手段。
二、文件的访问方式
2.1 顺序访问
**顺序访问(sequential access)**就是按照从前到后的次序依次存取文件的各个信息项。
- 从文件头开始顺序访问
- 由文件中间的某一位置开始顺序访问
2.2 随机访问
**随即访问(random access)**就是无序存取文件的某些信息项。
- 按编号随机访问
- 按key随机访问
三、文件的组织
文件组织又称文件的结构,所谓的“逻辑结构”,就是指在用户看来,文件内部的数据应该是如何组织起来的。而“物理结构”指的是在操作系统看来,文件的数据是如何存放在外存中的。
3.1 文件的逻辑组织
文件的逻辑组织形式主要有两种:流式和记录式。
1、流式文件
流式文件(又称无结构文件),构成文件的基本单位是字节,即流式文件是具有符号名且在逻辑上有完整意义的字节序列。
如:Windows .txt文件
2、记录式文件
记录式文件(又称有结构文件),构成文件的基本单位是记录,每条记录又由若干个数据项组成。亦即记录式文件是具有符号名且在逻辑上有完整意义的记录序列。
一般来说,每条记录有一个数据项可作为关键字。根据各条记录的长度(占用的存储空间)是否相等,又可分为定长记录和可变长记录两种。
3.2 文件的物理组织
文件的物理结构就是要确定如何将记录或字节保存在存储型设备的物理块中。
需要考虑因素:
-
记录格式
等长or不等长(流式不必考虑)
-
空间开销
除保存文件内容之外的存储开销
-
访问速度
顺序访问速度、随机访问速度
-
长度变化
动态增加和动态减少
物理结构可分为:顺序结构,链接结构、索引结构、散列结构、倒排结构。
3.2.1 顺序结构
一个文件占有若干连续的磁盘块,首块号和块数记录在文件控制块(FCB)中。
优点:访问速度快,节省空间
缺点:长度变化困难
3.2.2 链接结构
一个文件占有若干个不连续的存储块,各块之间以指针相连。其首块号和块数被记录于该文件的文件控制块中
优点:节省空间,长度变化容易
缺点:随机访问速度慢
3.2.3 索引结构
索引结构针对链接结构随机访问慢而加以改进。
一文件可存于不连续块中,块号记在索引块中。
优点:速度快,长度变化容易
缺点:索引块占空间(外存和内存)
3.2.4 Hash 结构
**散列结构(hash structures)**又称杂凑结构。只适用于定长记录和按键随机查找的访问方式,用于构造文件目录。
哈希的思想不必多说。
散列结构的即通过计算来确定一条记录在存储设备上的存储位置。
我们可以设计一个hash函数,给定key,可以计算hash(key) = addr来作为记录在磁盘或文件中的存放位置。
hash技术自然要考虑hash冲突。
如果给定key1 != key2,hash(key1) = hash(key2),我们该如何解决?
数据结构上讲过:顺序探查,二次探查,平方取中、拉链法……
这里最常用的方法是:**顺序探查法:**如发生冲突,则在冲突位置开始顺序探查第一个空闲的存储位置,将该记录保存。
下面叙述散列结构下保存、查找、删除记录的流程。
保存记录:
- 计算addr = hash(key)
- 相应位置冲突计数+1
- 如果查找到的记录空闲,则标记为占用,填充记录内容
- 否则顺序查找下一个,直到找到第一个空闲的记录项
查找记录:
- 计算addr = hash(key)
- 取addr对应记录的冲突计数count
- 如果count = 0,说明无此记录
- 否则,如果此项空闲顺取下一条记录,直到找到一条非空闲记录
- 如果key相等,那么说明找到
- 否则如果hash(key)相同,我们将count - 1
- 如果count = 0,那么说明查找记录不存在
- 否则,我们顺取下一条记录
删除记录:
- 计算addr = hash(key)
- 调用查找过程
- 如果没找到,说明无此记录
- 否则,我们将记录项置闲,冲突计数减1
Hash 结构特点:按关键字检索速度非常快
用途:常用于目录检索
注意:文件可循环使用,满时保存失败。
3.2.5 倒排结构
记录中的域称为键,能够区分所有记录的键称为主键,其他键称为次键。以键值和记录地址构成的索引结构称为倒排结构(reverse structure)。键值为主键的索引称为主索引,键值为次键的索引称为次索引。
倒排结构以多个键和多个索引作为特征。
倒排结构适合不同的查找方式,速度很快。其缺点是索引会带来较大的系统开销
3.3 UNIX文件物理结构(索引+链接)
UNIX 文件的物理结构为链接结构与索引结构的结合,也可看成是多级索引结构。
具体地说,当一个文件长度不大于10 × 512B时,为零级索引;当文件长度大于10 × 512B但不大于10 × 512 + 256 × 512B时,为一级索引;当文件长度大于10 × 512 + 256 × 512B但不大于 10 × 512 + 256 × 512 + 256^2 × 512 B时为二级索引;当文件长度大于10 × 512 + 256 × 512 + 265^2 × 512 B但不大于 10 × 512 + 256 × 512 + 256^2 × 512 + 256^3 × 512 B时,为三级索引。
如下图,文件的控制结构 inode 中有 13 个索引项,即 addr[0], addr[1], …, addr[12]。
当文件长度不超过10块时,addr[0 ~ 9]充当0级间址,即指向10个信息块;
addr[10] 用作一级间址,它指向一个一级索引块,一级索引块指向256个信息块。
addr[11] 用作二级间址,指向1个一级索引块,一级索引块指向256个二级索引块,每个二级索引块分别指向256个信息块。
addr[12] 用作三级间址,指向一个一级索引块,一级索引块指向256个二级索引块,每个二级索引块指向256个三级索引块,每个三级索引块指向256个信息块。
这样做的好处是:大多数文件较短,在零级索引一级索引访问很快。大文件较长,访问二、三级索引虽然略慢,但是缓冲相应索引块到内存后,还是比较快的。
既能节省空间又提高了速度。
四、文件目录
4.1 文件控制块与目录项
**文件控制块(file control block,FCB)**是标志文件存在的数据结构,其中包含系统对文件进行管理所需要的全部信息。
每一个文件都有一个FCB,它们被保存在外存空间中。
当欲访问一个文件时,应当能够根据文件名称找到它所对应的FCB。FCB以目录项的形式存储于目录文件中。因此FCB又被称为目录项。
FCB通常保存如下内容:
4.2 单级目录与多级目录
1、单级目录
所谓单级目录就是整个系统中只有一个目录,所有文件均登记在该目录中。
优点:简单
缺点:文件不能重名
2、二级目录
级目录是对单级目录的一种改进。采用二级目录时,整个系统只有一个公共目录,称为系统目录;每个用户都有一个专有目录,称为用户目录。所有的用户目录均登记于系统目录中,每个用户目录下登记着该用户的文件。
3、多级目录
多级目录结构是对二级目录结构的进一步改进。
文件系统呈现一种树形结构。**叶子结点是一般文件或者目录文件;非叶子结点为目录文件。**根节点是特殊的目录文件,称为根目录文件。
采用多级目录结构时,文件的名字是一个路径名。路径名由根结点开始到叶子结点结束结点名字序列所构成,其间以“/”或“\”相隔。
优点:
- 便于文件分类
- 查找速度快(因为每个目录下文件较少)
- 可以实现文件的连接(Link)
目前已为大多数操作系统所采用,如UNIX、Windows
4.3 文件目录的改进
有的系统将FCB分为两部分:FCB主部和FCB次部。
**FCB主部:**包括除文件名称以外的所有信息和一个标识该主部和多少次部相对应的连接计数。
- 保存在外存inode区域,打开时读入内存
**FCB次部:**仅包含一个文件名称和一个标识文件主部的文件号。
- 保存在目录文件中
在存储文件的外存划分一个固定区域保存文件FCB主部,并将保存主部的记录从头依次编号就是文件号。
改进的好处:
- 可以提高查找速度
- 可以实现文件链接(Link),一个文件多个路径名(参考Linux ln指令)
目录改进后的查找速度:
顺序查找 n 个记录,找到一个记录的平均查找记录的次数 = (1 + 2 + … n) / n = (n + 1) / 2
设未分次部和主部的FCB构成的文件目录占n个磁盘块,则顺序查找文件目录,找到一个**文件目录(即FCB)**的平均访问磁盘块的次数 = (n + 1) / 2
设次部构成的文件目录占m个磁盘块,则顺序查找文件目录找到一个文件(FCB)的平均访盘次数 = (m + 1) / 2 + 1
若(n + 1) / 2 - ((m + 1) / 2 + 1) > 0,即 n - m > 2,由于次部占据空间小,所以m通常会比n小不少,我们查找速度一般是会快一些的。
4.4 根目录与当前目录
1、根目录
树状结构(多级目录)文件系统中,根结点对应的目录称为根目录;
根目录保存在外存空间固定位置。
2、当前目录
目前正在使用的工作目录称为当前目录。
UNIX文件卷(volume)组织形式:
引导块中是引导程序,负责将UNIX可执行程序装入内存并执行
4.5 文件目录的查找
1、从根目录开始查找
2、从当前目录开始查找
二者不仅是绝对路径和相对路径的差别,查找速度上后者也要略快。
查找算法一般有如下几种:
- 顺序查找:emm……
- 散列查找:查找速度快,但是要求预先确定目录文件的大小。
- 二分查找:要求文件名按字典序存放
五、文件的共享
5.1 文件共享目的
-
节省存储空间
共享文件不需要开多个副本了
-
进程相互通信
进程可以通过文件共享来实现通信
5.2 文件共享的模式
-
异步使用同一文件
即,共享文件任意时刻最多只有一个进程访问它
-
同时使用一个文件
同一时刻多个进程要求使用同一文件,但是这就又分为两种情况了:
- 所有进程都不修改访问文件
- 另一种就复杂了。我们要对读者写者进行控制
5.3 文件共享的实现
-
公共目录
若干个可以被所有用户访问的公共目录,如Unix下的lib、dev等
-
连接(Link)
Linux中的硬连接,软连接
-
共享说明
说明文件可以由哪些用户使用,以及权限。如linux下的rwx,文件用户、组
5.3 文件的保护、保密与安全
- 保护
- 防止用户对文件进行非授权的访问
- 保密
- 防止文件内容泄露
- 安全
- 防止文件被破坏
- 自然因素
- 人为因素,攻防等
- 防止文件被破坏
5.3.1 文件的保护
- 对文件所有者和创建者的控制
- 能做什么
- 能被谁操作
- 访问方式
- 读
- 写
- 执行
- 追加
- 删除
- 列出
1、存取控制矩阵
将用户关于所有文件的存取方式记录在一个矩阵中,该矩阵称为存取控制矩阵。
加入我们对文件定义6种存取方式:R、W、E、A、M、D(读写执行追加修改删除),那么六个二进制为可表示
特点:
- 权限规定细,过于繁琐,占据较多存储空间
UNIX访问权限说明,i_mode
放个linux下的图
- 文件主判别:访问进程u_uid == i_uid
- 同组用户判别:访问进程u_gid == i_gid
- i_mode在创建文件时给出,creat(filename,mode)
- 其后文件主可以修改:chmod(filename,new_mode)
5.3.2 文件保密
1、口令
设置口令:
- 创建文件时用户规定一个口令,系统将其记在FCB中
- 访问文件要求给出口令,并与FCB中口令比较
特点:
- 简单
- 保密性不强(对系统操作者不保密)
2、密码
口令由于保存在FCB中保密性太差因而可能泄露,密码则是通过将文件内容加密,那么即使泄露了,窃取者在不知密码的情况下也只是获取了一堆杂乱无章的数据。
使用:
- 保存时加密
- 读取时解密
**特点:**对文件内容加密,速度慢,效果好
- 保存时:
- 用key启动一个随机数发生器,产生一个随机数序列,将其依次加到文件的各个字中
- 读取时:
- 用同一个key启动同一个随机数发生器,产生相同随机数序列,将其依次由文件的各个字中减去
线性同余法产生随机数
size_t random (size_t key) {
return (key * C1 + C2) % C3;
}
5.3.3 文件系统的安全
备份(Backup)原理
- 定期将磁盘上的文件复制到磁带上
- 发生故障时由磁带恢复(limited recovery)
实现方式:
- 完全转储:定期将磁带上文件全部复制到磁带上
- 恢复:最后一次转储磁带
- 优点:恢复容易
- 缺点:大量冗余
- 增量转储
- 每次只复制上次转储以来修改的部分
- 恢复:由初始转储磁带开始,利用第二次转储磁带、第三次转储磁带、……、最后一次转储磁带,逐步恢复到最终版本
- 优点:每次转储数据少
- 缺点:实现麻烦,某次转储磁带发生问题将使恢复困难
磁盘整理
利用转储和恢复可以对磁盘进行整理(使文件物理块连续,空闲盘块连续)
六、文件系统的实现
6.1 内存所需表目
文件访间时需要经常访问文件控制信息,为提高访问速度需要将控制信息缓存到内存,因此文件使用前需要打开,使用后需要关闭
- 系统打开文件表(系统一个)
- 修改标志是指FCB主部在内存期间是否被修改
- 用户打开文件表(每个进程一个)
- 文件可以共享,多个进程对文件的打开方式可以不同,读写位置可以不同,这些信息记录在一个表中
下面一张示例图展示两种表之间的关系:
6.2 UNIX文件系统的实现
6.2.1 内存所需表目(UNIX)
- 用户打开文件表
- u_ofile(每个进程一个):保存用户打开文件的读写指针
- file(整个系统一个):保存所有用户的打开文件表目,每个用户被分配的file表目数目不同
- 系统打开文件表
- inode(整个系统一个)
6.2.2 外存空间的管理
后面详细介绍
- 空闲块表
- 字位映像图(LINUX)
- 成组连接(UNIX approach)
6.3 外存空间管理
6.3.1 空闲块表
这种方法是将所有的空闲块记录在同一个表中,该表称为空闲块表。
6.3.2 字位映像图
即位图(bitset)。
这种方法用1位(1bit)来表示外存储器中一块的状态,可以规定当某一位的值为0时,该位所对应的外存块空闲,而当某一位的值为1时,该位所对应的外存块被占用。
6.3.3 空闲链表
系统保存着空闲链表链头、链尾指针,空闲链表通常分为以下两种形式:
空闲盘块链:以盘块为单位组成一条空闲链,
空闲盘区链:以盘区为单位组成一条空闲链
- 一个盘区由多个盘块组成
6.3.4 *成组链接法(UNIX)
回忆UNIX文件卷组织形式
引导块中是引导程序,负责将UNIX可执行程序装入内存并执行
UNIX 外存空间的管理采用成组连接方式,空闲块链与空闲块表的结合。
特殊块/超级块(super block)
- 记载文件卷上 k + 1 块到 n - 1 块中所有空闲块
- inode区中100个空闲inode(缓存)
文件安装(mount)后超级块读入内存。
注:占用区域已经记载在各个文件的inode中。
超级块的结构图如下:
- s_nfree 记录超级块内的块的数目
- s_free[i]都指向一个块
- s_free[0]指向一个索引块,索引块又指向新的一组(100个空闲块)
下面介绍空闲块管理方式,就明白成组链接的原理了。
6.3.4.1 空闲块管理方式:
相关结构:s_free,s_nfree
- 缓冲区sfee中记录的100个空闲块采用的次序管理。
- 申请块时,若s_nfree > 1,取缓冲区s_free[ – s_nfree]
- 如果申请时,s_nfree = 1,那么读入连接块s_free[0]
- 将连接块中的s_free 和 s_nfree 信息登记在缓冲区
- 分配空闲块
- 归还块时,如果s_nfree < 100,那么s_free[s_nfree ++ ] = 归还块号
- 如果s_nfree == 100,那么将 s_free 中记录的100个空闲块号连同 s_nfree 一同登记在连接块内,并写回外存
- s_free[0] = 连接块号
- s_nfree = 1
- 申请块时,若s_nfree > 1,取缓冲区s_free[ – s_nfree]
6.3.4.2 空闲inode管理方式:
相关结构:s_inode,s_ninode
s_inode 最多记录 100 个空闲 inode 的编号
- 申请时,取s_inode[-- s_ninode]
- 如果 s_ninode == 0,说明缓冲区里的inode用完,我们顺序扫描inode区域,拿100个空闲inode编号并记录到s_inode
- 释放时,s_inode[s_ninode ++ ] = 释放编号
- 如果s_ninode = 100,丢弃该inode编号
- 注意,内存中inode发生变化,我们的选择是及时写回外存
七、文件系统的界面
文件系统与用户之间的界面形式是一组系统调用命令,它们可以被写在用户程序中,是文件使用者与文件系统交互的途径。
文件的系统调用命令是文件系统与上层软件之间唯一的界面形式。
7.1 创建文件
命令形式:creat(path_name,fcb_args)
参数说明
- path_name:文件路径名
- fcb_args:参数
执行步骤:
- 为此文件分配一个FCB主部,初始化(文件主、共享说明、创建时间、长度等)
- 将文件名和文件号作为FCB次部填到末级目录中
- 以写方式打开
- 例如: creat(“/usr/li/d1/f1”, mode)
7.2 打开文件
命令形式:fd=open(path_name, mode)
参数说明:
- path name:文件路径名
- mode:打开方式
执行步骤
- 根据文件路径名查目录找到文件号,和FCB主部
- 合法性检查(根据打开方式、共享说明、用户身份)
- 根据文件号查系统打开文件表看该文件是否已被打开,如是共享计数加1;否则取一个空闲的系统打开文件表项并将外存中 FCB主部等信息填入此表项,共享计数置为1;
- 在用户打开文件表中取一空表项,填写打开方式和读写指针,并指向系统打开文件表的对应表项。
- 返回信息:fd:文件描述符(在用户打开文件表中的入口)它是一个非负整数,
7.3 关闭文件
命令形式:close(fd)
参数说明
- fd:文件描述符
执行步骤:
- 由 fd 查用户打开文件表,找到系统打开文件表
- 系统打开文件表中共享计数减1,如减1后的值为0且修改标志为1,则将此FCB 由内存写回外存FCB主部;
- 将fd所对应的用户打开文件表项置为空闲
7.4 指针定位
**命令形式:**seek(fd,offset)
参数说明:
fd:文件描述符;
offset:新的指针位置.
执行步骤:
- 由 fd 查用户打开文件表,得系统打开文件表入口
- 查系统打开文件表,得文件长度
- 检查参数合法性
- 将用户打开文件表中文件读写指针位置设定为offset,后继读写命令由该指针处存取文件内容
7.5 读文件
**命令形式:**read(fd,nrd,buf)
参数说明:
fd:文件描述符;
nrd:读入记录个数;
buf:内存起始位置.
步骤:
-
由fd查用户打开文件表,找到对应的入口;
-
合法性检查(用户打开文件表中所记录的打开方式、存取方式)
-
查系统打开文件表,找到文件的地址;
-
根据逻辑地址(offset)和物理结构计算物理地址;
-
如在缓冲区中;所需字节复制到进程空间buf起始位置;
-
否则申请缓冲区(可能多个)链入设备IO队列,若设备空闲启动设备,等待IO传输完成(切换进程),所需字节复制到进程空间buf起始的位置。
7.6 建立连接
**命令形式:**link(old name,new name)
参数含义:
old_name:已存在的文件路径名;
new_name:欲连接的文件路径名,
执行步骤:
-
查目录找到文件old name的FCB主部,由此得到文件号;
-
查目录找到文件new_name的末级目录;
-
将文件号与new_name中末级名字合起来构成一个新的目录项,将其填入new name的末级目录文件中;
-
将FCB主部中的连接计数加1
7.7 断开连接
**命令形式:**unlink(path_name)
参数含义:
path_name:文件路径名,
执行步骤:
-
查目录找到文件path_name的FCB主部
-
将连接计数i_nlink减1
-
如减1后的值为0,则归还该文件所占用的全部存储块,该文件将被撤销
-
将FCB次部由上级目录中清除
八、日志结构文件系统
8.1 背景
- CPU速度越来越快
- 内存容量以接近指数级速度增长
- 磁盘容量,更大更便宜
- 磁盘速度的提高却相对较慢
- 成为系统效率的瓶颈
- 缓存的增加,使大部分读盘操作可以在缓存中得到
- 写操作(多数为小量写)是影响文件系统效率的关键
UNIX中创建一个文件:
- (文件名,文件号)写入目录中
- 新文件inode更新
- 目录文件inode更新(长度变化)
- 写入文件内容
小量写(small write)
- 一次写修改磁盘块上的一小部分数据
- 假定一次写需要10ms寻道时间,4ms旋转延迟,50μs读写磁盘访问效率只有 50 / (14000 + 50) = 0.36%.
考虑写延迟
- 发生故障给文件系统一致性带来威胁
8.2 日志结构文件系统
UC Berkley 的研究人员提出一种新的文件系统——日志结构文件系统(LSFS)。
LSFS将整个磁盘看做一个日志,周期性地追加新日志。写操作并非直接反映到磁盘上,而是被暂时存到内存缓冲区中,其中包括新写的数据,也包括更新数据当积累到一定规模时,作为一个segment追加到日志的末尾。
段包括索引结点(inode)、目录(directory)以及数据块(datablock),每个段的开始处都包含一条总结信息(summary),说明该段的信息组
织情况。
由于索引结点的存储位置不能由其编号确定,系统维护一个索引结点图(inode map),以实现从文件号i-number 到磁盘索引结点inode位置的映射。索引结点图被保存在磁盘上,但是被缓存到内存以提高访问速度。打开文件时由文件号i-number查索引结点图找到索引结点,进而找到文件数据块。
当日志将磁盘写满时,新段无法继续写入。由于已写入盘中的段可能有陈旧信息,系统设置一个清洁线程(cleaner),循环扫描磁盘并对段进行压缩。
- 清洁线程首先读入第一个段,然后查找索引结点图确定索引结点是否为新版并仍然被使用,
- 若不是则信息被丢弃。
- 仍然有用的索引结点和数据块与内存中的当前段合并作为新段写回磁盘,旧段被标记为空闲,然后顺序处理下一个段。
九、内存映射文件
- 文件保存于外存,存取速度慢
- 访问之前需要打开
- 每次访问需要经过“打开文件表
- 读写需要经过I/O传输
- 缓冲可以提高速度,但首次访问需要I/O
- 内存容量增加,利用率不充分
- 进程虚拟空间大,只使用较小的一部分
内存映射文件:将文件映射到内存,以访问内存的方式访问文件
- 以访问内存的方式访问文件数据
- 文件数据的读入、写出由操作系统自动完成
- 进程关闭文件时,操作系统自动将文件被修改的数据写回磁盘
- 多个进程可以映射同一个文件,实现共享
ry)以及数据块(datablock),每个段的开始处都包含一条总结信息(summary),说明该段的信息组
织情况。
[外链图片转存中…(img-OytUfHHT-1719408518180)]
由于索引结点的存储位置不能由其编号确定,系统维护一个索引结点图(inode map),以实现从文件号i-number 到磁盘索引结点inode位置的映射。索引结点图被保存在磁盘上,但是被缓存到内存以提高访问速度。打开文件时由文件号i-number查索引结点图找到索引结点,进而找到文件数据块。
当日志将磁盘写满时,新段无法继续写入。由于已写入盘中的段可能有陈旧信息,系统设置一个清洁线程(cleaner),循环扫描磁盘并对段进行压缩。
- 清洁线程首先读入第一个段,然后查找索引结点图确定索引结点是否为新版并仍然被使用,
- 若不是则信息被丢弃。
- 仍然有用的索引结点和数据块与内存中的当前段合并作为新段写回磁盘,旧段被标记为空闲,然后顺序处理下一个段。
九、内存映射文件
[外链图片转存中…(img-oqJYZpR7-1719408518180)]
- 文件保存于外存,存取速度慢
- 访问之前需要打开
- 每次访问需要经过“打开文件表
- 读写需要经过I/O传输
- 缓冲可以提高速度,但首次访问需要I/O
- 内存容量增加,利用率不充分
- 进程虚拟空间大,只使用较小的一部分
内存映射文件:将文件映射到内存,以访问内存的方式访问文件
- 以访问内存的方式访问文件数据
- 文件数据的读入、写出由操作系统自动完成
- 进程关闭文件时,操作系统自动将文件被修改的数据写回磁盘
- 多个进程可以映射同一个文件,实现共享