进程作为计算机资源调度和分配的单位,文件作为计算机(用户)进行 I/O 的基本单位,进程调度对用户是透明的,I/O 是用户主动进行的,文件管理本质上就是一种I/O管理
文件本质上就是一种数据结构,只不过种类众多,具有不同的逻辑结构、物理结构
数据项
记录:一组相关数据项的集合
文件
易混淆的定义
文件描述符/索引
文件指针
打开文件表
工作目录
目录文件
文件目录
文件目录项/FCB
调用系统调用 open(“a”) ,如果是首次打开该文件(未被其它进程打开过)
如果是再次打开该文件
目录本身就是一种记录式文件
为了实现“按名存取”,包含文件名,文件物理位置,文件逻辑结构,文件的物理结构,存取控制信息,文件的建立日期和时间等
引入
检索文件只需要文件名,可以给目录文件瘦身,除了文件名的所有信息都移动到索引节点中,文件目录项只留下文件名和指向索引结点的指针(物理块号),这个“瘦身”效果,比我们想象中要高得多,以索引文件(物理结构也是索引结构)为例,本来FCB中需要存储文件的整张索引表,这可能会占据多个磁盘块
一个磁盘块能存储更多的目录项了,检索效率自然就提高了
磁盘与内存索引结点
存放在磁盘上的索引结点。每个文件有惟一的一个磁盘索引结点。
如果文件首次打开,要将磁盘索引结点拷贝到内存的中,便于以后使用,需要多次读取磁盘(每一级路径都需要读一次磁盘,不考虑中间路径是否有索引结点已经在内存中的情况),最终把磁盘索引节点拷贝到内存中,对于已打开文件,读盘次数和使用FCB是一致的
基本功能(要求)
单级目录
整个文件系统中只建立一张目录表,每个文件占一个目录项
实现
问题
两级目录
为每个用户建立一个单独的用户文件目录 UFD,系统中建立一个主文件目录 MFD,记录每个用户目录文件
实现
问题
多级(树形)目录结构
从根目录到任何数据文件,都只有一条惟一的通路(路径)
当前目录
为每个进程设置一个“当前目录” ,又称为“工作目录” ,进程对各文件的访问都是相对于当前目录进行的(即相对路径)
实现
问题
无环图目录结构
在树形目录的基础上增加了一些指向同一结点的有向边,即一个文件“同时存在”与两个文件夹(更便于实现共享)
线性检索法
使用线性表存储文件名和数据块指针,创建新文件时,首先搜索目录表以确定没有同名的文件存在,然后在目录表后增加一个目录项。删除文件则根据给定的文件名搜索目录表,接着释放分配给它的空间。
存在问题
Hash 方法
系统利用用户提供的文件名并将它变换为文件目录的索引值,能显著地提高检索速度
存在问题
不同文件目录中目录项的索引节点指针指向同一个索引节点,硬链接可视为两个指向同一地址指针,删除一个指针不会对另一个指针造成影响,其实质是允许一个文件拥有多个有效路径名,以防止“误删”源数据
类似windows的快捷方式,其实质是存储实际文件的路径名,实现共享
软连接和硬链接比较
…
文件是如何组织的,认为无结构文件(流式文件)不存在逻辑结构,只讨论有结构文件,不同的逻辑结构,本质上就是为了采用不同的查找方式
定长记录
可变长记录
优缺点
根据某个关键字建立一张索引表,解决可变长度记录的文件查找困难的问题,可以根据不同数据项建立多张索引表
优缺点
索引和顺序的结合,速度很快,索引表也不至于太大
可建立多级索引表
直接文件或散列文件。给定记录的键值或通过散列函数转换的键值直接决定记录的物理地址。这种映射结构不同于顺序文件或索引文件,没有顺序的特性。散列文件有很高的存取速度,但是会引起冲突,即不同关键字的散列函数值相同。
如何给文件分配物理块
为每一个文件分配一组相邻接的盘块
优点
支持顺序访问和随机访问
连续分配的文件在顺序访问时速度最快
问题
将文件装到多个离散的盘块中
优点
不会产生磁盘碎片,显著地提高了外存空间的利用率
可动态分配盘块,无需事先知道文件的大小
问题
只能顺序访问,随机访问极其低效(如果要访问第100个磁盘块,则须启动 100 次磁盘去实现读盘块的操作)
可靠性较低,只通过链接指针来将一大批离散的盘块链接起来,只要其中的任何一个指针出现问题,都会导致整个链的断开。
显式链接是指把用于链接文件各物理块的指针,从每个物理块的块末尾中提取出来,显式地存放在内存的一张链接表中。该表在整个磁盘中仅设置一张,称为文件分配表 FAT
一个磁盘一张FAT,开机时装入内存,且常驻内存,支持随机访问(只需要访问一次磁盘,前面的都是在内存里的FAT表中查的)
文件的第一个盘块号放在自己的 FCB 中
问题
链接分配方式虽然解决了连续分配方式所存在的问题,但不能支持高效的直接存取,FAT 需占用较大的内存空间
显示链接的可靠性依然是不可保证的
【根据两次统考题上的描述,将索引分配的索引块称之为“索引节点 Inode” ,我觉得跟目录管理提到的“索引节点”是同一种技术,不过目录管理中指的是采用Inode时的文件目录项,这里是采用Inode时的物理分配方式,因为采用索引结构时,FCB会非常大,因为需要存整张索引表,有必要进行“瘦身“】
为每个文件分配一个索引块 Inode,文件的FCB记录指向Inode的指针,Inode中记录一张索引表,将文件所对应的盘块号集中地放在一起,Inode中第i个条目指向文件的第i个块的物理块号
两次访外存,得到数据,先把索引块读入内存,再查索引块得到物理地址,取出数据
优缺点
可随机访问,易于增删
索引表空间开销
大文件导致的索引表过长问题
文件的物理结构与逻辑结构比较
逻辑结构,就是指在用户看来,用户能看到的,文件的数据是如何组织起来的,比方说word就是一个个文字,而excel就是一个个单元格。而“物理结构”指的是在操作系统看来,文件的数据是如何存放在外存中的。
物理结构,就是对于操作系统来说,这个文件是怎么存储在磁盘上。
逻辑结构与物理结构相适应才能在让用户满足的同时也让OS满足,假如一个逻辑结构为索引结构的文件,在物理结构上采用的是链式结构,那么它还是无法实现快速读取
连续分配方式,与内存管理中动态分区分配的空闲分区表/链式一样的
分配与回收
与内存的动态分配类似,同样可以采用首次适应算法、循环首次适应等算法
注意
在内存分配中很少采用连续分配方式,然而在外存管理,磁盘的对换区为了追求更高的效率,采用连续分配,可减少访问磁盘的 I/O 频率,连续分配的区域 I/O 速度更快,一般存储文件还是会采用离散分配(当文件比较小时,采用连续分配效率也较高)
空闲盘块链
离散分配方式,将磁盘上的所有空闲空间,以盘块为单位拉成一条链
分配与回收
从链首依次摘下适当数目的空闲盘块分配给用户,系统将回收的盘块依次插入空闲盘块链的末尾【分配和回收一个盘块的过程非常简单,但在为一个文件分配盘块时,可能要重复操作多次】
优点与问题
不需要额外的空间,但分配多少就得访问多少块
空闲盘区链
离散&连续分配方式,将磁盘上的所有空闲空间,以盘区(每个盘区可包含若干个盘块)为单位拉成一条链
分配与回收
分配盘区的方法与内存的动态分区分配类似,通常采用首次适应算法
离散&连续分配,利用二进制的一位来表示磁盘中一个盘块的使用情况,磁盘上所有的盘块都有一个二进制位与之对应。当其值为“0”时,表示对应的盘块空闲;当其值为“1”时,表示对应的盘块已分配。
空闲表法和空闲链表法都不适用于大型文件系统,因为这会使空闲表或空闲链表太长,UNIX 系统采用成组链接法
基本思想
把顺序的n个空闲扇区地址保存在第一个空闲扇区内,其后一个空闲扇区内则保存另一顺序空闲扇区的地址,如此继续,直至所有空闲扇区均予以链接。系统只需要保存一个指向第一个空闲扇区的指针。
磁头
每个盘面有一个磁头,所有磁头都是连接在一根磁柱上的,它们是共进退的
盘面
每个盘片有一个或者两个盘面,看读写磁头是单向还是双向的
磁道
每个盘面划分成一个个磁道(圈)
每个磁道存储的数据量是相同的,而最内侧磁道上的扇区面积最小,因此数据密度最大
柱面
所有盘面中相对位置相同的磁道组成柱面
扇区
一个磁道又被划分成一个个扇区
扇区是磁盘的最小管理单元(未分簇的操作系统)
扇区的数目是由最靠内的磁道能记录的扇区数决定的
磁盘容量
记录密度,磁道一英寸的段中可以放入的位数,每个磁道存储的数据量是相同的,而最内侧磁道上的扇区面积最小,因此记录密度最大,扇区的数目是由最靠内的磁道能记录的扇区数决定的。为了保持每个磁道有固定的扇区数,越往外的磁道扇区隔得越开
磁道密度,从盘片中心出发半径上一英寸的段内的磁道数
面密度,记录密度与磁道密度的乘积
磁盘块
文件系统就是操作系统的一部分,OS进行磁盘管理的最小单位是"块"(Linux下如Ext4等文件系统),分簇的操作系统,簇是OS进行磁盘管理的最小单位(Windows下如NTFS等文件系统)
一个磁盘块对应一个扇区,磁盘块是OS逻辑上的概念,扇区是实际存在的
簇
扇区是磁盘最小的物理存储单元,但是由于操作系统无法对数目众多的扇区进行寻址,所以操作系统就将相邻的扇区组合在一起,从而形成簇然后在对簇进行管理,以簇为单位进行空间分配。【簇也是逻辑概念,同磁盘块地位相同】
调度时间计算
寻道时间
受磁盘调度算法影响,一般会给出“相邻磁道平均移动时间”,拿总移动磁道数乘上即可
延迟时间
延迟时间如果没有明确指出或者说忽略,一般取磁盘转一周时间的一半
传输时间
需要传输b字节数据,磁盘转速为r转/秒,一个磁道可存储N字节
1 r ⋅ b N \frac{1}{r}\cdot \frac{b}{N} r1⋅Nb
先来先服务 FCFS
平均寻道时间较长
公平,不会饥饿
最短寻道时间优先 SSTF
贪心策略,每次的选取具有后效性,不能保证平均最少
可能导致饥饿
扫描算法(电梯调度) SCAN
SCAN:只有磁头移动到最外侧磁道的时候才能往内移动,移动到最内侧磁道的时候才能往外移动
LOOK:如果在磁头移动方向上已经没有别的请求,就可以立即改变磁头移动方向
响应频率不均匀(两侧两次响应的相隔时间短)
不会饥饿
循环扫描算法 CSCAN
磁头朝某个特定方向移动时才处理磁道访问请求,而返冋时直接快速移动至起始端而不处理仼何请求,解决响应频率不均匀的问题
磁道交替编号,盘面错位命名
访问一个磁道后,为访问下一个磁道做准备
访问一个盘面后,为访问下一个盘面做准备
磁盘地址采用【柱面号,盘面号,扇区号】格式
对于一个需要多个磁道存储的文件,如果存在同一盘面的不同磁道上,读取时势必要移动磁头;如果存在同一柱面的不同磁道,就不需要移动磁头
磁盘初始化
低级格式化涉及硬件,高级格式化涉及OS
低级格式化(物理格式化)
划分出柱面和磁道,再将磁道划分成扇区
在高级格式化之前,需要进行磁盘分区,将一个实体磁盘在逻辑上划分为数个磁盘
高级格式化
清除硬盘上的数据
生成引导区信息
生成文件系统,包括创建文件系统的根目录、初始化存储空间管理所用的数据结构(如位示图、空闲分区表、FAT表)
标注逻辑坏道
引导块
ROM中只存放很小的“自举装入程序”,完整的自举程序放在磁盘的启动块,启动块位于磁盘的固定位。启动分区所在的磁盘称为启动盘或系统盘。
为什么Windows更新/装软件会要求重启电脑?
覆盖/删除一个正在被打开的文件,Windows采取强制手段(不允许)
如果安装的软件涉及到一些系统文件的更新,一般系统文件都是正在运行/被打开的,那么自然就需要重启电脑,在系统内核加载前,去覆盖这些文件。(这个步骤,显然需要ROM中的程序来引导)
注册表文件(system.dat,user.dat)看来不属于上述情况,因为我们是可以通过regedit来修改的。
坏块
对于简单的磁盘,可以在逻辑格式化时(建立文件系统时)对整个磁盘进行坏块检査,标明哪些扇区是坏扇区,比如:在FAT表上标明。这种方式,坏块对操作系统不透明
对于复杂的磁盘,磁盘控制器(磁盘设备内部的一个硬件部件)会维护一个坏块链表。在磁盘出厂前进行低级格式化(物理格式化)时就将坏块链进行初始化。会保留一些“备用扇区”,用于替换坏块。这种方案称为扇区备用。这种方式,坏块对操作系统透明