4.1 文件的基本概念、操作与逻辑结构
文件与文件属性,文件控制块 FCB 与索引结点 inode;文件的创建、删除、打开、关闭、读写,进程打开文件表与系统打开文件表;文件保护;文件的逻辑结构(流式文件,顺序、索引、索引顺序、散列文件)。
文件的基本概念
文件是以硬盘等外存为载体、存储在计算机上的信息集合,例如一份文档、一张图片、一个可执行程序。在用户看来,文件是按名存取的;操作系统中负责管理文件的部分称为文件系统。
从数据组织的角度看,文件由以下层次构成:
- 数据项:文件系统中最低级的数据组织形式,分为基本数据项(如学号)和组合数据项;
- 记录:一组相关数据项的集合,用于描述一个对象在某方面的属性(如一个学生的学号、姓名、成绩);
- 文件:由创建者定义的、具有文件名的一组相关元素的集合,分为有结构文件(由若干记录组成)和无结构文件(字符流)。
文件的常见属性有:名称、类型、创建者、所有者、位置(指向设备和设备上文件的指针)、大小、保护信息(访问控制)、创建/修改/访问时间等。
文件控制块与索引结点
为了实现按名存取,操作系统为每个文件设置一个文件控制块(FCB),存放控制文件所需的各种信息:
- 基本信息:文件名、文件的物理位置、逻辑结构、物理结构等;
- 存取控制信息:文件主、核准用户和一般用户的存取权限;
- 使用信息:文件的建立时间、上次修改时间等。
FCB 的有序集合称为文件目录,一个 FCB 就是一个文件目录项。
查找文件时只需要用到文件名,但检索目录时要把整个 FCB 读入内存。为了减少读盘次数,UNIX 把文件名之外的描述信息单独存放在一个称为索引结点(inode)的数据结构中,目录项只保留文件名和索引结点号:
- 磁盘索引结点:存放在磁盘上,每个文件一个。包含文件主标识符、文件类型、存取权限、文件物理地址(如 UNIX 的 13 个地址项)、文件长度、链接计数、存取时间等。
- 内存索引结点:文件被打开时,把磁盘索引结点复制到内存中,并增加索引结点编号、状态(是否上锁、是否被修改)、访问计数、逻辑设备号、链接指针等。
文件的操作
| 操作 | 操作系统所做的工作 |
|---|---|
| 创建(create) | 为文件分配外存空间;在目录中为新文件建立一个目录项,记录文件名、在外存中的地址及其他属性 |
| 删除(delete) | 检索目录找到该文件的目录项;回收文件占用的存储空间;删除目录项(以及 FCB) |
| 打开(open) | 检索目录找到文件的 FCB,把它复制到内存的打开文件表中,返回表目的编号(文件描述符) |
| 关闭(close) | 删除进程打开文件表中的表项,系统打开文件表的打开计数减 1,减到 0 时删除系统表项(FCB 若被修改则写回外存) |
| 读(read)、写(write) | 通过文件描述符找到文件,按读写指针读出或写入数据,并修改读写指针 |
| 重新定位(seek)、截断(truncate) | 修改读写指针的位置;保留文件属性,把文件长度置 0 并释放其空间 |
打开与关闭
如果每次读写文件都按文件名检索目录,开销会很大。因此在第一次使用文件之前要先执行 open:操作系统根据文件名检索目录,把该文件的属性(包括物理位置)从外存复制到内存的打开文件表中,并把表目的编号——文件描述符——返回给用户。以后用户就通过文件描述符来操作文件,不再需要检索目录。
多个进程可能同时打开同一个文件,因此打开文件表分为两级:
- 进程打开文件表:每个进程一张,记录该进程对文件的使用信息,如读写指针、访问权限,以及指向系统表项的指针;
- 系统打开文件表:整个系统一张,记录与进程无关的信息,如 FCB 的副本、文件在外存中的位置、打开计数(有多少个进程打开了这个文件)。
文件保护
文件保护通过口令保护、加密保护和访问控制等方式实现:
- 口令保护:用户请求访问时必须提供口令。开销小,但口令存放在系统内部,不够安全;
- 加密保护:用密码对文件加密,访问时需要解密。保密性强,但加密和解密要耗费时间;
- 访问控制:根据用户的身份控制访问类型(读、写、执行、添加、删除、列表清单等)。最常用的方法是为每个文件附加一个访问控制列表(ACL),规定每个用户名及其允许的访问类型。为了精简列表,通常把用户分为拥有者、组和其他三类,例如 UNIX 中每类用户用 r、w、x 三位表示权限,共 9 位。
口令和加密都是防止文件被他人存取或窃取,并不能控制用户对文件的访问类型;访问控制则可以。
保护域与访问矩阵
更一般地,操作系统用访问矩阵描述「谁能对什么做什么」:
- 访问权:进程对某个对象(文件、设备等)执行操作的权利,记为(对象名,权集),如(F1,{R, W});
- 保护域:进程对一组对象的访问权的集合,进程只能在指定的域内执行操作;
- 访问矩阵:行代表域,列代表对象,矩阵项 access(i, j) 是域 Dᵢ 中的进程对对象 Oⱼ 拥有的访问权集合。
访问矩阵通常非常稀疏,实际存储时有两种做法:按列存放,为每个对象建立一张访问控制表(ACL),列出各个域对它的访问权;按行存放,为每个域建立一张访问权限表(capability list),列出该域对各个对象的访问权。
文件的逻辑结构
文件的逻辑结构是从用户角度看到的文件组织形式;物理结构(存储结构)是文件在外存上的存储组织形式,见下一节。
无结构文件(流式文件)
文件内的数据就是一串二进制流或字符流,以字节为单位,没有明显的结构,如源程序、可执行文件、库函数。对流式文件的访问通过读写指针指出下一个要访问的字节。
有结构文件(记录式文件)
由若干记录组成,记录可以是定长的或变长的:
| 结构 | 组织方式 | 特点 |
|---|---|---|
| 顺序文件 | 记录一个接一个地顺序排列,可按存入时间(串结构)或按关键字(顺序结构)排序 | 批量处理记录时效率最高;查找、修改、增删单个记录比较困难。定长记录可随机存取 |
| 索引文件 | 为变长记录文件建立一张索引表,每个记录对应一个表项(指向记录的指针和记录长度),索引表本身是定长记录的顺序文件 | 可以按关键字快速随机检索;但索引表要占用额外的存储空间 |
| 索引顺序文件 | 把顺序文件的记录分组,为每组的第一个记录建立一个索引项 | 兼顾顺序文件与索引文件的优点,索引表大大缩小 |
| 直接文件 / 散列文件 | 由记录的关键字经散列函数直接确定记录的物理地址 | 存取速度快;但没有顺序特性,可能产生冲突 |
即时练习
- 1文件系统中,文件访问控制信息存储的合理位置是( )。
- 2在一个文件被用户进程首次打开的过程中,操作系统需做的是( )。
- 3用户在删除某文件的过程中,操作系统不可能执行的操作是( )。
- 4某文件系统中,针对每个文件,用户类别分为 4 类:安全管理员、文件主、文件主的伙伴、其他用户;访问权限分为 5 种:完全控制、执行、修改、读取、写入。若文件控制块中用二进制位串表示文件权限,为表示不同类别用户对一个文件的访问权限,则描述文件权限的位数至少应为( )。
- 5有一个包含 10 000 个记录的顺序文件,若改为索引顺序文件,每组 100 个记录,则查找一个记录的平均比较次数约为( )。
- 6若多个进程同时打开同一个文件,下列信息中每个进程各自独立保存的是( )。
标记完成后,侧栏会显示进度。进度仅保存在本浏览器中。