本文首发于稀土掘金。该平台的作者 逐光而行 也是本人。
一点感悟
随着对操作系统学习的逐渐深入,越来越感受到如下两点:
- 操作系统也有自己的“设计模式”,类似于人类社会的“管理模式”。从某种程度上说,操作系统管理调度和人文学科中的管理是互通的。
- 数据结构与算法,虽然在写业务代码的时候可能用不到,但都一一体现在了操作系统的架构设计中。
产生文件系统这个抽象概念的背景:
满足计算机长期存储信息的需要
三大要求:
- 能存储 大量 信息
(受虚拟地址空间大小限制,进程在其地址空间存储的信息有限)
- 信息不受使用的进程影响
(而进程终止时其保存的信息会丢失)
- 多个进程能 并发 访问有关信息
(某种程度上说信息必须和单个进程是解耦的,是一个独立的存在)
文件系统
这是进程创建的信息逻辑单元,是对在磁盘上保存信息而方便以后读取的物理实体的一种概念抽象。
从用户的角度看文件系统
文件命名
- win95、win98(虽然现在早没人用了)是属于MS-DOS系统类,即对文件命名不区分大小写
- 在unix系中,操作系统本身并不关心文件扩展名,用户自己改啥都行;而Windows系则严格规定。
文件结构
在操作系统看来,文件就是字节序列。(unix系以及Windows都是这种)
也有记录序列和树两种结构。前者现在已经没人用了,后者在一些处理商业数据的大型计算机上还应用广泛。
文件类型
探究其中的二进制文件--以可执行文件为例
文件属性
文件的附加信息称为属性(atribute)或元数据(metadata)
文件目录
- 进程切换工作目录是安全的
- 但进程不能随意更改库文件目录,否则会由于其他进程对目录的假设失效,导致其他进程无法正常运行。
目录操作
link:
从用户的视角看,在多个目录下都会出现该文件。
从操作系统的视角看,多个路径(的指针/映射)都指向了该文件(这句是我的理解)
unlink
删除文件的本质就是unlink。只不过对于文件只出现在一个目录下的情况,表现为该文件直接消失;而对于文件有多个link的情况,unlink仅解除某个指定路径的link。
链接文件的一种可选方式——符号链接
一个file name指向命名另一个文件的小文件,当访问该小文件时,文件系统沿着路径最终找到了file name ,并且通过file name再找文件。
其中,这个file name就是符号,起到了跳板的作用。(不知道有没有理解错)
通过这种机制,不仅能跨越磁盘的界限,还能访问远程计算机上的文件。
从操作系统的角度看文件系统
文件系统布局
文件系统存放在磁盘上。
文件存储实现的几种方案
连续分配
- 特点:将一连串连续数据块存储在磁盘上。
(我的理解是像划定一大块空间存放数组一样,存数据就赋值,取数据就将该位置置特殊值或移动指针)
- 由上述表述可知,它的缺点是时间长了会产生“碎片”,优点是简单、读性能好(只需要按顺序读取)
- 解决“碎片”问题的一种方案:维护一个“空洞列表”,当创建一个新的文件时,即确定该文件的最终大小。
(不过这是比较底层的了,即使有,普通用户也应该感知不到它的存在。比如我从来没有遇到要创建一个文件,系统提示我无法找到适合空间、从而创建失败的情况)
- 该方案的使用场景:对于 一次性写光学介质来说,这种方案是适用的。
链表分配
- 优点:充分利用每一个磁盘块
- 缺点:随机访问慢(要从头开始找);磁盘块存储数据的字节数不再是2的整数次幂,降低了系统的运行效率(要读出完整块的信息,要耗费获得和拼接信息的开销)
在内存中使用文件分配表(file allocation table)的链表分配
(数组和链表的集合)
- 优点:整块都可以存放数据;数据访问也较纯链表容易
- 缺点:整张表占据的内存大,不实用。
i节点
给每个文件赋予一张表,称为i节点。表的内容格式如下:
这样,i节点的大小仅与可能要同时打开的最大文件数有关,而与实际磁盘大小无关。
当文件包含的磁盘块的数目超出了i节点所容纳的数目时,将其放入指针块地址中的附加地址处。
参考书籍
《现代操作系统》 Andrew S.Tanenbaum,Herbert Bos著,陈向群,马洪兵等译