目录

  • 1 文件概念及文件逻辑结构
    • 1.1 文件的分类
    • 1.2 文件的属性
    • 1.3 文件结构
  • 2 文件访问方式
    • 2.1 顺序存取
    • 2.2 直接/随机存取
    • 2.3 文件的存储设备
  • 3 文件的物理结构
    • 3.1 顺序结构
    • 3.2 链接结构
    • 3.3 索引结构
  • 4 目录
    • 4.1 目录结构

1 文件概念及文件逻辑结构

文件对用户来说是连续的逻辑地址空间,它是存储在磁盘上的,文件是记录在外存上的具有名字的相关信息的集合,文件里面通常保存数据或程序。

1.1 文件的分类

文件的分类可以按照如下类别来分:

  • 按用途分类可以分为:系统文件,库文件,用户文件;
  • 按按信息保存期限分类可以分为:临时文件,永久文件,档案文件;
  • 按文件的保护方式分类可以分为:只读文件,读写文件,只执行文件;
  • 按文件的逻辑结构分类可以分为:流式文件,记录式文件;
  • 按文件的物理结构分类可以分为:顺序(连续)文件,链接文件,索引文件;
  • 按信息流向分类可以分为:输入文件,输出文件,输入/输出文件(存储设备);
  • 按文件中的数据分类可以分为:源文件,目标文件,可执行文件;
  • 按文件的性质分类可以分为:普通文件,目录文件,特殊文件。

1.2 文件的属性

无论将文件如何来分类,文件都有一些共性的东西,我们称之为文件的属性,通常有如下属性:

  • 文件名:唯一的以人们可以理解的方式保存的信息;
  • 类型:需要可以支持多种类型的系统;
  • 位置:指向文件在设备上的存储位置的指针;
  • 大小:当前文件的大小;
  • 保护:控制对文件的读取,改写和执行的权限;
  • 时间,日期和用户身份:保护和安全需要的数据。

上述的这些文件属性信息会保存在磁盘上的目录结构中。

1.3 文件结构

用户和文件系统往往从不同的角度对待同一个文件的:

  • 用户:从使用的角度,按信息的使用和处理方式组织文件;
  • 文件系统:从文件的存储和检索的角度,根据用户对文件的存取方式和存储介质的特性组织文件,决定用户文件存放在存储介质上的方式。

这样就导致了文件有两种形式的结构,即文件的逻辑结构和文件的物理结构:

  • 逻辑结构:用户对文件的组织结构;
  • 物理结构:文件在外存储器上的存储结构。

物理结构直接影响存储空间的使用和检索文件信息的速度,逻辑文件保存到存储介质上的工作由文件系统来做,这样可减轻用户的负担。

文件从逻辑结构上分成二种形式,一种是无结构的流式文件,另一种是有结构的记录式文件

  • 流式文件:指对文件内信息不再划分单位,它是依次的一串字符流构成的文件;
  • 记录式文件:是用户把文件内的信息按逻辑上独立的含义划分信息单位,每个单位称为一个逻辑记录(简称记录)。记录的长度可分为定长和不定长记录两类。

我们重点讨论的是记录式的文件,记录文件有顺序、索引、索引顺序文件几种。

  • 顺序文件:顺序文件的所有记录按键值的约定次序组织,记录可以是定长的,也可以是变长的,顺序文件常用于批量记录读取。对于定长记录文件,若要查找第 iii 个记录,可根据下式得到相对于第一个记录首址的地址:Ai=i∗dA_i =i*dAi​=i∗d(ddd 为记录的长度)。对于非定长记录文件,若要查找第 iii 个记录,则需要有每个记录的长度:Ai=∑diA_i =∑d_iAi​=∑di​(ddd 为记录的长度)。不支持直接存取。
  • 索引文件:为解决非定长记录文件无法直接存取问题,往往建立一张索引表,记录下每个记录的长度及指向该记录的指针,从而方便了直接存取,索引表就类似于书的目录,指明了每个章节都在哪一页。索引文件对主文件中的记录按需要的数据项(一个或几个)建索引表,为每个记录设置一个表项,索引文件本身是顺序文件组织。
  • 索引顺序文件:事实上索引文件给每个数据项建立索引表这样的开销是比较大的,于是就有了索引顺序文件, 索引顺序文件先将顺序文件中的所有记录分为若干个组;再为顺序文件建立一张索引表,表中记录每个组的第一个记录,该索引项包含记录的键值和指向该记录的指针。它是顺序文件和索引文件的结合,检索时,先根据关键字去检索索引表,找到该记录所在组的第一个记录的位置,然后再利用顺序查找法去查找主文件,找到所需记录。如下图,给每个姓名首字母都分了组,然后在索引表中只用保存每个组的首地址即可,找到首地址后,再在组内进行顺序查找:

2 文件访问方式

前面提到文件有多种存储结构,在访问文件时,所采用的方式也是和文件的组织方式密切相关,常用的存取方式有如下两种:

  • 顺序存取 (Sequential access);
  • 直接/随机存取 (Direct access)。

2.1 顺序存取

顺序存取是最简单的访问方式,它就是按照文件信息的逻辑顺序依次存取:

  • 在记录文件中:按记录的排列顺序来存取;
  • 在流式文件中:反映为当前读写指针的变化,在存取完一段信息后,读写指针自动加上这段信息的长度,以便指出下次存取时的位置。

顺序存储示意图如下图所示,当前指针 (Current position) 可以向后读,也可以回到起始位置:

2.2 直接/随机存取

直接/随机存取可以直接定位到文件中的任何一个记录,而不需要像顺序存取一样要把路径中的所有记录过一遍。

对于连续文件(固定长度),第 iii 个记录的地址(addr0addr_0addr0​ 为首记录地址,LLL 为记录长度): rptr=addr0+i∗Lrptr=addr_0+i*Lrptr=addr0​+i∗L,在非定长文件中 LLL 的值不固定,所以非定长文件不支持随机存储

对于索引文件,是支持随机存取的,因为我们可以先随机查找索引表,再取地址。

2.3 文件的存储设备

文件的访问方式不仅和文件的存储方式有关,还和文件的存储设备有关,因为文件时保存在存储设备上的,文件自身也带有物理设备的特性。

文件的存储设备主要有磁带,磁盘,光盘等,存储设备的特性可以决定文件的存取方法,对于上述的几种存储设备,它们都是以块为单位存储数据的,因此文件的存储设备常常划分为若干大小相等的物理块,以块为单位进行信息的存储、传输。

以磁带为例,磁带可以永久保存大容量数据,它是一种顺序存取设备,即前面的物理块被存取访问之后,才能存取后续物理块的内容。磁带存取速度较慢:主要用于后备存储,或存储不经常用的信息,或用于传递数据的介质,现在磁带已经基本上被淘汰了。下图是磁带存储示意图:

再以磁盘为例,磁盘是一种随机存储设备,它既可以顺序存取,也可以随机存取。它可以直接定位到某个磁道上的某个扇区,如下图所示:

3 文件的物理结构

用户按逻辑结构使用文件,文件的物理结构对用户来说是不必关心的,但对文件系统来说却是至关重要的,因为它直接影响存储空间的使用和检索文件信息的速度。文件系统按物理结构管理文件,当用户请求读写文件时,文件系统必须实现文件的逻辑结构与物理结构之间的转换。

文件的物理结构指的是文件在外存的存放组织形式,文件的物理结构与存储设备的特性有很大关系,前面提到过文件的存储设备通常划分为大小相等的物理块,物理块是分配及传输信息的基本单位,一个物理块中可以存放若干个逻辑记录,一个逻辑记录也可以存放在若干个物理块中。

所以文件的物理结构取决于外存的分配方式,当采用连续分配方式时,就是顺序结构;当采用链接分配方式时,就是链接结构;当采用索引分配方式时,就是索引结构

3.1 顺序结构

这是最简单的物理文件结构,它将逻辑上连续的文件信息依次存放在外存连续的物理块中。如下图表示磁盘的存储空间,当文件要存储的时候,就为它找一段连续的存储空间存放,图中相同颜色的物理块表示一个文件,可以发现它们都是连续存放的。当我们需要找到某个文件的时候,要知道文件的首地址和长度,而这两个值都是保存在目录中的:

在这种分配方式下,每一个文件占用一个连续的磁盘块的集合,它的实现也非常简单,只需要起始块号和长度。同时它也可以随机存取,因为目录中保存了起始地址和长度,可以直接定位到某个文件。若是存储在磁盘中,其所需的磁盘寻道次数和寻道时间也比较少。

这种分配方式也有不足的地方,如现在有一个文件需要占据10个物理块,若查询内存剩余容量可以发现剩余有15个内存卡(以上图为例),但是依然无法分配,因为并没有10个连续的物理块,这个时候就出现了外碎片问题。

另外这种分配方式下文件不能动态增长,由于分配方式时顺序的,所以存储的方向也是固定的,如果某个文件要添加内容,可能导致物理块不够用,比如文件tr想增加3个物理块,就无法完成。

3.2 链接结构

顺序结构最大的问题就是外碎片问题,造成这个问题的主要原因就是顺序分配,参照内存中解决外碎片的方法,文件的物理结构也可以采用离散的分配方式,即采用链接结构。

在链接分配方式下按所需分配磁盘块,通过链接指针链接在一起,如下图只需要知道起始块和最后一块即可:

可以发现一个文件的物理块分散在磁盘的各个地方,在这种分配方式下消除了外碎片问题,但是缺点是无法支持随机存取了,若想知道文件的逻辑第三个物理块,则必须从首个物理块开始找到第三个块,而不能直接定位到第三个物理块。同时由于是指针链接,指针占据了一定的空间,而且存取速度较慢,物理块离散的分布,在磁盘存储中会带来更多的寻道次数和寻道时间。另外在这种分配方式下,只要磁盘中还有空间,文件时可以动态增长的。

解决指针占据空间的问题可以将多个块组成簇,以簇为单位分配,指针占用百分比减少,但增加内碎片,比如规定4个物理块为一个簇,每次分配都是4个物理块为单位分配。

为了支持随机存取,引入了文件分配表FAT (File allocation table ),每个磁盘会有一张文件分配表,里面的表项是和磁盘的物理块个数是一一对应的,每个表项存的内容就是该物理块的下一个物理块在什么地方,如下图所示,要找到某个文件只需要知道文件的起始地址就可以了,这样就间接的实现了随机存取,若要寻找文件逻辑上的第三个物理块,则只需要查询文件分配表即可,查找速度会非常快。:

3.3 索引结构

回顾顺序结构和链接结构,顺序结构支持随机存取,但有外碎片;链接结构没有外碎片,但不能直接存取,虽然引入的FAT可以随机存取,但需要占用较大的内存空间。

事实上,打开某个文件时,只需知道该文件所在的盘块号, 一个文件的信息存放在若干不连续物理块中,系统为每个文件建立一个索引表,并将这些块的块号存放在索引表中,一个索引表就是磁盘块地址数组,其中第 iii 个条目指向文件的第 iii 块,如下图,所有灰色的物理块同属于一个文件jeep,文件目录中会保存这个文件的索引表的编号,在索引表会找到该文件对应的所有物理块。这个索引表也是需要保存的,我们把它也保存在磁盘中,图中的物理块19,叫做索引块

可以发现索引分配是支持随机存取的,由于它也是一种离散的分配方式,所以它也没有外碎片。索引分配显然也是支持文件动态增长的。但是要建立索引表放在磁盘上,所以索引表是要占据磁盘空间的,同时因为是离散分配,也无法避免的增加了较多的寻道次数和寻道时间。

由于文件的大小是不定的,所以合理的设计索引表会提高检索速度,也能减少空间开销。当文件很小的时候,一张索引表就可以解决,当文件很大的时候,一张索引表可能就放不下了,因此有如下两种方案:

  • 链接模式:将一个大文件的一个索引表接着一个索引表,链接起来,相当于将多个小的索引表拼凑成一个大索引表来满足大文件的存储需求;
  • 多级索引: : 将一个大文件的所有索引表(二级索引) 的地址放在另一个索引表(主索引,一级索引)中,也就是索引表的每个表项又指向了另一张索引表,如下图所示:

在两级索引分配方式,若每个盘块大小为1KB,每个盘块号占4字节,则一个索引块中可存放256个盘块号,则两级索引最多可包含的盘块号总数为64K(256*256)。因此,所允许的文件的最大长度为64MB(64K*1KB)

4 目录

有些系统保存了成百万的文件,为了管理这些数据,需要组织他们,所以引入了目录管理,文件目录通常分为两部分:

  • 磁盘可以分成一个或多个分区
  • 每个分区都包含了存储在分区中的文件的信息,这些信息保存在设备目录中,设备目录记录分区上所有文件的各种信息。

目录是一个包含着所有文件信息的节点的集合,每一个目录项对应着一个文件,如下图:

目录本身也是要保存下来的,目录和文件都是保存在磁盘上的,在目录中通常会保存文件的名称、类型、地址、当前长度、最大长度、最后访问时间、数据最后更新时间、所有者ID、保护信息等信息。

这些信息具体保存在文件控制块FCB中,用于描述和控制文件的数据结构,它至少要包括文件名和存放文件的盘物理地址。文件控制块的有序集合称为文件目录,即一个文件控制块FCB就是一个文件目录项。文件控制块FCB中保存的内容大致可以分为如下三类:

  • 文件基本信息:文件名,用户名,文件地址,文件长度,文件逻辑结构,物理结构;
  • 存取控制信息:文件存取权限;
  • 管理信息:共享计数,文件的建立日期,保存期限,最后修改日期,最后访问日期。

4.1 目录结构

目录中就是所有文件控制块FCB的集合,对FCB的管理应该满足如下要求:

  • 效率:快速的定位一个文件;
  • 命名:方便用户,两个用户可以有相同名字的不同文件,相同的文件可以有不同的名字。

下图就是最简单的单级目录结构,所有文件对应这一个FCB表项,在单级目录结构中,要找到一个文件则要遍历FCB,而且由于是单级结构,不允许出现重命名,也不允许分组。:

为解决一级目录文件命名冲突,并提高对目录文件检索速度而改进,可以把目录分为两级:

  • 一级称为主文件目录(MFD):给出用户名,用户子目录所在的物理位置;
  • 二级称为用户文件目录(UFD,又称用户子目录):给出该用户所有文件的FCB。

这样在不同主文件目录下的不同文件可以重名,而且用户要查找文件只需要在自己的主目录下查找即可,如下图所示:

在二级目录结构下依然是无法分组的,为了解决这个问题引入了树型目录结构,如下图所示:

在树形目录结构下,层次结构清晰,便于管理和保护,有利于文件分类,解决重名问题,提高文件检索速度。但查找一个文件按路径名逐层检查,由于每个文件都放在外存,多次访盘影响速度。由于树形的叶子是不会重合的,所以不支持文件共享。

在有些系统中要求实现文件共享,这就引入了无环图结构目录,如下图所示,两个分支下的count都指向了同一个文件:

在这种方式下,当某一方去修改这个文件时,如删除了这个文件,那么另一方指向这个文件的指针就是一个悬挂指针,解决方案有两种:

  • 设置一个断点来按期检查当前是否有悬挂指针,若有就删除悬挂指针;
  • 通过表项保留计数来解决,文件的共享次数是通过一个计数器来实现的,当某一方删除这个文件的时候,我们并不删除这个文件,而是把这个计数器减一,当这个计数器为1时,这个文件就是一个独享文件,当这个计数器为0时,这个文件就真正的被删除了。

在有的系统中要求文件可以指向目录,这就引入了普通图结构目录,如下图所示:

这种结构下就会出现环,当查找某个文件时就可能陷入某个环,保证无环的方式有如下几种:

  • 只允许链接到文件而不允许链接到子目录;
  • 垃圾收集机制,定期检查是否有环;
  • 每次添加一个链接时都用一个检测算法判断会不会产生环;

操作系统原理第十章:文件系统相关推荐

  1. 【2021-11-08 更新】【梳理】简明操作系统原理 第二十章 加密(docx)

    配套教材: Operating Systems: Three Easy Pieces Remzi H. Arpaci-Dusseau Andrea C. Arpaci-Dusseau Peter Re ...

  2. 操作系统原理,文件系统的概念与实现,概念,需求,文件分类,逻辑结构,数据结构,文件控制块和文件目录,基本文件操作,多级目录,文件物理结构,Unix的文件多级索引结构

    操作系统原理,文件系统的概念与实现,概念,需求,文件分类,逻辑结构,数据结构,文件控制块和文件目录,基本文件操作,多级目录,文件物理结构,Unix的文件多级索引结构 基本概念 一.文件概念: 1.文件 ...

  3. Linux 操作系统原理 — 文件系统 — 存储布局

    目录 文章目录 目录 磁盘分区 MBR 与分区表 创建 MBR 分区 创建 GPT 分区 分区的格式化 分区的特性 引导块 空闲空间块 inode 区块.data block 区块与超级块 LVM 与 ...

  4. Linux 操作系统原理 — 文件系统 —文件

    目录 文章目录 目录 文件的类型 常规文件 ASCII 码文件 二进制文件 设备文件 字符设备文件 块设备文件 目录文件 其他文件 文件的构造方式 文件的属性 文件的操作 目录的操作 文件的类型 常规 ...

  5. 操作系统原理和实践-考前最后一练

    局部题目:建议理解全部概念再来看题目 操作系统原理和实践-考前最后一背_神迹小卒的博客-CSDN博客操作系统第二章 进程管理 - 幕布2.1 前趋图和程序执行2.2 进程的描述2.3 进程控制http ...

  6. 第一章 操作系统引论-操作系统原理和实践

    目录 三课合一: 要求学完要做到什么? 教材 目录 第一章操作系统引论 引例:操作系统在做什么? 你知道哪些操作系统的名字? 什么是OS操作系统? 1.1 操作系统的目标和作用 目标:方便性.有效性. ...

  7. 计算机四级操作系统原理知识汇总,2015年全国计算机四级《操作系统原理》考试内容...

    2015年全国计算机四级<操作系统原理>考试内容 一.操作系统概述 1.操作系统基本概念.特征.分类 2.操作系统主要功能 3.操作系统发展演化过程,典型操作系统 4.操作系统结构设计,典 ...

  8. Linux 操作系统原理 — 系统结构

    目录 文章目录 目录 Linux 系统架构 Linux 内核 内存管理 进程管理 文件系统 设备驱动程序 网络接口 Shell Linux 系统架构 Linux 系统一般有 4 个主要部分:内核.Sh ...

  9. 操作系统实验——简易FAT16文件系统的实现

    操作系统实验--简易FAT16文件系统的实现 前言 实验要求 FAT16基础知识 磁盘组成部分 分区原理 思路 完整代码 前言 暑假啦!呼,所有的补课终于也都结束了,虽然绩点还是一如既往的拉跨,但是很 ...

最新文章

  1. ASP.NET Core Web Razor Pages系列教程七: 添加新的字段
  2. css3 text-shadow
  3. 代码和普通的java_Java中普通代码块,构造代码块,静态代码块区别及代码示例...
  4. String 方法中 replace 和 replaceAll 的区别详解(源码分析)
  5. Js 原型对象与原型链(转)
  6. 在navicat中查看所有表的注释
  7. ubuntu 下安装 cudnn
  8. java的static块执行时机
  9. echart vue 图表大小_vue里echarts自适应窗口大小改变
  10. linux离线安装mysql8
  11. pycharm 右键无法显示unittest框架解决右键只有unittest 运行如何取消右键显示进行普通run...
  12. Mac上Go环境配置
  13. html默认初始代码
  14. 【QT安装】【QT+opencv安装】
  15. 软件测试中的正交缺陷分析总结,正交缺陷分类(ODC)流程简介及应用经验分享(上)...
  16. 不同型号的二极管模块并联_原来我不懂二极管…
  17. 微信小程序开发基础知识2(黑马)
  18. CAD画图教程,手把手教你画“鱼”
  19. C++中 itoa 和 atoi 的用法
  20. redis学习(十二)——hiredis的使用

热门文章

  1. Spring的静态代理和动态代理
  2. 主流大数据技术全体系参数与搭建与后台代码工程框架的编写(百分之70)
  3. Android之ASD组件(一)
  4. 代码混淆工具Dotfuscator 在VS2008中的使用步骤
  5. MySQL 5.1.40新特性及下载
  6. CKO将成为企业发展的军师--转自世界名人网
  7. 黑马lavarel教程---6、简单验证
  8. 10款jQuery/CSS3动画应用 超有用
  9. iOS开发多线程篇—多线程简介
  10. Apache Commons组件集合