初识文件管理
- 文件–就是一组有意义的信息/数据集合
文件的属性
文件名:由创建文件的用户决定文件名,主要是为了方便用户找到文件,**同一目录下不允许有重名文件**
标识符:一个系统内的各个文件标识符唯一,对用户来说毫无可读性,因此标识符只是操作系统用于去分各个文件的一种内部名称
类型:指明文件的类型
位置:文件存放的路径(让用户使用)、在外村中的地址(操作系统使用、对用户不可见)
大小:指明文件大小
保护信息:对文件进行保护的访问控制信息
创建时间、上次修改时间、文件所有者信息等
文件内部数据的组织形式
操作系统向上提供的基本功能
创建文件(create系统调用)
删除文件(delete系统调用)
读文件(read系统调用)
写文件(write系统调用)
打开文件(open系统调用)
关闭文件(close系统调用)
可用几个基本操作完成更复杂的操作,如复制文件等
文件的逻辑结构
- 逻辑结构:指在用户看来,文件内部的数据应该是如何组织起来的
- 物理结构:指在操作系统卡莱,文件的数据时如何存放在外存中的
类似于数据结构中的“逻辑结构”和“物理结构”
如“线性表”就是一种逻辑结构,在用户角度看来,线性表就是一组有先后关系的元素序列
“线性表”这种逻辑结构可以用不同的物理结构实现,如顺序表/链表。
-
无结构文件
文件内部的数据就是一系列二进制流或字符流组成。又称“流式文件”。没有明显的结构特性,如Windows操作系统中的.txt文件 -
有结构文件
由一组相似的记录组成,又称“记录式文件”。每条记录由若干个数据项组成。如数据库表文件。一般来说,每条记录有一个数据项可作为关键字(作为识别不同记录的ID)。根据各条记录的长度(占用的存储空间)是否相等,又可分为定长记录和可变长记录两种。
有结构文件的逻辑结构分为
-
顺序文件
- 文件中的记录一个接一个的顺序排列(逻辑上),记录可以使定长的或可变长的。 - 各个记录在物理上可以顺序存储或链式存储 - 顺序文件又可分为: 串结构:记录之间的额顺序与关键字无关,通常按照记录存入的时间决定记录的顺序 顺序结构:记录之间的顺序按关键字顺序排列
- 顺序文件的随机查找
- 顺序文件的随机查找
-
索引文件
- 建立一张索引表以加快文件检索速度。每条记录对应一个索引项
- 主要用于对信息处理的及时性要求比较高的场合
-
索引顺序文件
- 索引顺序文件是索引文件和顺序文件思想的结合。索引顺序文件中,同样会为文件建立一张索引表,但不同的是:并不是每个记录对应一个索引表项,而是一组记录对应一个索引表项。
- 例如:学生记录按照学生姓名的开头字母进行分组。每个分组就是一个顺序文件,分组内的记录不需要按关键字排序
文件目录
文件控制块
目录文件中的一条记录就是一个“文件控制块(FCB)”
FCB的有序集合称为“文件目录”,一个FCB就是一个文件目录项,FCB中包含了文件的基本信息
目录结构
单级目录结构
整个系统中只建立一张目录表,没饿文件占一个目录表
单级目录实现了“按名存取”,但是不允许文件重名
两级目录结构:分为主文件目录(MFD)和用户级目录(UFD)
1.主文件目录记录用户名及相应用户文件目录的存放位置
2.用户文件目录由该用户的文件FCB组成
3.允许不同用户名的文件重名
多级目录结构(树形目录结构)
用户要访问某个文件时要用文件路径名标识文件,文件路径名是个字符串。
各级目录之间用“/”隔开。从根目录出发的路径称为**绝对路径**,可以使用从当前目录出发的“相对路径”。
无环图目录结构
可以用不同的文件名指向同一个文件,甚至可以指向同一个目录
需要为每个共享结点设置一个共享计数器,用于记录此时有多少个地方在共享该结点,计数器为0时才真正删除该结点
注意:共享文件不同于复制文件。在共享文件中,由于用户指向的是同一个文件
因此只要其中一个用户修改了文件数据,那么所有用户都可以看到文件数据的变化
索引结点
- 除了文件名之外的所有信息都放到索引节点中,每个文件对应一个索引结点
- 目录项中只包含文件名、索引结点指针,因此每个目录项的长度大幅减小
- 由于目录项长度减小,因此每个磁盘块可以存放更多个目录项,因此检索文件时磁盘I/O的次数就减少了很多
文件的物理结构(文件分配方式)
文件块、磁盘块
- 类似于内存分页,磁盘中的存储单元也会被分为一个个“块/磁盘块/物理块”。很多操作系统中,磁盘块的大小与内存块、页面的大小相同
- 在内存管理中,进程的逻辑地址空间被分为一个个页面
同样的,在外存管理中,为了方便对文件数据的管理,文件的逻辑地址空间也被分为了一个一个的文件“块”。
于是文件的逻辑地址也可以表示为**(逻辑块号,块内地址)**的形式,用户通过逻辑地址来操作文件,操作系统要负责实现从逻辑地址到物理地址的映射
操作系统为文件分配存储空间都是以块为单位的
连续分配
-
连续分配方式要求每个文件在磁盘上占有一组连续的块
-
逻辑地址到物理地址的映射
(逻辑块号,块内地址)->(物理块号,块内地址) 只需要转换块号就行,块内地址保持不变 用户给出要访问的逻辑块号,操作系统找到改文件对应的目录项(FCB)... 物理块号=起始块号+逻辑块号 还需检查用户提供的逻辑块号是否合法(逻辑块号≥长度就不合法)
故连续分配方式支持顺序访问和直接访问(即随机访问)
- 读取某个磁盘时,需要移动磁头。访问的两个磁盘块相隔越远,移动磁头所需时间就越长。故连续分配的文件在顺序读/写时速度最快
- 物理上采用连续分配的文件不方便拓展,存储空间利用率低,会产生难以利用的磁盘碎片
链接分配
链接分配采取离散分配的方式,可以为文件分配离散的磁盘块。分为隐式链接和显示链接两种。
隐式链接
文件名 | … | 起始块号 | 结束块号 |
---|---|---|---|
aaaa | … | 9 | 16 |
- 目录中记录了文件存放的起始块号和结束块号
除了文件的最后一个磁盘块之外,每个磁盘块中都会保存指向下一个潘快的指针,这些指针对用户是透明的 - 逻辑地址->物理地址
用户给出要访问的逻辑块号,操作系统找到改文件对应的目录项(FCB)…
从目录项中找到起始块号(即0块号),将0号逻辑块读入内存,由此知道1号逻辑块存放的物理块号…以此类推 - 故采用链式地方时的文件,只支持顺序访问,不支持随机访问,查找效率低。另外,指向下一个盘块的指针也需要耗费少量的存储空间。
- 采用隐式链接的链接分配方式,很方便文件拓展。另外,所有的空闲磁盘块都可以被利用,不会有碎片问题,外存利用率高。
显示链接
把用于链接文件各物理块的指针显示的存放在一张表中。即文件分配表(FAT,File Allocation Table)
- 目录中只需记录文件的起始块号
文件名 | … | 起始块号 |
---|---|---|
aaa | … | 2 |
bbb | … | 4 |
- FAT(文件分配表)
物理块号 | 下一块 |
---|---|
0 | 1 |
2 | -1 |
3 | 5 |
4 | -1 |
5 | 23 |
… | 0 |
22 | |
23 | 3 |
假设某个新创建文件“aaa”依次存放在磁盘块2->5->0->1
假设某个新创建文件“bbb”依次存放在磁盘块4->23->3
- 一个磁盘仅设置一张FAT。开机时,将FAT读入内存,并常驻内存
- 逻辑地址->物理地址
用户给出要访问的逻辑块号,操作系统找到改文件对应的目录项(FCB)…
从目录项中找到起始块号,若i>0,则查询内存中的文件分配表FAT,往后找到i好逻辑块对应的物理块号。逻辑块号转换成物理块号的过程不需要读磁盘操作
结论:采用显示链接方式的文件,支持顺序访问,也支持随机访问,由于块号转换过程不需要访问磁盘,因此相比于隐式链接来说,访问速度快很多,也不会产生外部碎片,也可以很方便的对文件进行拓展
索引分配
索引分配允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块(索引表功能类似于内存管理中的页表)。索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为数据块。
- 目录中需要记录文件的索引块是几号磁盘块
文件名 | … | 索引块 |
---|---|---|
aaa | … | 7 |
bbb | … | 23 |
假设某个新创建的文件“aaa”的数据依次存放在磁盘块2->5->13->9。
7号磁盘块作为“aaa”的索引块,索引块中保存了索引表的内容
- 文件aaa的索引表
逻辑块号 | 物理块号 |
---|---|
0 | 2 |
1 | 5 |
2 | 13 |
3 | 9 |
- 注:在显示链接的链式分配方式中,文件分配表FAT是一个磁盘对应一张。而索引分配方式中,索引表是一个文件对应一张。
- 索引分配方式可以支持随机访问。文件拓展也很容易实现,只需要给文件分配一个空闲块,并增加一个索引表项即可。
物理结构总结
How? | 目录项内容 | 优点 | 缺点 | |
---|---|---|---|---|
顺序分配 | 为文件分配的必须是连续的磁盘块 | 起始块号、文件长度 | 顺序存取速度快,支持顺序访问 | 会产生碎片,不利于文件拓展 |
隐式链接 | 出文件的最后一个磁盘块之外,每个盘块中都存有指向下一个盘块的指针 | 起始块号、结束块号 | 可解决碎片问题,外存利用率高,文件拓展实现方便 | 只能顺序访问,不能随机访问 |
显示链接 | 建立一张文件分配表(FAT),显示记录盘块的先后关系(开机后FAT常驻内存) | 起始块号 | 除了拥有隐式链接的优点之外,还可通过查询内存中的FAT实现随机访问 | FAT需要占用一定的存储空间 |
索引分配 | 为文件数据块建立索引表,若文件太大,可采用链接方案、多层索引、混合索引 | 链接方案记录的是第一个索引块的块号,多层/混合索引记录的是顶级索引号的块号 | 支持随机访问,易于实现稳健的拓展 | 索引表需占用一定的存储空间。访问数据块前需要先读入索引块。若采用链接方案,查找索引块时可能需要很多次读磁盘操作。 |