【文件实现】
概述
在文件系统高层设计时,主要问题是如何将逻辑记录构成一个逻辑文件,而在文件系统低层设计时,主要问题是如何将一个文件存储在外存上,可见,所有的文件都存在以下两种形式的结构:
- 文件的逻辑结构:从用户出发所看到的文件形式,独立于文件的物理特性
- 文件的物理结构:系统将文件存储在外存上所形成的一种存储组织结构,用户不可见
文件实现,是指文件数据从逻辑地址到物理地址的映射,并对物理设备上的文件空间进行组织、管理,其要解决两个问题:
- 文件分配方式:对磁盘上的非空闲块进行管理,针对文件的逻辑地址
- 文件存储空间管理:对磁盘上的空闲块进行管理,针对文件的物理地址
文件分配方式
磁盘块,是指磁盘中存储单元被划分为一个个的物理块,每块的大小与内存块、页面大小相同,其是内存与磁盘间数据交换的基本单位
对于文件的逻辑地址来说,其结构如下:
对于文件的物理地址来说,其结构如下:
文件分配方式,就是在用户使用逻辑地址操作文件时,OS 负责实现文件从逻辑地址到物理地址的映射
文件存储空间管理
在物理存储设备中,物理磁盘被划分为一个个文件卷
在初始化后,文件卷会被划分为存放 FCB、存储空间管理信息的目录区和存储文件数据的文件区
文件存储空间管理,就是将物理存储设备划分为诸多大小相同的物理块,以块为单位进行管理,因此其又被称为文件盘块分配
【文件的基本操作】
概述
用户可通过文件系统提供的系统调用实施对文件的操作,最基本的操作有:
- 创建文件:分配必要的外存空间,并在文件目录中创立一个目录项,记录新文件的文件名、外存地址等属性
- 删除文件:在外存找到要删除的目录项,使其成为空项,然后回收该文件所占用的存储空间
- 打开文件:根据文件存放目录,将文件打开,并指示文件操作类型是读操作还是写操作
- 关闭文件:将打开的文件关闭,并将其在打开文件表项中删除,同时回收该文件的所有资源
创建文件
创建文件使用 create
系统调用,需要提供所需外存空间大小、文件存放路径、文件名这三个参数
具体流程如下:
- 在外存中找到文件所需空间
- 根据存放路径找到目录文件
- 在目录文件中创建对应目录项
删除文件
删除文件使用 delete
系统调用,需要提供文件存放路径、文件名这两个参数
具体流程如下:
- 根据存放路径找到相应目录文件
- 在目录文件中找到相应目录项
- 根据目录项信息,回收文件占用磁盘块
- 从目录表中删除对应目录项
打开文件
打开文件使用 open
系统调用,需要提供文件存放路径、文件名、对文件操作类型这三个参数
具体流程如下:
- 根据存放路径找到相应目录文件
- 在目录文件中找到相应目录项
- 检查该用户是否有对文件操作的相应权限
- 将目录项复制到内存打开的文件表中
- 将对应表的目的编号返回用户
- 用户通过编号来指明要操作的文件
对于打开文件表来说,其有两种:
- 系统的打开文件表:记录系统的打开文件,存在打开计数器,记录该文件此时已被几个进程打开
- 进程的打开文件表:记录进程的打开文件
- 系统表索引项:记录在系统表中的编号
- 读写指针项:记录该进程对文件读写操作进行到的位置
- 访问权限项:表目该进程对文件所具有的权限
关闭文件
关闭文件使用 close
系统调用,需要提供文件存放路径、文件名这两个参数
具体流程如下:
- 将进程打开文件表相应表项删除
- 回收分配给该文件的资源
- 系统的打开文件表的打开计数器 $-1$
- 当打开计数器值为 $0$ 时,删除该表项