显然,相比之下索引顺序文件提高了存取速度。
给定记录的键值或通过散列函数转换的键值直接决定记录的物理地址。
这种映射结构不同于顺序文件或索引文件,他没有顺序的特性。
散列文件有很高的存取速度,但是会引起冲突,即不同的关键字的散列值相同。
文件的无物理结构就是研究文件的实现。即文件数据在物理存储设备上是如何分布和组织的。
这个问题我们要分为两个方向:一是文件的分配方式,即对磁盘非空闲块的管理;二是文件存储空间管理,即对磁盘空闲块的管理。
链接分配采用的是离散分配方式。它消除了磁盘的外部碎片,提高了磁盘利用率。
可以动态为文件分配盘块,也无须事先清楚文件的大小。此外对文件的增删改查非常方便。
链接分配又分成隐式链接分配和显式链接分配。
一、隐式链接
分配方式:每个文件对应一个磁盘块的链表,文件块在磁盘中以链表的方式链接。添加文件的时候会在目录项中存储指向该文件首地址的指针和尾地址的指针。写文件的时候,系统会在磁盘中找到空闲块然后将这一块插入到文件里面。
特点:增删改查比较方便,不会产生外部碎片;但是只能顺序访问文件,磁盘块中的指针会消耗空间,稳定性不好,如果指针丢失文件就会被破坏
二、显式链接
分配方式:把链接文件各个物理块的指针,从每个物理块末尾提取出来,显式地存放在内存的一张链接表(文件分配表 FileAllocation Table,FAT)中。FAT 是由盘块号和指向下一块的指针构成,表头:(盘块号,下一块号)
。
以 -1
表示文件到达结尾。-2/-3/-4
等表示磁盘块空闲。
这张表存放在内存中,系统启动就调入内存。
特点:因为表在内存中,提高了查找速度,减少访问磁盘的次数。
链接分配解决了外部碎片和文件大小管理的问题,但是其不支持有效的直接访问、FAT需要占用较大的内存空间。
注意到在打开文件时并不需要将完整的 FAT 调入内存,为此,索引分配提供下述分配方法:
把每个文件的所有盘块都存储在索引块中,在目录项中存储指向该文件索引块的指针。
特点:没有外部碎片,支持直接访问文件的任意块。
注意:当文件过大的时候索引块可能存储不了一个文件的所有块号,所以索引块很难解决大的文件,但是可以引入以下三种机制解决
为了更全面地照顾小、中、大乃至特大型文件,可采用混合索引分配。
假如每个盘块大小 4KB,盘号长 4B,设置 10 个直接地址项、1 个一级索引、1 个二级索引 和 1 个三级索引。(一个盘块可存 4K/4 = 1024 个地址)则:
对于小型文件(≤4KB×10=40KB),为了提高其访问速度,最好让它们的每个盘块地址直接放入 FCB 中。例如我们直接在索引结点中设置 10 个直接地址项。用 i.addr(0),...,i.addr(9)
存放。这实现了直接寻址。
对于中型文件(≤4KB×1024=4MB),可以采用单索引方式。访问时先从 FCB 中得到索引表(利用 i.addr(10)
),再从中获得该文件的盘块地址。这实现 一次间接寻址。
对于长度大于 40KB+4MB 的文件,采用二次间接地址分配模式。用地址项 i.addr(11)
提供。可计算得出二级间接寻址的文件最大可达 1024×4MB=4GB 。
对于更大的文件(达 4TB 大小)则采用三级间接寻址。用地址项 i.addr(12)
提供。
UNIX 系统采用的就是上述分配方法,示意图如下:
目录的操作主要有:搜索、创建文件、删除文件、显示目录、修改目录
对于树形目录,用户操作的时候根据文件路径来标识想要的文件,文件路径是一个字符串,目录名和数据文件之间用 /
分开。
从根目录开始的路径叫做绝对路径;从“当前目录”出发到所找文件的路径叫做相对路径。
树形目录可以很方便的对文件进行分类,层次结构清晰,便于文件管理与保护。但是查找文件,需要按照路径名(中间可能有很多文件目录)去寻找,增加了磁盘的访问次数。
无环图目录结构如多个用户指向一个共享结点,结点对应的文件设置一个共享计数器,有新用户访问时计数器+1,当有用户需要删除文件的时候,计数器-1。文件被修改则每个用户看到的信息都是修改后的。直到计数器的值为0后才真正实现对文件的删除。
文件共享就是让多个用户共享使用一个文件,系统中只保存一个文件的副本,不需要每个用户都复制一份。
每个用户的文件目录中只设置文件名和相应的索引结点的指针。索引结点指针,指向同一个文件的索引结点,从而读取文件信息。
该文件的索引结点里面还应有一个链接计数器 counter
,用来记录当前访问文件的用户目录数量。如果此时有两个用户访问,用户A想要删除共享文件,而此时用户B还在使用,用户A只能删除它目录中的关于共享文件的目录项,不能删除共享文件。
如果 用户B 想共享访问 用户A 的中的文件 F。系统会创建一个 LINK 类型的新文件,也取名叫 F,并将其写入 B 的目录下。新文件 F 中存储的只是 A 中文件 F 的文件路径。(快捷方式)
当 B 想要访问 F 且正要读取 LINK 文件时,操作系统据此找到 F 的路径名然后对其进行读,这样实现共享的方式就是符号链接。
由此可见,在符号链共享方式下,每次访问共享文件时系统都需要逐个查找目录直到找到目标文件的索引结点,这个过程会产生多次读盘,增加了启动磁盘的频率。
显然,只有文件主才拥有指向目标文件的索引结点指针,其他用户只有文件路径名。因此不会发生删除文件后留下悬空指针的情况。文件主删除共享文件后,其他用户再访问时就会访问失败,并将符号链删除。
注意:软硬链接都是文件系统的静态共享方法。而两个进程同时对一个文件操作的共享,称为 动态共享。
文件存储在一个文件卷中,文件卷可以是物理盘的一部分,也可以是整个物理盘。
在一个文件卷中,文件数据信息的空间(文件区) 和 存放文件控制信息FCB的空间(目录区) 是分离的。
划分:将物理磁盘划分为一个个文件卷(逻辑卷、逻辑盘)
初始化:划分好目录区和文件区,建立空闲空间管理表格及存放逻辑卷信息的超级块
空闲表法是连续的分配方式,他与内存的动态分配方式相似。为文件划分一块连续的空间。系统为外存上的所有空闲区域建立一张空闲盘块表(序号,空闲盘块的第一块号,空闲盘块数)。
同样可以使用首次适应,最佳适应等算法。
空闲链表法就是根据构成链表的基本元素不同,分成空闲盘块链和空闲盘区链,对空闲区域进行管理。
空闲盘块链:将磁盘上所有的空闲空间以盘块为单位拉成一条链。创建文件时,系统从链首开始依次给文件分配块。回收式,系统依次将被回收的盘块插入到空闲盘块链的末尾。
特点:分配与回收简单,没有碎片产生;但是分配空间的时候要产生多次重复的操作。
空闲盘区链:将外存上的所有空闲盘区(每个盘区可包含若干个盘块)拉成一条链。每个盘区上存储指向下一个盘区的指针,和这个盘区的大小信息。当需要分配的时候会根据文件的大小和一定的算法(一般是首次适应算法)找到合适区域。当回收的时候要注意与相邻的空闲盘区合并。
特点:可以用作连续分配,也可以离散分配;可以一次给一个文件分配一个区域,分配效率高,且空闲盘区链较短;但分配与回收的过程比较复杂。
采用二进制的一位来表示一个盘块的使用情况,磁盘上所有的盘块都有一个二进制位与之对应。其中,值为 1
表示该盘块已被分配。
这样,一个 位组成的位示图就可以表示 个盘块的使用情况。
下面我们给出一个有 行 列的位示图,其盘块的具体分配方法。其中,我们规定行列数均是从 1 开始编号的,盘块号也是从 1 开始计算。请注意,这只适用于下面的计算式,如果具体题目中有所变动应当自行调整。
盘块的分配逻辑如下:
0
的二进制位。0
的二进制位转换成与之对应的盘块号。例如找到当前,则其盘块号为盘块的回收:
将需要回收的盘块的盘块号转化为具体的位示图坐标,并还原标识。即:
空闲表法和空闲链表法都不适用于大型文件系统,这会使得其本身就占用过大空间。
而在 UNIX 系统中,对于外存空闲空间的分配,采用的是成组链接法。这种方法结合了以上两种方法的优点,又克服了他们都有的“表太长了”的缺点。
待更
待更
(1)用户层软件:实现用户交互接口,通过库函数实现系统调用
(2)设备独立性软件:与硬件底层无关的操作,对上层的封装操作,向上一层提供调用接口,设备保护,容错处理,设备分配与回收,数据缓冲区管理,逻辑设备与物理设备映射映射
(3)设备驱动程序:CPU指令相同,负责控制硬件设备,将CPU指令转成设备操作,驱动程序以独立进程的形式存在
(4)中断处理程序(I/O中断的应答):IO完成后发送中断信号,执行中断处理程序,会直接操作硬件
在块设备输入时,假设一块磁盘数据写入缓冲区的时间为,操作系统将该缓冲区的数据传送到用户区的时间为,CPU 对数据进行处理的时间为 ,则:
利用外存/磁盘存储区域,将独占设备共享
一次磁盘读写操作由寻道时间、旋转延迟时间和传输时间决定。
LOOK改进
CLOOK改进
一个新的磁盘是一个空白板,必须分成扇区以便磁盘控制器能读写,这个过程称为低级格式化,也叫物理格式化。
物理格式化为每个磁盘的每个扇区采用特别的数据结构,包括校验码。
为了使用磁盘存储文件,操作系统还需要将其数据结构记录在磁盘上,这个过程分为两步: