【操作系统概念】第11章:文件系统实现

文章目录

  • 0.前言
  • 11.1 文件系统结构
  • 11.2 文件系统实现
    • 11.2.1 虚拟文件系统
  • 11.3 分配方法
    • 11.3.1 连续分配
    • 11.3.2 链接分配
    • 11.3. 3 索引分配
  • 11.5 空闲空间管理
    • 11.5.1 位图/位向量
    • 11.5.2 链表
    • 11.5.3 组

0.前言

正如第10章所述,文件系统提供了机制,以在线存储和访问文件内容,包括数据和程序。文件系统永久驻留在外存上,而外存设计成永久容纳大量数据。本章主要关注大多数常用外存即磁盘上的文件存储与访问问题。我们讨论各种方法,用于组织文件使用、分配磁盘空间、恢复空闲空间、跟踪数据位置以及操作系统其他部分与外存的接口等。本章也将讨论性能问题。

本章目标:

  1. 描述本地文件系统和目录结构的实现细节
  2. 描述远程文件系统的实现
  3. 讨论块分配和空闲块的算法和平衡

11.1 文件系统结构

磁盘提供大量的外存空间来维持文件系统。磁盘的下述两个特点使得其成为存储多个文件的方便介质。
①可以原地重写;
②可以直接访问磁盘上的任意一块信息。

为了提供对磁盘的高效且便捷的访问,操作系统通过文件系统来轻松地存储、定位、提取数据。文件系统有两个设计问题。
①定义文件系统对用户的接口
②创建数据结构和算法来将逻辑文件系统映射到物理外存设备上
另外,与内存管理的部分方式相同,磁盘同样是以块为单位进行转移的。每块为一个或多个扇区
在这里插入图片描述

  • IO控制为最底层,提供设备驱动程序和中断处理程序。实现内存和磁盘之间的信息传输
  • 基本文件系统发送命令,对磁盘上的物理块进行读写。 每个块通过磁盘地址标识(驱动器,柱面,磁道,扇区)
  • 文件组织模块将逻辑地址转换为物理地址,管理文件的逻辑块。同时含有空闲空间管理器,跟踪未分配的块,并根据要求提供给文件组织模块。
  • 逻辑文件系统管理元数据,管理目录结构,提供给文件组织模块必要的信息。以及通过文件控制块(file control block,FCB)维护文件结构

11.2 文件系统实现

11.2.1 虚拟文件系统

在这里插入图片描述
现代操作系统必须支持多个文件系统类型,因此操作系统必须把多个文件系统整合为一个目录结构。

  • 一个简单但不是很好的方法是为每个文件系统编写目录和文件程序。但这不面向对象。

因此可以将文件系统分为三个层次。

  1. 文件系统接口:包括open(),read(),write(),close()调用及文件描述符。
  2. 虚拟文件系统层(VFS层):区分本地文件和远程文件,并根据文件系统类型进一步区分不同本地文件。
    VFS定义了一个清晰的VFS接口,将文件系统的通用操作和具体实现分开。
    提供网络上唯一标识一个文件的机制。(基于vnode的文件表示结构)
  3. 各个类型的本地文件系统:通过VFS结合在一起,并由文件系统接口调用。
    VFS根据文件系统类型调用特定文件类型操作以处理本地请求,通过调用NFS协议程序来处理远程请求。

VFS层有两个目的:

  • VFS层通过定义一个清晰的VFS接口,以将文件系统的通用操作和具体实现分开。多个VFS接口的实现可以共存在同一台机器上,他允许访问已安装在本地的多个类型的文件系统。
  • VFS提供了在网络上唯一标识一个文件的机制。VFS基于称为vnode的文件表示结构。UNIX内核中为每个活动节点(文件或目录)保存一个vnode结构

11.3 分配方法

磁盘是直接访问的,非常灵活,其可以存储多个文件,所以一个问题是如何为这些文件分配空间,以便有效的访问和索引这些文件。

主要的分配方法有连续、链接、索引,每种方法有其优缺点。

常见的一个系统只支持一种分配方法,但也有系统支持多种分配方法

11.3.1 连续分配

连续分配(contiguous allocation) 要求每个文件在磁盘上占有一系列连续的块。
在这里插入图片描述
优点:

在访问块b后访问块b+1通常不需要移动磁头,当需要移动时(读到当前磁道末),只需要移动一个磁道。因此访问连续分配文件需要的寻道数最小。性能较好。
访问容易,连续分配支持顺序访问和直接访问

缺点:

如何为新文件找到空间,这是一个动态存储分配问题(第八章提到过),相关的算法会产生外部碎片问题

外部碎片的一个解决方案是合并(compact),即将小的空闲空间合并起来,而将其他存储的数据变成连续数据。显而易见这种方式的主要开销是时间,因为需要很多的IO操作。不能扩展
另一方面,这种方式还需要确定一个文件占用多少空间。文件的大小有时候可能比较好确定,但通常比较难以确定。

11.3.2 链接分配

在这里插入图片描述
采用链接分配(linked allocation),每个文件是磁盘块的链表。目录包括文件第一块的指针和最后一块的指针。每一块都有指向下一块的指针。

采用链接分配,每一个目录条目都有一个指向文件首块的指针。这些指针一开始均为nil(代表空指针,表示空文件)。

  • 在写文件时就可以通过空闲空间管理系统找到一个空闲块。
  • 在读文件时,通过块到块的指针就可以简答的读块。

优点:
没有外部碎片,空闲空间的任何一块都可以满足要求。
创建文件时,不需要说明文件大小。
不需要合并磁盘空间
可以说链接分配解决了连续分配的所有问题。

缺点:
只能用于顺序访问,要找到中间位置,必须跟随指针一块一块的移动。
指针需要空间。
可靠性较低。如果硬盘损坏,若损坏的是指针,那么这可能导致链接到错误的位置。

第一个问题的一个解决方案是采用链接分配方式的变种:文件分配表(FAT),具体参考P365
在这里插入图片描述
第二个问题的一个解决方式是将块合并为族,指针按族分配而不是按块分配,一个族包含多个块。这样就减少了指针的使用。但这样的问题就是会增加内部碎片。

第三个问题的解决方式是增加双向链表或在每个块中存文件名和相对块数,不过这也将导致开销增大。

11.3. 3 索引分配

链接分配解决了外部碎片和大小的声明问题,但如果不使用FAT,那么就没有办法有效的支持直接访问。

索引分配(index allocation) 把所有的指针存放在一起,通过索引块解决这一问题。

索引块是一个磁盘块地址的数组。

每个文件都有索引块,其第i块指向文件的第i个块。目录条目包含索引块的地址。要读第i块只需要通过索引块的第i个条目的指针查找和读取即可。

创建文件时,索引块所有指针都设置为nil,开始写第i块时,即从空闲空间管理系统中获取一块,并将指针设置为该地址。

**优点:**没有外部碎片,并且支持直接访问。因为磁盘上任何一个位置都可以通过索引获取。
缺点: 浪费空间。索引块的开销比指针要大很多。

针对缺点的解决方案:

  1. 链接方案:一个索引块通常为一个磁盘块,因此,它本身能直接读写。为了处理大文件,可以将多个索引块链接起来
  2. 多层索引:用第一层索引块指向一组第二层的索引块,第二层索引块再指向文件块,这是链接表示的一种变种。
  3. 组合方案:将索引块的头15个指针存在文件的inode中。这其中的前12个指针指向直接块。其他的3个指针指向间接块。第一个间接块为一级间接块的地址,第二个间接块为二级间接块的指针,第三个间接块为三级间接块指针

11.5 空闲空间管理

系统需要维护一个空闲空间链表(free-space list),该链表记录了所有的空闲磁盘空间,并在创建文件时,能够从该链表搜索并返回一段空闲空间。
虽然名字称为链表,但实现形式不一定表现为链表。这一点要注意

11.5.1 位图/位向量

采用位图(bit map)或位向量(bit vector),每块用一位表示,分配表示1,未分配表示0
优点:查找空闲块和n个连续空闲块相对简单和高效。

缺点:除非将整个位图都放在内存中方便及时查询,否则其效率就不是很高。这对于小型磁盘是完全可以的,但对大型磁盘,就需要相对较多的内存。

11.5.2 链表

将空闲磁盘块用链表连接起来,并将指向第一个空闲磁盘块的指针保存在磁盘的特殊位置,并同时放置到内存中。
在这里插入图片描述
这种方案的效率不高,因为遍历一遍链表需要大量的IO,但通常分配空闲空间不需要遍历,只需要将第一块分配即可。

11.5.3 组

组是对链表的一个改进,组将n个空闲块的地址存在第一个空闲块中。这n个空闲块的最后一个包含了另外n个空闲块的地址。
采用这种方式,大量的空闲块可以很快的找到。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机设计大赛 疫情数据分析与3D可视化 - python 大数据

文章目录 0 前言1 课题背景2 实现效果3 设计原理4 部分代码5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 大数据全国疫情数据分析与3D可视化 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐&#xff0…

Halcon深度学习,异常值缺陷检测

前言 halcon深度学习分为常见的4大类。分类,语义分割,异常值检测,深度OCR。本篇主要针对halcon的异常值检测,如何训练和部署,并通过图像预处理的方式实现对异常值缺陷检测的精准实现。 异常值检测不同于语义分割的项目…

【python】异常处理

前言 省略各种废话,直接快速整理知识点 try-except 基础 作用 程序不可能永远都是对的,当7除a,a由用户输入时,用户输入0就会报错。try-except就是解决这些问题。 结构 多分支自定义错误类型 上方的exception是一个错误类型…

Unity编辑器功能Inspector快捷自动填充数据和可视化调试

我们有时候可能需要在面板增加一些引用,可能添加脚本后要手动拖动,这样如果有大量的脚本拖动也是不小的工作量 实例 例如:我的脚本需要添加一个Bone的列表,一个个拖动很麻烦。 实现脚本 我们可以用这样的脚本来实现。 public…

Python 3 教程(2)

Python3 基础语法 编码 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码: # -*- coding: cp-1252 -*- 上述定义允许在源文件中使用 Windows-1252 字符集中的字符编码&…

JavaSec 基础之 URLDNS 链

文章目录 URLDNS 链分析调用链复现反序列化复现 URLDNS 链分析 URLDNS是ysoserial里面就简单的一条利用链,但URLDNS的利用效果是只能触发一次dns请求,而不能去执行命令。比较适用于漏洞验证这一块,而且URLDNS这条利用链并不依赖于第三方的类…

幕译--本地字幕生成与翻译--Whisper客户端

幕译–本地字幕生成与翻译 本地离线的字幕生成与翻译,支持GPU加速。可免费试用,无次数限制 基于Whisper,希望做最好的Whisper客户端 功能介绍 本地离线,不用担心隐私问题支持GPU加速支持多种模型支持(中文、英语、日…

web服务,C/S框架,单设备登陆实现方案

背景: 原登陆接口,校验密码通过后,使用springsession记录会话信息,将信息存入在redis中 基于原逻辑进行多设备登陆开发,默认的时候多设备登陆开关开启,即按原来逻辑处理,只要密码登陆校验成功之后,都会将当前的会话信息存入redis中. 当多设备开关关闭时候,同一个账号同一时间只…

Vue.js+SpringBoot开发高校大学生创业管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统公告模块2.2 创业项目模块2.3 创业社团模块2.4 政府政策模块2.5 创业比赛模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 系统公告表3.2.2 创业项目表3.2.3 创业社团表3.2.4 政策表 四、系统展示五、核心代码5.…

【Spring Boot 源码学习】BootstrapContext的实际使用场景

《Spring Boot 源码学习系列》 BootstrapContext的实际使用场景 一、引言二、往期内容三、主要内容3.1 BootstrapContext3.2 BootstrapRegistry 初始化器实现3.3 BootstrapContext 的实际使用场景3.3.1 早期启动时3.3.2 环境配置准备完成时3.3.3 应用上下文准备完成后关闭 Boot…

Normalizer(归一化)和MinMaxScaler(最小-最大标准化)的区别详解

1.Normalizer(归一化)(更加推荐使用) 优点:将每个样本向量的欧几里德长度缩放为1,适用于计算样本之间的相似性。 缺点:只对每个样本的特征进行缩放,不保留原始数据的分布形状。 公式…

Linux--gdb(调试工具)

1. 背景 程序的发布方式有两种,debug模式和release模式 Linux gcc/g出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项 2. 命令 gdb binFile 退出: ctrl d 或 quit 调试命令&am…

如何压缩PDF文件大小?看完这篇文章,即可实现无损压缩!

平时工作或生活中,很多小伙伴是不是经常喜欢用PDF格式进行文件的保存,毕竟它具有较高的兼容性,且在不同设备中打开也不会出现排版错乱的情况。不过有时候PDF文件会因为内容过大,占用的内存过多,从而导致电脑卡顿的情况…

深入理解MySQL中的MVCC(多版本并发控制)

在MySQL中,MVCC是一种用于提供并发控制的技术,它允许数据库系统在事务并发执行的情况下保持数据的一致性,同时提高了数据库的并发性能。MVCC背后的理念是允许每个事务可以看到一个一致性的快照,从而避免了读取操作被写入操作所阻塞…

【Python刷题】环形链表

问题描述 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&a…

树网的和 题解

先放一张图 作为一道蓝题,其实快接近紫题了。 --------------------------------------不怎么华丽的分割线-------------------------------------- 前置芝士:树的直径 一个点的最远点( y y y)到这个最远点的最远点( p p p)一定是一条树的直径。 假若…

Winform窗体随着屏幕的DPI缩放,会引起窗体变形及字体变形,superTabControl标签字体大小不匹配

一、前言 superTabControl做的浏览器标签(cefsharp)在缩放比例(125%,150%时字体不协调) 物联网浏览器,定制浏览器,多媒体浏览器(支持H264)参考栏目文章即可 二、配置参数 app.manifest参数 dpiAware =true <application xmlns="urn:schemas-microsoft-c…

Python快速入门系列-1

Python快速入门系列 第一章: Python简介1.1 Python的历史与发展1.2 Python的优势与特点1.2.1 易学易用1.2.2 动态类型1.2.3 丰富的标准库与第三方库1.2.4 面向对象与函数式编程1.2.5 广泛应用领域 1.3 Python的应用领域 第一章: Python简介 1.1 Python的历史与发展 Python是一…

Vue+SpringBoot打造个人健康管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 健康档案模块2.2 体检档案模块2.3 健康咨询模块 三、系统展示四、核心代码4.1 查询健康档案4.2 新增健康档案4.3 查询体检档案4.4 新增体检档案4.5 新增健康咨询 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpri…

python 蓝桥杯之并查集

文章目录 总述合并过程查找过程算法实战实战1 总述 并查集&#xff08;Disjoint-set Union&#xff0c;简称并查集&#xff09;是一种用来管理元素分组情况的数据结构。它主要用于解决集合的合并与查询问题&#xff0c;通常涉及到以下两种操作&#xff1a; 合并&#xff08;Uni…