操作系统文件管理

  • Post author:
  • Post category:其他




文件管理



文件的逻辑结构



无结构文件

一系列二进制流或字符流组成



有结构文件

由一组相似的记录组成

  1. 顺序文件

    文件中的记录一个接一个排序,可以是定长也可以是可变长。各个记录在物理上可以是顺序储存或链式储存

    分为串结构和顺序结构,串结构记录之间的顺序和关键字无关,顺序有关
  2. 索引文件

    建立索引表指向逻辑文件。索引表固定长度,定长顺序文件,可以随机访问
  3. 索引顺序文件

    索引表里面的项指向顺序文件的第一个

    顺序文件和索引文件的结合



文件目录



文件控制块

目录文件记录了目录下所有文件的属性,包括文件名、类型、物理地址等。目录文件中的每一条记录就是一个文件控制块FCB

FCB实现了文件名和文件之间的映射。


操作


搜索

创建

删除

显示目录

修改目录



目录结构

  1. 单级目录结构

    系统中只有一张目录表,不允许重名
  2. 两级目录结构

    分主文件目录和用户文件目录

    不同用户的文件运行重名
  3. 多级目录结构

    结构像一个树,目录是内节点,非目录文件是子节点

    相对路径和绝对路径、
  4. 无环图目录结构

    可以用不同的文件名指向同一个文件

    实现共享文件。



索引结点

为了减少目录文件的大小,PCB里面只储存文件名和一个索引结点的指针。索引结点里面储存了除文件名外其他的信息



文件的物理结构

文件的逻辑地址空间被分成了一个一个文件的块



连续分配

每个文件在磁盘上占据一组连续的块

文件目录中记录文件名和起始块号(其实就是地址)

优点:

  1. 支持顺序访问和随机访问
  2. 连续分配的文件在顺序读写时速度最快

缺点:

  1. 文件拓展不方便
  2. 存储空间利用率低,容易产生碎片



链接分配

采取离散分配的方式,可以为文件分配离散的磁盘块。分为显式链接和隐式链接



隐式链接

目录文件中记录了起始和结束块号。每个目录项中保存了指向下一个块的指针。

只支持顺序访问,不支持随机访问

文件拓展方便



显式链接

目录文件中记录文件名和起始块号等信息。用一个文件分配表FAT记录所有的块的下一个块。每个磁盘只需要一张FAT

方便拓展,不会产生碎片,支持随机访问,访问效率高。

需要一定的存储空间来存放FAT



索引分配

允许文件离散地分配在磁盘块中,系统会为每个文件创建一张索引表,索引表中记录了文件的各个逻辑块对应的物理块。索引表存放的磁盘叫索引块,文件数据存放的磁盘块叫数据块。目录文件里面储存了文件名和索引块的地址。

支持随机访问,容易拓展

如果索引表太大,可以用隐式链接等方法链接多个索引表(超长情况下搜索花费也很大)或者多层索引(这个比较快)或者混合索引(一个文件索引表中既包含直接地址索引,也包含一级间接索引和多级间接索引)



文件储存空间管理



存储空间划分与初始化

磁盘分区:将物理磁盘划分为一个个文件卷

每一个文件卷分为目录区和文件区



存储空间管理

  1. 空闲表法:将所有连续存储空间的第一个磁盘块号储存起来,并记录该储存空间有多少个磁盘块。磁盘块分配也是由首次适应、最近适应等算法进行分配。回收磁盘块时需要更新空闲盘块表的数据。
  2. 空闲链表法

    1. 空闲盘块链:操作系统储存链头和链尾的磁盘块的指针,每个磁盘块有一个指针指向下一个磁盘块。分配空间时按照链表的顺序一个个磁盘块分配
    2. 空闲盘区链:操作系统储存链头和链尾指针,每个盘区头部有指针指向下一个盘区的头部。分配跟空闲表法一样
  3. 位示图法

    每个二进制位对应一个盘快。0表示空闲,1表示已分配
  4. 成组链接法

    文件卷的目录区中储存一个超级块,当系统启动时需要将超级块读入内存,并且保证内存与外存的超级块数据一致。超级快储存了下一组空闲盘块数以及每一个空闲块号。每一个盘快号又储存下一个空闲盘块。



文件的基础操作

  1. 创建文件

    调用create系统调用

    传入参数:所需外存大小,路径,文件名

    create系统调用时,操作系统在外存中找到文件所需要的空间,根据文件存放路径找到对应的目录文件,在该目录文件下创建该文件的目录项
  2. 删除文件

    调用delete系统调用

    传入参数:路径,文件名

    delete系统调用时,操作系统根据路径找到目录文件,从目录中找到对应的目录项,根据目录项记录的存放位置,文件大小等回收磁盘块,再从目录表中删除对应文件的目录项
  3. 打开文件

    调用open系统调用

    传入参数:路径,文件名,对应的操作类型

    open系统调用时,操作系统按照路径找到目录文件从中找到目录项,检测用户是否有权限,如果有就将目录项负责到内存中的打开文件表中,将对应表目的编号返回给用户,之后用户使用打开文件表的编号来指明要求操作的文件
  4. 读文件

    调用read系统调用

    read系统调用需要指明打开的文件以及读入的数据和内存中的存放位置。
  5. 写文件

    write系统调用

    跟读文件差不多



文件共享



基于索引结点(硬连接)

索引结点(前面文件目录里面有介绍)中设置一个count,表示链接到本结点上的用户目录项数,当用户删除该数据时只删除相应用户里面的信息并且使count–。若count==0才将索引结点删掉



基于符号链(软连接)

跟索引结点有关联,创建的索引结点指针指向一个索引结点,索引结点指向的文件里面记录了另外一个文件的路径,根据路径再找到相应的文件。就不直接指向数据,而是间接指向一个指向数据的文件。类似快捷方式



文件保护



口令保护

设置口令,保存和验证的开销都很小,但口令存储在文件内部,不够安全



密码保护

密码加密(不是日常理解的密码,上面的口令更接近常用的密码)

将原始数据按照一定的算法跟密码进行计算,使得保存的数据跟源数据不一样。读取时输入密码再按照算法跟加密后的数据进行运算得到源数据

保密性强,但编码译码需要一定的时间



访问控制

每个文件的FCB中增加一个文件控制列表,记录各个用户对本文件的权限



磁盘的结构



磁盘磁道扇区

磁盘:由磁性物质组成,用来记录二进制数据

磁道:磁盘被划分成一个个同心弧(圈),每个轨道就是一个磁道

扇区:磁道被划分为一个个弧,每个扇区就是一个数据块。越靠近圆心的扇区数据就越密集



读写数据

将磁头移动到相应的磁道,磁盘旋转移动到相应的扇区



磁盘调度算法

调度:将磁头移动到相应的磁盘块进行数据处理操作,对于多个请求,设计磁头移动的顺序为调度。



先来先服务FCFS

按照到来的顺序移动磁头

公平,但是性能差,寻道时间长



最短寻找优先SSTF

选择离当前磁道最近的磁道,贪心思想,未必最优

性能较好,但是有可能造成饥饿



扫描算法

磁头只有移动到最外层才能往内移动,只有移动到最内层才能往外移动

性能较好,不会产生饥饿,但响应频率不平均,而且有时候不需要完全移动到最外或者最内,到最外或最内的那个请求即可。



LOOK调度算法

解决扫描算法磁头只有到最外最内才能改变方向的缺点

内容:如果移动方向上已经没有请求了那么就可以改变方向



循环扫描算法

解决扫描算法响应不平均的缺点

只有一个方向的移动才能处理请求,到了末端后移动到开头重新扫描



C- LOOK调度算法

结合上面两个算法就是了



一些减少时延的算法



交替编号

如果要读取同一个磁道上相邻的扇区,因为磁盘一直在旋转,所以无法无缝连接地读下去,而是需要等磁盘再转一圈后才能准备好读取。交替编号的思想就是把逻辑上相邻的数据在磁道上交替编号(也就是中间夹着其他的扇区),给磁头充足的时间去准备读取下一个磁块,这样就能在更少的圈内实现数据读取。



错误命名

各个磁盘扇区的编号不一样。本质上还是给磁头充足的反应去准备读取



磁盘管理



磁盘初始化

  1. 低级格式化,将磁盘的各个磁道划分为扇区
  2. 磁盘分区,每个分区由若干个柱面组成
  3. 逻辑格式化,创建文件系统



引导块

计算机开机时需要执行一系列初始化程序,完整的初始化程序储存在磁盘的固定位置,自举装入程序写在ROM中只执行一小部分的初始化,然后启动磁盘中完整的初始化程序



坏块管理

逻辑格式化时对于坏块进行标记(简单磁盘)

维护坏块链表(复杂的磁盘)



版权声明:本文为weixin_50871986原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。