0%

文件系统原理

[toc]

7.1 基本概念#

7.1.1 文件定义#

文件是以计算机硬盘为载体的信息集合
需要提供文件系统进行管理

7.1.2 文件结构#

  • 数据项:
    类似于int、string这种,或者 学号、姓名等值(类似sql表中的某个值内容)
  • 记录:
    一组数据项集合
    比如学号和姓名,组成了学生记录(例如sql表中的某一行)
  • 文件

按逻辑结构可以分为2类:
? 无结构文件: 一般都是二进制文件流文件,直接按顺序封装。这里面不包含记录的概念
? 有结构文件: 包含记录的概念
顺序文件:按记录中的某个关键字排序过,可二分查找记录行
索引文件: 需要1个索引表,记录每个记录的位置
索引顺序文件:先按关键字索引,在部分擦护照
直接、散列文件:用哈希键值确定记录位置

7.1.3 文件属性#

名称
标识符——确认文件唯一性
类型
位置——设备文件指针
大小——文件大小或者文件最大值
保护——访问控制权限
时间、日期
用户标志——哪个用户可用

7.1.4 文件常见操作#

  • 创建文件
  • 写文件——要指定一个写指针确认从哪开始写
  • 读文件——读写共用一个指针,避免文件不同步
  • 重定位——修改文件位置
  • 删除文件——先删除文件目录项,再去清理空间,避免还没清理完有人却正要用
  • 截断文件——把文件长度截断

7.1.5 open打开文件的过程#

  1. 从外存把文件属性拷贝进内存,建立文件目录表
  2. 返回一个文件编号给用户
  3. 用文件打开计数器,记录有多少个进程正在打开该进程。当没有进程在使用时,回收内存。
  4. 进程获取文件的以下信息:
  • 文件指针
  • 文件打开计数
  • 文件磁盘位置
  • 访问权限

7.2 目录#

目录就是文件的外部组织结构

7.2.1 文件的组织结构#

7.2.1.1 文件控制块FCB(文件目录项)#

  • 存放了操作文件所需要的信息
  • 文件目录中存放了许多FCB,可以通过FCB按名查取。
  • 包含的信息有:
    基本信息: 文件名/物理位置/逻辑结构/物理结构
    存取控制信息: 访问权限
    使用信息:建立时间、修改时间

7.2.1.2 索引节点#

  • 存放文件描述信息, 但是不包含文件名

  • 文件目录中只存放文件名和i节点指针

  • 可减少外村磁盘的查找速度

  • 节点内容包括:
    标识符、类型、权限、存取时间
    地址长度、链接计数
    节点编号、状态(是否上锁)
    访问计数、设备号

  • 文件打开时,会把索引节点从磁盘复制进内存,称为内存索引节点

7.2.1.3 文件控制块和索引节点的区别#

只需要文件位置信息等时,只需要拿文件控制块来唯一确认一个文件即可。
但是需要真正使用文件时,则需要索引节点里的信息
但如果把索引节点提前加载进内存的话,容易导致开销浪费。所以只有需要的时候,才回去用到索引节点,减少要拷贝的信息。
在这里插入图片描述

7.2.2 目录的结构#

单级目录
两级目录
多级目录:树形结构,有相对路径和绝对路径

7.2.3 文件层次结构#

从用户层从上往下排列

  1. 用户接口:
    若干程序模块组织曾,每一个模块对应一个系统调用
  2. 文件目录系统: 查找目录项,找到索引节点
    存取控制:用户要访问的权限和FCB中的权限做比对
    逻辑文件系统: 把要读取的记录转为罗季葵爱好
    物理文件系统——把逻辑块号转为实际物理地址
    设备管理模块——分配磁盘设备做输入输出

7.2.4 目录的实现原理#

线性列表——宠用目录项, 顺序检索。
哈希表——根据文件名得到key值

linux的目录实现原理:

7.3 文件共享#

7.3.1 软连接#

符号链接
建立一个文件, 文件中存放共享文件的路径
只有文件拥有者才能有指向文件的i节点指针
不会出现指针悬空, 不存在时,软链接会被删除。
在这里插入图片描述

7.3.2 硬连接#

即一个文件名的指针
各用户文件目录表用i节点指针指向同一个索引节点
当文件被删除,另一个用户就不能访问了。
容易出错。
在这里插入图片描述

7.4 文件的实现原理#

7.4.1 文件分配#

指怎么给文件分配磁盘块

7.4.1.1 连续分配:#

每个文件在磁盘上占一组连续的块
目录项记录文件的起始位置和长度
这样能让作业的磁盘寻道数最少
适用于长度固定的文件

7.4.1.2 链接分配:#

  • 隐式链接:
    每个文件有一个链表, 每个节点是一个磁盘块,next指针指向下一个磁盘块

  • 显式链接:
    用一个二维数组表替代next指针, [0]是盘块,[1]是下一个盘块
    这个表就是文件分配表FAT
    文件的第一个盘号也就是链表头 会放入FCB的物理地址中

7.4.1.3 索引分配#

为了防止这个表占据太大空间或者不够用
给每个文件有一个索引表,按顺序给出盘块
同时可以多级索引, 即可以给出磁盘中下一级索引表的盘块号。然后再去把盘中的二级索引表导入到内存中使用

7.4.2 存储空间管理#

即把哪些磁盘块分给文件呢?

  • 文件卷、逻辑卷

以下是空闲块分配方法:

  • 空闲表法—— 从空闲盘块表中选取, 释放的时候要做前后空闲区合并
  • 空闲链块法:把空闲块组成链表
  • 位视图法: 用010101确定是否空闲,可减少空闲块信息的大小
  • 成组链接法:
    把n个空闲区分组,存入不同的空闲盘块栈中。并且有各种指针指向其他组的空闲盘块
    当某组内的空闲块变化时, 可以修改上一个块号栈的指针指向位置。
    在这里插入图片描述