【操作系统概念】第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个空闲块的地址。
采用这种方式,大量的空闲块可以很快的找到。

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

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

相关文章

系统架构设计师——计算机系统基础知识

计算机系统基础知识 计算机硬件基础知识、计算机软件基础知识、计算机语言、多媒体技术等内容 1.1 计算机系统概述 计算机系统的定义与组成计算机系统(Computer System)是指用于数据管理的计算机硬件、软件及网络组成的系统。(软件硬件&am…

编程笔记 html5cssjs 004 网页基本结构 2035年倒计时

编程笔记 html5&css&js 004 网页基本结构 2035年倒计时 一、代码二、解释 这段HTML代码实现了一个倒计时页面&#xff0c;倒计时的目标日期是2035年1月1日。页面中使用一个<div>元素显示倒计时的天数、小时数、分钟数和秒数。 一、代码 <!DOCTYPE html> &…

springboot251基于springboot-vue的毕业论文管理系统

毕业论文管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本毕业论文管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短…

视频批量混剪剪辑,批量剪辑批量剪视频,探店带货系统,精细化顺序混剪,故事影视解说,视频处理大全,精细化顺序混剪,多场景裂变,多视频混剪

前言 工具的产生源于dy出的火山引擎的云视频混剪制作是按分钟数收费的&#xff0c;这个软件既能实现正常混剪也能避免二次收费。属于FFMPEG合成的。 欢迎大家给一些好的建议和功能&#xff0c;回复可见&#xff0c;附加了一些天卡&#xff0c;周卡&#xff0c;请大家不要一人占…

JavaSec 基础之 URLDNS 链

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

Node.js是什么?

概念&#xff1a;Node.js1运行在服务器端的js&#xff0c;用来编写服务器 特点&#xff1a;单线程、异步、非阻塞、统一API 是一个构建在V8引擎之上的js运行环境&#xff0c;它使得js可以运行在浏览器以外的地方&#xff0c;相对于大部分的服务器端语言来说&#xff0c;Node.J…

练习3-softmax分类(李沐函数简要解析)与d2l.train_ch3缺失的简单解决方式

环境为:练习1的环境 网址为:https://www.bilibili.com/video/BV1K64y1Q7wu/?spm_id_from333.1007.top_right_bar_window_history.content.click 代码简要解析 导入模块 导入PyTorch 导入Torch中的nn模块 导入d2l中torch模块 并命名为d2l import torch from torch import nn…

Neo4j安装 Linux:CentOS、openEuler 适配langchain应用RAG+知识图谱开发 适配昇腾910B

目录 Neo4j下载上传至服务器后进行解压运行安装JAVA再次运行在windows端打开网页导入数据 Neo4j下载 进入Neo4j官网下载页面 向下滑动找到 Graph Database Self-Managed 选择 社区版&#xff08;COMMUNITY&#xff09; 选择 Linux / Mac Executable Neo4j 5.17.0 (tar) 单机下…

分销商城微信小程序:用户粘性增强,促进复购率提升

在数字化浪潮的推动下&#xff0c;微信小程序作为一种轻便、高效的移动应用形式&#xff0c;正成为越来越多企业开展电商业务的重要平台。而分销商城微信小程序的出现&#xff0c;更是为企业带来了前所未有的机遇。通过分销商城微信小程序&#xff0c;企业不仅能够拓宽销售渠道…

产品推荐 - 基于矽海达 SEM9363的无线数字图传编码开发板

Sihid SEM9363无线数字图传编码调制板(A版本)通过HDMI接口输入高清数字视频到Hi3516A处理器做H.264压缩编码&#xff0c;压缩后的视频信号通过FPGA实现COFDM信道调制&#xff0c;再经AD936x转换为模拟信号调制发射出去。 SEM9363板功能与技术规格 通过Micro HDMI接口输入数字视…

生活的色彩--爱摸鱼的美工(17)

题记 生活不如意事十之八九&#xff0c; 恶人成佛只需放下屠刀&#xff0c;善人想要成佛却要经理九九八十一难。而且历经磨难成佛的几率也很小&#xff0c;因为名额有限。 天地不仁以万物为刍狗&#xff01; 小美工记录生活&#xff0c;记录绘画演变过程的一天。 厨房 食…

AI探索实践12 - Typescript开发AI应用4:大模型响应数据的格式化输出

大家好&#xff0c;我是feng&#xff0c;感谢你阅读我的博文&#xff0c;如果你也关注AI应用开发&#xff0c;欢迎关注公众号和我一起​探索。如果文章对你有所启发&#xff0c;请为我点赞&#xff01; 一、重点回顾 在介绍本文之前的文章中&#xff0c;我们先来回顾一下使用L…

Google OAuth2.0获取授权信息返回的id_token如何解析

背景 我们在做google登录的时候&#xff0c;第一步先要获取授权码code&#xff0c;在得到code之后会根据code拿到授权的token信息&#xff0c;token信息中包含&#xff1a;access_token&#xff0c;refresh_token&#xff0c;scope&#xff0c;token_type&#xff0c;expires_…

两天学会微服务网关Gateway-Gateway过滤器

锋哥原创的微服务网关Gateway视频教程&#xff1a; Gateway微服务网关视频教程&#xff08;无废话版&#xff09;_哔哩哔哩_bilibiliGateway微服务网关视频教程&#xff08;无废话版&#xff09;共计17条视频&#xff0c;包括&#xff1a;1_Gateway简介、2_Gateway工作原理、3…

前端React篇之React中什么是受控组件和非控组件?

目录 React中什么是受控组件和非控组件&#xff1f;受控组件非受控组件 React中什么是受控组件和非控组件&#xff1f; 在React中&#xff0c;受控组件和非受控组件是两种表单元素的状态管理方式。 受控组件 受控组件&#xff08;Controlled Component&#xff09;是指其值由…

探秘Solr:解密搜索引擎背后的原理与应用(一)

本系列文章简介&#xff1a; 在本系列文章中&#xff0c;我们将从Solr的基本概念开始&#xff0c;解释索引和搜索是如何工作的&#xff0c;深入探讨倒排索引、分词器和搜索算法等关键概念。接着&#xff0c;我们将了解Solr的工作原理&#xff0c;从数据导入和索引构建到搜索流程…

数据结构 - 栈和队列

本篇博客将介绍栈和队列的定义以及实现。 1.栈的定义 栈是一种特殊的线性表&#xff0c;只允许在固定的一端进行插入和删除数据&#xff0c;插入数据的一端叫做栈顶&#xff0c;另一端叫做栈底。栈中的数据遵守后进先出的原则 LIFO (Last In First Out)。 插入数据的操作称为压…

如何借助私域营销在医美行业中脱颖而出?

在现今这个以貌取人的社会&#xff0c;外貌焦虑已变得司空见惯。美丽往往能给人带来更多的瞩目和机遇&#xff0c;但天生丽质并非人人可得。随着经济的繁荣和消费结构的升级&#xff0c;颜值经济开始崭露头角&#xff0c;医美行业因此受到了广大消费者的青睐&#xff0c;迎来了…

Leetcode 剑指 Offer II 068.搜索插入位置

题目难度: 简单 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个排序的整数数组 nums 和一个整数目标值 target &#xf…

阿波罗登月需要解决飞行控制问题,数学家卡尔曼在维纳控制的基础上提出了卡尔曼滤波

说到登月&#xff0c;很多人只想到和火箭以及航天器相关的技术&#xff0c;其实登月离不开信息技术的革命。因为从飞行控制到远程通信&#xff0c;都需要解决很多过去从未遇到过的难题。 登月首先要保证在月球上着陆的地点准确&#xff0c;而且要保证返回火箭和飞船能够在月球轨…