文件及目录的基本操作
一个文件的属性
- 文件名:同一个目录下不允许有重命名文件
- 标识符:一个系统内的各文件标识符唯一
- 类型
- 位置
- 大小
- 创建时间、上次修改时间
- 文件所有者信息
- 保护信息
文件基本概念
无结构文件:由一些二进制或字符流组成,又称“流式文件”。
有结构文件:如数据库表,由一组相似的记录组成,又称“记录式文件”
记录是一组相关数据项的集合。
数据项是文件系统中最基本的数据单位。
Q:文件之间应该如何组织?
用户可以创建一层一层的目录,各层目录中存放相应的文件,系统中的各个文件通过一层一层的目录合理有序的组织起来。目录也是一种特殊的有结构文件,由记录组成。
文件共享:使多个用户可以共享一个文件
文件保护:保证不同用户对文件有不同的操作权限
Q:文件应如何存放在外存?
-
操作系统以块为单位为文件分配存储空间,因此即使一个文件大小只有10B依然需要占用1kb的磁盘块。外存中的数据读入内存时同样以块为单位。
-
文件的逻辑地址分为(逻辑块号,块内地址),操作系统需要将逻辑地址转换为外存的物理地址。
-
外存也是一个个由存储单元组成,每个存储单元对应一个物理地址
-
文件数据放在连续的几个磁盘块中,文件数据放在离散的磁盘块中并记录各个磁盘块之间的先后顺序。
文件的逻辑和物理
逻辑结构:在用户看来文件内部的数据应该如何组织的。
物理结构:在OS看来文件内部的数据如何存放在外村中。
- 无结构文件
- 一系列二进制流或字符流组成,称为流式文件
- 有结构文件:由一组相似的记录组成,每条记录又若干个数据项组成,每条记录有一个数据项作为关键字。
- 顺序文件:文件中的记录一个接一个顺序排列(逻辑上),记录可以是定长或可变,各个记录在物理上可以顺序存储或链式存储。
- 链式:无论定长或可变,都无法实现随机读取,每次只能从第一个记录开始依次查找。
- 顺序
- 可变:无法实现随机读取,每次只能从第一个记录开始依次查找。
- 定长
- 可随机存取,记录长度为L,则第i个记录存放的相对位置 i*L
- 采用串结构,无法快速找到某关键字对应的记录
- 若采用顺序结构可以快速找到某关键字对应的记录(比如折半查找)
- 索引文件
- 索引顺序文件
- 顺序文件:文件中的记录一个接一个顺序排列(逻辑上),记录可以是定长或可变,各个记录在物理上可以顺序存储或链式存储。
索引文件
- 索引表本身是定长记录的顺序文件,可以快速找到第i个记录对应索引项。
- 主要用于对信息处理的及时性要求比较高的场合,可以用不同的数据项建立多个索引表。
- 一组记录对应一个索引表项。
文件目录
文件控制块
- 目录文件
- 目录本身是一种结构文件,由一条条记录组成,每条记录对应一个在该放在该目录下的文件。
PCB是进程存在的唯一标志。
FCB的有序集合称为文件目录,一个FCB就是一个文件目录项。
FCB实现了文件名和文件之间的映射。用户程序可以实现“按名存取”。
文件
- 文件名放在目录表
- 属性attr放在索引节点inode
- 文件数据data放在磁盘block中
单级目录结构:整个文件系统只建立一张目录表。
-
优点:
- 实现简单
- 能实现按名存取
-
缺点:
- 查找速度慢
- 不允许重名
- 不便于实现文件共享
多级目录结构:将文件目录分为主文件目录和用户文件目录。
- 优点:
- 提高了目录检索速度。
- 层次清楚
- 允许文件重名。
- 不同用户可以使用不同的文件名来访问系统中的同一个共享文件。
- 缺点:
- 缺乏灵活性。
- 无法很好满足文件多的用户的需要。
无环图目录结构
- 可以用不同的文件名指向同一个文件。
- 需要为每个共享结点设置一个共享计数器,当共享计数器减为0才删除结点。
- 共享文件不同于复制文件,在共享文件中由于各用户指向同一个文件。
索引结点FCB的改进
索引结点:包含除了文件名之外的文件描述信息。
存放在外存中的索引结点称为”磁盘索引结点“。
当索引结点放入内存后称为”内存索引结点“。
文件共享:基于索引结点的共享方式(硬链接)
- count>0说明由别的用户要使用文件
- count =0时系统负责删除文件
文件共享:基于符号链的共享方式(软链接)
文件的基本操作
操作系统向上提供哪些功能?
-
创建文件
- 在外存中找到文件所需空间
- 根据文件存放路径找到对应的目录文件,在目录中创建该文件对应的目录项。
-
删除文件
- 从目录中找到文件名对应的目录项,回收文件占用的磁盘块。
- 从目录表中删除文件对应的目录项
-
打开文件
- 从目录中找到文件名对应的目录项
- 将目录项复制到内存中的”打开文件表“,用户使用”打开文件表“的编号指明要操作的文件。
-
写入文件
- 记录此时有多少个进程打开此文件
- 如果声明是只读则不能对文件进行写写入操作
- 读写指针记录操作系统对文件操作的位置
-
关闭文件
- 记录此时有多少个进程打开此文件
-
读取文件
- read调用