操作系统8:文件系统
文件系统
基本概念
文件是具有符号名的数据项的集合
行文件:以行为单位
文件的属性:
文件的标识是内部使用的编号,在文件系统内部并不使用文件名
文件操作通过系统调用的方式进行
打开和关闭都涉及到了内存和磁盘的交互
顺序访问:
目录
目录也是在磁盘中的,它是一种特殊的文件
目录的结构
- 整个目录系统中不允许重名
- 不好分组
这里的路径名表示的是用户的分组
树型就可以分组了
对树型目录进行更改,就可以实现目录的共享
这都好理解
悬空指针也不一定要操作系统解决,现在的操作系统也就没管
实际使用的时候尽量会避免环的产生
第一个方式太激进了,会限制功能
文件系统的安装和使用
也可以把几块硬盘通过RAID技术构成一个分区,多用于服务器
安装时可以安装在特定的安装点下:
新的硬盘要先建立文件系统
每个分区中要有引导信息
根分区:存放操作系统内核和其他系统文件
将分区加载到操作系统上时,会在内存中保留一份加载表来说明该分区的情况
文件的共享和保护
文件系统结构
文件由数据块和文件控制块两部分组成
文件系统在磁盘上而不是内存中
逻辑文件系统处理元数据
目录结构一开始放在磁盘上,但是要打开文件时,会将相关的一部分或者全部加载到内存中以便于查找文件在磁盘上的位置
除了每个进程有自己的文件打开表以记录该进程打开了哪些文件之外,系统也有一个总表来记录哪些文件被打开了(进程的文件打开表中的项指向的其实就是系统的文件打开表的对应的项),这些文件的文件控制块都会被加载到内存中
虚拟文件系统
在各种实际文件系统之上建立统一的虚拟文件系统进行统一管理和使用
目录的实现
可以将目录放入内存以加快访问速度
读取文件控制块的信息来获取文件的物理存储位置
外存分配方法
连续分配
--每个文件占用磁盘中几个连续的数据块**
基于extent的连续分配
链接分配
这种不能随机访问
一旦指针存储出问题,就gg了
链接分配的实际使用:
DOS的FAT格式
FAT中,将每个块的指针专门抽出来,存放在文件分配表中,但是每一块还是保留了指向下一块的指针
这种方式使得链接方式也具有了随机访问性
索引分配
和FAT方式不一样,每一块没有指向下一块的指针
在知道要找的文件内偏移量和每个数据块的大小,Q是可以计算出来的
UNIX的UFS/Linux的ext2格式
索引节点可以存放直接指向数据的10个指针、指向一级索引的指针、指向二级索引的指针,小文件直接指向数据本身即可,大文件可以使用一级索引或者二级索引
空闲空间的管理
空闲空间的管理介绍位图和链表两种
位图方式相对比较为文件找到连续的空闲位置
由此可见位图的空间占用是不高的
要是使用的话很难实现连续分配(即使有也不好找),可以实现链接分配
Linux文件系统
Linux有自己的标准文件系统,但是支持的文件系统有许许多多
每个文件对应一个inode
还保存了文件名的长度等信息
文件的类型
目录文件只允许系统进行修改
目录文件中就是目录项
Linux一切皆文件的体现,将对设备的IO作为对文件的读取和写入
socket文件用于网络通信
proc是内存中的文件系统
VFS虚拟文件系统
VFS仅存在于内存
定义对象和对应的操作方法
目录项对象是为了加速文件搜索使用的
这也是为什么在linux上第一次查找很慢,但是之后再查就快了,因为VFS已经将对应的目录项文件加载到内存了
目录项之间可以通过指针相连,这样通过父子关系查找会非常快
file对象只对应已经打开的文件
下面这张图概况的非常好:
通过文件名打开后就不再使用文件名,而是直接使用文件描述符
ext2文件系统
第一个块是用于引导的
来源:https://www.cnblogs.com/zhehan54/p/5820152.html
硬盘主要由MBR(Master Boot Record)和各个磁盘分区组成。
MBR中的有 引导代码 和 磁盘分区表, 分区表中记录了每个分区的起始位置,以及哪个磁盘分区是活动分区, 这样系统就会找到它, 然后装载这个分区中的引导块,并执行之。
引导块将会装载存存储在本分区的操作系统。 需要注意的是,每个分区都有一个引导块,不管这个分区有没有操作系统,这是各大厂商的约定,是一种标准。
每个分区除了必须的引导块之外,又被分成多个块组。
在每个块组中你能看到熟悉的磁盘块位图和inode位图, 不用解释估计你也知道是干嘛的。还有inode表(当然是存放文件和目录的inode 了)和真正的数据块。
对了, 我的磁盘分区表只有64个字节, 而每个分区项占用16个字节, 所以只能容纳4个分区。 如果你想用多于4个分区, 你就需要把其中一个设为扩展分区, 然后在其中继续划分成逻辑分区,想划几个就划分几个。
一般情况下,大家都喜欢把我划分成一个主分区+一个扩展分区, 在扩展分区中再需要划分。
主分区、扩展分区和逻辑分区的区别,系统分区、引导分区和启动分区的区别,可以看这篇文章
每个块组中包含的超级块内容是一样的,互为备份