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

news2025/2/27 19:49:59

文章目录

  • 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个空闲块的地址。
采用这种方式,大量的空闲块可以很快的找到。

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

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

相关文章

【数据分享】2000-2022年全国1km分辨率的逐年PM2.5栅格数据(免费获取)

PM2.5作为最主要的空气质量指标,在我们日常研究中非常常用!之前我们给大家分享了2013-2022年全国范围逐日的PM2.5栅格数据(可查看之前的文章获悉详情)! 本次我们给大家带来的是2000-2022年全国范围的逐年的PM2.5栅格数…

树莓派4B Ubuntu20.04 Python3.9安装ROS踩坑记录

问题描述 在使用sudo apt-get update命令更新时发现无法引入apt-pkg,使用python3 -c "import apt_pkg"发现无法引入,应该是因为:20.04的系统默认python是3.8,但是我换成了3.9所以没有编译文件,于是使用sudo update-alte…

K8S - 在任意node里执行kubectl 命令

当我们初步安装玩k8s (master 带 2 nodes) 时 正常来讲kubectl 只能在master node 里运行 当我们尝试在某个 node 节点来执行时, 通常会遇到下面错误 看起来像是访问某个服务器的8080 端口失败了。 原因 原因很简单 , 因为k8s的各个组建&…

思科网络中如何配置标准ACL协议

一、什么是标准ACL协议?有什么作用及配置方法? (1)标准ACL(Access Control List)协议是一种用于控制网络设备上数据流进出的协议。标准ACL基于源IP地址来过滤数据流,可以允许或拒绝特定IP地址范…

微信私信短剧机器人源码

本源码仅提供参考,有能力的继续开发 接口为api调用 云端同步 https://ys.110t.cn/api/ajax.php?actyingshilist 影视搜索 https://ys.110t.cn/api/ajax.php?actsearch&name剧名 每日更新 https://ys.110t.cn/api/ajax.php?actDaily 反馈接口 https://ys.11…

机器学习-pytorch1(持续更新)

上一节我们学习了机器学习的线性模型和非线性模型的机器学习基础知识,这一节主要将公式变为代码。 代码编写网站:https://colab.research.google.com/drive 学习课程链接:ML 2022 Spring 1、Load Data(读取数据) 这…

Chain of Verification(验证链、CoVe)—理解与实现

原文地址:Chain of Verification (CoVe) — Understanding & Implementation 2023 年 10 月 9 日 GitHub 存储库 介绍 在处理大型语言模型(LLM)时,一个重大挑战,特别是在事实问答中,是幻觉问题。当答案…

排序算法全景:从基础到高级的Java实现

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

【红外与可见光融合:条件学习:实例归一化(IN)】

Infrared and visible image fusion based on a two-stage class conditioned auto-encoder network (基于两级类条件自编码器网络的红外与可见光图像融合) 现有的基于自动编码器的红外和可见光图像融合方法通常利用共享编码器从不同模态中提取特征&am…

Java17 --- springCloud之LoadBalancer

目录 一、LoadBalancer实现负载均衡 1.1、创建两个相同的微服务 1.2、在客户端80引入loadBalancer的pom 1.3、80服务controller层&#xff1a; 一、LoadBalancer实现负载均衡 1.1、创建两个相同的微服务 1.2、在客户端80引入loadBalancer的pom <!--loadbalancer-->&…

ARTS Week 20

Algorithm 本周的算法题为 1222. 可以攻击国王的皇后 在一个 下标从 0 开始 的 8 x 8 棋盘上&#xff0c;可能有多个黑皇后和一个白国王。 给你一个二维整数数组 queens&#xff0c;其中 queens[i] [xQueeni, yQueeni] 表示第 i 个黑皇后在棋盘上的位置。还给你一个长度为 2 的…

js【详解】async await

为什么要使用 async await async await 实现了使用同步的语法实现异步&#xff0c;不再需要借助回调函数&#xff0c;让代码更加易于理解和维护。 (async function () {// await 必须放在 async 函数中try {// 加载第一张图片const img1 await loadImg1()// 加载第二张图片co…

Linux网络套接字之UDP网络程序

(&#xff61;&#xff65;∀&#xff65;)&#xff89;&#xff9e;嗨&#xff01;你好这里是ky233的主页&#xff1a;这里是ky233的主页&#xff0c;欢迎光临~https://blog.csdn.net/ky233?typeblog 点个关注不迷路⌯▾⌯ 实现一个简单的对话发消息的功能&#xff01; 目录…

力扣---腐烂的橘子

题目&#xff1a; bfs思路&#xff1a; 感觉bfs还是很容易想到的&#xff0c;首先定义一个双端队列&#xff08;队列也是可以的~&#xff09;&#xff0c;如果值为2&#xff0c;则入队列&#xff0c;我这里将队列中的元素定义为pair<int,int>。第一个int记录在数组中的位…

毅速3D打印随形透气钢:模具困气排气革新之选

在注塑生产过程中&#xff0c;模具内的气体若无法有效排出&#xff0c;往往会引发困气现象&#xff0c;导致产品表面出现气泡、烧焦等瑕疵。这些瑕疵不仅影响产品的美观度&#xff0c;更可能对其性能造成严重影响&#xff0c;甚至导致产品报废&#xff0c;从而增加生产成本。 传…

【C语言】linux内核tcp_write_xmit和tcp_write_queue_purge

tcp_write_xmit 一、讲解 这个函数 tcp_write_xmit 是Linux内核TCP协议栈中的一部分&#xff0c;其基本作用是发送数据包到网络。这个函数会根据不同情况推进发送队列的头部&#xff0c;确保只要远程窗口有空间&#xff0c;就可以发送数据。 下面是对该函数的一些主要逻辑的中…

C语言--函数指针变量和函数指针数组的区别(详解)

函数指针变量 函数指针变量的作用 函数指针变量是指向函数的指针&#xff0c;它可以用来存储函数的地址&#xff0c;并且可以通过该指针调用相应的函数。函数指针变量的作用主要有以下几个方面&#xff1a; 回调函数&#xff1a;函数指针变量可以作为参数传递给其他函数&…

基于pytorch的视觉变换器-Vision Transformer(ViT)的介绍与应用

近年来&#xff0c;计算机视觉领域因变换器模型的出现而发生了革命性变化。最初为自然语言处理任务设计的变换器&#xff0c;在捕捉视觉数据的空间依赖性方面也显示出了惊人的能力。视觉变换器&#xff08;Vision Transformer&#xff0c;简称ViT&#xff09;就是这种变革的一个…

链表基础知识详解

链表基础知识详解 一、链表是什么&#xff1f;1.链表的定义2.链表的组成3.链表的优缺点4.链表的特点 二、链表的基本操作1.链表的建立2.链表的删除3.链表的查找4.链表函数 一、链表是什么&#xff1f; 1.链表的定义 链表是一种物理存储单元上非连续、非顺序的存储结构&#xf…

人工智能|机器学习——K-means系列聚类算法k-means/ k-modes/ k-prototypes/ ......(划分聚类)

1.k-means聚类 1.1.算法简介 K-Means算法又称K均值算法&#xff0c;属于聚类&#xff08;clustering&#xff09;算法的一种&#xff0c;是应用最广泛的聚类算法之一。所谓聚类&#xff0c;即根据相似性原则&#xff0c;将具有较高相似度的数据对象划分至同一类簇&#xff0c;…