第四章 文件管理
4.1文件系统基础
4.1.1 文件的基本概念
文件的属性:
文件名: 文件名称唯一
标识符: 对用户来说毫无可读性,标识符是操作系统用于区分各个文件的一种内部名称
类型: 指明文件的类型
位置: 文件存放的路径,在外存的地址
大小: 文件大小
创建时间,上次修改时间,文件所有者信息
保护信息: 对文件进行保护的访问控制信息
无结构文件: 由一些二进制或字符流组成,又称流式文件
有结构文件: 由一组相似的记录组成,又称纪录式文件
数据项是文件系统中最基本的数据单位
记录是一组相关数据项的集合
文件之间应该怎样组织起来?
——用户可以自己创建一层一层的目录,各层目录存放相应的文件。系统中的各个文件就通过一层一层的目录合理有序的组织起来了,目录就是一种特殊的有结构文件(目录就是文件夹)
操作系统应该向上提供哪些功能?
- 创建文件-create系统调用
- 删除文件-delete系统调用
- 读文件-read系统调用
- 写文件-write系统调用
- 打开文件-open系统调用
- 关闭文件-close系统调用
文件共享: 使多个用户可以共享使用一个文件
文件保护: 如何保证不同用户对文件有不同的操作权限
4.1.2 文件的逻辑结构
根据各条记录的长度是否相等,可分为定长记录和可变长记录
顺序文件: 文件中的记录一个接一个地顺序排列(逻辑上),记录可以是定长的或可变长的。各个记录在物理上可以顺序存储或链式存储
串结构: 记录之间的顺序与关键字无关
顺序结构: 记录之间的顺序按关键字顺序排列
索引文件: 建立一张索引表以加快文件检索速度,每条记录对应一个索引项,文件中的这些记录在物理上可以离散地存放。
索引顺序文件: 索引文件和顺序文件思想结合,同样也会为文件建立一张索引表,但不同的是,并不是每个记录对应一个索引表项,而是一组记录对应一个索引表项。
4.1.3 文件的物理结构
连续分配: 要求每个文件在磁盘上占有一组连续的块。
读取某个磁盘时,需要移动磁头。访问的两个磁盘块相隔越远,移动磁头所需时间就越长。
结论:连续分配的文件在顺序读/写时速度最快。
——物理上采用连续分配的文件不方便拓展,存储空间利用率低,会产生难以利用的磁盘碎片,可以紧凑来处理碎片,但需耗费大量时间。
链接分配:
索引分配:
索引存储允许文件离散低分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块。索引表存放的磁盘块称为索引块,文件数据存放的磁盘块称为数据块。
文件内部各条记录链式存储:由创建文件的用户自己设计的
文件整体用链接分配:由操作系统决定的
索引文件的索引表:用户自己建立的,映射:关键字—记录的存放逻辑地址
索引分配的索引表:操作系统建立的,映射:逻辑块号—物理块号
4.1.4 文件的基本操作
4.1.5 文件保护
1.口令保护
为文件设置一个“口令”,用户请求访问文件时必须提供口令;
口令一般存放在文件对应的FCB或索引结点中,用户访问文件前需要先输入“口令”,操作系统会将用户提供的口令与FCB存储的口令进行对比,如果正确,则允许该用户访问文件。
优点: 保存口令的空间开销不多,验证口令的时间开销也很小
缺点: 正确的口令存放在系统内部,不够安全。
2.加密保护
使用某个“密码”对文件进行加密,在访问文件时需要提供正确的“密码”才能对文件进行正确的解密。
优点: 保密性强,不需要在系统中存储“密码”
缺点: 编码/译码,或者说加密/解密需要花费一定时间
3.访问控制
在每个文件的FCB(或索引结点)中增加一个访问控制列表(ACL),该表中记录了各个用户可以对该文件执行哪些操作
4.2 文件目录
4.2.1 目录结构
文件控制块: 目录文件中的一条记录就是一个文件控制块(FCB)
FCB的有序集合称为“文件目录”,一个FCB就是一个文件目录项
FCB包含了文件的基本信息,存取控制信息,使用信息。
1.单级目录结构
整个系统只建立一张目录表,每个文件占一个目录项。
单级目录实现了“按名存取”,但是不允许文件重名。因此不适用于多用户操作系统
2.两级目录结构
分为主文件目录和用户文件目录。
主文件目录记录用户名及相应用户文件目录的存放位置;
用户文件目录由该用户的文件FCB组成;
但用户不能对自己的文件进行分类。
3.多级/树形目录结构
用户要范围跟某个文件时要用文件路径名标识文件,文件路径是个字符串。各级目录之间用“/”隔开。
从根目录出发的路径称为绝对路径。
从当前目录出发的“相对路径”。
树形目录结构可以很方便地对文件进行分类,层次结构清晰,也能够更有效地进行文件的管理和保护,但是,树形结构不便于实现文件的共享。因此提出了无环图目录结构
4.无环图目录结构
索引结点:
4.2.2 文件共享
注意:多个用户共享同一个文件,系统中只有一份文件数据,只要某个用户修改了文件数据,其他用户也可以看到文件数据的变化;
1.基于索引结点的共享方式(硬链接)
索引结点: 一种文件目录瘦身策略,由于检索文件时只需要用到文件名,因此可以将除了文件名之外的其他信息放到索引结点中。这样目录项就只需包含文件名,索引结点指针。
2.基于符号链的共享方式(软链接)
4.3 文件系统
4.3.1 文件系统的层次结构
4.3.2文件系统的全局结构
1.物理格式化(低级格式化): 划分扇区,检测坏扇区,并用备用扇区替换坏扇区。
2.逻辑格式化(高级格式化): 完成各分区的文件系统初始化
4.3.3 文件存储空间管理
存储空间的划分: 将物理磁盘划分为一个个文件卷(逻辑卷,逻辑盘)
目录区: 主要存放文件目录信息(FCB),用于磁盘存储空间管理的信息
文件区: 用于存放文件数据
存储空间的初始化: 将各个文件卷划分为目录区,文件区
有些系统支持超大型文件,可支持由多个物理磁盘组成一个文件卷
1.空闲表法
适用于“连续分配方式”
如果分配磁盘块: 与内存管理中的动态分区分配很类似,为一个文件分配连续的存储空间,同样可采用首次适应,最佳适应,最坏适应等算法来决定要为文件分配哪个区间
如何回收磁盘块:与内存管理中的动态分区分配很类似,当回收某个存储区时需要有四种情况:(表项合并)
1.回收区的前后都没有相邻空闲区
2.回收区的前后都是空闲区
3.回收区前面是空闲区
4.回收区后面是空闲区
2.空闲链表法
a.空闲盘块链:空闲盘块中存储着下一个空闲盘块的指针
操作系统保存着链头,链尾指针
如何分配:若某文件申请k个盘块,则从链头开始依次摘下k个盘块分配,并修改空闲链的链头指针
如何回收: 回收的盘块依次挂到链尾,并修改空闲链的链尾指针。
适用于离散分配的物理结构,为文件分配多个盘块时可能要重复多次操作
b.空闲盘区链:以连续的空闲盘块组成一个空闲盘区。空闲盘区中的第一个盘块内记录了盘区的长度,下一个盘区的指针
操作系统保存着链头,链尾指针
如何分配: 若某文件申请k个盘块,则可以采用首次适应,最佳适应等算法,从链头开始检索,依照算法规则找到一个大小符合要求的空闲盘区,分配给文件。若没有合适的连续空闲块,也可以将不同盘区的盘块同时分配给一个文件,注意分配后可能要修改相应的链指针,盘区大小等数据
如何回收: 若回收区和某个空闲盘区相邻,则需要将回收区合并到空闲盘区中。若回收区没有和任何空闲区相邻,将回收区作为单独的一个空闲盘区挂到链尾。
离散分配,连续分配都适用。为一个文件分配多个盘块时效率更高
3.位示图法
4.成组链接法
文件卷的目录区中专门用一个磁盘块作为“超级块”,当系统启动时需要将超级快读入内存。并且要保证内存与外存中的超级快数据一致。
4.3.4 虚拟文件系统
特点:
1.向上层用户进程提供统一标准的系统调用接口,屏蔽底层具体文件系统的实现差异
2.VFS要求下层的文件系统必须实现某些规定的函数功能。一个新的文件系统想要在操作系统被使用,就绪比满足该文件系统VFS的要求
3.每打开一个文件,VFS就在主存新建一个vnode,用统一的数据结构标识文件,无论该文件存储在哪个文件系统。
(vnode只存于主存中,而inode既会被调入主存,也会在外存存储)
文件系统挂载: 即文件系统安装/装载—如何将一个文件系统挂载到操作系统中
- 在VFS中注册新挂载的文件系统。内存中的挂载表包含每个文件系统的相关信息,包括文件系统类型,容量大小等
- 新挂载的文件系统,要向VFS提供一个函数地址列表
- 将新文件系统加到挂载点,也就是将新文件系统挂载在某个父目录下