文件系统
引言
我们以探究式的方式来讲解文件系统:
- 从零开始,提出最基本的需求,设计最基本版本的文件系统。
- 然后不断迭代,从而引出现代操作系统使用的文件系统。
首先思考下什么是文件?
- 首先,文件是用来保存数据的,那么数据保存在了哪里呢?
- 保存在了磁盘中
- 即文件和磁盘是有关的,那么两者是什么关系呢?
- 文件是操作系统对磁盘(一级永久性存储介质)的抽象
为什么要讲文件以及磁盘的关系呢?
- 我们说文件是对磁盘的抽象
- 其实是一种底层思维,磁盘的基本属性是保存信息、数据
- 那么提供一个抽象层或多个抽象层的目的是方便使用
- 同理,我们在各个领域遇到这种情况也可以借鉴这里的思路:提供一层或多层抽象,从而由不易使用到容易使用
以同样的思路来思考问题:
- 进程是什么的抽象?
- 地址空间呢?
进程是对CPU的抽象:这样说可能有点笼统,但是思考下:进程是用来做计算任务的,那么CPU呢?CPU也是做计算的。
地址空间是对物理内存的抽象:对物理内存最简单的理解就是从0顺序编号,经过基层抽象和改进后形成了虚拟地址空间的抽象层。
文件系统需要做什么工作?
下面会讨论几个问题,主要围绕着文件系统需要实现哪些功能,方便我们设计文件系统。
1.关于文件名的限制:
- 为什么文件名中不能有上述字符?作为程序员我们要能真正的回答这个问题,而不是这样的答案:国际规定、方便管理、这是要求,像样的回答最起码应该是:
- 以上字符可能在别处使用过了,那么到底在哪里使用过了呢?
- \:这个字符熟悉嘛?Windows下文件路径分隔符,如果文件名里用了,那么造成了歧义,我们看到路径不禁怀疑,这到底是个路径还是个文件呢?
- /:这个有些历史原因,该字符是DOS界面的指令标识符,如果使用,会造成指令和文件名的混乱
- ::冒号在Windows下是用来指定盘符的,不能使用的原因同上
- *:熟悉正则表达式的应该知道,该字符是用来模糊匹配的,称为通配符
- ?:同上,也是通配符
- ":双引号为什么不能使用呢?做开发熟悉的童鞋可能知道,在cmd里参数之间要加空格,那么如果文件名里有空格怎么办?将文件名用双引号引起来就好了,所以双引号不能额出现在文件名里!
- < >:同样需要一些额外的知识才能理解,在Linux里的重定向使用的是<和>
- |:同样需要一些额外的知识,该符号是管道符,做过操作系统相关实验的同学应该比较容易了解
现在明白了叭,原来Windows的要求都是有据可循的,不是平白无故的要求。
2.文件扩展名有哪些
Windows下有哪些扩展名?
- .exe, .c, .cpp, .gif, .html, .jpg等等,这些扩展名有什么用呢?做个小实验就明白了
- 首先我有一张图片:
- Windows直接给了我一个缩略图,而且双击可打开。
- 然后我修改它的扩展名为.jp:
- 发现了吗?缩略图没了,然后我再双击:
- 出现了这个鬼东西
做了上面的实验后,思考这些扩展名有什么用呢?
- 图片的扩展名是.jpg的时候,双击直接可以打开,也就是说Windows知道.jpg文件需要用哪个应用程序打开
- 但是当扩展名被修改成.jp的时候,双击就不行了,Windows说让我找新应用
- 所以说:扩展名在Windows下的作用是用来标识文件的打开方式
- 在Unix上,系统对扩展名不做要求,扩展名仅仅用来帮助用户和应用程序识别文件,比如一个常用的操作ubuntu还原之前先备份:cp source.list source.list.back, 目的文件名的后缀名很随意吧!vim source.list.back照样可以打开的!
3.文件有哪些类型?
- 普通文件
- 目录文件
- 特殊文件:特殊文件用于管理 I/O 设备
4.文件是怎么保存的以及文件的属性和操作
文件是字节串:
- 文件是一串字节
- 用户可以将任意内容放入文件
- OS 不关心文件的具体内容
- windows,unix均采用了这种文件结构
文件存取方式:
- 最简单的方式:顺序读取
- 从头开始读,顺序读,知道结尾
- 比如磁带
- 直接存取:
- 方式一:每个read函数指明地址,磁头移动到对应地址直接存取
- 方式二:先seek,然后再顺序读取(Windows Linux均采用此方式)
- 比如磁盘
文件有哪些属性?
- 直观的看下有哪些字段,后面具体讨论
对文件需要有哪些操作? - 创建
- 删除
- 读、写
- 设置读写位置
- 设置和获取文件属性
- 重命名等
文件目录怎么表示呢?
- 目录是我们下面实现文件系统时需要重点关注的地方,历史上出现过单级文件目录系统
- 仅仅有一个目录,所有文件都在此目录下
- 世界上第一台超级计算机CDC 6600采用此法。
单级文件目录的优缺点:
- 简单易实现
- 查找速度慢,不允许重名
多级目录(树型结构目录):
- 当前我们的Windows就是多级目录
- 本质是一个树型结构,目录里还能有目录
路径名:
- 每个文件都有唯一的路径,比如: C:\Users\xxx, /root/xxx
- 有绝对路径和相对路径之分
对目录的操作
- 搜索文件
- 创建文件
- 删除文件
- 遍历目录
- 重命名文件
文件的实现
上文就算做需求分析了,下面我们来考虑如何实现我