6 文件管理
1 文件
文件系统是操作系统中负责存取和管理信息的模块,它用统一的方式管理用户和系统信息的存储、检索、更新、共享和保护,并为用户提供一整套方便有效的文件使用和操作方法
- 面向用户的功能:
- 文件按名存取
- 文件目录建立和维护
- 实现逻辑文件到物理文件的转换
- 文件存储空间的分配和管理
- 提供合适的文件存取方法
- 实现文件的共享、保护和保密
- 提供一组可供用户使用的文件操作
- 优点:
- 用户使用方便
- 文件安全可靠
- 实现文件共享
文件是由文件名字标识的一组信息的集合。
- 可按各种方法进行分类:
- 按用途分类:
- 按保护级别分类:
- 按信息流向分类:
- 按存放时限分类:
- 按设备类型分类:
- 按文件的结构分类:
- 文件是一个抽象机制,提供了把文件保存在磁盘上,用户不必了解信息存储细节且便于读取的方法,这一抽象机制中最重要的是文件命名。
- 文件名是字母或数字组成的字母数字串,它的格式和长度因系统而异
- 操作系统支持不同类型文件:
- 普通文件
- 目录文件
- 特别文件:
- 块设备文件
- 字符设备文件
- 管道文件
- 文件属性:
- 基本属性
- 类型属性
- 保护属性
- 用于防止文件被破坏
- 包括:
-
一是防止系统崩溃所造成的文件破坏;
- 定时转储
- 多副本
- 访问控制——防止文件主和其他用户有意无意的非法操作所造成的文件不安全性,基本属性是建立三元组:(用户,对象,存取权限)
-
二是防止文件主和其他用户有意或无意的非法操作所造成的文件不安全性。
-
- 管理属性
- 控制属性
文件存储方法:
- 存取方法是操作系统为用户程序提供的使用文件的技术和手段
- 存取方法:
- 顺序存取
- 直接存取
- 索引存取
2 文件目录
文件系统的分层结构:
- 文件管理层--实现文件的逻辑结构,为用户提供各种文件系统调用,及文件访问权限的设置等工作;
- 目录管理层--负责查找文件描述符,进而找到需要访问的文件,及进行访问权限检查等工作;此外,还需完成目录的添加、删除、重排等操作。
- 磁盘管理层--将文件的逻辑地址转换成磁盘的物理地址,即由逻辑块号找到柱面号、磁道号和扇区号,具体的数据传输操作由设备管理实现
FCB文件控制块:
- OS为每个文件建立的唯一数据结构,其中包含了全部文件属性,其目的是既便于用户的操作和使用,又便于操作系统对文件的管理和控制
- 一个文件由两部分组成 :FCB 和文件体(文件信息)。有了 FCB 就可以实现文件的“按名存取”
文件目录:
- FCB 汇集和组织在一起形成文件目录,文件目录包含目录项,目录项有两种,分别用于描述子目录和描述文件
- 目录项的格式随系统而异,全部由目录项构成的文件称为目录文件,主要用于文件的查找,它保存在外存上,查找文件时调入内存工作区
Linux特殊目录项建立方法:
- Linux系统的FCB 中的文件名和其他管理信息分开,其他信息单独组成一个数据结构,称为索引节点 inode,此索引节点在磁盘上的位置由 inode 号标识。
- 文件系统中的每个文件都有一个磁盘 inode 与之对应,这些 inode 被集中存放于磁盘上的 inode 区。FCB 对于文件的作用,犹如 PCB 对于进程的作用,集中这个文件的所有相关信息,找到 inode,就能获得此文件的必要信息
- 数据块索引在union结构的每个具体文件系统中,其中的i_data[15] 数组给出数据块地址索引,前12项为直接索引,第13项为一次间接索引,第14项为二次间接索引,第15项为三次间接索引
- 磁盘 inode 记录文件的属性和相关信息,文件访问过程中会频繁地用到它,不断来回于内外存之间引用它,当然是极不经济的。为此,为此,在内存区开辟一张活动 inode 表。磁盘 inode 反映文件静态特性,活动 inode 反映文件动态特性
- 当访问某文件时,若在活动 inode 表中找不到其 inode,就申请一个空闲活动 inode,把磁盘 inode 内容复制给它,随之就可用来控制文件读写。
- 当用户关闭文件时,活动 inode 的内容回写到对应的磁盘 inode 中,再释放活动 inode 以供它用。把 FCB 的主要内容与索引节点号分开,不仅能够加快目录检索速度,而且,便于实现文件共享
层次目Linux系统的FCB 中的文件名和其他管理信息分开,其他信息单独组成一个数据结构,称为索引节点 inode,此索引节点在磁盘上的位置由 inode 号标识。录结构:
- 每一级目录可以是下一级子目录的说明,也可以是文件的说明,形成层次关系。
- 多级目录结构采用树形结构,是一棵倒向有根树,树根是根目录;从根向下,每个树枝是一个子目录;而树叶是文件
- 包括:
- 路径名
- 目录路径名
- 文件路径名
- 绝对路径名
- 相对路径名
3 文件组织与数据存储
文件存储:
- 卷是存储介质的物理单位
- 物理卷和物理设备不总是一致的
- 块是存储介质上连续信息所组成的一个区域,也叫物理记录
- 块是主存储器和辅助存储设备信息交换的物理单位,每次交换一块或整数块
- 决定块的大小要考虑到用户使用方式、数据传输效率和存储设备类型等多种因素。
- 不同类型的存储介质,块的长短常常各不相同;同一类型的存储介质,块的长短也可以不同
文件组织:
- 文件组织指文件中信息的配置和构造方式,应该从文件的逻辑结构和组织及文件的物理结构和组织两方面考虑
- 文件的逻辑结构和组织是从用户观点出发,研究用户概念中的信息组织方式,这是用户能观察到,可加以处理的数据集合
- 文件逻辑结构分两种形式:流式文件,记录式文件
- 流式文件指文件内的数据不再组成记录,只是依次的一串信息集合,可以看成是只有一个记录的记录式文件
- 文件常按长度来读取所需信息,也可用插入特殊字符作为分界
- 记录式文件包含若干逻辑记录,逻辑记录是文件中按信息在逻辑上的独立含意划分的信息单位
- 分类:
- 记录式顺序文件
- 记录式索引顺序文件
- 分类:
- 流式文件指文件内的数据不再组成记录,只是依次的一串信息集合,可以看成是只有一个记录的记录式文件
成组和分解:
- 逻辑记录和块的关系
- 逻辑记录是按信息在逻辑上的独立含义划分的单位,块是存储介质上连续信息所组成的区域。
- 逻辑记录被存放到文件存储器的存储介质上时,可能占用一块或多块,也可以一个物理块包含多个逻辑记录。
- 成组操作
- 分解操作
- 块因子
- 记录格式和记录键
- 记录格式
- 格式F:定长记录
- 格式V:变长记录
- 格式S:跨块记录
- 记录键:
- 主键、次键
- 单键记录、多键记录
- 记录格式
文件物理结构:
- 文件的物理结构和组织是指逻辑文件在物理存储空间中存放方法和组织关系
- 文件的存储结构涉及:块的划分、记录的排列、索引的组织、信息的搜索,其优劣直接影响文件系统的性能
- 构造文件物理结构的方法:
- 第一类计算法
- 第二类指针法
顺序文件:
- 文件中逻辑上连续的信息存放到存储介质的依次相邻的块上便形成顺序文件
- 逻辑记录顺序和物理记录顺序完全一致的文件,通常,记录按出现的次序被读出或修改
连接文件:
- 连接文件使用连接字,又叫指针来表示文件中各个记录之间的关系
索引文件
- 索引结构是实现非连续存储的另一种方法,适用于数据记录保存有随机存取存储设备上的文件
- 使用索引表,每个表目包含一个记录的键及其记录数据的存储地址,这类文件称索引文件
- 索引顺序文件是顺序文件的扩展,各记录本身在介质上也顺序排列,有直接处理和修改记录的能力
- 索引顺序文件能象顺序文件一样进行快速顺序处理,既允许按物理存放次序(记录出现的次序);也允许按逻辑顺序(由记录主键决定的次序)进行处理
直接文件:
- 记录的关键字与其地址间可通过某种方式建立对应关系,利用这种关系实现存取的文件叫直接文件
- hash技术要建立hash表,hash表是一个指针数组,数组通过索引访问,找到的指针便指向数据记录
4 文件系统功能及实现
文件系统提供给用户程序的一组系统调用,包括:建立、打开、关闭、撤销、读、写和控制,通过这些系统调用用户能获得文件系统的各种服务
在为应用程序服务时,文件系统需要沿路径查找文件目录以获得文件的FCB,把常用和正在使用的那些文件的FCB复制进内存,这样,文件被打开后,可被多次使用,直至文件被关闭或撤销,大大地减少磁盘访问次数,提高文件系统效率
文件系统磁盘结构:
- 超级块:占用1#号块,存放文件系统的结构和管理信息
- 索引节点区:2#~k+1#块 ,存放inode表,每个文件都有各种属性,将其记录在称为索引节点的inode的结构中
- 数据区:k+2#~n#为数据块
- 用户打开文件表
- 系统打开文件表
- 描述文件的inode
文件系统调用:
- 文件创建
- 格式:fd =create(filenamep,mode)
-
① 为新文件分配inode和活动inode,并把inode号与文件分量名组成新目录项,记到目录中。
② 在新文件所对应的活动inode中置初值,如置存取权限i_mode,连接计数i_nlink等。
③ 分配用户打开文件表项和系统打开文件表项,置表项初值,读写位移f_offset清“0”。
④把各表项及文件对应的活动inode用指针连接起来,把文件描述字返回给调用者
- 文件删除
- 删除把指定文件从所在的目录文件中除去。如果没有连接用户(i_link 为“1”),还要把文件占用的存储空间释放。删除系统调用形式为:unlink (filenamep)。在执行删除时,必须要求用户对该文件具有“写”操作权
- 文件打开
- fd = open(filenamep,mode)
-
① 检索目录,把它的外存inode复制到活动inode表。
②根据参数mode核对权限,如果非法,则这次打开失败。
③ 当“打开”合法时,为文件分配用户打开文件表项和系统打开文件表项,并为表项设置初值。通过指针建立这些表项与活动inode间的联系。把文件描述字,即用户打开文件表中相应文件表项的序号返回给调用者
- 文件关闭
- close(fd)
-
根据fd找到用户打开文件表项,再找到系统打开文件表项。释放用户打开文件表项。
② 把对应系统打开文件表项中的f_count减“1”,如果非“0”,说明还有进程共享这一表项,不用释放直接返回;否则释放表项。
③ 把活动索引节点中的i_count减“1”,若不为“0”,表明还有用户进程正在使用该文件,不用释放而直接返回,否则在把该活动inode中的内容复制回文件卷上的相应inode中后,释放该活动inode
- 读文件
- read(fd,buf,count)
- 系统根据f_flag中的信息,检查读操作合法性,再根据当前位移量f_offset值,要求读出的字节数,及活动索inode中i_addr指出的文件物理块存放地址,把相应的物理块读到缓冲区中,然后再送到bufp指向的用户内存区中
- 写文件
- write(fd,buf,count)
- 文件随机存取
- lseek(fd,offset,whence)
- 文件描述字fd必须指向一个用读或写方式打开的文件,当whence是“0”时,则f_offset被置为offset,当whence是“1”时,则f_offset被置为文件当前位置加上offset
文件共享:
- 文件的静态共享
-
link (oldnamep, newnamep);
① 检索目录找到oldnamep所指向文件的inode号。
② 再次检索目录找到newnamep所指文件的父目录文件,并把已存在文件的inode号与别名构成一个目录项,记入到该目录中去。
③ 把已存在文件inode的连接计数i_nlink加“1” -
文件解除链接调用形式为:
unlink (namep)
解除链接与文件删除执行的是同一系统调用代码。删除文件是从文件主角度讲的,解除文件连接是从共享文件的其他用户角度讲的。都要删去目录项,把i_nlink减“1”,不过,只有当i_nlink减为“0”时,才真正删除文件
-
- 文件的动态共享
- 文件动态共享是系统中不同的用户进程或同一用户的不同进程并发访问同一文件
- 同一用户父、子进程协同完成任务,使用同一读/写位移,同步地对文件进行操作。 该位移指针宜放在相应文件的活动索引节点中。当用系统调用fork建立子进程时,父进程的pcb结构被复制到子进程的pcb结构中,使两个进程的打开文件表指向同一活动inode,达到共享同一位移指针的目的
- 多用户共享文件,每个希望独立地读、写文件,这时不能只设置一个读写位移指针,须为每个用户进程分别设置一个读、写位移指针。 位移指针应放在每个进程用户打开文件表的表目中。这样,当一个进程读、写文件,并修改位移指针时,另一个进程的位移指针不会随之改变,从而,使两个进程能独立地访问同一文件
- 文件的符号连接共享
- 又称软链接,符号链接是一种只有文件名,不指向inode的文件
- 符号链接共享文件的实现思想: 用户A目录中形afile→bfile,实现A的目录与B的文件的链接。其中只包含被链接文件bfile的路径名而不是它的inode号
- 当用户A要访问被符号链接的用户B的文件bfile,且要读“符号链接”类文件时,被操作系统截获,它将依据符号链接中的路径名去读文件,于是就能实现用户A使用文件名afile对用户B的文件bfile的共享。
- 优点:能用于链接计算机系统中不同文件系统中的文件,可链接计算机网络中不同机器上的文件,此时,仅需提供文件所在机器地址和该机器中文件的路径名。
- 缺点:搜索文件路径开销大,需要额外的空间查找存储路径
文件空间管理
- 位示图
- 空闲区表
- 空闲块链
- 空闲块列表
- 成组空闲块链
内存映射文件
- 原理:把进程需要访问的文件映射到其虚地址空间中,于是,便可通过读写这段虚地址进行文件访问,而磁盘访问转变成内存访问
- 系统提供两个新的系统调用,
1)映射文件,有两个参数:一个文件名和一个虚拟地址,把一个文件映射到进程地址空间。
2)移去映射文件,让文件与进程地址空间断开,并把映射文件的数据写回磁盘文件
虚拟文件系统:
- 实现目标;
- 同时支持多种文件系统;
- 多个文件系统应与传统的单一文件系统没有区别,在用户面前表现为一致的接口;
- 提供通过网络共享文件的支持,访问远程结点上的文件系统应与访问本地结点的文件系统一致;
- 可以开发出新的文件系统,以模块方式加入到操作系统中
- 设计思想:
- 应用层
- 虚拟层
- 实现层
- VFS实质上是一种存在于内存中的,支持多种类型具体文件系统的运行环境,功能有:
- 记录安装的文件系统类型
- 建立设备与文件系统的联系
- 实现面向文件的通用操作
- 涉及特定文件系统的操作时映射到具体文件系统中去
文件系统性能问题
- 盘块高速缓存
- 数据预先读入
- 信息优化分布
- 磁盘驱动调度
- 内存映射文件
提高文件系统可靠性的措施:
- 磁盘坏块管理。
1) 硬件方法:
2)软件方法:
备份数据
文件系统一致性检查
- 1) 磁盘块一致性检查
- 原理:操作系统为每个磁盘块建立两个计数器:占用计数器和空闲计数器,前者记录该磁盘块在文件中出现的次数,后者记录该磁盘块在空闲块链表中出现的次数,初始化时空闲计数器置1,而占用计数器置0,当磁盘块分配给文件使用时其空闲计数器置0,而同时占用计数器置1。
- 通过每个磁盘块的两个计数器进行相互比对来判断是否存在磁盘块不一致的状态
- 2)文件系统一致性检查
- 原理:检查文件inode中的链接数i_count与其出现在文件系统中不同位置的次数是否一致。
- 具体做法:查看目录系统,为每个文件(inode)建立一个计数器。从根目录开始,沿目录树依次向下查找。对于每个目录中的每个文件,其inode的计数器值加1。检查结束后,获得每个inode计数器的值,表明该文件包含在多少个目录中。再把计数器的值与inode中的链接数i_count进行比较。如果两个值相同,说明文件系统保持了一致性。否则,出现两种错误,即inode的链接数i_count太大或太小
文件系统不一致的处理方法:
- 如果inode中链接计数i_count大于目录项数,会导致无法释放inode。解决办法是把i_count减少并改为正确值。如正确值为0,则应删除该文件。
- 如果inode中的链接计数i_count小于目录项数,在删除文件过程中会导致inode提前释放,使得文件系统中还有一个目录指向不可用的inode,如果该inode又分配给了其他文件,将会造成严重后果。解决办法是把inode的链接计数i_count增大并改为等于实际的目录项