正在学习操作系统,记录笔记。
参考资料: 《操作系统(精髓与设计原理 第8版) 》
文件管理(File Management)
在大多数一应用中,文件都是核心元素,相对应的就需要文件管理。文件管理的基本目标就是能够快速准确地找到存储在磁盘当中的文件,并将其加载进内存,进行读/写操作。
要实现文件管理可以有两种方式:
实际上所有的操作系统都提供了文件管理系统,它由系统实用程序组成,可以作为具有特权的应用程序来运行。
文件系统属性:
文件系统提供对文件进行操作的接口,典型的有以下六种:
讨论文件时通常要用到如下四个术语:
基本域
和组合域
:文件管理系统是一组系统软件,它为使用文件的用户和应用程序提供服务。
文件管理系统需要满足以下七大需求:
在上述第一条中,用户需求的范围取决于各种应用程序和计算机系统的使用环境。对于交互式的通用系统,最小需求集合如下:
文件系统架构
下图展示了文件系统软件架构:
从底层逐层向上介绍:
文件管理功能:
下图展示了文件管理的要素
下面要介绍五类常见的文件组织结构:
举个例子说明该方法的有效性: 考虑一个包含100万条记录的顺序文件
(1000000 + 1) / 2
)(1000 + 1 ) / 2
)(1000 + 1 ) / 2
)由此可见,平均访问次数从500000降低到了1000,大大降低了查询开销。
(50 + 1) / 2
)(50 + 1) / 2
)(50 + 1) / 2
)索引顺序文件的是基于文件的一个域(关键域)进行处理,但是在现实中,可能需要对我们所关注的一些域(属性)进行记录查询,这时索引顺序文件就失去了作用。为此,引入了一个多索引的结构。
对于变长记录,某些记录并不包含所有的域。向主文件中增加一条新记录时,索引文件必须全部更新。
文件目录解决了这样一个问题:即给定一个文件名,就能够在外存中准确地访问到对应文件。
与任何文件管理系统和文件集合相关联的是文件目录。目录包含文件的相关信息,包括:
目录自身是一个文件,它可被各种文件管理例程访问。
尽管用户和应用程序也可得到目录中的某些信息,但这通常是由系统例程间接提供的。
从用户角度看,目录在用户和应用程序所知道的文件名和文件自身之间提供映射。
每个文件项都包含文件名。
下表列出了文件目录的信息单元 基本信息 信息单元 说明 文件名 由创建者(用户或程序)选择的名字,在同一个目录中必须是唯一的 文件类型 如文本文件、二进制文件、加载模块等 文件组织 供那些支持不同组织的系统使用 地址信息 信息单元 说明 卷 指示存储文件的设备 起始地址 文件在辅存中的起始物理地址(如在磁盘上的柱面、磁道和块号) 使用大小 文件的当前大小,单位为字节、字或块 分配大小 文件的最大尺寸 访问控制信息 信息单元 说明 所有者 控制文件的用户。所有者可授权或拒绝其他用户的访问,并改变给予它们的权限 访问信息 该单元的最简形式包括每个授权用户的用户名和口令 许可的行为 控制读、写、执行及在网上传送 使用信息 信息单元 说明 数据创建 文件首次放到目录中的时间 创建者身份 通常是当前所有者,但不一定必须是当前所有者 最后一次访问的日期 最后一次读记录的日期 最后一次读用户的身份 最后一次进行读的用户 最后一次修改的日期 最后一次修改、插入或删除的日期 最后一次修改者的身份 最后一次进行修改的用户 最后一次备份的日期 最后一次把文件备份到另一个存储介质中的日期 当前使用 当前文件活动的信息,如打开文件的进程、是否被一个进程加锁、文件是否在内存中被修改但未在磁盘中修改等
在介绍目录结构之前,为了理解文件结构的需求,我们可以考虑可能在目录上执行的操作:
(n × m) / 2
(n + m) / 2
路径名(pathname):系统中的任何文件都可以按照从根目录或主目录向下到各个分支,最后直到该文件的路径来定位。这一系列目录名和最后到达的文件名组成了该文件的路径名。
文件名称可以相同,只要路径名不同就可以。
现假设有一个名为“HuaZhu”
的用户目录,其包含子目录:OS → Nachos → code → thread
在thread
目录下有一个名为thread.cc
文件,现在要定位该文件
绝对路径:/HuaZhu/OS/Nachos/code/thread/thread.cc
工作目录(working directory ):(如果要求用户在每次访问文件时都必须拼写完整的绝对路径仍比较复杂)在典型情况下,对交互用户或进程而言,总有一个当前路径与之相关联,通常称为工作目录。文件通常按相对于工作目录的方式访问,即采用相对路径。
现假设我正处于Nachos
目录下,定位thread.cc
文件
相对路径:./code/thread/thread.cc
绝对路径和相对路径的使用没有绝对的优劣,针对不同的使用场景有不同的选择。
在多用户系统中,几乎总是要求允许文件在多个用户间共享,这就会产生两个问题:
下面列出了一些具有代表性的访问权限:
这些权限构成了一个层次结构,层次结构中的每个权限都隐含了前面的那些权限
被指定为某个文件所有者的用户,通常是最初创建该文件的用户。所有者具有前面列出的全部权限,并且可给其他用户授予权限。访问可以提供给不同类型的用户:
如果允许多个用户追加或更新一个文件,操作系统或文件系统必须强加一些规范:
在设计共享访问能力时,必须解决互斥问题和死锁问题。
在辅存中,文件是由许多块组成的。操作系统或文件管理系统负责为文件分配块。这时会引发两个管理问题:
文件分配涉及以下几个问题:
下面考虑三种文件分配的方法,首先下表总结了每种方法的特点:
连续 | 链式 | 索引 | 索引 | |
---|---|---|---|---|
是否预分配 | 需要 | 可能 | 可能 | 可能 |
分区大小是固定还是可变 | 可变 | 固定块 | 固定块 | 可变 |
分区大小 | 大 | 小 | 小 | 中 |
分配频率 | 一次 | 低到高 | 高 | 低 |
分配需要的时间 | 中 | 长 | 短 | 中 |
文件分配表的大小 | 一个表项 | 一个表项 | 大 | 中 |
说明:
说明:
说明:
当前还未分配给任何文件的空间同样需要管理。
要实现文件分配技术,首先需要知道磁盘中的哪些块是可用的,除了上述提到的文件分配表(FAT),还需要磁盘分配表(Disk Allocation Table,DAT)。
位表(Bit tables ):
这种方法使用一个向量,向量的每一位对应于磁盘中的每一块。0表示空闲块,1表示已使用块。
磁盘大小(字节数) / (8 × 文件系统块大小
)
例如:对于一个块大小为512字节的16GB磁盘,位表会占用4MB的空间。链式空闲区(Chained free portions):
使用指向每个空闲区的指针和它们的长度值,可将空闲区链接在一起。
使用锁来防止进程间干扰和空间分配一致性。
请求一个文件分配时:
本篇已完结
先告一段落喽,非常感谢授课老师的指导以及同学们的帮助。
(如有修改或补充欢迎评论)