文件管理
文件的概念和定义
用户进行的输入,输出中,是以文件为基本单位的.
数据项
分类:
- 基本数据项:描述一个对象的某种属性的一个值,时数据中最小逻辑数据单位.
- 组合数据项:由多个基本数据项组成.
记录
一组相关的数据项的集合,用于描述一个对象在某方面的数据.
文件
一组相关的集合.
逻辑上可分为:
- 有结构文件(一组相似记录组成,记录型文件)
- 无结构文件(一个字符流,流式文件)
文件的属性,基本操作以及打开和关闭
文件的属性
- 名称:需唯一.
- 标识符:文件的唯一标签,使用者不可读.
- 类型:为对应的文件系统使用.
- 位置:指向文件的指针.
- 大小:文件当前的大小.
- 保护:保护文件的访问呢控制信息.
- 时间,日期和用户标识:文件创建,上次修改,上次访问的信息.
文件的基本操作
创建
步骤:
- 在文件系统中找到空间.
- 在目录中创建对应的条目.
写文件
输入:
- 待写入的文件名
- 待写入的内容
过程:
- 搜索目录查找文件位置.
- 根据文件的写位置指针,进行写入,并更新写指针.
读文件
输入:
- 待读取的文件名
- 读入文件块的内存位置
过程:
- 搜索目录查找对应的目录项.
- 进行读操作,更新读指针.
文件重定位
根据条件搜索目录,将当前文件位置设为给定值.
删除文件
过程:
- 从目录中查找待删除文件的目录项,使之成为空值.
- 回收该文件所占的空间.
截断文件
保持文件属性不变,删除文件内容.
文件的打开与关闭
操作系统在使用文件前要显式的打开.
打开流程:
- 首次打开:由文件属性从外存中拷贝到内存.
- 由文件名搜索目录,将对应的目录条目复制到打开文件表(open-file table).
- 返回该文件在打开文件表中对应的条目.
一个进程打开文件:
- 系统将进程中的进程打开表中添加相应的条目,指向系统的打开文件表.
- 增加系统的打开文件表中对应条目的文件打开计数器(Open Count).
一个进程关闭文件:
- 减少打开文件表对应条目的文件打开计数器的值,若为0,则回收该文件的内存空间.
- 将打开文件表中相应条目删除,释放文件的文件控制块(File Control Block,FCB).
文件的逻辑结构
分类:
- 无结构文件(流式文件)
- 有结构文件(记录式文件)
无结构文件
- 将数据按顺序组织成记录并保存。
- 已字节(Byte)为单位。
- 只能通过穷举搜索访问。
- 源程序,目标代码等适用于字符流无结构方式。
有结构文件
顺序文件
结构:
- 串结构:记录之间的顺序与关键字无关。(按照存入时间先后顺序排列)
- 顺序结构:文件中的所有记录按关键字顺序排列。
索引文件
定长记录文件
第i个记录的地址为:
(A_i = i*L)
可变长记录文件
顺序查找前i-1个记录,第i个记录的地址为:
(A_{i-1} = L_0+L_1+...+L_{i-2})
可以建立索引表加快索引速度:
- 索引表是定长记录的顺序文件。
- 每条记录对应一个索引项,包括索引号,记录的长度,指向逻辑文件中记录的指针。
- 将关键字作为索引号内容,并按照关键字顺序排序。
索引顺序文件
特点:
-
将顺序文件中的所有记录分成若干组(按照关键字)
-
为顺序文件建立一张索引表,为每个分组中的第一个记录建立一个索引项。
-
每个索引项包含一个关键字和指向该记录的指针。
-
主文件是以关键字和其他数据组成.
-
索引表为每组设置一个记录,使用关键字和指向该记录起始位置的指针.
-
索引表是以关键字递增排序.
-
查找记录时,先通过索引表查找对应的组,再从组中使用顺序查找确定记录.
直接文件或散列文件(Hash File)
通过hash函数将键值转换成哈希值,由哈希值直接决定记录的物理地址.
文件目录结构
文件目录:
- 包含属性,位置,所有权等信息.
- 提供文件名和文件之间的映射.
- 提供控制访问文件的信息.
文件控制块
文件控制块(FCB):
- 存放控制文件所需的各种信息的数据结构.
- FCB的有序集合称为文件目录,一个FCB为一个文件目录项.
包含信息:
- 基本信息(文件名,物理位置,逻辑结构,物理结构)
- 存取控制信息(文件存取权限)
- 使用信息(文件建立,修改时间)
索引结点
将文件名和文件描述信息分开,文件描述信息形成索引结点.
文件目录中的每个目录项是由文件名和指向该文件的索引结点的指针构成.
索引结点组成:
- 文件主标识符
- 文件类型
- 文件存取权限
- 文件物理地址
- 文件长度
- 文件链接计数
- 文件存取时间
目录结构
文件操作:
- 搜索:搜索目录,找出对应的目录项.
- 创建文件:在目录增加一个目录项.
- 删除文件:从目录中删除相应目录项.
- 显示目录:显示用户目录中的文件和属性.
- 修改目录:改变相应的目录项.
单级目录结构
特点:
- 只有一张目录表.
- 每个文件对应一个目录项.
- 查找速度慢,不允许重名,不利于共享.
两级目录结构
- 将文件目录分成主文件目录和用户文件目录.
- 主文件目录(Master File Directory):记录用户名和用户文件目录的存储地址.
- 用户文件目录:记录用户文件的FCB.
- 不能对文件分类.
多级目录结构(树形目录结构)
- 文件路径名是字符串,由根目录出发到目标文件的通路上所有目录名与数据文件名用分隔符链接起来组成的.
- 绝对路径:从根目录出发的路径.
- 相对路径:设置一个当前目录,进程对文件的访问是相对于当前目录的.
- 使用
cd
改变"当前路径". - 查找文件需要按路径名访问中间结点,增加磁盘访问次数,降低速度.
无环图目录结构
- 在树形目录结构上增加指向同一个结点的有向边,形成有向无环图.
- 便于实现文件共享.
- 每个共享结点设置共享计数器,增加该结点的共享链时,计数器加1,每个用户请求删除结点时,计数器减1.计数器为0时才删除结点.
共享文件
基于索引结点的共享方式(硬链接)
特点:
- 索引结点:存放文件的物理地址和文件属性。
- 文件目录只设置文件名和指向相应索引结点的指针。
- 索引结点有一个链接计数(count),表示链接到索引结点的用户数。
- 新增用户共享该文件时,其索引结点的链接计数加1,否则减1。计数为0时删除该文件。
shell代码:
ln 待链接的文件 硬链接名
利用符号链接实现文件共享(软链接)
特点:
- 系统创建LINK类型的新文件,放到新用户的目录中。
- 软链接中只包含被链接文件的路径名。
- 路径名页称为符号链。
- 只有文件的拥有者才有指向索引结点的指针,其他用户只有该文件的路径名。
- 文件拥有者删除文件,其他用户访问失败,则删除符号链接。
- 不会出现文件被删产生悬空指针。
- 问题:文件被替换后,旧的符号链接仍然有效,导致错误。
shell代码:
ln -s 待链接的文件 软链接名
文件保护
文件保护实现:
- 口令保护(避免窃取)
- 加密保护
- 访问控制(*控制访问方式)
访问类型
- 读
- 写
- 执行:转入内存并执行
- 添加:添加信息
- 删除:删除文件
- 列表清单:列出文件名和文件属性
访问控制
- 实现一:根据用户身份进行控制。
- 访问控制列表(Access-Control List,ACL):文件的每个用户名和所允许的访问类型。
- 优点:可以实现复杂的访问方法。
- 缺点:复杂的空间管理。
- 精简的访问列表:
- 拥有者:创建文件的用户
- 组:一组具有类似访问的用户
- 其他:其他用户
- 实现二:建立文件时提供口令。用户请求访问时必须提供口令。
- 优缺点:时间、空间开销小;口令保存在系统内部,不安全。
- 实现三:对文件进行加密。访问文件需要使用密钥。
- 优缺点:保密性好,节省存储空间;编码和译码需要时间。
- 注:多级目录结构还需要保护子目录的文件。
文件系统层次结构
用户调用接口
- 为用户提供与文件和目录有关的调用(新建,打开,读写,关闭,删除...)。
- 一个模块对应一个系统调用。
文件目录系统
- 管理文件目录。
- 活跃文件目录表,读写状态信息表,进程打开文件表,存储设备上的文件目录结构管理。
存取控制验证
- 实现文件保护。
- 将用户的访问要求与FCB指示的访问控制权限进行比较,确认合法性。
逻辑文件系统与文件信息缓冲区
- 将用户要读写的逻辑记录转换成文件逻辑结构内的相应块号。
物理文件系统
- 将逻辑记录对应的块号转换成实际物理地址。
分配模块
- 管理辅存空间。
设备管理程序模块
- 分配设备,分配设备读写用缓冲区,磁盘调度,启动它设备,处理设备中断,释放设备。
文件系统的实现
目录实现
分类:
- 线性列表
- 哈希表
线性列表
- 是一个线性表,每一项由文件名和对应的数据块指针组成。
- 创建文件:搜索目录确定没有同名文件。然后再目录表中国增加一项目录项。
- 删除文件:由文件名搜索目录表,释放对应目录项所指向的地址的空间。
哈希表
- 由文件名通过哈希函数或者哈希值,哈希值为指向线性列表中一项的指针。
- 优点:查找迅速,插入和删除简单。
- 缺点:需要避免冲突,哈希函数依赖于表长。
文件实现
文件分配方式
磁盘空间分配方式:
- 连续分配
- 链接分配
- 索引分配
连续分配
- 每个文件占用一组连续的块。
- 连续分配可以用第一块的磁盘地址和连续块的数量定义。
- 文件的目录条目包括开始块的地址和分配区域的长度。
注:
- 每个文件在文件中有一个目录项。
- 每一项由文件名,起始磁盘地址和连续块数量组成。
- 优点:存取快。缺点:不能动态调整长度。增删容易产生碎片。
链接分配
分类:
- 隐式链接
- 显式链接
隐式链接:
- 每个文件对应一个磁盘块的链表。
- 每个磁盘块都有指向下一个盘块的指针(除最后一块)
- 目录由文件名,文件的第一块的指针和文件的最后一块的指针组成。
- 创建文件时,在目录中新增一项,起始指针指向文件的首块。
- 无法随机访问盘块,只能通过指针顺序访问文件。
- 其中一个指针丢失导致文件的丢失。
显式链接
- 文件分配表(File Allocation Table,FAT):每一项对应一个物理块,每一块存放文件中下一块的序号。
- 文件目录中每一项对应一个文件,每一项由文件名和首块序号组成。
- FAT存放在内存中。
索引分配
- 每个文件的所有的盘块号集中放在一个索引块中。
- 索引块的第i个条目指向文件的第i个块。
- 目录条目包括文件名和索引块地址。
- 要读入文件的第i个块,则由索引的第i个条目的指针确定其物理地址。
多层索引:第一层索引块指向第二层的索引块,第二层索引块再指向文件块。
混合索引:将多种索引分配方式相结合的分配方式。
文件存储空间管理
文件存储器空间的划分与初始化
- 文件数据信息的空间(文件区)和存放文件控制信息FCB的空间(目录区)是分离的。
- 逻辑卷需要初始化,划分好目录区和文件区,建立空闲空间管理表和存放逻辑卷信息的超级块。
文件存储空间管理
1.空闲表法
- 为所有空闲区建立一个空闲盘块表。
- 每个空闲区对应一个空闲表项,包括表项序号,空闲区的第一个盘块号和该区的空闲盘块数。
- 创建文件时,从空闲盘块表中依次查找各表项,直到找到第一个满足大小的空闲区。
- 回收时,需要考虑将两个相邻的空闲区合并。
2.空闲链表法
- 所有空闲盘区组成一个空闲链。
- 可分为:空闲盘块链和空闲盘区链。
- 空闲盘块链:以盘块为单位形成链。创建文件时,从链首开始,取下适当空闲盘块分配。删除文件时,回收盘插入空闲盘块链末尾。
- 空闲盘区链:将所有空闲盘区(若干个盘块)形成链。每个盘区有指示下一个空闲盘区的指针和本盘区的大小。
3.位示图法
- 使用二进制的一位表示磁盘的一个盘块。
- 若该位为0,则对应盘块空闲;若该位为1,则对应盘块已分配。
- 分配:顺序扫描二进制,找到需要的k个连续的0,若为第i行,第j列,则对应的盘块号为:n(i-1)+j (n为每行的位数)。修改对应的位为1。
- 回收:由盘块号转换为行列号:i =(b-1)/(n+1);j=(b-1)%(n+1) (b为盘块号)。修改对应位示图为0。
4.成组链接法
- 将空闲块分成若干组。
- 每组的第一个空闲块记录当前组空闲块总数和下一个空闲块的物理盘块号以及下一组的空闲块物理盘块号。
- 有一个空闲盘块号栈(超级块)保存第一组中空闲块号和空闲盘块号。
- 分配是从前往后分配,回收是从后往前回收。
磁盘的结构
- 磁盘的盘面上的数据存储在一组同心圆中,为磁道。
- 一个盘面有上千个磁道,磁道可划分成几百个扇面。
- 每个扇面固定存储大小(512B)。
- 一个扇面称为一个盘块。
- 扇面从外到内密度增加。
- 所有盘片上相对位置相同的磁道组成柱面。
- 扇面是磁盘可寻址的最小存储单位。
- 磁盘的地址使用:柱面号+盘面号+扇区号(块号) 组成。
磁盘调度算法
磁盘读写时间由寻道时间,延迟时间和传输时间决定。
寻道时间:磁头移动到指定磁道的时间。
(T_s = m*n+s)
m:磁盘速度常数(约0.2ms);n:跨越的磁道数;s:启动时间。
延迟时间:定位到某一个磁道的扇区的时间。
(T_r = 1/(2r))
r:旋转速度。5400r/m的磁盘约为5.55ms。
传输时间:磁盘读写数据的时间。
(T_t=b/(rN))
b:读写的字节数;r:磁盘每秒转数;N:一个磁道的字节数。
总平均存取时间:
(T_a=T_s+T_r+T_t)
常见磁盘调度算法
先来先服务算法(First Come First Service,FCFS)
- 根据进程请求访问磁盘的先后顺序进行调度。
- 当请求是访问簇聚的文件扇区时达到较好的性能。
- 一般接近随机调度。
最短寻找时间优先算法(Short Seek Time First,SSTF)
- 选择处理的磁道是与当前磁头所在磁道距离最近的磁道,使得每次的寻找时间最短。
- 可能产生“饥饿”。
扫描算法(SCAN)/电梯算法
- 在磁头当前移动方向上选择当前磁头所在磁道距离最近的请求作为下一次服务的对象。
- 访问局部性不佳。
循环扫描算法(Circular SCAN,C-SCAN)
- 在扫描算法的基础上规定磁头单向移动提供服务,回返时直接移动到起始端而不服务任何请求。
- 即:只在同一方向上进行扫描,反方向只移动,不扫描。
减少延迟时间:
- 对扇面进行交替编号,不同盘面错位命名。
磁盘的管理
磁盘的初始化
低级格式化(物理分区):将磁盘分成扇区。
每个扇区的数据结构:头,数据区域,尾部组成。
步骤:
- 分成多个柱面组成的分区。
- 对物理分区进行逻辑格式化,将文件系统数据结构存储到磁盘上。
引导块
自举程序:
初始化CPU,寄存器,设备控制器和内存;然后启动操作系统。
- 找到磁盘上的操作系统内核。
- 装入内存。
- 转到起始地址。
- 开始操作系统的运行。
坏块
- 电子集成驱动器(IDE):执行逻辑格式化时扫描磁盘检查坏扇区,在FAT表上注明。
- 小型计算机系统接口(SCSI):控制器维护一个磁盘坏块链表。
总结
磁盘结构
引导控制块(Boot Control Block):
系统从该分区引导操作系统所需的信息。
- UFS称为引导块(Boot Block),NTFS称为分区引导扇区(Partition Boot Sector)。
分区控制块(Partition Control Block):包括分区详细信息。
- 分区的块数
- 块的大小
- 空闲块的数量和指针
- 空闲FCB的数量和指针。
- UPS称为超级块(Superblock),NTFS称为主控文件表(Master File Table)。
内存结构
- 内存分区表:所有安装分区的信息。
- 内存目录结构:最近访问的目录信息。包括指向分区表的指针。
- 系统打开文件表:每个打开文件的FCB。
- 进程打开文件表:指向系统打开文件表的条目。
混合索引分配的实现
索引结点设置13个地址项,地址项分为直接地址和间接地址。
直接地址
- 设置10个直接地址项,适当大小的文件可以由直接地址读出所有盘块号。
一次间接地址
- 一级索引分配方案。
多次间接地址
- 地址项提供二次间接地址。
- 实质为两级索引分配方式。