1. 概述
1.1 文件和文件系统
-
文件File
:存储在外存上具有标识名的一组字符流或记录的集合。可长期保存和共享 -
文件系统File System
:OS中负责存储、管理、和操作文件的一组实用程序及其所需数据结构 - 文件系统的功能:从用户角度来看
- 创建、删除、打开、关闭、读、写文件和目录
- 维护文件属性:文件名、所有者、创建/修改时间、访问权限、长度、外存地址等
- 文件的透明存取(按名存取)、共享与保护
1.2 文件结构
记录式文件
中,数据的4个结构层次
-
域fidld(字段)
:包含一个数值,如学号、姓名等 -
记录
:一组相关域的集合,如一条学生记录 -
文件
:一组相似记录的集合,如数据库中的表 -
数据库DataBase
:可由多个相关文件(表)组成,如学生学籍管理
-
流式文件
:UNIX将所有文件都看作由字节流
组成,如源程序、目标代码等
1.3 文件系统功能
- 文件系统功能:目录管理、访问(权限)控制、访问方法、文件操作函数、记录组块、文件分配、磁盘管理和调度
- 以写磁盘文件为例
1.4 文件夹
1.4.1 内容(目录的内容)
- 每个文件有一个目录项(文件控制块
FCB
),保存它的属性 - 每个目录本身也是一个文件。目录文件是
占据整数个磁盘块
的记录式文件,内容是该目录下所有文件目录项的集合
例如:一个磁盘块1024B,新建一个目录,该目录文件长1024B, 每个目录项32B,则该目录可以有32个文件。
- 每个目录至少包含两项:当前目录 . 和父目录 .
1.4.2 结构
- 目录:树型结构
- 文件由文件路径名和文件名标识
1.4.3 命名
- 文件的命名:文件名.扩展名
- 扩展名用来反映文件的类型
- 在同一目录下文件名必须唯一
- 绝对路径,相对路径,当前目录
- 绝对路径:/Li/D/H
- 相对路径:/Li
- 相对路径:D/H
2. 文件共享
- 访问权限
- 对一个文件的访问权限层次
- 无权限、知道该文件存在、执行、读、在文件尾追加、写、更加其他用户的访问权限、删除文件
- 权限是依次递增的,每项权限都隐含前面的那些权限
- 创建文件的用户是文件的所有者,拥有全部权限,可以向其他用户授予权限
- 同时访问
- 多个用户可以同时读文件
- 用户在修改文件时,对整个文件或相关记录加锁,实现互斥写,防止死锁
1、用户删除某文件时,OS不可能执行的操作是(A)
A.删除此文件所在的目录
B. 删除与此文件关联的目录项
C. 删除与此文件对应的文件控制块
D. 释放与此文件关联的内存缓冲区2、一个文件被打开时,OS首先要做的是 。(B)
A. 将文件内容读到内存
B.将文件控制块读到内存
C. 修改文件控制块中的读写权限
D. 将文件的数据缓冲区首指针返回给用户进程
3. 记录组块-3三种方式
- 磁盘I/O以块(如扇区)为单位,
字节流式文件可以直接I/O
,但记录式文件需要将多条记录组装成块才能进行I/O
- 3种记录组块的方法
-
固定组块
:记录长度固定,若干完整的记录放在一块,块后部可能有内碎片 -
可变长度跨越式组块
: 记录长度可变,尽量占满一块,有些记录可能跨越两块,则用指针
连接 -
可变长度非跨越式组块
:记录长度可变,但不跨块,有块的内碎片,一条记录的长度不能超过块的尺寸
4. 辅助存储管理
4.1 文件分配-为文件分配磁盘空间
- 预分配(声明文件最大尺寸),动态分配
- 给文件分配磁盘空间时:
- 如果分配连续磁盘块,则访问时不需要移动磁头,速度快;但磁盘利用率低,碎片多,文件扩充困难
- 如果离散分配磁盘块,则磁盘空间利用率高,但访问时磁头移动使得访问速度变慢
- 所以,可以离散分配磁盘块,但最好是连续分配。 于是现代OS以磁盘块(
簇cluster
)为单位分配磁盘, 每个文件至少占一个单独的磁盘块。1簇=2n扇区。 - 3种文件分配方法:
连续分配
,链接分配
,索引分配
4.2 文件分配-连续分配方法
- 为每个文件分配一组相邻的盘块。(FF,BF,WF)
- 文件属性简单:(起始块号,块数);
- 顺序访问和随机访问都方便;寻道少,I/O快
- 磁盘外碎片多,需紧缩;文件不能动态增长。
4.3 文件分配-链接分配
- 每个盘块有一链接指针,将该文件的多个离散的盘块链接成一个链表
- 动态分配,没有外碎片,寻道多,I/O慢,适合顺序访问,随机访问比较困难(链表的特性)
4.4 文件分配-索引分配
- 把所有盘块的地址集中到索引块中
- 没有外碎片,是随机访问的(O(1)),但增加索引块的开销
- 基于单个索引盘块进行索引分配:
- 基于长度可变的(盘块)分区进行索引分配:
同样一个索引块的开销,可为文件分配更多盘块
1、如果磁盘块长4KB(即索引块和数据块均长4KB), 每个盘块指针4B,则采用基于单个盘块的索引分配时,允许的文件最大尺寸是多少?
一个索引快和数据块均为4KB,一个盘块指针长4B,那么索引块中就能够指向(4KB/4B) = 1K个指针
,1K个指针就对应着1K个数据块,1K*4KB = 4MB,因此文件尺寸为4MB2、基于大小可变的分区的索引分配,假设索引块中“长度” 域占1B、2B,文件最大尺寸分别是多少?当长度域为1B时,索引块有(4KB/5B=819个指针),而长度是1B,1Byte代表8个bit,8个bit可以代表(2^8-1) = 255个地址,因此文件的最大尺寸可以是819
2554KB = 815.8MB
同理可以计算出682
64K4KB = 170.5GB
3.设一个文件由100个磁盘块组成,则对于连续文件、 链接文件和索引文件,当在文件中间增加一块(原50#块 后面)和删除一块(删掉51#块)时需要的磁盘I/O次数是 多少?设头指针和索引表已在内存。(设块号从1开始计数)
如何理解:连续分配可以理解成静态数组(内存中连续分配),连接分配就是链表了(寻找节点开销大),索引分配就是打表O(1)
5.磁盘空闲空间的管理
5.1 位表(位图、位视图)
1bit => 1块的状态,0:空闲
,1:已分配
这个就相当于是数组的寻址方式,字号可以看成是行,位号可以看成是列,要找到某一个元素的地址那就是行*每一行的元素个数+所在列数
即可寻址
- 易于分配连续空间。位图可(部分)复制到内存,加快磁盘分配回收。位图本身需占用 n 个磁盘块:磁盘容量 = 2^30 字节 (1 GB),盘块大小 = 2 ^12 字节 (4 KB),则位示图占 2 ^ 30/2 ^ 12 = 2 ^ 18 bits = 2 ^ 15 B (32KB),n =8个磁盘块。
5.2 空闲块链
- 将所有空闲盘块区形成一个链表
5.3 索引表
- 将所有空闲盘块区的“首块号+块数”放在一个索引表中
5.4 空闲块列表
将所有空闲盘块号放在磁盘一个保留区里。 此表可部分复制到内存,可排序以 实现连续分配。
6. UNIX文件管理
6.1 文件管理类型与链接
- UNIX区分6种文件:
普通文件
,目录文件
,特殊文件 (设备)
,命名管道
,链接文件(硬链接)
,符号链接
。 - UNIX通过链接共享文件:
ln [-s] 原名 新名
ln /Liu/A /Li/D/F
创建硬链接
- 文件名/Li/D/F和/Liu/A指向同一个i-node索引节点
- 不能链接目录或跨文件系统创建链接
ln -s /Liu/A /Li/D/F
创建符号链接(快捷方式)
- 文件/Li/D/F中只包含原文件/Liu/A的路径名,而原文件
/Liu/A指向一个 i-node,才能找到文件的其它属性。 - 文件主删除文件/Liu/A后,符号链接访问将失败。
- 可以链接目录或跨文件系统创建链接。
6.2 访问权限
$ ls –l
drwxr-xr-x 3 sww staff 4096 Dec 14 17:03 test 目录文件
-rw-r--r-- 1 sww staff 43 Dec 12 10:45 hello.c 普通文件
-r-xr-xr-x 2 sww staff 985 Dec 14 17:03 exea 硬链接
l--x--x--x 1 sww staff 6 Dec 12 10:45 aa->/bin/x 符号链接
- UNIX:三类用户,权限(读/写/执行)以3位八进制表示。
6.3 索引节点 i-node
- UNIX中的文件控制块:索引节点 i-node。
- 创建文件时,在磁盘上建立一个磁盘i-node。
- 文件名和
i-node
号保存在目录项中 - 除文件名外,所有其它属性都保存在 i-node 中。
目录文件中存储的是唯一的文件名,文件名后还有一个2B的域用来存储i-node在i-node表的地址
6.4 UNIX混合索引
- FreeBSD(一种UNIX的变种):设1块为4KB,8B/块地址,则512地址/块。
- 直接地址:i 节点的前12项是文件前12个数据块的盘块号。
- 一次间址:i 节点的第13项中存放一个盘块号,这个盘块(索引表)中存放该文件的另外512个数据盘块的盘块号。
- i 节点的第14、15项用于二次和三次间接寻址。
- 则文件大小从 48KB 可扩大到 2MB+、1GB+、512GB+。
- 这样做的好处是在动态分配内存空间,根据文件大小的实际需要对内存进行分配。
可以这样理解:所谓一、二、三次简址就是采用了多少级缓存,一次间址就是直接放一个索引表,二次间址就是建立一个索引表的索引表,三次简址类似
6.5 UNIX磁盘文件布局
- 超级块:文件系统大小、空闲磁盘块数 目、空闲盘块表、索引节点表 大小、空闲索引节点数目、空闲索引节点表等
- i-node: 记录每个文件的属性(除了文件名)。 inode表长度固定。创建文件系统 时,默认根据磁盘块数量确定inode数量。
6.6 Linux文件系统
- Linux:访问文件系统前,它必须被安装到一个安装点\
$ fdisk -l
查看已有分区(文件系统)
$ mkdir /aa ; mount /dev/sda6 /aa 挂载Linux分区,
该/aa目录的原有内容将暂时不可见,直到卸载分区
$ umount /aa 或 umount /dev/sda6 卸载Linux分区
7. Linux虚拟文件系统
- 虚拟文件系统VFS: 同时支持多种文件 系统(如VFAT、NTFS、UFS、NFS、 EXT2、EXT3、光盘 的ISO9660等)。
- 通过VFS的转换,用户使用同一组系统调用对不同文件系统中的文件进行操作,而不需要关心不同文件系统的实现细节。
8. Windows文件系统
- Windows支持传统的FAT16、FAT32文件系统
- 文件分配表 File-Allocation Table
- FAT32下,FAT有两个副本,更可靠。磁盘分区最长2TB(XP下最长32GB),文件最长4GB。
- 自Windows NT开始使用、不断增加新特性的文件系统NTFS:
- 写文件操作被记录在事务日志中。系统崩溃后,根据日 志对那些部分完成的事务进行重做或撤销,保证磁盘上文件的一致性。
可恢复性
- 为文件分配磁盘空间时,以簇(2^n个连续扇区,一簇至多 2 ^16B)为单位离散分配,最大文件为2 ^ 32簇。
- 磁盘逻辑分区称为卷volume,卷最大2 ^ 64B。
9. NTFS卷结构
- NTFS的卷布局:
- 分区引导扇区:启动代码、卷布局信息、文件系统信息等。
- 主文件表MFT:NTFS的核心。
- 被组织成一个表,表内每行长1024B(称为一条记录)。 每行描述一个文件或文件夹的属性和文件 (部分)内容。
- 若文件内容足够小,则整个文件位于MFT的一行中; 否则,该行包含文件的部分信息,其余部分放到卷的 其它可用簇,同时在该行中保存指向这些簇的指针。
- 系统文件:MFT2(MFT前几行的镜像备份)、事务日志、簇位图(簇的分配/空闲状况)、坏簇记录等。
10. FAT文件结构