zoukankan      html  css  js  c++  java
  • 操作系统8:文件系统

    文件系统

    基本概念

    image-20200207155841066.png
    文件是具有符号名的数据项的集合

    image-20200207160413440.png
    image-20200207160453880.png
    行文件:以行为单位

    image-20200207160544675.png
    文件的属性:

    image-20200207160624494.png
    文件的标识是内部使用的编号,在文件系统内部并不使用文件名

    image-20200207160811301.png
    文件操作通过系统调用的方式进行

    打开和关闭都涉及到了内存和磁盘的交互

    image-20200207161002383.png
    顺序访问:

    image-20200207161113611.png
    image-20200207161133026.png

    目录

    image-20200207161211005.png
    目录也是在磁盘中的,它是一种特殊的文件

    image-20200207161258594.png
    image-20200207161355805.png

    目录的结构

    image-20200207161639933.png

    • 整个目录系统中不允许重名
    • 不好分组

    image-20200207161754260.png
    这里的路径名表示的是用户的分组

    image-20200207161903962.png
    image-20200207162458742.png
    树型就可以分组了

    image-20200207162553326.png
    对树型目录进行更改,就可以实现目录的共享

    image-20200207162612184.png
    image-20200207162707475.png
    这都好理解

    悬空指针也不一定要操作系统解决,现在的操作系统也就没管

    image-20200207162921488.png
    实际使用的时候尽量会避免环的产生

    image-20200207162956659.png
    第一个方式太激进了,会限制功能

    文件系统的安装和使用

    image-20200207163116631.png
    也可以把几块硬盘通过RAID技术构成一个分区,多用于服务器

    image-20200207163421048.png
    image-20200207163453055.png
    安装时可以安装在特定的安装点下:

    image-20200207163541170.png
    新的硬盘要先建立文件系统

    每个分区中要有引导信息

    根分区:存放操作系统内核和其他系统文件

    将分区加载到操作系统上时,会在内存中保留一份加载表来说明该分区的情况

    文件的共享和保护

    image-20200207163631287.png
    image-20200207164948656.png
    image-20200207165027112.png
    image-20200207170755910.png

    文件系统结构

    image-20200207170912984.png
    文件由数据块和文件控制块两部分组成

    文件系统在磁盘上而不是内存中

    image-20200207171031773.png
    image-20200207171130079.png
    逻辑文件系统处理元数据

    image-20200207171243022.png
    image-20200207171328875.png
    image-20200207171427355.png
    image-20200207171539412.png
    image-20200207171617894.png
    目录结构一开始放在磁盘上,但是要打开文件时,会将相关的一部分或者全部加载到内存中以便于查找文件在磁盘上的位置

    除了每个进程有自己的文件打开表以记录该进程打开了哪些文件之外,系统也有一个总表来记录哪些文件被打开了(进程的文件打开表中的项指向的其实就是系统的文件打开表的对应的项),这些文件的文件控制块都会被加载到内存中

    虚拟文件系统

    在各种实际文件系统之上建立统一的虚拟文件系统进行统一管理和使用

    image-20200207172305777.png
    image-20200207172356121.png

    目录的实现

    image-20200207172434008.png
    可以将目录放入内存以加快访问速度

    image-20200207172557795.png
    image-20200207172708950.png
    读取文件控制块的信息来获取文件的物理存储位置

    image-20200207172821959.png

    外存分配方法

    image-20200207173116786.png

    连续分配

    image-20200207173150435.png
    --每个文件占用磁盘中几个连续的数据块**

    image-20200207173211183.png
    image-20200207173816678.png

    基于extent的连续分配

    image-20200207173906436.png

    链接分配

    image-20200207173951171.png
    image-20200207174106910.png
    image-20200207174445383.png
    这种不能随机访问

    image-20200207174531704.png
    一旦指针存储出问题,就gg了

    链接分配的实际使用:

    DOS的FAT格式

    image-20200207174618862.png
    FAT中,将每个块的指针专门抽出来,存放在文件分配表中,但是每一块还是保留了指向下一块的指针

    这种方式使得链接方式也具有了随机访问性

    image-20200207174843014.png

    索引分配

    image-20200207175045742.png
    image-20200207175107871.png
    和FAT方式不一样,每一块没有指向下一块的指针

    image-20200207175307776.png
    在知道要找的文件内偏移量和每个数据块的大小,Q是可以计算出来的

    image-20200207175358624.png
    image-20200207175418143.png
    image-20200207175432627.png
    image-20200207175457293.png

    UNIX的UFS/Linux的ext2格式

    image-20200207175916872.png
    image-20200207175510972.png
    索引节点可以存放直接指向数据的10个指针、指向一级索引的指针、指向二级索引的指针,小文件直接指向数据本身即可,大文件可以使用一级索引或者二级索引

    image-20200207180059449.png
    image-20200207180142280.png
    image-20200207180340781.png
    image-20200207180355490.png

    空闲空间的管理

    空闲空间的管理介绍位图和链表两种

    image-20200207180501777.png
    image-20200207180554113.png
    位图方式相对比较为文件找到连续的空闲位置

    由此可见位图的空间占用是不高的

    image-20200207180623165.png
    要是使用的话很难实现连续分配(即使有也不好找),可以实现链接分配

    image-20200207180742797.png

    Linux文件系统

    image-20200207182325724.png
    Linux有自己的标准文件系统,但是支持的文件系统有许许多多

    image-20200207180955391.png
    image-20200207181041576.png
    image-20200207181058847.png
    每个文件对应一个inode

    image-20200207181242243.png
    还保存了文件名的长度等信息

    文件的类型

    image-20200207181620608.png
    目录文件只允许系统进行修改

    image-20200207181926265.png
    目录文件中就是目录项

    image-20200207182003578.png
    Linux一切皆文件的体现,将对设备的IO作为对文件的读取和写入

    socket文件用于网络通信

    proc是内存中的文件系统

    VFS虚拟文件系统

    image-20200207182738351.png
    VFS仅存在于内存

    image-20200209102401910.png
    image-20200209102424636.png
    定义对象和对应的操作方法

    目录项对象是为了加速文件搜索使用的

    image-20200209102602078.png
    image-20200209102655816.png
    image-20200209102828645.png
    image-20200209102902811.png
    image-20200209102954411.png
    image-20200209103218349.png
    image-20200209103226231.png
    image-20200209103338075.png
    image-20200209103411401.png
    image-20200209103444529.png
    image-20200209103941506.png
    image-20200209104041714.png
    image-20200209104116160.png
    image-20200209104216054.png
    这也是为什么在linux上第一次查找很慢,但是之后再查就快了,因为VFS已经将对应的目录项文件加载到内存了

    image-20200209104607271.png
    image-20200209104639845.png
    目录项之间可以通过指针相连,这样通过父子关系查找会非常快

    image-20200209104803915.png
    image-20200209104818761.png
    image-20200209104858221.png
    file对象只对应已经打开的文件

    image-20200209105006174.png
    image-20200209105051489.png
    image-20200209105246539.png
    image-20200209105334601.png
    image-20200209105419398.png
    下面这张图概况的非常好:

    image-20200209105558314.png
    image-20200209105731600.png
    通过文件名打开后就不再使用文件名,而是直接使用文件描述符

    image-20200209105930993.png
    image-20200209110115198.png
    image-20200209110124795.png
    image-20200209110141404.png

    ext2文件系统

    image-20200209110343505.png
    image-20200209110422807.png
    第一个块是用于引导的

    来源:https://www.cnblogs.com/zhehan54/p/5820152.html

    硬盘主要由MBR(Master Boot Record)和各个磁盘分区组成。
    MBR中的有 引导代码 和 磁盘分区表, 分区表中记录了每个分区的起始位置,以及哪个磁盘分区是活动分区, 这样系统就会找到它, 然后装载这个分区中的引导块,并执行之。
    引导块将会装载存存储在本分区的操作系统。 需要注意的是,每个分区都有一个引导块,不管这个分区有没有操作系统,这是各大厂商的约定,是一种标准。
    每个分区除了必须的引导块之外,又被分成多个块组。
    在每个块组中你能看到熟悉的磁盘块位图和inode位图, 不用解释估计你也知道是干嘛的。还有inode表(当然是存放文件和目录的inode 了)和真正的数据块。
    对了, 我的磁盘分区表只有64个字节, 而每个分区项占用16个字节, 所以只能容纳4个分区。 如果你想用多于4个分区, 你就需要把其中一个设为扩展分区, 然后在其中继续划分成逻辑分区,想划几个就划分几个。
    一般情况下,大家都喜欢把我划分成一个主分区+一个扩展分区, 在扩展分区中再需要划分。

    主分区、扩展分区和逻辑分区的区别,系统分区、引导分区和启动分区的区别,可以看这篇文章

    image-20200209135633993.png
    image-20200209135646994.png
    image-20200209135702249.png
    每个块组中包含的超级块内容是一样的,互为备份

    image-20200209135808718.png
    image-20200209135831810.png
    image-20200209135855959.png
    image-20200209135923670.png
    image-20200209140034855.png

  • 相关阅读:
    spark-RDD缓存,checkpoint机制,有向无环图,stage
    spark广播变量
    k8s部署spark
    spark简单安装
    搭建一套高可用的hadoop集群
    JavaScript实现无限级递归树的示例代码
    $.ajax 调用 Asp.Net Core Razor Page 后台代码
    2020蓝桥杯省赛B组第二轮 H 字串分值
    取整函数
    c++按空格分割句子
  • 原文地址:https://www.cnblogs.com/jiading/p/12289070.html
Copyright © 2011-2022 走看看