一、文件与文件系统
1.1 文件是什么
- 文件是对磁盘的抽象
- 所谓文件是指一组带标识(标识即为文件名)的、在逻辑上有完整意义的信息项的序列。
- 信息项:构成文件内容的基本单位(单个字节,或多个字节),各信息项之间具有顺序关系
- 文件内容的意义:由文件建立者和使用者解释
1.2 如何设计一个文件系统
这里先看文件管理的需求:
- 从用户角度
文件系统是如何呈现在用户面前:
* 一个文件的组织
- 如何命名
- 如何保护文件
- 可以实施的操作
- 从操作系统角度:怎样组织、管理文件
* 文件的描述、分类
- 文件目录的实现
- 存储空间的管理
- 文件的物理地址
- 磁盘实际运作方式(与设备管理的接口)
- 文件系统的性能
1.3 文件系统
- 操作系统中统一管理信息资源的一种软件,管理文件的存储、检索、更新,提供安全可靠的共享和保护手段,并且方便用户使用
- 文件系统要完成哪些任务
1、统一管理磁盘空间,实施磁盘空间的分配与回收
2、实现文件的按名存取:名字空间–映射–>磁盘空间
3、实现文件信息的共享,并提供文件的保护、保密手段
4、向用户提供一个方便使用、易于维护的接口,并向用户提供有关统计信息
5、提高文件系统的性能
6、提供与IO系统的统一接口
1.4 文件的分类
按文件性质和用途分类(UNIX),一般分为普通文件、目录文件、特殊文件(设备文件)、管道文件、套接字
- 普通文件
即用户自己建立的文件,包含了用户的信息,一般为ASCII或二进制文件 - 目录文件
管理文件系统的系统文件 - 特殊文件
字符设备文件:和输入输出有关,用户模仿串行I/O设备,例如终端、打印机、网卡等。
块设备文件:磁盘
1.5 文件的逻辑结构
- 无结构的流式文件
对文件内信息不再划分单位,它是依次的一串字符流构成的文件。 - 有结构的记录式文件
用户把文件内的信息按逻辑上独立的含义划分信息单位,每个单位称为一个逻辑记录(简称记录)。 - **说明:**这里是从用户角度看文件,由用户的访问方式确定,这里给出了三种逻辑结构,还可以组织成堆、顺序、索引、索引顺序、散列等结构。第一种是以字节为单位的流式结构,第二种是一种记录式文件结构,最后一种是树形结构。
1.6 典型的文件逻辑结构与文件存取
流式文件:构成文件的基本单位是字符
文件是有逻辑意义、无结构的一串字符的集合
记录式文件:文件由若干记录组成,可以按记录进行读写、查找等操作。每条记录有其内部结构
文件的逻辑结构与文件存取之间的关系
顺序存取(访问)
随机存取:提供读写位置(当前位置)。如UNIX的seek操作。
1.7 文件的存储介质
1.7.1 存储介质与物理块
- 典型的存储介质
磁盘(包括固态盘SSD)、磁带、光盘、U盘、… - 物理块(块
block、簇cluster)
信息存储、传输、分配的独立单位
存储设备划分为大小相等的物理块,统一编号
1.7.2 典型的磁盘结构
普通磁盘构造及工作原理
- 磁道(Track)
- 柱面(Cylinder)
- 扇区(Sector)
- 磁头(Heads)
- 盘片(Platters)
- 每个碟片都有两面,因此也会相对应每碟片有2个磁头。
- A:磁道
- B:扇面
- C:扇区
- D:簇(扇区组)
在硬盘上定位某一数据记录位置—C扇区,使用了三维定位。
1.7.3 磁盘访问
磁盘工作时盘片在高速旋转,机械手臂驱动磁头沿着径向移动,在磁道上读取所需要的数据。
一次访问磁盘的请求:读写、磁盘地址(设备号、柱面号、磁头号、扇区号),内存地址(源/目)。完成过程由三个动作组成:
- 寻道(时间):磁头移动定位到指定磁道
- 旋转延迟(时间):等待指定扇区从磁头下旋转经过
- 数据传输(时间):数据在磁盘与内存之间的实际传输
1.7.4 磁盘空间管理
位图
用一串二进制位反映磁盘空间中分配使用情况,每个物理块对应一位,分配的物理块为0,否则为1。
申请物理块时,可以在位示图中查找1的位,返回对应的物理块号
归还时,将对应位转置1。
空闲块表
将所有空闲块记录在一个表中,即空闲块表
主要两项内容:起始块号,块数
空闲块链表
把所有空闲块链成一个表
扩展:成组链接法
磁盘地址与块号的转换
成组链接法设计思想
**说明:**左上角的是一个专用块,表示一些有用信息,而右边大括号中的都是空闲块。所有空闲块我们分成了若干组,典型的是100块是一组,最后一个空闲组只有99个空闲块。专用块中有20个空闲块号,分别对应右边的空闲块组。每次要使用文件的时候,就从专用块中挑选空闲块,一般从801开始分配。820中的第一块实际上是记录了后面一块800中空闲块的空闲块号和总的空块的数量,后面的以此类推。最后一个组中的0则表示最后一组的标志。
成组链接法:分配算法
分配一个空闲块
查L单元(空闲块数)
- 当
空闲块数 > 1 , i = L + 空闲块数;
从i单元得到一个空闲块号;
把该块分配给申请者; - 空闲块数减1
- 当
空闲块数 = 1, 取出L + 1单元内容(一组的第一块号或0);
其值 = 0无空闲块,申请者等待
其值不等于零,把该块内容复制到专用块
该块分配给申请者;
把专用块内容读到内存L 开始的区域。
成组链表法:回收算法
归还一块
查L单元的空闲块数
- 当
空闲块数 < 100空闲块数加一;j := L + 空闲块数
归还块号填入j单元 - 当
空闲块数 = 100, 则把内存中登记的信息写入归还块中;
把归还块号填入L+ 1单元;
将L单元置成1。






