OS:5-文件管理
第5章 文件管理
5.1 文件的概念
- 文件是由信息按一定的结构方式组成,可持久化保存的抽象机制,由于它必定存储在某种设备上,故也可以认为文件是设备的一种抽象
- 由文件名所标识,用户可以按名访问
- 文件名和扩展名
文件分类
- 按用途可分成:系统文件、库文件、用户文件
- 按保护级别可分成:只读文件、读写文件、不保护文件
- 按信息时限可分成:临时文件、永久文件、档案文件
- 按设备类型可分成:磁盘文件、磁带文件、光盘文件、软盘文件
- Linux分类
- 普通文件
- 目录文件
- 特殊文件
引入文件的优点
- 用户使用方便:按名存取
- 文件安全可靠:用户通过文件系统才能实现对文件的访问
- 文件可备份
- 文件可共享
5.2 文件系统及其功能
文件系统是操作系统中负责存取和管 理信息的模块,它用统一的方式管理用户和系统信息的存储、检索、更新、共享和保护,并为用户提供一整套方便有效的文件使用和操作方法
- 文件系统中的文件
- 用户概念中的逻辑文件
- 存放他的存储结构
- 文件系统的功能
- 面向用户:
- 文件按名存取
- 文件共享和保护
- 文件操作和使用
- 面向用户:
![image-20210106133311774](https://cyzblog.oss-cn-beijing.aliyuncs.com/image-20210106133311774.png)
5.3 文件的存储
- 文件存储介质有磁带、光盘和磁盘
- 卷是存储介质的物理单位,对应于一盘磁带、一块软盘、一个光盘片、一个硬盘分区
- 块是存储介质上连续信息所组成的一个区域,也叫做物理记录
- 块在主存储器和辅助存储器进行信息交换的物理单位,每次总是交换一块或整数块信息
顺序存取存储设备
- 严格依赖信息的物理位置次 序进行定位和读写的存储设备
- 磁带机、光盘
直接存取存储设备
- 移臂与旋转两维组织,存取速度高
- 磁盘
- 每个物理记录有确定的位置和唯 一的地址,存取任何一个物理块所需的时间几乎不依赖于此信息的位置
文件存取相关见5.11
5.4 文件的逻辑结构
逻辑文件
-
逻辑文件,又称为文件的逻辑结构
- 独立于物理环境的,用户概念中的抽象信息组织方式
- 用户能观察到的,并加以处理的数据集合
-
文件的逻辑结构分为两种形式
- 一种是流式文件
- 无结构的文件,指文件内的数据不再组成记录,只是由一串依次的字节组成的信息流序列
- 每个字节都有一个索引,第一个字节索引0,第二个字节索引1...
- 一种是记录式文件
- 是一种有结构的文件,它是若干逻辑记录信息所组成的记录流文件
- 逻辑记录是文件中按信息在逻辑上的独立含义所划分的信息单位
- 一种是流式文件
5.5 记录的成组和分解
- 逻辑记录是信息按逻辑上的独立含义由用户划分的单位,块是系统划分的存储介质上连续信息所组成的区域
- 一条逻辑记录可能占用一块或多块;一块可能包含多条逻辑记录
成组
若干个逻辑记录合并成一组,写入一个块叫记录的成组
每块中的逻辑记录数称块因子
- 记录的成组操作在输出缓冲区内进行, 凑满一块后才将缓冲区内的信息写到存储介质上
分解
当存储介质上的一个物理记录读进输入缓冲区后,把逻辑记录从块中分离出来的操作叫记录的分解操作
![image-20210106134926058](https://cyzblog.oss-cn-beijing.aliyuncs.com/image-20210106134926058.png)
特征
- 优点
- 节省存储空间
- 减少IO次数,提高系统效率
- 用户读请求,导致包含该逻辑记录的物理 读输入缓冲区;这一操作可能读入了多个逻辑记录,这一现象称为提前读
- 用户写请求,首先是写入输出缓冲区,只有当该缓冲区中的逻辑记录满后才会引起实际输出,这一现象称为推迟写
5.6 文件的物理结构
- 文件的物理结构和组织是指文件在物理存储空间中的存放方法和组织关系,又称为物理文件
- 设计块的划分,记录的排列、索引的组织、信息的搜索等
- 直接影响文件系统的性能
顺序文件
又叫连续文件
- 将一个文件中逻辑上连续的信息存放到存储介质的依次相邻的块中便形成顺序结构
- 如磁带文件、光盘文件
- 优点:
- 顺序存取记录时速度较快
- 缺点:
- 建立文件前需要能预先确定文件长度,以便分配存储空间;
- 修改、插入和增加文件记录有困难
连接文件
又叫串联文件
- 连接结构的特点是使用连接字(指针)来表示文件中各个物理块之间的先后次序
- 第一块文件信息的物理地址由文件目录给出,而每一块的连接字指出了文件的下一个物理块位置;连接字内容为0时,表示文件至本块结束
- 像输入井、输出井等都用此类文件
![image-20210106140817749](https://cyzblog.oss-cn-beijing.aliyuncs.com/image-20210106140817749.png)
- 优点:
- 易于对文件CRUD
- 不必预先知道文件长度
- 存储空间利用率高
- 缺点:
- 存放指针需额外的存储空间;
- 由于存取须通过缓冲区,待获得连接字后,才能找到下一物理块的地址, 因而,仅适用于顺序存取
直接文件
又叫散列文件
- 通过计算记录的关键字建立与其物理存储地址之间的对应关系
- 解决冲突
- 解决办法有拉链法、循环探查法、 二次散列法、溢出区法等
索引文件
索引文件为每个文件建立了一张索引表,其中,每个表目包含一个记录的键(或逻辑记录号)及其存储地址
![image-20210106141153912](https://cyzblog.oss-cn-beijing.aliyuncs.com/image-20210106141153912.png)
访问方式:
-
索引文件在文件存储器上分两个区: 索引区和数据区
- 第一步查 找索引表
- 第二步获得记录物理地址
-
优点:
- 备连接文件的优点
- 克服了它只能作顺序存取的缺点, 具有直接读写任意一个记录的能力,便于文件的增、删、改
-
缺点:
- 增加了索引表的空间开销和查找时间
5.7 文件的目录结构
- 文件目录是实现文件的“按名存取”的关键数据结构
- 目录便于查找、防止冲突
- 文件目录需要永久保存,因此也组织成文件存放在磁盘上,称目录文件
一级目录结构
- 在操作系统中构造一张线性表,与每个文件的相关属性占用一个目录项,构成了一级目录结构
- 由于用户与文件众多,容易重名,不利记忆
二级目录结构
- 第一级为主文件目录
- 第二级为用户的文件目录,每一用户只允许查看自己的文件目录
![image-20210106141900636](https://cyzblog.oss-cn-beijing.aliyuncs.com/image-20210106141900636.png)
-
优点:
- 避免一个用户未经授权就存取另一个用户的文件,使用户文件的私有性得到保证,实现了对文件的保密和保护
- 特别是不同用户具有同名文件时,由于各自有不同的用户文件目录而不会导致混乱
-
缺点:
- 对于同一个用户而言,同样存在文件多、容易重名问题
树形目录结构
每一级目录可以登记下一级目录,也可以登记文件,从而形成了层次文件目录结构
- 一棵倒向的有根树,树根是根目录;
- 从根向下,每一个树分叉是一个子目录;
- 而树叶是文件
- 不同系统中不一样,比如linux中万物皆文件,可以是目录文件、普通文件、特殊文件
- 优点:
- 较好地反映现实世界中具有层次关系的数据集合和较确切地反映系统内部文件的组织结构
- 不同文件可以重名,只要它们不位于同一末端的子目录中
- 易于规定不同层次或子树中文件的不同存取权限,便于文件的保护、保密和共享
5.8 文件目录的管理
文件查找
“按名存取”文件就是系统根据用户提供的文件路径名来搜索各级文件目录,找到该文件
- 绝对路径名——从根目录查起
- 相对路径名——从当前目录查起
.
当前目录..
父目录
目录项查找:二分查找
活动文件表
- 当一个文件经过许多目录节点时,使用很不方便;系统在沿路径查找目录时,往往要多次访问文 件存储器,使访问速度大大减慢
- 系统可以为每个用户进程建立一张活动文件表,当用户使用一个文件之前,先通过“打开”操作,把该文件有关目录信息复制到指定主存区域,有关信息填入活动文件表,以建立用户进程和该文件索引的联系
- 当不再使用该文件时,使用“关闭”,切断用户进程和这个文件的联系,同时,若该目录已被修改过,则应更新辅存中对应的文件目录
例子:
5.9 文件的安全与保护
概念
- 文件共享是指不同用户共同使用某些文件
- 并发控制
- 文件保护是指防止文件被破坏
- 文件副本
- 文件存储矩阵与文件存取表
- 文件属性
- 文件保密则是指防止文件及其内容被其他用户窃取
- 隐蔽文件目录
- 设置口令
- 使用密码
5.10 文件的保护
5.11 文件的存取方法
顺序存取
- 读操作根据读指针读出当前记录,同时推进读指针,指向下一次要读出的记录
- 写操作则设置写指针,把一个记录写到文件未端, 同时推进写指针
- 允许对读指针进行前跳或后退n(整数)个记录的操作
- 磁带机、光盘
直接存取
- 又称随机存取,可以非顺序地从文件的任何位置读取文件内容
- 例如,航空订票系统,用航班号作标识,把特定航班的所有信息存放在物理块中,用户预订某航班时,直接计算出该航班的存位置
索引存取
- 基于索引文件的索引存取方法
- 信息块的地址都可以 通过查找记录键而换算出
- 实际的系统中,大都采用多级索引,以加速记录查找过程
5.12 文件的使用
建立文件
- 所需参数
- 文件名、设备类(号)、文件属性及存取控制信息
- 处理流程
- 在相应设备上建立一个文件目录项,为文件分配第一个物理块,在活动文件表中申请一个项,登记有关目录信息,并返回一个文件句柄
撤销/删除文件
- 所需参数
- 文件名和设备类(号)
- 处理流程
- 若文件没有关闭,先关闭文件;
- 若为共享文件,进行联访处理;
- 在目录文件中删去相应目录项;
- 释放文件占用的文件存储空间
打开文件
- 所需参数
- 文件名、设备类(号)、打开方式
- 处理流程
- 在主存活动文件表中申请一个项,返回一个文件句柄;
- 跟据文件名查找目录文件,把目录信息复制到活动文件表相应栏;
- 按存取控制说明检查访问的合法性;
- 若打开的是共享文件,则应有相应处理
关闭文件
- 所需参数
- 文件句柄
- 处理流程
- 将活动文件表中该文件的“当前使用用户数”减1;
- 若此值为0,则收回此活动文件表;
- 完成“推迟写”;
- 若活动文件表目内容已被改过,则应先将表目内容写回文件存储器上相应表目中,以使文件目录保持最新状态
读写文件
- 所需参数
- 文件句柄、用户数据区地址、 读写的记录或字节个数
- 处理流程
- 按文件句柄从活动文件表中找到该文件的目录项信息;
- 根据目录项指出的该文件的逻辑和物理组织方式
- 把相关逻辑记录转换成物理块
定位文件
用于调整所打开文件的读写指针位置
- 所需参数
- 文件句柄、定位指针
5.13 辅存空间管理
分配方式
- 连续分配:存放在辅存空间连续存储区中 (连续的物理块号)
- 顺序访问时速度快,管理较为简单
- 但为了获得足够大的连续存储区,需定时进行‘碎片’整理
- 非连续分配:动态分配给若干扇区或簇(几个连续扇区),不要求连续
- 辅存空间管理效率高,便于文件动态增长和收缩
空闲块管理
-
位示图
- 字位为“1”表示相应块已占用,字位为“0”状态表示该块空闲
- 可以把位示图全部或大部分保存在主存中,可实现高速物理块分配和去配
-
空闲块成组连接法
- 每组第一块登记下一组空闲盘块号和空闲块总数
- 最后一组中,第一项是0,作为结束标志
- 这是个小细节!
举个例子
假定文件卷启用时共有空闲块338块(但是合是339,因为最后一组的第一项是没用的)
OS启动时,将磁盘专用快复制到内存系统工作区中,访问内存专用块既可完成申请和释放工作
5.14 文件系统的实现层次
补充
inode、目录项
- 文件系统中的每个文件都有一个磁盘 inode 与之对应,这些 inode 被集 中存放于磁盘上的 inode 区
- Inode存储了文件系统对象的一些元信息,如所有者、访问权限(读、写、执行)、类型(是文件还是目录)、内容修改时间、inode修改时间、上次访问时间、对应的文件系统存储块的地址,等等
- 目录项:
inode与文件访问:
- 当访问某文件时,若在活动 inode 表中找不到其 inode,就申请一个空闲活动 inode,把磁盘 inode 内容复制给它,随 之就可用来控制文件读写。
- 用户关闭文件时,活动 inode 的内容回写到对应的磁盘 inode 中,再释放活动 inode 以供它用。把 FCB 的主要内容 与索引节点号分开,不仅能够加快目录检索速度,而且,便于实现文件共享。
层次目录结构
树型多级目录优点:
-
较好地反映现实世界中具有层次关系的数据集合和确切地反映系统内部文件的分支结构;
-
不同文件可重名,只要它们不位于同一末端子目录中,易于规定不同层次或子目录中文件的不同存取权限,便于文件的保护、保密和共享等,有利于系统的维护和查找
纯树型目录结构:
- 每个文件都只有一个父目录
- 文件共享不是对称的,父目录有效拥有该文件,其他被授权用户必须经过属主目录才能对该文件进行访问
有向无环图目录结构:
- 允许文件有多个父目录而破坏树的特性
- 不同用户可以对称方式实现文件共享,即可能属于不同用户的多个目录,使用不同文件名能访问和共享同一个文件
- 由于一个文件可能有多个父目录,需为每个文件维护一个引用计数,用来记录文件的父目录个数,仅当引用计数为1时,删除操作才移去文件,否则仅仅把相关记录从父目录中删去
多重索引结构
![image-20210108164943175](https://cyzblog.oss-cn-beijing.aliyuncs.com/image-20210108164943175.png)
文件系统磁盘结构
- 超级块:1#
- 存放文件系统结构和管理信息,元数据
- 超级块就是文件系统的心脏
- 记录inode表所占盘块数
- 文件数据所占盘块数
- 主存中登记的空闲盘块数
- 主存中登记的空闲块物理块号
- 主存中登记的空闲inode数
- 主存中登记的空闲inode编号
- 及其他文件管理控制信息
- 超级块既有盘位示图的功能,又记录整个文件卷的控制 数据
- inode节点区:2#~k+1#
- Unix文件的核心
- 所有inode都有相同大小,且inode表是inode结构的列表
- 文件系统中的每个文件在该表中都有一个inode
- 又分磁盘inode表和主存活动inode表,后者解决频繁访问磁盘inode表的效率问题。
- 数据区:k+2#~n#
- 文件的内容保存在这个区域,磁盘上所有物理块的大小是一样的,如果文件包含超过一块的数据,则文件内容会存放在多个盘块中
- 数据块、目录块
![image-20210108165201956](https://cyzblog.oss-cn-beijing.aliyuncs.com/image-20210108165201956.png)
文件系统的功能及实现
一些重要的数据结构:
-
用户打开文件表
-
进程的PCB结构中保留一个files_struct,称为用户打开文件表或文件描述符表
-
表项的序号为文件描述符fd,该登记项内登记系统打开文件表的一个入口指针fp
-
通过此系统打开文件表项连接到打开文件的活动inode
-
-
系统打开文件表
- 由于一个文件可以被多个进程同时打开或一个进程同时打开多次,带来了如何管理文件当前位移量的问题
- 是为解决多用户进程共享文件、父子进程共享文件而设置 的系统数据结构file_struct
- 不管是同一个进程还是不同进程,每当打开一个文件时,通过此表项把用户打开文件表的表项与文件活动inode联接起来,以实现数据的访问和信息的共享
- 多个file可以对应同一个inode,一个node可以连接0个或者多个file
-
主存活动inode表
- 把常用和正在使用的那些文件目录复制进主存,这样既不增加太多主存开销,又可明显减少查找时间
- 系统为每个用户进程建立一张活动文件表,用户使用文件之前先通过“打开”操作,把该文件的文件目录复制到指定主存区域
- 当不再使用该文件时,使用“关闭”操作切断和该文件目录的联系,这样,文件被打开后,可被用户多次使用,直至文件被关闭或撤销,大大减少访盘次数,提高文件系统的效率。
i_count
反应共享inode的进程数目,是关闭文件时活动inode能否释放的依据i_nlink
连接计数,决定删除文件时是否将占用的存储空间释放
- 把常用和正在使用的那些文件目录复制进主存,这样既不增加太多主存开销,又可明显减少查找时间
![image-20210108170401525](https://cyzblog.oss-cn-beijing.aliyuncs.com/image-20210108170401525.png)
文件系统调用
-
文件的创建
文件尚未存在,需要对其创建,或者文件已经存在需要重新创建。
不同于文件的打开,打开是指文件已经存在。
fd = create (filenamep, mode);
- 为新文件分配索引节点和活动索引节点,并把索引节点编号与文件分量名组成新目录项,记到目录中
- 在新文件所对应的活动索引节点中置初值,如置存取权限 i_mode=mode,连接计数i_nlink=1
- 分配用户打开文件表项和系统打开文件表项,置表项初值,读写位移f_offset清“0”
- 把各表项及文件对应的活动索引节点用指针连接起来,把 文件描述字返回给调用者
-
文件的删除
在执行删除时,必须要求用户对该文件具有“写”操作权
unlink(filemep);
-
把指定文件从所在的目录文件中除去
-
如果没有连接用户(i_link 为“1”),还要把文件占用的存储空间释放
-
-
文件的打开
fd = open (filenamep, mode);
- 检查目录,如果未创建,报错;在检索到指定文件后,把磁盘inode复制到活动inode表中
- 根据参数mode核对权限,如果非法,则这次打开失败
- 当“打开”合法时,为文件分配用户打开文件表项和系统打开文件表项,并为表项设置初值。通过指针建立这些表项 与活动索引节点间的联系。把文件描述字,即用户打开文件表中相应文件表项的序号返回给调用者
注意:如果其他用户已经打开同一文件,活动inode表中已有该文件的inode,不执行1,仅把活动inode表中的i_count+1即可。
-
文件的关闭
close(fd);
- 根据fd找到用户打开文件表项,再找到系统打开文件表项。释放用户打开文件表项。
- 把对应系统打开文件表项中的f_count减“1”,如果非“0”,说明还有进程共享这一表项,不用释放直接返回; 否则释放表项。
- 把活动索引节点中的i_count减“1”,若不为“0”,表明还有用户进程正在使用该文件,不用释放而直接返回, 否则在把该活动索引节点中的内容复制回文件卷上的相应索引节点中后,释放该活动索引节点。
-
f_count反映不同进程通过同一个系统打开文件表项共享 一个文件的情况;
-
i_count反映不同进程通过不同系统打开文件表项共享一 个文件的情况
-
读文件
nr = read (fd, buf, count);
- 根据f_flag中的信息,检查读操作合法性,
- 根据当前位移量f_offset值,要求读出的字节数,及活动索引节点中i_data[]指出的文件物理块 存放地址,把相应的物理块读到缓冲区中
- 然后再送到bufp指向的用户主存区中
-
写文件
nw = write (fd, buf, count);
buf是信息传送的源地址,即把buf所指向的用户主存区中的信息,写入到文件中
-
文件的随机存取
在文件初次“打开”时,文件的位移量f_offset清空为零, 以后的文件读写操作总是根据offset的当前值,顺序地读写 文件。为了支持文件的随机访问,提供系统调用lseek,它允许用户在读、写文件前,事先改变f_offset的指向
lseek (fd, offset, whence);
- 当whence是“0”时,则f_offset被置为offset
- 当whence是“1”时,则f_offset被置为文件当前位 置加上offset。
文件共享
文件的静态共享
OS允许一个文件同时属于多个目录,但实际上文件仅有一处物理存储的“多对一”关系
link (oldnamep, newnamep);
- 检索目录找到oldnamep所指向文件的索引节点inode编号
- 再次检索目录找到newnamep所指文件的父目录文件,并把已存在文件的索引节点inode编号与别名构成一个目录项,记入到该目录中去
- 把已存在文件索引节点inode的连接计数i_nlink加“1”
文件的动态共享
文件动态共享是系统中不同的用户进程或同一用户的不同进程并发访问同一文件
文件的符号链接共享