操作系统④ 文件管理

文件管理

概述

  • 单个文件
    • 文件名、标识符、类型、位置、大小、保护信息
    • 有结构文件、无结构稳健
  • 文件间组织:目录
  • 操作系统应提供的基础功能
    • create
    • delete
    • read
    • write
    • open
    • close
  • 文件的存储方式
    • 块为单位、物理单元、物理地址
    • 连续存储、离散存储
    • 空闲块清理
  • 磁盘在单位时间只能读入一个磁盘块里的数据

文件逻辑结构

  • 无结构文件:流式文件(txt)
  • 有结构文件:记录是文件(数据库、表格)
    • 定长、不定长
    • 顺序文件
      • 链式存储:无法随机存取,只能依次读取
      • 顺序存储
        • 可变长:无法随机存取
          • 索引文件:索引号、长度、指针,但体积可能过大
          • 索引顺序文件:为一组记录对应一个索引表项
        • 定长:可随机存取
          • 串结构,无法快速找到对应记录、增删容易
          • 顺序结构,可以快速找到对应记录、增删困难

文件目录

  • 文件目录:一种特殊的有结构文件
    • 控制块FCB:文件名、类型、存取权限、物理块号等
    • 系统提供的功能:搜索、创建、删除、显示、修改
    • 分类
      • 单级目录(早期)
        • 不允许重名
      • 两级目录(早起多用户):主文件、用户文件
        • 不能分类
      • 多级目录(现代树形)
        • 设置当前目录(相对目录查找)
        • 方便分类文件、减少磁盘IO
        • 不便于文件共享
      • 无环图目录结构
        • 给共享节点设置共享计数器,当共享计数器归零时,才删除
  • 索引节点(FCB改进)
    • 只有文件名、索引节点指针
    • 可以一次读入更多目录项进行查找,减少磁盘IO
    • 在外存时为磁盘索引节点、在内存时为内存索引节点

文件物理结构

  • 基础原件概念
    • 磁盘块、文件块,类似内存页框、页面
    • 用户通过(逻辑块号、块内地址)来访问文件,操作系统实现从逻辑地址到物理地址的映射
  • 连续分配
    • 每个文件在磁盘上占有一组连续块
    • FCB:文件名、起始块、长度
    • 支持顺序访问和随机访问
    • 由于文件块、顺序读写时,访问速度最快
    • 不方便文件扩展、存储空间利用率低产生磁盘碎片
  • 链接分配(默认隐式链接)
    • 隐式(链接在文件末)
      • 文件通过连接到下个块的指针来访问
      • FCB:文件名、起始块、结束块
      • 需要i+1次IO访问第i块,只能顺序访问
      • 方便文件扩展、存储空间利用率高、不产生磁盘碎片
    • 显式(连接在单独的表中)
      • FAT是记录文件连接方式的表:物理块、下一块,-1为结束
      • FCB:文件名、起始块
      • FAT常驻内存,转换逻辑块号为物理块号的过程不需要磁盘IO
      • 支持顺序、随机访问、访问效率高
      • 文件分配表需要占用存储空间
  • 索引分配
    • 为文件建立单独索引表:逻辑块号(隐含)、物理块号
    • FCB:文件名、索引块
    • 支持随机访问、易于扩展
    • 索引表占用空间
    • 当索引表太大时
      • 连接方案:在索引表中增加指向下一个索引块的指针
        • 需要依次查询索引表
      • 多层索引:建立多层索引
        • 最大长度:一级项数x二级项数x…xn级项数x块大小
        • 对于k级页表,需要k+1次访问
        • 对于小文件可能会多次读取页表
      • 混合索引
        • 顶级索引表中包含顶级、一级、二级索引
    • 要点
      • 根据多层索引、混合索引结构计算文件最大长度
      • 分析访问数据块岁需要的读磁盘次数

文件存储空间管理

  • 划分与初始化
    • 物理磁盘包含多个文件卷
      • 文件卷:目录区、文件区
    • 一个文件卷可以跨越多个物理磁盘(部分超大型文件系统)
  • 管理方式
    • 空闲表法
      • 空闲表:起始空闲盘块号、空闲盘块数
      • 应用适应算法:首次适应、最佳适应、最坏适应
      • 回收区间合并参照内存管理
    • 空闲链表法:系统保持连头指针、链尾指针
      • 空闲盘块链:每个盘块内记录下一个空闲盘块指针
        • 分配:从链头摘下k个盘块,修改链头指针
        • 回收:依次将回收盘块挂到链尾,修改链尾指针
      • 空闲盘区链:每个盘区首个盘块内记录下一个空闲盘区指针、及本盘区长度
        • 分配:应用适应算法,从一个或多个盘区中摘取
        • 回收:若块与某个空闲盘区相邻,则合并;否则生成若干个新的节点、挂到链尾
    • 位示图
      • 二进制位对应盘块0空闲、1已分配
      • 以字(n bit)为单位,用字号i、位号j(行号、列号)记录第b=ni+j对应空闲情况
      • 分配、回收即转换过程
    • 成组链接法(大型文件系统,如UNIX)
      • 超级块(目录区,内存与磁盘保持一致):
        • 下一组空闲盘块数量
        • 这些空闲盘块的块号
          • 其中首个块内记录下一组的空闲盘块数和空闲盘块号
          • 最后一组的首个盘块内使用特殊标记分组结束
      • 分配
        • 检查第一分组内数量是否足够
        • 足够则分配相应数量,分配前使用首个盘块中的表替代超级块中的表
        • 不足够则在取完该分组后取下一个分组
        • 始终保持超级块中数据指向下一个有空的分组
      • 回收
        • 先向当前有空的分组中插入空闲块
        • 当前分组写满之后,建立新的分组,复制超级块中的数据到分组的第一个块中,并重建超级快

文件操作(系统调用)

  • 创建create
    • 参数:空间、路径、文件名
    • 动作:
      • 找到空间
      • 插入目录项
  • 删除delete
    • 参数:路径、文件名
    • 动作:
      • 找到目录项
      • 根据目录项回收磁盘块
      • 删除目录表中的项
  • 打开open
    • 参数:路径、文件名、操作类型
    • 动作:
      • 找到目录项、鉴权
      • 复制到内存“打开文件表”,
        • 系统打开文件表:编号、文件名、外存地址、打开计数器
        • 进程打开文件表:编号、文件名、读写指针、访问权限、系统表索引
  • 关闭close
    • 参数:文件索引(指针)
    • 动作
      • 删除进程中的表项
      • 系统表计数器-1,若归零则删除表项
  • 读read
    • 参数:文件索引号、读入数据大小、存储的内存指针
    • 动作
      • 查询打开文件表
      • 根据读写指针读入指定大小到内存区域
  • 写write
    • 参数:文件索引号、写出数据大小、写出的数据在内存的指针
    • 动作
      • 查询打开文件表
      • 根据读写指针写出指定大小内存区域中的数据到外存

文件共享

  • 硬链接:索引节点(配合瘦身的文件目录,只有文件名、索引节点指针)
    • 不同目录项指向同一个索引节点,节点中含有计数器,该节点直接存储文件物理地址
    • 删除时必须检查计数器是否归零,归零则连同物理文件一起删除
    • 单次IO
  • 符号链接
    • 创建一个新的文件来记录文件实际存储的位置
    • 删除物理文件则导致符号连接失效,但链接文件还在
    • 多次IO

文件保护

  • 口令保护:
    • 保存口令在FCB中
    • 可以越权访问,不够安全
  • 加密保护
    • 对文件内容进行加密,只有正确秘钥可以解密(如异或、移位)
    • 加解密需要时间
  • 访问控制
    • FCB/索引节点中加入访问控制表
    • 控制表可以以用户/组为单位记录权限;权限可分为读写执行删除
    • 实现灵活,实现复杂保护功能

文件系统层次结构

  • 用户接口:Read/Write/Open/Close等系统调用
  • 文件目录系统:FCB操作、目录管理
  • 存取控制模块:鉴权与保护
  • 逻辑文件系统与文件信息缓冲区:文件记录转换逻辑地址
  • 物理文件系统:逻辑地址转换物理地址
    • 辅助分配模块:空间分配与回收
    • 设备管理模块 ⇔ \Leftrightarrow 物理设备

磁盘

  • 磁盘
    • 盘面
      • 扇区(最内侧数据密度最大)
    • 柱面
    • 磁头(固定头、移动头)
    • 由(盘面、柱面、磁头)可以定位唯一物理块

磁盘调度算法

  • 磁盘上处理时间 T a = T S + T R + T t T_a=T_S+T_R+T_t Ta=TS+TR+Tt
    • 寻道时间 T S = s + m n T_S=s+mn TS=s+mn
      • 启动磁头臂耗时s
      • 移动磁头:跨越n个磁道,每个磁道耗时m
    • 延迟时间 T R = 1 2 r T_R=\frac{1}{2r} TR=2r1
      • 定位到目标扇区:转速为r(平均转半圈)
    • 传输时间 T t = b r N T_t=\frac{b}{rN} Tt=rNb
      • 转速为r,读写b个字节,每个磁道块上N个字节
  • 优化寻道时间
    • FCFS先来先服务:根据进程访问顺序
      • 多进程、访问分散下性能差
    • SSTF最短时间优先:优先处理最近的磁道
      • 产生饥饿
    • SCAN扫描(电梯算法):只有移动到最外侧后,才往里移动
      • 响应频率不平均、不能及时回头
    • LOOK:继承SCAN的思想,但当发现当前方向上没有请求时立刻回头
      • 解决SCAN的不及时回头缺点
    • C-SCAN循环扫描算:只有从一侧向另一侧移动时,才访问磁道
      • 解决访问频率不平均的问题
    • C-LOOK:结合C-SCAN与C-LOOK
      • 解决SCAN的所有问题
    • 若没有说明,SACN就是LOOK;C-SCAN就是C-LOOK
  • 优化延迟时间
    • 磁头访问完扇区之后需要时间准备下一次读取,物理上相邻逻辑上也相邻会导致磁盘空转
    • 交替编(扇区)号:减小延迟时间
    • 按(柱面号,盘面,扇区)编址:读取连续地址不必移动磁头更加节省时间
    • 错位命名:不同盘面上扇区交错,可以给磁头缓冲时间,就像旋转楼梯
  • 磁盘管理
    • 磁盘初始化
      • 低级格式化(物理格式化):划分扇区,扇区分为头、数据、尾,头或尾存储管理数据结构以及校验码
      • 磁盘分区:划分柱面
      • 逻辑格式化:创建文件系统
    • 引导块
      • ROM中存储很小的自举装入程序
      • 开集系统运行该自举装入程序,找到引导块,完成初始化
    • 坏块处理
      • FAT表上标记坏块:对操作系统不透明
      • 磁盘控制器:维护坏块表,并给予预留的备用好块,对操作系统透明
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值