[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打开文件的过程#
- 从外存把文件属性拷贝进内存,建立文件目录表
- 返回一个文件编号给用户
- 用文件打开计数器,记录有多少个进程正在打开该进程。当没有进程在使用时,回收内存。
- 进程获取文件的以下信息:
- 文件指针
- 文件打开计数
- 文件磁盘位置
- 访问权限
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 文件层次结构#
从用户层从上往下排列
- 用户接口:
若干程序模块组织曾,每一个模块对应一个系统调用 - 文件目录系统: 查找目录项,找到索引节点
存取控制:用户要访问的权限和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个空闲区分组,存入不同的空闲盘块栈中。并且有各种指针指向其他组的空闲盘块
当某组内的空闲块变化时, 可以修改上一个块号栈的指针指向位置。