操作系统 4.4-从生磁盘到文件

news2025/4/19 4:34:43

文件介绍

操作系统中对磁盘使用的第三层抽象——文件。这一层抽象建立在盘块(block)和文件(file)之间,使得用户可以以更直观和易于理解的方式与磁盘交互,而无需直接处理磁盘的物理细节如扇区(sector)、柱面(cylinder)和磁头(head)。

  1. 用户视角的文件

    • 在用户眼中,文件是字符序列或字符流的集合。用户通常通过文件名和路径来访问文件,而不是直接操作磁盘的物理地址。

  2. 磁盘上的文件

    • 在磁盘上,文件被存储为一系列的盘块集合。这些盘块在物理上可能不是连续的,但文件系统通过文件系统的索引结构(如inode或文件分配表)来跟踪这些盘块。

  3. 文件抽象

    • 文件抽象是操作系统提供的一种机制,它将用户对文件的操作转换为对盘块的操作。这种抽象隐藏了磁盘的物理细节,使得用户可以透明地读写文件。

  4. 字符流到盘块集合的映射

    • 操作系统负责建立字符流(即用户文件内容)和盘块集合之间的映射关系。这意味着用户写入文件的数据会被操作系统分割并存储到磁盘上的不同盘块中,而读取文件时,操作系统会重新组合这些盘块中的数据以重建原始的字符流。

  5. 文件系统的作用

    • 文件系统不仅管理文件和目录的层次结构,还管理文件数据到磁盘块的映射。它处理文件的创建、删除、读写等操作,并确保数据的一致性和完整性。

  6. 简化用户操作

    • 通过引入文件抽象,用户无需了解磁盘的物理结构和复杂的I/O操作,可以像操作本地文件一样简单地操作磁盘文件。

文件的建立

数组映射

映射的作用

  1. 文件与盘块的映射

    • 文件系统中,文件内容被映射到磁盘上的一系列盘块。这种映射关系由文件系统维护,对用户透明。

    • 图中显示了文件 test.c 的一部分内容(200-212字符)被映射到磁盘块789。

  2. 连续结构实现文件

    • 文件在磁盘上可能不是连续存储的,但文件系统通过映射信息将这些分散的盘块组织成一个逻辑上的连续文件。

  3. 读写操作

    • 用户对文件的读写操作(读入、修改、读出)通过文件系统转换为对相应盘块的操作。

  4. 处理文件修改

    • 当文件被修改时(如删除字符),文件系统需要更新映射信息,以反映新的文件内容和结构。

如何工作

具体来说,它描述了文件如何在磁盘上存储,以及操作系统如何通过文件控制块(FCB)来管理文件的存储位置。以下是图中内容的详细解释:

  1. 文件内容与FCB(File Control Block)

    • 图中显示了一个C语言文件test.c,其中包含一个main()函数。

    • 文件的FCB记录了文件名、起始块和块数等信息。例如,test.c的FCB显示文件名是test.c,起始块是6,块数是3。

  2. 文件内容的映射

    • 文件内容被映射到磁盘上的块中。图中显示了test.c文件中的一段内容(200-212字符)被映射到磁盘块789。

    • 这种映射是通过文件系统将文件内容分割成多个块,并在FCB中记录每个块的磁盘位置来实现的。

  3. 文件操作

    • 图中还展示了文件的读写操作。用户可以通过FCB找到文件的起始块和块数,然后进行读取、修改等操作。

    • 例如,图中显示了一个操作员正在删除test.c文件中的200-212字符。

优缺点

图中实现映射的方式将文件内容映射到一系列连续的盘块,类似于数组索引的方式。这种映射方式通常称为连续分配(contiguous allocation)或连续分配策略。以下是这种映射方式的优缺点:

优点
  1. 简单性

    • 映射方式简单直接,易于理解和实现。

  2. 访问速度

    • 由于文件数据存储在连续的盘块上,顺序访问速度很快

  3. 缓存效率

    • 连续存储的数据可以更好地利用缓存机制,提高整体性能。

  4. 无碎片

    • 不会产生外部碎片,因为文件占用的是连续的磁盘空间。

  5. 易于扩展

    • 文件扩展时只需分配额外的连续空间,操作简单。

缺点

  1. 灵活性差

    • 文件大小固定,不适合大小频繁变化的文件。

  2. 扩展困难

    • 如果需要扩展文件,可能需要重新分配一块连续空间并复制数据,效率低

  3. 碎片化问题

    • 删除文件后,可能会在磁盘上留下不连续的空闲空间,导致碎片化。

  4. 单点故障风险

    • 如果存储文件映射信息(如文件大小、起始块号等)损坏,可能导致整个文件不可访问。


链式映射

链式映射是一种文件存储结构,其中文件的每个块通过指针链接到下一个块

实现方式和工作原理

  1. 文件控制块(FCB)

    • 每个文件都有一个FCB,其中包含文件的基本信息,如文件名、起始块地址等。

    • 在链式结构中,FCB还包含指向文件第一个块的指针。

  2. 块链接

    • 文件的每个数据块都包含数据以及一个指向下一个数据块的指针。

    • 最后一个数据块的指针通常设置为NULL,表示链的结束。

  3. 访问文件

    • 操作系统通过FCB找到文件的第一个块,然后通过块间的指针顺序访问文件的所有块

    • 这种结构允许文件在存储时不必是连续的,从而更有效地利用磁盘空间。

优缺点:

优点:
  1. 文件长度增减容易

    • 由于文件块是通过指针链接的,添加或删除块只需要修改相关块的指针,不需要移动大量数据。

    • 这使得文件的动态扩展和收缩变得简单和高效。

  2. 空间利用率高

    • 文件块可以分布在磁盘的任何位置,这有助于减少磁盘空间的浪费,特别是在文件大小经常变化的情况下。

缺点:
  1. 顺序访问慢

    • 由于文件块可能分散在磁盘的不同位置,顺序访问文件时需要频繁地寻道和旋转延迟,这会降低访问速度。

    • 这种结构不适合需要频繁顺序访问的应用场景。

  2. 可靠性差

    • 如果某个块的指针损坏或丢失,可能会导致整个文件无法访问。

    • 需要额外的机制来维护数据的一致性和完整性。

  3. 管理开销大

    • 每个块都需要额外的指针空间,这增加了存储开销。

    • 操作系统需要更多的时间来管理这些指针和块。

索引映射

索引结构是文件系统中的一种文件存储方式,它结合了连续分配和链式分配的优点,以提高文件访问的效率和灵活性。以下是索引结构的实现方式、工作原理以及其优缺点:

实现方式和工作原理:

  1. 索引块(Index Block)

    • 索引结构使用一个或多个索引块来存储指向文件数据块的指针

    • 索引块可以是一级索引、二级索引或多级索引,具体取决于文件的大小和系统的实现。

  2. 一级索引

    • 在一级索引结构中,FCB包含一个索引块的地址,该索引块直接包含指向所有数据块的指针。

    • 这种方式适用于小型文件,因为索引块的大小有限。

  3. 二级或多级索引

    • 对于大型文件,可以使用二级或多级索引。在二级索引中,索引块包含指向其他索引块的指针,这些索引块再包含指向数据块的指针。

    • 这种方式可以支持更大的文件,但增加了查找数据块的复杂性。

  4. 访问文件

    • 操作系统通过FCB找到索引块,然后根据索引块中的指针找到数据块。

    • 这种方式允许文件块在磁盘上非连续存储,同时避免了链式结构中的指针跟踪开销。

优缺点:

优点:
  1. 灵活性高

    • 文件块可以在磁盘上非连续存储,提高了磁盘空间的利用率。

    • 文件大小可以动态变化,添加或删除数据块只需更新索引块。

  2. 访问速度快

    • 通过索引块直接访问数据块,减少了磁盘寻道和旋转延迟。

    • 适用于随机访问模式,因为可以直接定位到任何数据块。

  3. 支持大文件

    • 通过使用二级或多级索引,可以支持非常大的文件。


 


 

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

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

相关文章

免费多语言文档翻译软件推荐

软件介绍 今天给大家介绍一款文档翻译助手。它能够支持PDF、Word等多种文档格式,涵盖中文、英文、日语等多语言互译。此软件在翻译过程中精选保留文档原貌,每段文字、每个图表的匹配都十分完美,还依托顶尖翻译大模型,让翻译结果符…

安全序列(DP)

#include <bits/stdc.h> using namespace std; const int MOD1e97; const int N1e65; int f[N]; int main() {int n,k;cin>>n>>k;f[0]1;for(int i1;i<n;i){f[i]f[i-1]; // 不放桶&#xff1a;延续前一位的所有方案if(i-k-1>0){f[i](f[i]f[i-k…

【Flask开发】嘿马文学web完整flask项目第4篇:4.分类,4.分类【附代码文档】

教程总体简介&#xff1a;2. 目标 1.1产品与开发 1.2环境配置 1.3 运行方式 1.4目录说明 1.5数据库设计 2.用户认证 Json Web Token(JWT) 3.书架 4.1分类列表 5.搜索 5.3搜索-精准&高匹配&推荐 6.小说 6.4推荐-同类热门推荐 7.浏览记录 8.1配置-阅读偏好 8.配置 9.1项目…

SQL开发的智能助手:通义灵码在IntelliJ IDEA中的应用

SQL 是一种至关重要的数据库操作语言&#xff0c;尽管其语法与通用编程语言有所不同&#xff0c;但因其在众多应用中的广泛使用&#xff0c;大多数程序员都具备一定的 SQL 编写能力。然而&#xff0c;当面对复杂的 SQL 语句或优化需求时&#xff0c;往往需要专业数据库开发工程…

解决:AttributeError: module ‘cv2‘ has no attribute ‘COLOR_BGR2RGB‘

opencv AttributeError: module ‘cv2’ has no attribute ‘warpFrame’ 或者 opencv 没有 rgbd 解决上述问题的方法是&#xff1a; 卸载重装。 但是一定要卸载干净&#xff0c;仅仅卸载opencv-python是不行的。无限重复都报这个错。 使用pip list | grep opencv查看相关的…

NutriJarvis:AI慧眼识餐,精准营养触手可及!—— 基于深度学习的菜品识别与营养计算系统

NutriJarvis&#xff1a;AI慧眼识餐&#xff0c;精准营养触手可及&#xff01;—— 基于深度学习的菜品识别与营养计算系统 NutriJarvis 是一个基于深度学习的菜品识别与营养计算系统&#xff0c;旨在通过计算机视觉技术自动识别餐盘中的食物&#xff0c;并估算其营养成分&…

【LaTeX】

基本使用 \documentclass 类型&#xff1a;文章&#xff08;article&#xff09;、报告&#xff08;report&#xff09;、书&#xff08;book&#xff09; 中文的文章是ctexart&#xff0c;中文字体是UTF8 \documentclass[UTF8]{ctexart} []说明可以省略不写的意思&#xf…

细说STM32单片机FreeRTOS任务管理相关函数及多任务编程的实现方法

目录 一、FreeRTOS任务管理相关函数 1、FreeRTOS函数 2、FreeRTOS宏函数 3、主要函数功能说明 &#xff08;1&#xff09;创建任务osThreadNew() &#xff08;2&#xff09;删除任务vTaskDelete() &#xff08;3&#xff09;挂起任务vTaskSuspend() &#xff08;4&…

uniapp微信小程序基于wu-input二次封装TInput组件(支持点击下拉选择、支持整数、电话、小数、身份证、小数点位数控制功能)

一、 最终效果 二、实现了功能 1、支持输入正整数---设置specifyTypeinteger 2、支持输入数字&#xff08;含小数点&#xff09;---设置specifyTypedecimal&#xff0c;可设置decimalLimit来调整小数点位数 3、支持输入手机号--设置specifyTypephone 4、支持输入身份证号---设…

leetcode-419.棋盘上的战舰

leetcode-419.棋盘上的战舰 文章目录 leetcode-419.棋盘上的战舰一.题目描述二.第一次代码提交三.第二次代码提交 一.题目描述 二.第一次代码提交 class Solution { public:int countBattleships(vector<vector<char>>& board) {int m board.size(); //列数i…

使用uglifyjs对静态引入的js文件进行压缩

前言 因为有时候js文件没有npm包&#xff0c;或者需要修改&#xff0c;只能引入静态的js&#xff0c;那么这个时候就可以对js进行压缩了。我其实想通过vite、webpack等插件进行压缩的&#xff0c;可是他都不能定位到public目录下面的文件&#xff0c;所以我只能自己压缩了。编…

程序加壳脱壳原理和实现

理论 一个可运行的执行文件&#xff0c;至少会有一个代码段&#xff0c;程序的入口点指向代码段&#xff0c;程序运行的时候&#xff0c;从入口点开始执行代码段指令 为了将一个正常的程序进行加壳保护&#xff0c;至少要三部分逻辑配合 1、待加壳保护的程序 2、加壳逻辑 3…

【数据分析实战】使用 Matplotlib 绘制折线图

1、简述 在日常的数据分析、科研报告、项目可视化展示中&#xff0c;折线图是一种非常常见且直观的数据可视化方式。本文将带你快速上手 Matplotlib&#xff0c;并通过几个实际例子掌握折线图的绘制方法。 Matplotlib 是 Python 中最常用的数据可视化库之一&#xff0c;它能够…

数据仓库标准库模型架构相关概念浅讲

数据仓库与模型体系及相关概念 数据仓库与数据库的区别可参考&#xff1a;数据库与数据仓库的区别及关系_数据仓库和数据库-CSDN博客 总之&#xff0c;数据库是为捕获数据而设计&#xff0c;数据仓库是为分析数据而设计 数据仓库集成工具 在一些大厂中&#xff0c;其会有自…

亚洲区域健康人群免疫细胞marker

最近发现一篇文献&#xff0c;作者来自新加坡基因研究所&#xff0c;这篇文章大概是整理了619个亚洲人群的免疫多样性图集&#xff08;AIDA&#xff09;&#xff0c;跨越了7个国家&#xff0c;最终使用了1,265,624个免疫细胞的单细胞数据&#xff0c;并最终确定了8种主要的免疫…

三极管以及mos管

三极管与mos管的高低电平导通判断 &#xff08;1&#xff09;三极管的高低电平导通判断 三极管中有2个PN结&#xff0c;分别称为发射结和集电极结&#xff0c;按材料划分为硅材料三极管&#xff08;硅管&#xff09;&#xff0c;锗材料三极管&#xff08;锗管&#xff09;&am…

PPT模板之--个人简历

还在为制作 PPT 时毫无头绪、对着空白页面抓耳挠腮而烦恼吗&#xff1f;别担心&#xff0c;这里就是你的 PPT 灵感补给站&#xff01;在这个快节奏的信息时代&#xff0c;一份吸睛又高效的 PPT 至关重要&#xff0c;它能在商务汇报中助你赢得先机&#xff0c;在课堂展示时让你脱…

springboot--页面的国际化

今天来实现页面中的国际化 首先&#xff0c;需要创建一个新的spring boot项目&#xff0c;导入前端模板&#xff0c;在我的博客中可以找到&#xff0c;然后将HTML文件放在templates包下&#xff0c;将其他的静态资源放在statics包下&#xff0c;如下图结构 页面的国际化主要在首…

前端学习10—Ajax

1 AJAX 简介 AJAX 全称为 Asynchronous JavaScript And XML&#xff0c;就是异步的 JS 和 XML 通过 AJAX 可以在浏览器中向服务器发送异步请求&#xff0c;最大优势为&#xff1a;无刷新获取数据 AJAX 不是新的编程语言&#xff0c;而是一种将现有的标准组合在一起使用的新方…

list的常见接口使用

今天&#xff0c;我们来讲解一下C关于STL标准库中的一个容器list的常见接口。 在我们之前c语言数据结构中&#xff0c;我们已经了解过了关于链表的知识点了&#xff0c;那么对于现在理解它也是相对来说比较容易的了。 数据结构--双向循环链表-CSDN博客 1. 定义与包含头文件 …