27.目录与文件系统

【README】

1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐;

2.第4层抽象:抽象整个磁盘到文件系统


【1】文件系统,抽象整个磁盘(第4层抽象)

【图解】整个磁盘抽象
1)磁盘存储的是一堆文件;一堆文件形成树状结构

  • 具体实现是:把整个磁盘的所有盘块进行抽象,组织;
  • 所谓抽象就是用数据结构进行组织;
  • 如一个文件对应一个inode,一个inode组织文件所有盘块,形成字符序列;

整个磁盘的文件以上述方式进行组织和抽象,形成给用户一个抽象的树状结构;

2)整个磁盘抽象为文件系统

  • 文件系统就是映射, 从字符位置到盘块的映射;
  • 底层结构是对上层的实现, 上层是对底层的抽象;  

【2】整个磁盘的一堆文件如何映射

【2.1】目录树

1)多个文件如何组织

  • 方式1) 所有文件放在一层目录下,即所有文件放在一个文件夹下 ;
    • 缺点:不方便查找文件;
  • 方式2) 每个用户一个目录,所有文件放在各自的用户目录下;
    • 缺点:但每个用户的文件数量也很多,还是不方便查找;

2)目录树的文件组织方式

【图解】引入目录树之后,把N个文件进行K次划分,则划分后的子集的文件数量为 O(logkN) ;
划分算法可以参考分治思想

  • 第1次划分: 把N个文件平均划分为2个子集;
  • 第2次划分: 把每个子集再平均划分为2个子集,共得到4个子集;
  • 第K次划分: 把 K-1次划分得到的每个子集,再划分为2个子集,共得到 2^K-1 个子集;

3)引入了目录

  • 如 var, my , data 等叫做目录,目录下面有子目录集合和文件集合;
  • 多个目录构成目录树;

4)目录是什么?

  • 实现目录成为关键性问题 ;

【2.2】目录的实现

1)目录怎么用?

  • 文件路径: /my/data/a ;多个路径就构成了目录树; 其中非叶子节点 my,data是目录;

 【图解】访问磁盘上的目录

  • 步骤1: 根据目录(文件)路径 /my/data/a 可以找到文件a的inode,或FCB;inode存储了字符到盘块号的映射关系;
  • 步骤2: 根据inode可以找到文件a对应的盘块号,(如果没有字符起始位置,则起始位置是0);
  • 步骤3:把盘块号送入请求队列,再由驱动程序取出盘块号计算出CHS,发送out指令把CHS送入磁盘控制器;

2)如何根据路径或文件名(目录名)找到文件 inode

  • 或目录存储了什么信息可以根据路径找到具体的文件;  

【例】根据/my/data/ a  如何找到 a文件的inode ;
my目录下面有3个文件(或目录),data下面还有a文件;

方法1)目录存放该目录下的所有子目录(文件)的inode(FCB);

  • 对于查找 /my/data/a 的inode 需要列出 my目录下的所有子目录,包括data,count,mail;然后所有子目录与data做比较并选择得到data目录的inode;再列出data目录下的所有子目录,然后以此类推。
  • 方法1的问题: 查找速度比较慢;因为 读取了 count,mail的fcb但这2个目录的fcb是用不到的;造成了浪费

方法2)目录存放该目录下的所有子目录(文件)的inode(FCB)的编号(指针);
如下图所示。

【图解】目录的实现 (重要*)

  • 当前目录存放子目录(文件)的inode(FCB)的编号(指针)
  • 磁盘抽象结构如下:

FCB数组(指针)

数据盘块集合

[FCB0, FCB1, FCB2, FCB3, FCB4, FCB5, FCB6, FCB7, FCB8, FCB9, FCB10, ...]

<var,13><my,82>

 其中 FCB0 存储了根目录的FCB(第一个FCB就是根目录的FCB)
FCB1存储了 var目录的FCB;
FCB2存储了 my目录的FCB, ......

【例】目录的数据结构(结构体)
对于查找路径 /my/data/a表示的a目录的盘块号步骤:

  • 步骤1:把所有根目录”/” 下的子目录项列表查询出来;
  • 步骤2:根据目录项列表查找my目录的编号13(或下标13);
  • 步骤3:根据编号13查找FCB数组就可以找到并读入目录my的FCB13;
  • 步骤4:根据目录my的FCB13的数据块中的子目录项列表, 找到目录data的FCB编号103;
  • my目录结构如下:

FCB数组(指针)

数据盘块集合(子目录项列表)

[FCB0, FCB1, FCB2, FCB3, FCB4, FCB5, FCB6, FCB7, FCB8, FCB9, FCB10, ...]

<data,103> <cont,225> <mail, 77>

  • 根据编号103,到FCB数组找到并读入103号下标的FCB,即data目录的FCB103;
  • 步骤5:根据目录data的FCB103的数据块中的子目录项列表, 找到目录a的FCB编号205;
  • a 目录结构如下:
  • FCB数组(指针)

    数据盘块集合(子目录项列表)

    [FCB0, FCB1, FCB2, FCB3, FCB4, FCB5, FCB6, FCB7, FCB8, FCB9, FCB10, ...]

    <a,205>

  • 根据编号205,到FCB数组找到205号下标的FCB,即a目录(文件)的FCB205;即,FCB205就是路径 /my/data/a 的FCB;

补充:接下来磁盘读写步骤

  • FCB存储了盘块号,把盘块号送入请求队列;
  • 磁盘驱动通过电梯算法从请求队列获取盘块号,并计算出CHS送入磁盘控制器;
  • 磁盘控制器根据CHS操作磁盘进行读写;

3)根目录”/”信息从哪里来

  • 即 根目录下的子目录列表的FCB数组从哪里获取

【注意】上图非常重要,它显示的是 整个磁盘格式化后的组成部分(非常重要*)

【图解】根目录信息存储了什么数据。
1)整个磁盘格式化以后,就会形成目录树结构,包括

  • 引导块;
  • 超级块;
  • i节点位图(inode位图);
  • 盘块位图;
  • i节点(inode数组);第1项就是根目录inode;
  • 数据区;

2)整个磁盘格式化后各个部分的内容构成:

  • 引导块:操作系统引导扇区 ;
  • 超级块:记录了 i节点位图,盘块位图的盘块大小;超级块起始盘块号加上i节点位图盘块大小,再加上盘块位图盘块大小就可以得到i节点的起始盘块,而i节点的第1块存储的就是根目录信息,根目录存储了 FCB数组指针,子目录项列表
  • i节点位图(Inode位图):新建一个文件,即新建一个inode,把该文件对应的inode设置为1;相反,删除一个文件(或inode),则该inode设置为0;
  • 盘块位图: 各个盘块使用情况(0-空闲,1-占用);

补充: superblock 超级块非常重要;

  • mount原理:要想使用一个磁盘或u盘,需要先把u盘 挂载 mount到系统;mount的作用就是读取磁盘或u盘的超级块到内存,解析出 i节点位图,盘块位图;
  • 根据 i节点位图和盘块位图可以 计算出i节点的起始盘块号
  • 读取i节点的第1个盘块的内容,即根目录FCB的信息;根目录FCB存储了子目录项列表;

【小结】

  • 以上内容介绍了一个目录树(逻辑)如何实现在磁盘(物理)上的;

【3】整个磁盘的映射 

 

【图解】 读取 test.c文件的202~212 范围的字节流

  • 步骤1:打开 test.c 文件;
    • 根据超级块找到 inode节点的起始盘块号;读取inode节点部分的第1个盘块,即根目录PCB;根据根目录PCB可以找到 test.c文件的PCB(inode);具体细节参见 (对于查找路径 /my/data/a 表示的 a 目录的盘块号步骤)
  • 步骤2:通过inode获取文件描述符 fd,把fd传入 read() 函数,找到盘块789;
  • 步骤3:把盘块号789 添加到请求队列;
  • 步骤4:磁盘完成上一次读写后,发出中断;磁盘驱动的中断处理程序从请求队列中获取盘块号789,并计算出CHS(柱面号,磁头号,扇区号);
  • 步骤5:把CHS作为 out命令的参数送入磁盘控制器;
  • 步骤6:磁盘控制器根据CHS读入对应扇区的数据到内存缓冲区;
  • 步骤7:读入完成后,发出中断,中断处理程序唤醒睡眠的用户线程;
  • 步骤8:用户线程被唤醒后,把内存缓冲区的数据根据用户程序的指令送入cpu做进一步处理;

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

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

相关文章

dd命令打包多个文件_linux的tar命令详情;linux多个文件压缩打包到一个压缩文件...

tar命令可以用来压缩打包单文件、多个文件、单个目录、多个目录。Linux打包命令_tartar命令可以用来压缩打包单文件、多个文件、单个目录、多个目录。常用格式&#xff1a;单个文件压缩打包 tar czvf my.tar.gz file1多个文件压缩打包 tar czvf my.tar.gz file1 file2,...(file…

28.文件目录解析代码实现

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》&#xff0c;内容非常棒&#xff0c;墙裂推荐&#xff1b; 背景&#xff1a; 磁盘格式化后&#xff0c;其组成部分包括引导块&#xff0c;超级块&#xff0c;inode使用位图&#xff0c;盘块使用位图&#xff0…

Oracle入门(十四A)之PL/SQL 基本结构

一、条件控制语句 &#xff08;1&#xff09;条件语句Iif…then…end if形式1:if <布尔表达式> then…(pl/sql和sql)…end if;&#xff08;2&#xff09;条件语句II if…then…else … end if 形式2&#xff1a;if <布尔表达式> then…(pl/sql和sql)else…end if;…

利用记事本创建一个ASP.NET Core RC2 MVC应用

步骤一、安装最新的.NET Core SDK 我们可以根据自身的操作系统环境从https://github.com/dotnet/cli上下载.NET Core最新的SDK&#xff0c;这个SDK包含.NET Core Runtime和一些有用工具&#xff08;比如命令行&#xff09;。如果你已经安装了老旧的版本&#xff0c;我个人建议你…

datatable中某一列最小值_获取DataTable 某一列所有值

//获取某一列值string orderids (from d in dt.AsEnumerable() select d.Field("OrderID")).ToList().ListToString();/// /// 判断字符串是否在某字符串数组当中/// /// /// /// public static bool In(this string value, params string[] items){return items.An…

29.操作系统对磁盘的4层抽象小结

【README】 本文总结了操作系统 对磁盘的4层抽象&#xff0c;并给出了详细介绍的post 链接&#xff1b; 【1】对磁盘的4层抽象 【1.1】对磁盘的第1层抽象 通过盘块号读写磁盘&#xff08;读写多个扇区&#xff09;&#xff1b; 因为磁盘底层操作的单位是扇区&#xff08;51…

Oracle入门(十四C)之转换函数

一、数据转换类型 为数据库创建表时&#xff0c;SQL 程序员必须定义在表的各个字段中存储何种数据。在 SQL 中&#xff0c;有几种不同的数据类型。这些数据类型用于定义每个列中可以包含的值的范围。 &#xff08;1&#xff09;在本文中将使用以下数据类型VARCHAR2 CHAR NUMBER…

发布在即!.NET Core 1.0 RC2已准备就绪

先说点废话&#xff0c;从去年夏天就开始关注学习ASP.NET Core&#xff0c;那时候的版本还是beta5&#xff0c;断断续续不停踩坑、一路研究到11月份RC1发布。 在这个乐此不疲的过程里&#xff0c;学习了很多新的东西&#xff0c;对ASP.NET Core也是越来越喜爱。然而到现在&…

1.java IO模型(BIO,NIO,AIO)

【README】 本文介绍了 3种 java io模型&#xff0c;包括 BIO&#xff0c;NIO&#xff0c; AIO&#xff1b; IO模型名称 描述 工作原理 BIO-Blocking IO 同步并阻塞式IO 一个服务器线程处理一个客户端连接 NIO-Non-blocking IO 同步非阻塞式IO 一个服务器线程处理多个…

Oracle入门(十四D)之常规函数

一、NULL处理 &#xff08;1&#xff09;函数的计算过程 到目前为止&#xff0c;您已经学会了在简单语句中应用单行函数。不过&#xff0c;函数可以嵌套任意层。所以&#xff0c;了解嵌套函数的计算过程非常重要。下例就是一个嵌套函数。其计算过程是从最里层开始计算&#xff…

python定义函数prime判断是否是素数_用自定义函数判断素数 用C语言编写自定义函数prime(int x),判断x是否为素数?...

用C语言编写自定义函数prime(int x)&#xff0c;判断x是否为素数&#xff1f;int prime(int x){int i&#xff0c;kk(int)sqrt( (double)x )for(i2i&ltki )if(x%i0)break// 如果完成所有循环&#xff0c;那么x为素数if(i&gtk)retrun 1elsereturn 0}C语言&#xff0c;编…

构建高性能.NET应用之配置高可用IIS服务器-第一篇:IIS必须掌握的知识

正确而合理的配置IIS是构建一个高性能和高可扩展应用的基础。虽然很多的时候采用默认的配置就已经可以处理一般的情况&#xff0c;但是随着站点应用的发展&#xff0c;特别是当访问量稍微大一点的时候&#xff0c;就会暴露出很多我们认为的“奇奇怪怪”的问题。 所以&#xff0…

3.NIO选择器(基于NIO的服务器与客户端通讯)

【README】 本文总结自B站《尚硅谷netty》&#xff0c;很不错&#xff1b; 【1】选择器Selector&#xff08;多路复用器&#xff09; 【1.1】基本介绍 1&#xff09;Java 的 NIO&#xff0c;用非阻塞的 IO 方式。可以用一个线程&#xff0c;处理多个客户端连接&#xff0c;就…

perplexity 衡量指标_求通俗解释NLP里的perplexity是什么?

高赞回答讲得已经非常通俗易懂&#xff0c;不过由于自然语言处理的发展&#xff0c;出现了许多不同类型的模型&#xff0c;对困惑度这个指标的计算方法颇有不同(包括前面的高赞回答也只是展开了一个子集)&#xff0c;常常让人摸不着头脑。所以这个回答旨在尽量全面地梳理不同语…

C#在Linux上的开发指南

本人才疏学浅&#xff0c;在此记录自己用C#在Linux上开发的一点经验&#xff0c;写下这篇指南。&#xff08;给想要在Linux上开发C#程序的朋友提供建议&#xff09; 目前在Linux上跑的网站&#xff1a;http://douxiubar.com | http://douxiubar.com/AdminLogin/Index&#xff0…

Oracle入门(十四E)之条件表达式case和deocde函数

一、表达式&#xff08;1&#xff09;条件表达式 共有两种条件表达式&#xff0c;即 CASE 表达式和DECODE 表达式。就 CASE 比较两个表达式而言&#xff0c;该表达式在逻辑上等效于之前学习的NULLIF 函数。如果两个表达式相等&#xff0c;则返回null&#xff0c;如果不相等&…

4.基于NIO的群聊系统

【README】 1.本文总结自B站《netty-尚硅谷》&#xff0c;很不错&#xff1b; 2.文末有错误及解决方法&#xff1b; 【1】群聊需求 1&#xff09;编写一个 NIO 群聊系统&#xff0c;实现服务器端和客户端之间的数据简单通讯&#xff08;非 阻塞&#xff09; 2&#xff09;实…

构建高性能.NET应用之配置高可用IIS服务器-第二篇 IIS请求处理模型

在IIS 中&#xff0c;Http监听者(http.sys)和请求处理者由两个系统服务在控制着。一个是WWW 服务&#xff0c;另外一个就是Windows Process Activation。 对于WWW服务&#xff0c;它主要是监控IIS的配置文件&#xff0c;将新的配置信息用到HTTP.sys和WAS上。同时它也维持一些性…

Oracle入门(十四F)之PL/SQL定义变量

一、变量介绍 &#xff08;1&#xff09;变量的使用可以使用变量&#xff1a; 临时存储数据存储值的操作可重用性&#xff08;2&#xff09;PL&#xff0f;SQL中的变量处理变量是&#xff1a; 在声明部分中声明和初始化在可执行部分中使用和分配新值变量可以是&#xff1a;作为…

小米手环nfc门卡摸拟成功后不能开门_如何使用小米手环5 NFC版进行门卡模拟(如公司门禁卡、小区门禁卡、学校门禁卡等)?...

由于本人最近购入了小米手环5 NFC版&#xff0c;所以对小米手环模拟门禁卡比较清楚一点。说一下用该手环模拟门禁的方法吧&#xff0c;我本人模拟的是学校公寓的门禁卡&#xff0c;不过学校的门禁卡是加密卡&#xff0c;可能操作起来稍微比不加密的门禁卡麻烦一点&#xff0c;因…