【汤4操作系统】深入掌握操作系统-文件管理篇

news2024/9/20 1:12:49

第六章 文件管理

image-20230614091116769

文件

数据项&记录&文件

数据项分为:

  • 基本数据项:描述对象的某些属性,例如学生的年龄,姓名学号等
  • 组合数据项:由若干个基本数据项组合而成

记录:一组相关数据项的集合,用于描述一个对象在某方面的属性

文件:文件是指由创建者所定义的、 具有文件名的一组相关元素的集合,可分为有结构文件和无结构文件两种

  • 有结构文件:文件由若干个相关的记录组成
  • 无结构文件:被看成一个字符流

文件的属性

  • 文件的类型

    • image-20230614091722409
    • image-20230614091733296
    • image-20230614091739266
    • image-20230614091747635
  • 文件的长度

  • 文件的物理位置

  • 文件的创立时间

文件系统模型

image-20230614091858579

  • 对象及其属性:文件管理的对象有文件、目录和文件存储器
  • 对对象操纵和管理的软件集合。这是文件系统的核心部分,实现了
    • 对文件存储空间的管理
    • 文件目录管理
    • 文件的逻辑地址向物理地址的转换
    • 文件的读写管理
    • 文件的共享和保护
  • 文件系统接口。文件系统向用户提供的接口有命令接口、程序接口、图形用户接口三类,用户可以通过它们来使用文件系统。

文件的逻辑结构

文件的逻辑结构:从用户观点出发,所观察到的文件组织形式,是用户可以直接处理的数据及结构,独立于物理特性,又称为文件组织

image-20230424171721227

  • 无结构文件:流式文件
  • 有结构文件:由一组相似的记录组成,又称记录式文件。每个记录又有若干数据项组成
  • 根据有结构文件中的各条记录在逻辑上如何组织可以分为三类

顺序文件

顺序文件:文件中的记录一个接一个地顺序排列

  • 串结构:记录之间的顺序与关键字无关
  • 顺序结构:记录之间的顺序按关键字顺序排列

image-20230424172220635

image-20230425091119063

  • 对于可变长记录,无法实现随机存取
  • 对于定长记录,可随机存取,串结构无法快速检索
  • 增加/删除一个记录比较困难

索引文件

解决可变长记录的随机存取

image-20230425091412244

  • 优点:将一个需要顺序查找的文件改造成一个可随机查找的文件,极大地提高了对文件的查找速度。
  • 利用索引文件插入和删除记录也非常方便
  • 缺点:除了主文件外还需要配置索引表,增加了存储开销

索引顺序文件

索引表是一个定长记录的串结构的顺序文件

  • 基本克服了变长记录的顺序文件不能随机访问,以及不便于记录的删除和插入的缺点
  • 仍保留的顺序文件的关键特征,即记录是按关键字的顺序组织起来的

image-20230425091545550

image-20230425091622289

多级索引顺序文件

image-20230425091706960

image-20230425091723883

image-20230425091811514

文件的物理结构

对任一文件都存在两种形式的结构

  • 文件的逻辑结构:从用户观点出发,所观察到的文件组织形式,是用户可以直接处理的数据及结构,独立于物理特性,又称为文件组织
  • 文件的物理结构:又称为文件的存储结构。是指系统将文件存储在外存上所形成的一种存储组织形式,用户看不见,与存储介质的存储性能有关还和采用的外存分配方式有关
  • 文件的逻辑结构和物理结构都将影响文件检索的速度

连续分配(顺序分配)

顺序文件结构

连续分配要求为每个文件分配一组相邻接的盘块,一组盘块的地址定义了磁盘上的一段线性地址。

  • 把逻辑文件中的数据顺序地存储到物理上邻接的各个数据块中,这样形成的物理文件可以顺序读取
  • 文件目录中为每个文件建立一个表项,其中记载文件的第一个数据库地址及文件长度
  • 对于顺序文件连续读写多个数据库内容时,性能较好

image-20230614094155074

  • 优点:
    • 顺序访问容易,可以随机存取可以很快检索文件中的一个数据库
    • 顺序访问速度快
      • 磁头移动距离短,效率高
  • 缺点
    • 要求有连续的存储空间,可能会导致外部碎片,降低外存利用率【可以紧凑】
    • 必须事先直到文件的长度
      • 空间利用率不高
      • 不利于文件尺寸的动态增长

链接分配

  • 链接文件:采用链接分配方式时,可通过在每个盘块上的链接指针,将同属于一个文件的多个离散盘块链接成一个链表,把形成的文件称为链接文件

  • 隐式链接

    • 文件目录的每个目录项中,都须含有指向链接文件第一个盘块和最后一个盘块的指针,每个盘块中都含有指向下一个盘块的指针
    • image-20230614094802566
    • 主要问题:只适合顺序访问,对随机访问极其低效
      • 为了提高检索速度和减少指针所占用的存储空间,可以将几个盘块组成一个簇
      • 减少了查找时间和指针所占用空间,但增大了内部碎片
  • 显式链接

    • 把用于链接文件各物理块的指针,显示地存放在内存的一张链接表中
    • 整个磁盘仅设置一张文件分配表(FAT)
      • 分配给文件的所有盘块号都存放在该表中
    • 凡是属于某一文件的第一个盘块号,均作为文件地址被填入相应文件的FCB的物理地址字段中
    • 查找记录的过程是在内存中进行的,因而不仅显著提高了检索速度,而且大大减少了访问磁盘的次数
    • image-20230614095552871
  • 优点:

    • 无外部碎片,没有磁盘空间浪费
    • 无需事先知道文件大小。文件动态增长时,可动态分配空闲盘块
  • 缺点:

    • 不能支持高效随机/直接访问,仅适合于顺序存取
    • 需要为指针分配空间【隐式链接】
    • 可靠性低
    • 文件分配表占用较大内存

索引分配

链接分配的问题

  • 不能支持高效的直接存取
  • FAT需要占用较大的内存空间1

image-20230614095932206

image-20230614095949988

image-20230614100008475

image-20230614100041447

image-20230614100046691

假设每个盘块大小为1KB,每个盘块号占4个字节,则在一个索引块中可放256个文件物理块的盘块号。在两级索引时,最多可包含的存放文件的盘块的盘块号总数为256*256=64K个盘块号。可以得出:采用两级索引时,所允许的文件最大长度为64MB。

image-20230614100202771

image-20230614101503609

文件存储空间的管理

  • 存储空间的基本分配单位是磁盘块

  • 空闲分区表:属于连续分配方式,为每个文件分配一块连续的存储空间,系统为空闲区建立一张空闲表,存储序号,第一空闲盘块号和空闲盘块数。适合于可变大小分区的连续分配

  • image-20230614104821272

    分配时,可以按照之前的分配算法进行分配,如首次适应算法,当删除文件释放空间时,系统回收其存储空间,合并相邻空闲分区。

    实现简单,空闲分区分布较分散且数量较多时,空闲分区表很大需要较大的内存空间,会降低空闲分区表的检索速度

    浪费存储空间,不适合登记分散且数目很多的空闲分区,不利于基于存储块的链接文件和索引文件的存储空间分配

  • 空闲链表法

    • 空闲盘块链:以盘块为单位,将空闲的盘块连接成一条链,当创建文件时,从链表头开始,依次摘下适当的数目的空闲盘块进行分配,系统回收时,将回收的盘块依次插入链表尾部

      • 优点:用于分配和回收一个盘块的过程非常简单
    • 空闲盘区链:以空闲盘区(可能包含多个连续空闲盘块)为单位,将空闲盘区连接成一条链,分配时一般采用首次适用算法,在回收盘区时,同样也要将回收区域相邻接的空闲盘区相合并

    • image-20230614105328629

    • 问题:一段时间后,可能空闲分区链表中太多小分区,文件分配的存储空间太过分散,删除回收需要很长时间,若一个文件申请连续存储空间,则需要花费较长时间查找相邻的空闲分区

    • 适合非连续存储文件位示图:利用0,1表示物理块是否被使用,一般采用二维数组来存储,在进行盘块分配时,书序扫

      描位示图,从中找出一个或一组的空闲盘块,进行分配后更改位示图中的值

  • 位示图:利用0,1表示物理块是否被使用,一般采用二维数组来存储,在进行盘块分配时,顺序扫描位示图,从中找出一个或一组的空闲盘块,进行分配后更改位示图中的值

    • image-20230614105644550
    • 盘块的回收:
    • 将回收盘块的盘块号转换为位示图的行号和列好
      • i = (b-1)div n + 1,j = (b-1)mod n + 1
    • 修改位示图 map[i,j] = 0
    • 优点:
      • 很容易找到一个或一组连续的空闲分区
      • 占用空间小
    • 缺点:
      • 对于大硬盘难以将位示图全部装入内存
      • 磁盘空间快用完,性能严重下降
  • 成组链接法

    • image-20230614110016466

    • image-20230614110026248

    • image-20230425112218742image-20230425112507218

    • 每一组的第一个盘块用来记录下一组的盘块数量和盘块号的信息,其余号对应空闲块;每一个用于记录的磁盘块都是记录下一组的信息。

      image-20230425112604962

      分配201号盘块

      image-20230425112653676

      把300的磁盘块数据复制到超级块中

      回收没满直接插

      image-20230425112737499

      回收满了,新建一个区,先复制超级块,再新建超级块指向新回收的块

      image-20230425112845390

      image-20230425113001992

文件目录

  • 文件目录也是一种数据结构,用于标识系统中的文件及其物理地址,供检索时使用

    • 对目录管理的要求如下:
      • 实现按名存取
      • 提高对目录的检索速度
      • 文件共享
      • 允许文件重名
  • **文件控制块【FCB】:**用于描述和控制文件的数据结构

    • 从文件管理的角度来看,文件由文件体和FCB组成
    • 文件控制块是操作系统为了管理文件而设置的数据结构,存放了文件的有关说明信息,记录了系统对文件进行管理所需要的全部信息
    • FCB是文件存在的标志
    • FCB保存在文件目录中,一个FCB就是一个目录项
    • 内容包含
      • 基本信息:文件名、文件类型等
        • 地址信息:卷【存储文件的设备】、起始地址、文件长度
      • 存取控制信息:文件存取权限
      • 使用信息:创建时间、修改时间、访问时间
  • 文件目录:文件控制块的有序集合

  • 目录项:构成文件目录的项目,就是FCB

  • **目录文件:**为了实现对文件目录的管理,通常将文件目录以文件的形式保存在外存,文件叫做目录文件。

索引结点

  • UNIX系统中,采用了把文件名和文件描述信息分开的方式,把文件描述信息单独形成一个数据结构,叫索引结点
    • 为什么引入?
      • 在检索目录文件时,只用到了文件名,仅当找到一个目录项时,才需要从目录项中读取出该文件的物理地址,而其他一些对该文件进行描述的信息在检索目录时一概不要,显然在检索目录时这些信息不需要调入内存

目录结构

  • 单级目录结构:所有用户的全部文件目录保存在一张目录表中,每个文件的目录项占用一个表项

    • image-20230614112843501
    • 优点:实现了按名存取
    • 缺点
      • 查找速度慢
      • 不允许重名
      • 不便于实现文件共享
  • 两级目录结构:分为主目录和用户目录

    • 为每个用户建立单独的用户文件目录
    • 系统中为所有用户建立一个主文件目录
    • image-20230614112747221
    • 优点:
      • 一定程度解决了重名问题
      • 提高了文件目录检索效率
      • 简单的文件共享
    • 问题:不便用户文件的逻辑分类
  • 层次目录结构:现在使用的多级目录,主目录称为根目录,数据文件称为树叶,其他的目录称为树的结点

    • image-20230614113200552

    • 路径名:从树的根目录开始,把全部目录文件名和数据文件名,依次用/连接起来,即构成该数据文件的路径名

      • 系统中每个文件都有唯一的路径名
    • 当前目录:为每个进程设置一个当前目录,又称为工作目录。进程对各个文件的访问都相对于当前目录进行

    • 从当前目录到数据文件为止所构成的路径名称为相对路径名

    • 查询速度更快,层次结构更加清晰,能更有效地进行文件的管理和保护

    • image-20230614113435978

    • image-20230614113445202

    • image-20230614113450795

image-20230425093229031

文件共享和访问控制

文件共享的有效控制涉及两方面

  • 同时存取
  • 存取权限

image-20230614113929085

  • 实现文件共享的实质是可以从不同地方打开同一个文件
  • 首要步骤是找到文件的目录项进而读取文件在外存的起始地址

链接目录项实现文件共享

image-20230614114132198

image-20230614114146086

即有向无环图实现

利用索引结点实现文件共享

  • 文件物理地址及其它文件的属性相关信息,不再是存放在目录项中,而是放在索引结点中,在文件目录中只设置文件名和指向相应索引结点的指针
  • 可以通过共享文件索引结点来共享文件。当用户需要共享文件时,新建目录项将索引结点指针指向共享文件的索引结点

image-20230425201807257

利用符号链共享

image-20230425201848919

由系统创建一个Link类型的新文件,新文件中只包含被创文件的路径名

新文件中的路径名,则只被看作是符号链。当B要访问被链接的文件F且正要读LINK类新文件时,将被OS截获, OS根据新文件中的路径名去读该文件,于是就实现了用户B对文件F的共享。

  • 只是文件主才拥有指向其索引结点的指针,而共享文件的其他用户只有路径名
    • 优点:能连接任何机器上的文件
    • 缺点:备份可能产生多个拷贝

利用URL实现文件共享

image-20230614114750194

image-20230614114807336

总结

image-20230614114911649

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/656564.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

光线追踪中的空间划分,辐射度量学简介

之前接触过四岔树,这里用到了KD-tree和BSP-Tree KD-Tree 对于如何划分: 首先需要知道需要沿着哪一条轴进行划分,划分的位置所有节点不存在父节点上,只存在于叶节点上 对于如何查找 光线穿过包围盒A,那么分别对其两…

4.4 超简单文书编辑器:nano

在Linux系统当中有非常多的文书编辑器存在,其中最重要的是vim。 nano使用很简单,可以直接加上文件名就能够打开一个旧文件或新文件。打开一个叫text.txt的文件名来看看: [ctrl]-G:取得线上说明(help)&…

Python案例——采集专栏文章保存成pdf

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 环境使用: python 3.8 >>>>>> 运行代码 pycharm 2022.3 >>>>>> 辅助敲代码 wkhtmltopdf 软件 找助理邀课老师获取 模块使用: 内置模块 re >>>正则表达式 第三方模…

es6 的模块化由来

es 模块化,之前是没有的。没有的时候,用的是社区创建的commjs模块化 commjs模块其实是一个对象,这个对象要在代码运行的时候才会创建出来的 这有个不好的地方,就是不能在编译的时候找到依赖文件,也不能进行类型检查&…

一文搞定C++异常机制(附代码+详细解析)

C异常 1.引文C语言传统的处理错误的方式: 2.C异常概念3.异常的使用3.1 异常的抛出和捕获3.2 异常的重新抛出异常捕获中的内存泄漏问题 3.3异常安全3.4异常规范 4.异常优缺点5.总结: 1.引文 C语言传统的处理错误的方式: 终止程序&#xff0c…

【GAI】红杉美国生成式AI:一个创造性的新世界

The New Language Model Stack 红杉美国官网发表了最新一篇题为《Generative AI: A Creative New World》的文章译稿,,原文作者是红杉的两位合伙人:Sonya Huang和Pat Grady,有意思的是在文章作者一栏,赫然还写着GPT-3…

华为OD机试真题 JavaScript 实现【磁盘容量排序】【2022Q4 100分】,附详细解题思路

一、题目描述 磁盘的容量单位常用的有M,G,T这三个等级,它们之间的换算关系为1T 1024G,1G 1024M,现在给定n块磁盘的容量, 请对它们按从小到大的顺序进行稳定排序,例如给定5块盘的容量&#x…

宠物电商社区APP的设计与实现

摘 要:为了设计并实现具有宠物产品商城和问答社区功能的APP,通过比较国内外宠物行业电商发展现状和国内已有的宠物电商平台的优缺点,分析可行性和需求,从而进行详细设计和实现。该APP后台采用SSM框架,数据库使用MySQL…

最终版:1分钟自动部署数字人平台并提供web服务:唇形合成(wav2lip) + 超分修复(codeformer),

Demo效果 本文实现步骤:数字人形象(AI绘画) -> 文字转语音(谷歌tts) -> 表情迁移 -> 唇形合成 -> 视频超分 上述步骤所有技术均已在此专栏发布,可点击上方专栏查看具体博文 所有技术依赖环境及api接口均封装打包完毕,使用docker一键部署,预计耗时10分钟 原图 …

tolua源码分析(八)lua扩展继承C#类

tolua源码分析(八)lua扩展继承C#类 上一节我们阐述了lua调用带out参数的C#函数机制,本节我们来看下lua层是如何扩展C#类的。这次的例子在example 17,主要都是lua代码: LuaTransform { } …

1.pixi.js编写的塔防游戏(类似保卫萝卜)-设计逻辑

游戏说明 一个用pixi.js编写的h5塔防游戏,可以用electron打包为exe,支持移动端,也可以用webview控件打包为app在移动端使用 环境说明 cnpm6.2.0 npm6.14.13 node12.22.7 npminstall3.28.0 yarn1.22.10 npm config list electron_mirr…

1.2 聚合工程与springboot整合

步骤1&#xff1a; 在顶级父工程中添加springboot相关的pom配置 <!--springboot父级依赖&#xff0c;表示是一个是springboot项目 --> <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifa…

vue3(基于vite)项目初始基本配置

简介 一个好的项目开始搭建总是需要配置许多初始化配置&#xff0c;比如eslint语法检验、prettier代码格式统一、husky做commit拦截等等&#xff0c;本文从零开始带你一步步搭建一个完整的项目配置&#xff0c;熟悉之后下次直接拿来即用 环境准备 node v16以上pnpm 8.0.0 1.新…

4.3.3 info page

在所有的Unix Like系统当中&#xff0c;都可以利用 man 来查询指令或者是相关文件的用法&#xff1b; 但是&#xff0c;在Linux里面则又额外提供了一种线上求助的方法&#xff0c;那就是利用info。 基本上&#xff0c;info与man的用途其实差不多&#xff0c;都是用来查询指令的…

看完就会,从抓包到接口测试的全过程解析!

一、为什么抓包 1、从功能测试角度 通过抓包查看隐藏字段 Web 表单中会有很多隐藏的字段&#xff0c;这些隐藏字段一般都有一些特殊的用途&#xff0c;比如收集用户的数据&#xff0c;预防 CRSF 攻击&#xff0c;防网络爬虫&#xff0c;以及一些其他用途。这些隐藏字段在界面…

数据库大题

(计算题&#xff0c;20分) 设有两个关系R和S,求① R ∪ S R \cup S R∪S;② R − S R - S R−S;③ R S R \times S RS;④ ∏ C , A ( R ) \prod_{C,A}(R) ∏C,A​(R);⑤ σ B > ′ 4 ′ ( R ) \sigma_{B>4}(R) σB>′4′​(R) 关系R关系S (简答题&#xff0c;10…

Telnet是什么协议?如何使用?

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 ​编辑 一、Telnet是什么协议&#xff1f; 二、Telnet用在哪&#xff1f; 三、Telnet协议的优点和缺点 ​编辑 1、优点 ①简单易…

Microservice架构模式简介

在2014年&#xff0c;Sam Newman&#xff0c;Martin Fowler在ThoughtWorks的一位同事&#xff0c;出版了一本新书《Building Microservices》。该书描述了如何按照Microservice架构模式设计及搭建一个具有良好扩展性并可持续开发的系统。除此之外&#xff0c;该书还将基于该模式…

pygame光栅化三角形 用像素填充三角形

参考文章 DirectX C 3D编程基础 5 [三角形光栅化] 自制中字 这次用像素填充三角形&#xff0c;是为了下次用图片做纹理填充三角形做准备。 前面的文章说了根据直线方程求出已知两点间任意一点的坐标&#xff0c;现在来试试用像素填充三角形。 首先画一个三角形 pygame.draw.…

whisperX 语音识别本地部署

WhisperX 是一个优秀的开源Python语音识别库。 下面记录Windows10系统下部署Whisper 1、在操作系统中安装 Python环境 2、安装 CUDA环境 3、安装Annaconda或Minconda环境 4、下载安装ffmpeg 下载release-builds包&#xff0c;如下图所示 将下载的包解压到你想要的路径&#xf…