操作系统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

猜你喜欢

转载自www.cnblogs.com/jiading/p/12289070.html