导航:首页 > 物理学科 > 连续分配需要多少次磁盘io删除一个物理块

连续分配需要多少次磁盘io删除一个物理块

发布时间:2022-12-26 05:41:16

1. 编程实现连续分配,链接分配和索引分配等三种外存分配方式

一. 连续分配

原理:创建文件时,分配一组连续的块;FAT(文档分配表)中每个文件只要一项,说明起始块和文件长度。对于顺序文件有利。

优点:1.简便。适用于一次性写入操作。2.支持顺序存取和随机存取,顺序存取速度快。3.所需的磁盘寻道次数和寻道时间最少。(因为空间的连续性,当访问下一个磁盘块时,一般无需移动磁头,当需要移动磁头时,只需要移动一个磁道。)

缺点:1.文件不能动态增长。(可能文件末尾处的空块已经分配给了别的文件。)2.不利于文件的插入和删除。3.外部碎片问题。(反复增删文件后,很难找到空间大小足够的连续块,需要进行紧缩。)4.在创建文件时需生命文件大小。

如图:

2. 文件管理

文件名:同一目录下不允许有同名文件 标识符:一个系统内的各文件标识符唯一,对用户来说毫无可读性,因此标识符只是操作系统用于区分各个文件的一种内部名称
类型
位置:文件的存放路径(让用户使用)、在外存中的地址(操作系统使用,对用户不可见)
大小
创建时间
上次修改时间
创建者
保护信息:对文件进行保护的访问控制信息

文件内部的数据组织方式

文件如何存放在外存
逻辑块号+块内地址

顺序文件

链式存储无法实现随机存取,每次只能从第一个记录开始往后查找
顺序可变长记录无法实现随机存取,每次只能从第一个记录开始往后查找
顺序存储定长记录可实现随机存取,若采用串结构,无法快速找到某关键字对应的记录,若采用顺序结构可以快速找到某关键字对应的记录

串结构比顺序结构的增删更简单,因为串结构不需要关键字按顺序排列

索引文件

建立一张索引表以加快文件检索速度,每条记录对应一个索引项
索引项本身是定长记录的顺序文件,因此可以快速找到第i个记录对应的索引项
将关键字作为索引号内容,若按关键字顺序排列,还可以支持按照关键字对半查找
每当要增加/删除一个记录,需要对索引表进行修改
主要用于对信息处理的及时性要求比较高的场合
还可以用不同的数据项建立多个索引表

多级索引

目录本身就是一种有结构文件,由一条条记录组成,每条记录对应一个该存放在该目录下的文件

文件控制块FCB:目录文件中的一条记录,实现了文件名和文件之间的映射,使用户可以按名存取。包含文件名、物理地址、逻辑结构、物理结构、存储控制信息、使用信息等,最基本的是文件名和文件存放的物理地址

单级目录:不允许文件重名

两级目录:主文件目录,用户文件目录
不同用户的文件可以重名,也可以实现访问限制,usr1不可以访问usr2的文件

多级目录结构
绝对路径:从根目录出发的路径,/照片/2015/自拍.jpg,三次读盘IO操作
相对路径:从当前目录出发,./2015/自拍.jpg,两次读盘IO操作

无环图目录结构
可以用不同的文件名指向同一个文件,甚至可以指向同一个目录。可以为共享节点设置共享计数器,共享计数器为0时,真正删除文件

磁盘块:在很多操作系统中,磁盘块的大小与内存块、页面的大小相同
磁盘IO、读写操作:内存和磁盘之间的数据交换,以块为单位进行,每次读入一块,或者每次写出一块
文件的逻辑地址也可以表示为逻辑块号和块内地址的形式
用户通过逻辑地址来操作自己的文件,操作系统要负责实现从逻辑地址到物理地址的映射

连续分配:每个文件在磁盘上占有一组连续的块
此时文件目录项中需要记录文件的起始块号和长度(占用了多少个块)
用户给出要访问的逻辑块号时,操作系统需要检查用户提供的逻辑块号是否合法(逻辑块号≥长度)
优点1:可以直接算出逻辑块号对应的物理块号,因此连续分配支持顺序访问和直接访问(随机访问)
优点2:读取磁盘块时,需要移动磁头,访问的两个磁盘块相距越远,移动磁头所需时间越长。因此连续分配的文件在顺序读写时速度最快
缺点:物理上采用连续分配的文件不方便拓展(需要移动);会产生磁盘碎片,使得空间利用率降低(可以用紧凑技术,需要很大的时间代价)

链接分配:采取离散分配,通过指针链接将磁盘块连接

默认是隐式链接

索引分配:系统为每个文件建立一张索引表,表中记录文件的各个逻辑块对应的物理块(相当于页表),索引表存放的磁盘块称为索引块,文件数据存放的磁盘块称为数据块
目录中需要记录文件的索引块是几号磁盘块,索引表中逻辑块号是隐藏的

与显式链接的区别:FAT是整个磁盘对应一张FAT,索引表是一个文件对应一张索引表

支持随机访问,容易实现文件拓展
索引表需要占用空间

如果索引表太大怎么办

3. 设一个文件由100个物理块所组成

101

4. 程序员必备知识(操作系统5-文件系统)

本篇与之前的第三篇的内存管理知识点有相似的地方

对于运行的进程来说,内存就像一个纸箱子, 仅仅是一个暂存数据的地方, 而且空间有限。如果我们想要进程结束之后,数据依然能够保存下来,就不能只保存在内存里,而是应该保存在 外部存储 中。就像图书馆这种地方,不仅空间大,而且能够永久保存。

我们最常用的外部存储就是 硬盘 ,数据是以文件的形式保存在硬盘上的。为了管理这些文件,我们在规划文件系统的时候,需要考虑到以下几点。

第一点,文件系统要有严格的组织形式,使得文件能够 以块为单位进行存储 。这就像图书馆里,我们会给设置一排排书架,然后再把书架分成一个个小格子,有的项目存放的资料非常多,一个格子放不下,就需要多个格子来进行存放。我们把这个区域称为存放原始资料的 仓库区 。

第二点,文件系统中也要有 索引区 ,用来方便查找一个文件分成的多个块都存放在了什么位置。这就好比,图书馆的书太多了,为了方便查找,我们需要专门设置一排书架,这里面会写清楚整个档案库有哪些资料,资料在哪个架子的哪个格子上。这样找资料的时候就不用跑遍整个档案库,在这个书架上找到后,直奔目标书架就可以了。

第三点,如果文件系统中有的文件是热点文件,近期经常被读取和写入,文件系统应该有 缓存层 。这就相当于图书馆里面的热门图书区,这里面的书都是畅销书或者是常常被借还的图书。因为借还的次数比较多,那就没必要每次有人还了之后,还放回遥远的货架,我们可以专门开辟一个区域, 放置这些借还频次高的图书。这样借还的效率就会提高。

第四点,文件应该用 文件夹 的形式组织起来,方便管理和查询。这就像在图书馆里面,你可以给这些资料分门别类,比如分成计算机类.文学类.历史类等等。这样你也容易管理,项目组借阅的时候只要在某个类别中去找就可以了。

在文件系统中,每个文件都有一个名字,这样我们访问一个文件,希望通过它的名字就可以找到。文件名就是一个普通的文本。 当然文件名会经常冲突,不同用户取相同的名字的情况还是会经常出现的。

要想把很多的文件有序地组织起来,我们就需要把它们成为 目录 或者文件夹。这样,一个文件夹里可以包含文件夹,也可以包含文件,这样就形成了一种 树形结构 。而我们可以将不同的用户放在不同的用户目录下,就可以一定程度上避免了命名的冲突问题。

第五点,Linux 内核要在自己的内存里面维护一套数据结构,来保存哪些文件被哪些进程打开和使用 。这就好比,图书馆里会有个图书管理系统,记录哪些书被借阅了,被谁借阅了,借阅了多久,什么时候归还。

文件系统是操作系统中负责管理持久数据的子系统,说简单点,就是负责把用户的文件存到磁盘硬件中,因为即使计算机断电了,磁盘里的数据并不会丢失,所以可以持久化的保存文件。

文件系统的基本数据单位是 文件 ,它的目的是对磁盘上的文件进行组织管理,那组织的方式不同,就会形成不同的文件系统。

Linux最经典的一句话是:“一切皆文件”,不仅普通的文件和目录,就连块设备、管道、socket 等,也都是统一交给文件系统管理的。

Linux文件系统会为每个文件分配两个数据结构: 索引节点(index node) 和 目录项(directory entry) ,它们主要用来记录文件的元信息和目录层次结构。

●索引节点,也就是inode, 用来记录文件的元信息,比如inode编号、文件大小访问权限、创建时间、修改时间、 数据在磁盘的位置 等等。 索引节点是文件的唯一标识 ,它们之间一一对应, 也同样都会被 存储在硬盘 中,所以索引节点同样占用磁盘空间。

●目录项,也就是dentry, 用来记录文件的名字、索引节点指针以及与其他目录项的层级关联关系。多个目录项关联起来,就会形成 目录结构 ,但它与索引节点不同的是,目录项是由内核维护的一个数据结构,不存放于磁盘,而是 缓存在内存 。

由于索引节点唯一标识一个文件,而目录项记录着文件的名,所以目录项和索引节点的关系是多对一,也就是说,一个文件可以有多个别字。比如,硬链接的实现就是多个目录项中的索引节点指向同一个文件。

注意,目录也是文件,也是用索引节点唯一标识,和普通文件不同的是,普通文件在磁盘里面保存的是文件数据,而目录文件在磁盘里面保存子目录或文件。

(PS:目录项和目录不是一个东西!你也不是一个东西(^_=), 虽然名字很相近,但目录是个文件。持久化存储在磁盘,而目录项是内核一个数据结构,缓存在内存。

如果查询目录频繁从磁盘读,效率会很低,所以内核会把已经读过的目录用目录项这个数据结构缓存在内存,下次再次读到相同的目录时,只需从内存读就可以,大大提高了 文件系统的效率。

目录项这个数据结构不只是表示目录,也是可以表示文件的。)

磁盘读写的最小单位是 扇区 ,扇区的大小只有512B大小,很明显,如果每次读写都以这么小为单位,那这读写的效率会非常低。

所以,文件系统把多个扇区组成了一个 逻辑块 ,每次读写的最小单位就是逻辑块(数据块) , Linux中的逻辑块大小为4KB,也就是一次性读写 8个扇区,这将大大提高了磁盘的读写的效率。

以上就是索引节点、目录项以及文件数据的关系,下面这个图就很好的展示了它们之间的关系:

索引节点是存储在硬盘上的数据,那么为了加速文件的访问,通常会把索引节点加载到内存中。

另外,磁盘进行格式化的时候,会被分成三个存储区域,分别是超级块、索引节点区和数据块区。

●超级块,用来存储文件系统的详细信息,比如块个数、块大小、空闲块等等。

●索引节点区,用来存储索引节点;

●数据块区,用来存储文件或目录数据;

我们不可能把超级块和索引节点区全部加载到内存,这样内存肯定撑不住,所以只有当需要使用的时候,才将其加载进内存,它们加载进内存的时机是不同的.

●超级块:当文件系统挂载时进入内存;

●索引节点区:当文件被访问时进入内存;

文件系统的种类众多,而操作系统希望 对用户提供一个统一的接口 ,于是在用户层与文件系统层引入了中间层,这个中间层就称为 虚拟文件系统(Virtual File System, VFS) 。

VFS定义了一组所有文件系统都支持的数据结构和标准接口,这样程序员不需要了解文件系统的工作原理,只需要了解VFS提供的统一接口即可。

在Linux文件系统中,用户空间、系统调用、虚拟机文件系统、缓存、文件系统以及存储之间的关系如下图:

Linux支持的文件系统也不少,根据存储位置的不同,可以把文件系统分为三类:

●磁盘的文件系统,它是直接把数据存储在磁盘中,比如Ext 2/3/4. XFS 等都是这类文件系统。

●内存的文件系统,这类文件系统的数据不是存储在硬盘的,而是占用内存空间,我们经常用到的/proc 和/sys文件系统都属于这一类,读写这类文件,实际上是读写内核中相关的数据。

●网络的文件系统,用来访问其他计算机主机数据的文件系统,比如NFS. SMB等等。

文件系统首先要先挂载到某个目录才可以正常使用,比如Linux系统在启动时,会把文件系统挂载到根目录。

在操作系统的辅助之下,磁盘中的数据在计算机中都会呈现为易读的形式,并且我们不需要关心数据到底是如何存放在磁盘中,存放在磁盘的哪个地方等等问题,这些全部都是由操作系统完成的。

那么,文件数据在磁盘中究竟是怎么样的呢?我们来一探究竟!

磁盘中的存储单元会被划分为一个个的“ 块 ”,也被称为 扇区 ,扇区的大小一般都为512byte.这说明即使一块数据不足512byte,那么它也要占用512byte的磁盘空间。

而几乎所有的文件系统都会把文件分割成固定大小的块来存储,通常一个块的大小为4K。如果磁盘中的扇区为512byte,而文件系统的块大小为4K,那么文件系统的存储单元就为8个扇区。这也是前面提到的一个问题,文件大小和占用空间之间有什么区别?文件大小是文件实际的大小,而占用空间则是因为即使它的实际大小没有达到那么大,但是这部分空间实际也被占用,其他文件数据无法使用这部分的空间。所以我们 写入1byte的数据到文本中,但是它占用的空间也会是4K。

这里要注意在Windows下的NTFS文件系统中,如果一开始文件数据小于 1K,那么则不会分配磁盘块来存储,而是存在一个文件表中。但是一旦文件数据大于1K,那么不管以后文件的大小,都会分配以4K为单位的磁盘空间来存储。

与内存管理一样,为了方便对磁盘的管理,文件的逻辑地址也被分为一个个的文件块。于是文件的逻辑地址就是(逻辑块号,块内地址)。用户通过逻辑地址来操作文件,操作系统负责完成逻辑地址与物理地址的映射。

不同的文件系统为文件分配磁盘空间会有不同的方式,这些方式各自都有优缺点。

连续分配要求每个文件在磁盘上有一组连续的块,该分配方式较为简单。

通过上图可以看到,文件的逻辑块号的顺序是与物理块号相同的,这样就可以实现随机存取了,只要知道了第一个逻辑块的物理地址, 那么就可以快速访问到其他逻辑块的物理地址。那么操作系统如何完成逻辑块与物理块之间的映射呢?实际上,文件都是存放在目录下的,而目录是一种有结构文件, 所以在文件目录的记录中会存放目录下所有文件的信息,每一个文件或者目录都是一个记录。 而这些信息就包括文件的起始块号和占有块号的数量。

那么操作系统如何完成逻辑块与物理块之间的映射呢? (逻辑块号, 块内地址) -> (物理块号, 块内地址),只需要知道逻辑块号对应的物理块号即可,块内地址不变。

用户访问一个文件的内容,操作系统通过文件的标识符找到目录项FCB, 物理块号=起始块号+逻辑块号。 当然,还需要检查逻辑块号是否合法,是否超过长度等。因为可以根据逻辑块号直接算出物理块号,所以连续分配支持 顺序访问和随机访问 。

因为读/写文件是需要移动磁头的,如果访问两个相隔很远的磁盘块,移动磁头的时间就会变长。使用连续分配来作为文件的分配方式,会使文件的磁盘块相邻,所以文件的读/写速度最快。

连续空间存放的方式虽然读写效率高,但是有 磁盘空间碎片 和 文件长度不易扩展 的缺陷。

如下图,如果文件B被删除,磁盘上就留下一块空缺,这时,如果新来的文件小于其中的一个空缺,我们就可以将其放在相应空缺里。但如果该文件的大小大于所

有的空缺,但却小于空缺大小之和,则虽然磁盘上有足够的空缺,但该文件还是不能存放。当然了,我们可以通过将现有文件进行挪动来腾出空间以容纳新的文件,但是这个在磁盘挪动文件是非常耗时,所以这种方式不太现实。

另外一个缺陷是文件长度扩展不方便,例如上图中的文件A要想扩大一下,需要更多的磁盘空间,唯一的办法就只能是挪动的方式,前面也说了,这种方式效率是非常低的。

那么有没有更好的方式来解决上面的问题呢?答案当然有,既然连续空间存放的方式不太行,那么我们就改变存放的方式,使用非连续空间存放方式来解决这些缺陷。

非连续空间存放方式分为 链表方式 和 索引方式 。

链式分配采取离散分配的方式,可以为文件分配离散的磁盘块。它有两种分配方式:显示链接和隐式链接。

隐式链接是只目录项中只会记录文件所占磁盘块中的第一块的地址和最后一块磁盘块的地址, 然后通过在每一个磁盘块中存放一个指向下一 磁盘块的指针, 从而可以根据指针找到下一块磁盘块。如果需要分配新的磁盘块,则使用最后一块磁盘块中的指针指向新的磁盘块,然后修改新的磁盘块为最后的磁盘块。

我们来思考一个问题, 采用隐式链接如何将实现逻辑块号转换为物理块号呢?

用户给出需要访问的逻辑块号i,操作系统需要找到所需访问文件的目录项FCB.从目录项中可以知道文件的起始块号,然后将逻辑块号0的数据读入内存,由此知道1号逻辑块的物理块号,然后再读入1号逻辑块的数据进内存,此次类推,最终可以找到用户所需访问的逻辑块号i。访问逻辑块号i,总共需要i+ 1次磁盘1/0操作。

得出结论: 隐式链接分配只能顺序访问,不支持随机访问,查找效率低 。

我们来思考另外一个问题,采用隐式链接是否方便文件拓展?

我们知道目录项中存有结束块号的物理地址,所以我们如果要拓展文件,只需要将新分配的磁盘块挂载到结束块号的后面即可,修改结束块号的指针指向新分配的磁盘块,然后修改目录项。

得出结论: 隐式链接分配很方便文件拓展。所有空闲磁盘块都可以被利用到,无碎片问题,存储利用率高。

显示链接是把用于链接各个物理块的指针显式地存放在一张表中,该表称为文件分配表(FAT, File Allocation Table)。

由于查找记录的过程是在内存中进行的,因而不仅显着地 提高了检索速度 ,而且 大大减少了访问磁盘的次数 。但也正是整个表都存放在内存中的关系,它的主要的缺点是 不适 用于大磁盘 。

比如,对于200GB的磁盘和1KB大小的块,这张表需要有2亿项,每一项对应于这2亿个磁盘块中的一个块,每项如果需要4个字节,那这张表要占用800MB内存,很显然FAT方案对于大磁盘而言不太合适。

一直都在,加油!(*゜Д゜)σ凸←自爆按钮

链表的方式解决了连续分配的磁盘碎片和文件动态打展的问题,但是不能有效支持直接访问(FAT除外) ,索引的方式可以解决这个问题。

索引的实现是为每个文件创建一个 索引数据块 ,里面存放的 是指向文件数据块的指针列表 ,说白了就像书的目录一样,要找哪个章节的内容,看目录查就可以。

另外, 文件头需要包含指向索引数据块的指针 ,这样就可以通过文件头知道索引数据块的位置,再通过索弓|数据块里的索引信息找到对应的数据块。

创建文件时,索引块的所有指针都设为空。当首次写入第i块时,先从空闲空间中取得一个块, 再将其地址写到索引块的第i个条目。

索引的方式优点在于:

●文件的创建、增大、缩小很方便;

●不会有碎片的问题;

●支持顺序读写和随机读写;

由于索引数据也是存放在磁盘块的,如果文件很小,明明只需一块就可以存放的下,但还是需要额外分配一块来存放索引数据,所以缺陷之一就是存储索引带来的开销。

如果文件很大,大到一个索引数据块放不下索引信息,这时又要如何处理大文件的存放呢?我们可以通过组合的方式,来处理大文件的存储。

先来看看 链表+索引 的组合,这种组合称为 链式索引块 ,它的实现方式是在 索引数据块留出一个存放下一个索引数据块的指针 ,于是当一个索引数据块的索引信息用完了,就可以通过指针的方式,找到下一个索引数据块的信息。那这种方式也会出现前面提到的链表方式的问题,万一某个指针损坏了,后面的数据也就会无法读取了。

还有另外一种组合方式是 索引+索引 的方式,这种组合称为多级索引块,实现方式是通过一个索引块来存放多个索引数据块,一层套一层索引, 像极了俄罗斯套娃是吧๑乛◡乛๑ 

前面说到的文件的存储是针对已经被占用的数据块组织和管理,接下来的问题是,如果我要保存一个数据块, 我应该放在硬盘上的哪个位置呢?难道需要将所有的块扫描一遍,找个空的地方随便放吗?

那这种方式效率就太低了,所以针对磁盘的空闲空间也是要引入管理的机制,接下来介绍几种常见的方法:

●空闲表法

●空闲链表法

●位图法

空闲表法

空闲表法就是为所有空闲空间建立一张表,表内容包括空闲区的第一个块号和该空闲区的块个数,注意,这个方式是连续分配的。如下图:

当请求分配磁盘空间时,系统依次扫描空闲表里的内容,直到找到一个合适的空闲区域为止。当用户撤销一个文件时,系统回收文件空间。这时,也需顺序扫描空闲表,寻找一个空闲表条目并将释放空间的第一个物理块号及它占用的块数填到这个条目中。

这种方法仅当有少量的空闲区时才有较好的效果。因为,如果存储空间中有着大量的小的空闲区,则空闲表变得很大,这样查询效率会很低。另外,这种分配技术适用于建立连续文件。

空闲链表法

我们也可以使用链表的方式来管理空闲空间,每一个空闲块里有一个指针指向下一个空闲块,这样也能很方便的找到空闲块并管理起来。如下图:

当创建文件需要一块或几块时,就从链头上依次取下一块或几块。反之,当回收空间时,把这些空闲块依次接到链头上。

这种技术只要在主存中保存一个指针, 令它指向第一个空闲块。其特点是简单,但不能随机访问,工作效率低,因为每当在链上增加或移动空闲块时需要做很多1/0操作,同时数据块的指针消耗了一定的存储空间。

空闲表法和空闲链表法都不适合用于大型文件系统,因为这会使空闲表或空闲链表太大。

位图法

位图是利用二进制的一位来表示磁盘中一个盘块的使用情况,磁盘上所有的盘块都有一个二进制位与之对应。

当值为0时,表示对应的盘块空闲,值为1时,表示对应的盘块已分配。它形式如下:

在Linux文件系统就采用了位图的方式来管理空闲空间,不仅用于数据空闲块的管理,还用于inode空闲块的管理,因为inode也是存储在磁盘的,自然也要有对其管理。

前面提到Linux是用位图的方式管理空闲空间,用户在创建一个新文件时, Linux 内核会通过inode的位图找到空闲可用的inode,并进行分配。要存储数据时,会通过块的位图找到空闲的块,并分配,但仔细计算一下还是有问题的。

数据块的位图是放在磁盘块里的,假设是放在一个块里,一个块4K,每位表示一个数据块,共可以表示4 * 1024 * 8 = 2^15个空闲块,由于1个数据块是4K大小,那么最大可以表示的空间为2^15 * 4 * 1024 = 2^27个byte,也就是128M。

也就是说按照上面的结构,如果采用(一个块的位图+ 一系列的块),外加一(个块的inode的位图+一系列的inode)的结构能表示的最大空间也就128M,

这太少了,现在很多文件都比这个大。

在Linux文件系统,把这个结构称为一个 块组 ,那么有N多的块组,就能够表示N大的文件。

最终,整个文件系统格式就是下面这个样子。

最前面的第一个块是引导块,在系统启动时用于启用引导,接着后面就是一个一个连续的块组了,块组的内容如下:

● 超级块 ,包含的是文件系统的重要信息,比如inode总个数、块总个数、每个块组的inode个数、每个块组的块个数等等。

● 块组描述符 ,包含文件系统中各个块组的状态,比如块组中空闲块和inode的数目等,每个块组都包含了文件系统中“所有块组的组描述符信息”。

● 数据位图和inode位图 ,用于表示对应的数据块或inode是空闲的,还是被使用中。

● inode 列表 ,包含了块组中所有的inode, inode 用于保存文件系统中与各个文件和目录相关的所有元数据。

● 数据块 ,包含文件的有用数据。

你可以会发现每个块组里有很多重复的信息,比如 超级块和块组描述符表,这两个都是全局信息,而且非常的重要 ,这么做是有两个原因:

●如果系统崩溃破坏了超级块或块组描述符,有关文件系统结构和内容的所有信息都会丢失。如果有冗余的副本,该信息是可能恢复的。

●通过使文件和管理数据尽可能接近,减少了磁头寻道和旋转,这可以提高文件系统的性能。

不过,Ext2 的后续版本采用了稀疏技术。该做法是,超级块和块组描述符表不再存储到文件系统的每个块组中,而是只写入到块组0、块组1和其他ID可以表示为3、5、7的幂的块组中。

在前面,我们知道了一个普通文件是如何存储的,但还有一个特殊的文件,经常用到的目录,它是如何保存的呢?

基于Linux 一切切皆文件的设计思想,目录其实也是个文件,你甚至可以通过vim打开它,它也有inode, inode 里面也是指向一些块。

和普通文件不同的是, 普通文件的块里面保存的是文件数据,而目录文件的块里面保存的是目录里面一项一项的文件信息 。

在目录文件的块中,最简单的保存格式就是 列表 ,就是一项一项地将目录下的文件信息(如文件名、文件inode.文件类型等)列在表里。

列表中每一项就代表该目录下的文件的文件名和对应的inode,通过这个inode,就可以找到真正的文件。

通常,第一项是“则”,表示当前目录,第二项是.,表示上一级目录, 接下来就是一项一项的文件名和inode。

如果一个目录有超级多的文件,我们要想在这个目录下找文件,按照列表一项一项的找,效率就不高了。

于是,保存目录的格式改成 哈希表 ,对文件名进行哈希计算,把哈希值保存起来,如果我们要查找一个目录下面的文件名,可以通过名称取哈希。如果哈希能够匹配上,就说明这个文件的信息在相应的块里面。

Linux系统的ext文件系统就是采用了哈希表,来保存目录的内容,这种方法的优点是查找非常迅速,插入和删除也较简单,不过需要一些预备措施来避免哈希冲突。

目录查询是通过在磁盘上反复搜索完成,需要不断地进行/0操作,开销较大。所以,为了减少/0操作,把当前使用的文件目录缓存在内存,以后要使用该文件时只要在内存中操作,从而降低了磁盘操作次数,提高了文件系统的访问速度。

感谢您的阅读,希望您能摄取到知识!加油!冲冲冲!(发现光,追随光,成为光,散发光!)我是程序员耶耶!有缘再见。<-biubiu-⊂(`ω´∩)

5. 单极索引分配 在文件结尾添加一个磁盘块 需要几次磁盘操作

因为一个目录文件最多可以由4个磁盘块组成,读目录和下级目录的时候,在最好的情况下,总能在第一个磁盘块上就能找到所需的下级目录信息,所以ADKQ四个目录读四次就可以了,此后是读文件,理想情况下所需页面可以通过前10个索引直接找到,此时只需再读一次就能读到所需页了,结果最少共用5次

最坏情况下,每个目录都存放在4个磁盘块的最后一个上,因此每个目录都得读四次,一共4*4=16次,而找到文件后,所需页面又得通过2级索引去找,这样一来2级索引表读一次,1级索引表又读一次,页面本身内容再读一次,又需2+1=3次,所以最坏情况就是16+3=19次

6. 一个文件有100个磁盘块,fcb在内存,采用链接分配在文件结尾处添加一个磁盘块需要多少次磁盘操作

首先如果弄不明白,也不要苦恼,你可以找一下自己的朋友,或者是专业人士来为您回答这技术性问题,如果自己钻牛角尖,那就是给自己找麻烦了

7. 操作系统(四)文件管理

文件—就是一组有意义的信息/数据集合

文件属于抽象数据类型。为了恰当地定义文件,需要考虑有关文件的操作。操作系统提供系统调用,它对文件进行创建、写、读、重定位、搠除和截断等操作。

所谓的“逻辑结构”,就是指在用户看来,文件内部的数据应该是如何组织起来的。而“物理结构”指的是在操作系统看来,文件的数据是如何存放在外存中的。

无结构文件:文件内部的数据就是一系列二进制流或字符流组成。又称“流式文件”

文件内部的数据其实就是一系列字符流,没有明显的结构特性。因此也不用探讨无结构文件的“逻辑结构”问题。

有结构文件:由一组相似的记录组成,又称“记录式文件”。每条记录又若干个数据项组成。 [1] 一般来说,每条记录有一个数据项可作为关键字。根据各条记录的长度(占用的存储空间)是否相等,又可分为定长记录和可变长记录两种。有结构文件按记录的组织形式可以分为:

对于含有N条记录的顺序文件,查找某关键字值的记录时,平均需要查找N/2次。在索引顺序文件中,假设N条记录分为√N组,索引表中有√N个表项,每组有√N条记录,在查找某关键字值的记录时,先顺序查找索引表,需要查找√N /2次,然后在主文件中对应的组中顺序查找,也需要查找√N/2次,因此共需查找√N/2+√N/2=√N次。显然,索引顺序文件提高了查找效率,若记录数很多,则可采用两级或多级索引

FCB的有序集合称为“文件目录”,一个FCB就是一个文件目录项。FCB中包含了文件的基本信息(文件名、物理地址、逻辑结构、物理结构等),存取控制信息(是否可读/可写、禁止访问的用户名单等),使用信息(如文件的建立时间、修改时间等)。最重要,最基本的还是文件名、文件存放的物理地址。

对目录的操作如下:

操作的时候,可以有以下几种目录结构:

早期操作系统并不支持多级目录,整个系统中只建立一张目录表,每个文件占一个目录项。

单级目录实现了“按名存取”,但是不允许文件重名。在创建一个文件时,需要先检查目录表中有没有重名文件,确定不重名后才能允许建立文件,并将新文件对应的目录项插入目录表中。显然, 单级目录结构不适用于多用户操作系统。

早期的多用户操作系统,采用两级目录结构。分为主文件目录(MFD,Master File Directory)和用户文件目录(UFD,User Flie Directory)。

允许不同用户的文件重名。文件名虽然相同,但是对应的其实是不同的文件。两级目录结构允许不同用户的文件重名,也可以在目录上实现实现访问限制(检查此时登录的用户名是否匹配)。但是两级目录结构依然缺乏灵活性,用户不能对自己的文件进行分类

用户(或用户进程)要访问某个文件时要用文件路径名标识文件,文件路径名是个字符串。各级目录之间用“/”隔开。从根目录出发的路径称为绝对路径。

系统根据绝对路径一层一层地找到下一级目录。刚开始从外存读入根目录的目录表;找到目录的存放位置后,从外存读入对应的目录表;再找到目录的存放位置,再从外存读入对应目录表;最后才找到文件的存放位置。整个过程需要3次读磁盘I/O操作。

很多时候,用户会连续访问同一目录内的多个文件,显然,每次都从根目录开始查找,是很低效的。因此可以设置一个“当前目录”。此时已经打开了的目录文件,也就是说,这张目录表已调入内存,那么可以把它设置为“当前目录”。当用户想要访问某个文件时,可以使用从当前目录出发的“相对路径”

可见,引入“当前目录”和“相对路径”后,磁盘I/O的次数减少了。这就提升了访问文件的效率。

树形目录结构可以很方便地对文件进行分类,层次结构清晰,也能够更有效地进行文件的管理和保护。但是,树形结构不便于实现文件的共享。为此,提出了“无环图目录结构”。

可以用不同的文件名指向同一个文件,甚至可以指向同一个目录(共享同一目录下的所有内容)。需要为每个共享结点设置一个共享计数器,用于记录此时有多少个地方在共享该结点。用户提出删除结点的请求时,只是删除该用户的FCB、并使共享计数器减1,并不会直接删除共享结点。只有共享计数器减为0时,才删除结点。

其实在查找各级目录的过程中只需要用到“文件名”这个信息,只有文件名匹配时,才需要读出文件的其他信息。因此可以考虑让目录表“瘦身”来提升效率。

当找到文件名对应的目录项时,才需要将索引结点调入内存,索引结点中记录了文件的各种信息,包括文件在外存中的存放位置,根据“存放位置”即可找到文件。存放在外存中的索引结点称为“磁盘索引结点”,当索引结点放入内存后称为“内存索引结点”。相比之下内存索引结点中需要增加一些信息,比如:文件是否被修改、此时有几个进程正在访问该文件等。

为文件设置一个“口令”(如:abc112233),用户请求访问该文件时必须提供“口令”。

优点:保存口令的空间开销不多,验证口令的时间开销也很小。

缺点:正确的“口令”存放在系统内部,不够安全。

使用某个“密码”对文件进行加密,在访问文件时需要提供正确的“密码”才能对文件进行正确的解密。 [3]

优点:保密性强,不需要在系统中存储“密码”

缺点:编码/译码,或者说加密/解密要花费一定时间。

在每个文件的FCB(或索引结点)中增加一个访问控制列表(Access-Control List, ACL),该表中记录了各个用户可以对该文件执行哪些操作。

有的计算机可能会有很多个用户,因此访问控制列表可能会很大,可以用精简的访问列表解决这个问题

精简的访问列表:以“组”为单位,标记各“组”用户可以对文件执行哪些操作。当某用户想要访问文件时,系统会检查该用户所属的分组是否有相应的访问权限。

索引结点,是一种文件目录瘦身策略。由于检索文件时只需用到文件名,因此可以将除了文件名之外的其他信息放到索引结点中。这样目录项就只需要包含文件名、索引结点指针。

索引结点中设置一个链接计数变量count,用于表示链接到本索引结点上的用户目录项数。

当User3访问“ccc”时,操作系统判断文件“ccc”属于Link类型文件,于是会根据其中记录的路径层层查找目录,最终找到User1的目录表中的“aaa”表项,于是就找到了文件1的索引结点。

类似于内存分页,磁盘中的存储单元也会被分为一个个“块/磁盘块/物理块”。很多操作系统中,磁盘块的大小与内存块、页面的大小相同

内存与磁盘之间的数据交换(即读/写操作、磁盘I/O)都是以“块”为单位进行的。即每次读入一块,或每次写出一块

在内存管理中,进程的逻辑地址空间被分为一个一个页面同样的,在外存管理中,为了方便对文件数据的管理,文件的逻辑地址空间也被分为了一个一个的文件“块”。于是文件的逻辑地址也可以表示为(逻辑块号,块内地址)的形式。用户通过逻辑地址来操作自己的文件,操作系统要负责实现从逻辑地址到物理地址的映射

连续分配方式要求每个文件在磁盘上占有一组连续的块。用户给出要访问的逻辑块号,操作系统找到该文件对应的目录项(FCB)——可以直接算出逻辑块号对应的物理块号,物理块号=起始块号+逻辑块号。还需要检查用户提供的逻辑块号是否合法(逻辑块号≥ 长度就不合法)因此 连续分配支持顺序访问和直接访问 (即随机访问)

读取某个磁盘块时,需要移动磁头。访问的两个磁盘块相隔越远,移动磁头所需时间就越长。 连续分配的文件在顺序读/写时速度最快,物理上采用连续分配的文件不方便拓展,且存储空间利用率低,会产生难以利用的磁盘碎片可以用紧凑来处理碎片,但是需要耗费很大的时间代价。。

链接分配采取离散分配的方式,可以为文件分配离散的磁盘块。分为隐式链接和显式链接两种。

用户给出要访问的逻辑块号i,操作系统找到该文件对应的目录项(FCB)…从目录项中找到起始块号(即0号块),将0号逻辑块读入内存,由此知道1号逻辑块存放的物理块号,于是读入1号逻辑块,再找到2号逻辑块的存放位置……以此类推。因此,读入i号逻辑块,总共需要i+1次磁盘I/O。

采用链式分配(隐式链接)方式的文件,只支持顺序访问,不支持随机访问,查找效率低。另外,指向下一个盘块的指针也需要耗费少量的存储空间。但是,采用隐式链接的链接分配方式,很方便文件拓展。另外,所有的空闲磁盘块都可以被利用,不会有碎片问题,外存利用率高。

把用于链接文件各物理块的指针显式地存放在一张表中。即文件分配表(FAT,File Allocation Table)

一个磁盘仅设置一张FAT 。开机时,将FAT读入内存,并常驻内存。FAT的各个表项在物理上连续存储,且每一个表项长度相同,因此“物理块号”字段可以是隐含的。

从目录项中找到起始块号,若i>0,则查询内存中的文件分配表FAT,往后找到i号逻辑块对应的物理块号。 逻辑块号转换成物理块号的过程不需要读磁盘操作。

采用链式分配(显式链接)方式的文件,支持顺序访问,也支持随机访问 (想访问i号逻辑块时,并不需要依次访问之前的0 ~ i-1号逻辑块), 由于块号转换的过程不需要访问磁盘,因此相比于隐式链接来说,访问速度快很多。显然,显式链接也不会产生外部碎片,也可以很方便地对文件进行拓展。

索引分配允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块(索引表的功能类似于内存管理中的页表——建立逻辑页面到物理页之间的映射关系)。索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为数据块。

在显式链接的链式分配方式中,文件分配表FAT是一个磁盘对应一张。而索引分配方式中,索引表是一个文件对应一张。可以用固定的长度表示物理块号 [4] ,因此,索引表中的“逻辑块号”可以是隐含的。

用户给出要访问的逻辑块号i,操作系统找到该文件对应的目录项(FCB)…从目录项中可知索引表存放位置,将索引表从外存读入内存,并查找索引表即可只i号逻辑块在外存中的存放位置。

可见, 索引分配方式可以支持随机访问。文件拓展也很容易实现 (只需要给文件分配一个空闲块,并增加一个索引表项即可)但是 索引表需要占用一定的存储空间

索引块的大小是一个重要的问题,每个文件必须有一个索引块,因此索引块应尽可能小,但索引块太小就无法支持大文件,可以采用以下机制:

空闲表法适用于“连续分配方式”。分配磁盘块:与内存管理中的动态分区分配很类似,为一个文件分配连续的存储空间。同样可采用首次适应、最佳适应、最坏适应等算法来决定要为文件分配哪个区间。回收磁盘块:与内存管理中的动态分区分配很类似,当回收某个存储区时需要有四种情况——①回收区的前后都没有相邻空闲区;②回收区的前后都是空闲区;③回收区前面是空闲区;④回收区后面是空闲区。总之,回收时需要注意表项的合并问题。

操作系统保存着链头、链尾指针。如何分配:若某文件申请K个盘块,则从链头开始依次摘下K个盘块分配,并修改空闲链的链头指针。如何回收:回收的盘块依次挂到链尾,并修改空闲链的链尾指针。适用于离散分配的物理结构。为文件分配多个盘块时可能要重复多次操作

操作系统保存着链头、链尾指针。如何分配:若某文件申请K个盘块,则可以采用首次适应、最佳适应等算法,从链头开始检索,按照算法规则找到一个大小符合要求的空闲盘区,分配给文件。若没有合适的连续空闲块,也可以将不同盘区的盘块同时分配给一个文件,注意分配后可能要修改相应的链指针、盘区大小等数据。如何回收:若回收区和某个空闲盘区相邻,则需要将回收区合并到空闲盘区中。若回收区没有和任何空闲区相邻,将回收区作为单独的一个空闲盘区挂到链尾。 离散分配、连续分配都适用。为一个文件分配多个盘块时效率更高

位示图:每个二进制位对应一个盘块。在本例中,“0”代表盘块空闲,“1”代表盘块已分配。位示图一般用连续的“字”来表示,如本例中一个字的字长是16位,字中的每一位对应一个盘块。因此可以用(字号,位号)对应一个盘块号。当然有的题目中也描述为(行号,列号)

盘块号、字号、位号从0开始,若n表示字长,则

如何分配:若文件需要K个块,①顺序扫描位示图,找到K个相邻或不相邻的“0”;②根据字号、位号算出对应的盘块号,将相应盘块分配给文件;③将相应位设置为“1”。如何回收:①根据回收的盘块号计算出对应的字号、位号;②将相应二进制位设为“0”

空闲表法、空闲链表法不适用于大型文件系统,因为空闲表或空闲链表可能过大。UNIX系统中采用了成组链接法对磁盘空闲块进行管理。文件卷的目录区中专门用一个磁盘块作为“超级块”,当系统启动时需要将超级块读入内存。并且要保证内存与外存中的“超级块”数据一致。

进行Create系统调用时,需要提供的几个主要参数:

操作系统在处理Create系统调用时,主要做了两件事:

进行Delete系统调用时,需要提供的几个主要参数:

操作系统在处理Delete系统调用时,主要做了几件
事:

在很多操作系统中,在对文件进行操作之前,要求用户先使用open系统调用“打开文件”,需要提供的几个主要参数:

操作系统在处理open系统调用时,主要做了几件事:

进程使用完文件后,要“关闭文件”

操作系统在处理Close系统调用时,主要做了几件事:

进程使用read系统调用完成写操作。需要指明是哪个文件(在支持“打开文件”操作的系统中,只需要提供文件在打开文件表中的索引号即可),还需要指明要读入多少数据(如:读入1KB)、指明读入的数据要放在内存中的什么位置。操作系统在处理read系统调用时,会从读指针指向的外存中,将用户指定大小的数据读入用户指定的内存区域中。

进程使用write系统调用完成写操作,需要指明是哪个文件(在支持“打开文件”操作的系统中,只需要提供文件在打开文件表中的索引号即可),还需要指明要写出多少数据(如:写出1KB)、写回外存的数据放在内存中的什么位置操作系统在处理write系统调用时,会从用户指定的内存区域中,将指定大小的数据写回写指针指向的外存。

寻找时间(寻道时间)T S :在读/写数据前,将磁头移动到指定磁道所花的时间。

延迟时间T R :通过旋转磁盘,使磁头定位到目标扇区所需要的时间。设磁盘转速为r(单位:转/秒,或转/分),则平均所需的延迟时间

传输时间T t :从磁盘读出或向磁盘写入数据所经历的时间,假设磁盘转速为r,此次读/写的字节数为b,每个磁道上的字节数为N。则

总的平均存取时间Ta

延迟时间和传输时间都与磁盘转速相关,且为线性相关。而转速是硬件的固有属性,因此操作系统也无法优化延迟时间和传输时间,但是操作系统的磁盘调度算法会直接影响寻道时间

根据进程请求访问磁盘的先后顺序进行调度。

优点:公平;如果请求访问的磁道比较集中的话,算法性能还算过的去
缺点:如果有大量进程竞争使用磁盘,请求访问的磁道很分散,则FCFS在性能上很差,寻道时间长。

SSTF算法会优先处理的磁道是与当前磁头最近的磁道。可以保证每次的寻道时间最短,但是并不能保证总的寻道时间最短。(其实就是贪心算法的思想,只是选择眼前最优,但是总体未必最优)

优点:性能较好,平均寻道时间短
缺点:可能产生“饥饿”现象

SSTF算法会产生饥饿的原因在于:磁头有可能在一个小区域内来回来去地移动。为了防止这个问题,可以规定,只有磁头移动到最外侧磁道的时候才能往内移动,移动到最内侧磁道的时候才能往外移动。这就是扫描算法(SCAN)的思想。由于磁头移动的方式很像电梯,因此也叫电梯算法。

优点:性能较好,平均寻道时间较短,不会产生饥饿现象
缺点:①只有到达最边上的磁道时才能改变磁头移动方向②SCAN算法对于各个位置磁道的响应频率不平均

扫描算法(SCAN)中,只有到达最边上的磁道时才能改变磁头移动方向,事实上,处理了184号磁道的访问请求之后就不需要再往右移动磁头了。LOOK调度算法就是为了解决这个问题,如果在磁头移动方向上已经没有别的请求,就可以立即改变磁头移动方向。(边移动边观察,因此叫LOOK)

优点:比起SCAN算法来,不需要每次都移动到最外侧或最内侧才改变磁头方向,使寻道时间进一步缩短

SCAN算法对于各个位置磁道的响应频率不平均,而C-SCAN算法就是为了解决这个问题。规定只有磁头朝某个特定方向移动时才处理磁道访问请求,而返回时直接快速移动至起始端而不处理任何请求。

优点:比起SCAN来,对于各个位置磁道的响应频率很平均。
缺点:只有到达最边上的磁道时才能改变磁头移动方向,另外,比起SCAN算法来,平均寻道时间更长。

C-SCAN算法的主要缺点是只有到达最边上的磁道时才能改变磁头移动方向,并且磁头返回时不一定需要返回到最边缘的磁道上。C-LOOK算法就是为了解决这个问题。如果磁头移动的方向上已经没有磁道访问请求了,就可以立即让磁头返回,并且磁头只需要返回到有磁道访问请求的位置即可。

优点:比起C-SCAN算法来,不需要每次都移动到最外侧或最内侧才改变磁头方向,使寻道时间进一步缩短

磁盘地址结构的设计:

Q:磁盘的物理地址是(柱面号,盘面号,扇区号)而不是(盘面号,柱面号,扇区号)

A:读取地址连续的磁盘块时,采用(柱面号,盘面号,扇区号)的地址结构可以减少磁头移动消耗的时间

减少延迟时间的方法:

Step 1:进行低级格式化(物理格式化),将磁盘的各个磁道划分为扇区。一个扇区通常可分为头、数据区域(如512B大小)、尾三个部分组成。管理扇区所需要的各种数据结构一般存放在头、尾两个部分,包括扇区校验码(如奇偶校验、CRC循环冗余校验码等,校验码用于校验扇区中的数据是否发生错误)

Step 2:将磁盘分区,每个分区由若干柱面组成(即分为我们熟悉的C盘、D盘、E盘)

Step 3:进行逻辑格式化,创建文件系统。包括创建文件系统的根目录、初始化存储空间管理所用的数据结构(如位示图、空闲分区表)

计算机开机时需要进行一系列初始化的工作,这些初始化工作是通过执行初始化程序(自举程序)完成的

初始化程序可以放在ROM(只读存储器)中。ROM中的数据在出厂时就写入了,并且以后不能再修改。ROM中只存放很小的“自举装入程序”,完整的自举程序放在磁盘的启动块(即引导块/启动分区)上,启动块位于磁盘的固定位置,开机时计算机先运行“自举装入程序”,通过执行该程序就可找到引导块,并将完整的“自举程序”读入内存,完成初始化。拥有启动分区的磁盘称为启动磁盘或系统磁盘(C:盘)

对于简单的磁盘,可以在逻辑格式化时(建立文件系统时)对整个磁盘进行坏块检查,标明哪些扇区是坏扇区,比如:在FAT表上标明。(在这种方式中,坏块对操作系统不透明)。

对于复杂的磁盘,磁盘控制器(磁盘设备内部的一个硬件部件)会维护一个坏块链表。在磁盘出厂前进行低级格式化(物理格式化)时就将坏块链进行初始化。会保留一些“备用扇区”,用于替换坏块。这种方案称为扇区备用。且这种处理方式中,坏块对操作系统透明

8. 考虑一个由4个物理块组成的文件,假定采用索引结构,且 文件控制块已经在主存。对于采用连续结构、链接

连续:201,101,1,0,98,0 链接:1,52,102,1,52,100 索引:1,1,1,0,0,0

9. 26 文件外存分配方式

目前,常用的外存分配方法有 连续分配 链接分配 索引分配 三种。采用不同的分配方式时,将形成不同的文件物理结构。

连续分配方式对应顺序式文件结构,链接分配方式形成链接式文件结构,索引分配方式将形成索引式文件结构。有的系统(如DOS操作系统)对三种方法都支持,但是更普遍的是 一个系统只提供一种方法的支持

连续分配方法要求每个文件在磁盘上占有一组连续的块,如图所示。这样所形成的文件结构称为 顺序文件结构 ,此时的物理文件称为 顺序文件 。这种分配方式保证了逻辑文件中的的记录顺序与存储器中的文件占用盘块的顺序是 一致的

优点是 实现简单、存取速度快 ,支持顺序访问和直接访问,作业访问磁盘时需要的寻道数和寻道时间最短。

缺点在于,文件长度 不宜动态增加 ,因为一个文件末尾后的盘块可能已经分配给其他文件,一旦需要增加, 就需要大量移动盘块。在外存上使用紧凑技术所花费的时间远比内存紧凑一次所花费的时间多得多。

此外,反复增删文件后会产生 外部碎片 (与内存管理分配方式中的碎 片相似),并且很难确定一个文件需要的空间大小,因而只适用于长度固定的文件。

链接分配是釆取 离散分配 的方式,消除了外部碎片,故而显着地 提高了磁盘空间的利用率 ;又因为是根据文件的当前需求,为它分配必需的盘块,当文件动态增长时,可以动态地再为它分配盘块,故而 无需事先知道文件的大小 。此外,对文件的 增、删、改也非常方便

链接分配又可以分为隐式链接和显式链接两种形式。

文件,目录中每个目录项都包括 指向链接文件第一盘块和最后一个盘块的指针 。磁盘块分布在磁盘的任何地方,除最后一个盘块外,每一个盘块都有指向下一个盘块的指针,这些指针对用户是透明的。

为了提高检索速度和减小指针所占存储空间,可以将几个盘块组成一个簇(cluster),虽然成倍 减少了访问时间,以及指针存储空间,但却增大了内部碎片,改进很有限

显示链接把用于链接文件各物理块的指针,显示地存放在内存的一张链接表中。该表在整个磁盘仅设置一张。

表的序号从0开始,直至N-1,N为盘块总数,在每个表项中存放链接指针,即下一个盘块号。

在该表中,凡是属于某一文件的第一个盘块号(链首指针所对应的盘块号)均作为文件地址被填入相应的文件的FCB的物理地址字段中。

由于查找记录的过程是 在内存中进行的,因而提高了检索速度,减少了访问磁盘的次数 。由于分配给文件的所有盘块号都在该表中,故把该表称为文件分配表FAT(File Allocation Table)。

在打开某个文件时,只需把该文件占用的盘块号的编号调入内存即可, 无需把整个FAT调入内存 。为此,将每个文件所对应的盘块号集中地放在一起,索引分配方式就是基于此想法所形成的一种分配方式。

其为每个文件分配一个索引表,再把分配给该文件的所有盘块号都记录在该索引块中,因而该索引块就是一个含有许多磁盘块号的数组。在建立一个文件时,只需要在为之建立的目录项中填上指向该索引块的指针。

当文件太大时,索引块太多,单级索引是低效的 。此时,为这些索引块再建立一级索引,称为第一级索引,还可再建立索引,称为第二级索引等等。称为多级索引分配。

在二级索引分配方式下,若每个盘块的大小为1KB,每个盘块号占4个字节,在一个索引块可以存放256个盘块号。则,在两级索引时,最多可以包括存放文件的盘块号总数为64K(256 * 256)个盘块号,所允许文件最大长度为64MB。

若盘块号为4KB,则一级索引的最大文件大小为4MB,二级索引的最大文件大小为4GB。

多种索引分配方式相结合 而形成的一种分配方式,如直接地址,一次间接地址,多次间接地址。

Unix SystemV的分配采用了三级索引分配方式。共设置了13个索引地址项。前10个:iaddr(0)~iaddr(9)为直接地址项,iaddr(10)为一次间接地址项,iaddr(11)为二次间接地址项,iaddr(12)为三次间接地址项。

10. 某系统磁盘块大小为512b,1560字节处的信息要进行多少次的i/o

2.什么是批处理、分时操作系统、实时操作系统?各有什么特征? 3.多道程序设计与多重处理有何区别? 4.讨论操作系统可以从哪些角度出发,如何把它们统一起来? 5.现代操作系统对运行环境有何要求? 3 2 1.有人说,一个进程是由伪处理机执行的一个程序,这话对吗?为什么? 2.比较进程与程序的联系和区别。 3.我们说程序的并发执行将导致最终结果失去封闭性。这话对所有的程序都成立吗?试举例说明。 4.什么是临界区?举一临界区的例子。 5.什么是线程?线程和进程有何区别? 6.某高校计算机系开设网络课并安排上机实习,假设机房共有2m台机器,有2n 名学生选该课,规定: ① 每2 个学生组成一组,各占一台机器,协同完成上机实习; ② 只有一组2 个学生到齐,并且此时机房有空闲机器时,该组学生才能进入机房; ③ 上机实习由一名教师检查,检查完毕,一组学生同时离开机房。 试用P、V操作模拟上机实习过程。 7.今有三个并发进程R,M,P,它们共享了一个可循环使用的缓冲区B,缓冲区B 共有N个单元。进程R 负责从输入设备读信息,每读一个字符后,把它存放在缓冲区B 的一个单元中;进程M负责处理读入的字符,若发现读入的字符中有空格符,则把它改成“,”;进程P负责把处理后的字符取出并打印输出。当缓冲区单元中的字符被进程P 取出后,则又可用来存放下一次读入的字符。请用PV操作为同步机制写出它们能正确并发执行的程序。 8.写出Reader-Writer 问题的算法,避免由于不断有Reader 出现,而使得Writer 无限期等待。 9. 设计C 程序(可以嵌入汇编语言),以忙等待方式实现信号量的P、V操作。 10. 设计C 程序,实现生产者-消费者问题。 说明:8-10 为课外实践练习。 4 3 1.进程调度的功能有哪些? 2.进程调度的时机有哪几种? 3.为什么说在进程上下文切换的过程中,上下文切换程序不能破坏“老”进程的上下文结构? 4.比较常用的几种调度算法。 5.假设有四道作业,它们的进入时刻与执行时间如下所示: 作业号 进入时刻(时) 执行时间(小时) 1 10.00 0.4 2 10.10 1.0 3 10.20 0.6 4 10.30 0.2 在单道程序环境下,分别采用先来先服务和最短作业优先调度算法,试说明它们的调度顺序及平均周转时间。 5 4 1.什么是虚拟存储器?其特点是什么? 2.动态分区管理的常用内存分配算法有哪几种?比较它们各自的优缺点。 3.什么是页式管理?静态页式管理可以实现虚存吗? 4.请求页式管理有哪几种常用的页置换算法?比较它们的优缺点。 5.什么是段式管理?它与页式管理有何区别? 6.在一个请求分页系统中,采用LRU 页面置换算法时,假如一个进程的页面访问顺序为4, 3,2,1,4,3,5,4,3,2,1,5,当分配给该进程的物理块数M 分别为3 和4 时,请计算访问过程中发生的缺页次数和缺页率,比较所得结果。 7.设一个计算机有4 个页框,装入时间、最近访问时间和每页的访问位、修改位如下所示(时间以时钟周期为单位): 页 装入时间 最近访问时间 访问位A 修改位M 0 126 279 0 0 1 230 260 1 0 2 120 272 1 1 3 160 280 1 1 1)NRU 将置换哪一页? 2)LRU 将置换哪一页? 3)FIFO 将置换哪一页? 8.已知如下段表: 段号 基址 长度 合法(0)/非法(1) 0 219 600 0 1 2300 14 0 2 90 100 1 3 1327 580 0 4 1952 96 0 在分段存储管理下系统运行时,下列逻辑地址的物理地址是什么? (1)0,430 (2)1,10 (3)1,11 (4)2,500 (5)3,400 (6)4,112 6 5 1.什么是系统调用?系统调用与一般的过程调用有何区别? 2.在Linux 操作系统中,引起进程调度的时机有哪些? 3.简述 shell 命令在Linux 中的实现过程。 4.在Linux 系统中,进程在什么时候处理它们接收到的软中断信号?进程接收到软中断信号后放在什么地方? 5.Windows 2000/xp 在哪些情况下进行线程优先级提升? 6.试描述使用Win32 API 实现线程同步的一般方法。 7 6 1.什么是文件、文件系统?文件系统有哪些功能? 2.文件的物理结构有哪几种?为什么说串联文件结构不适合随机存取? 3.什么是文件目录?文件目录中包含哪些信息? 4.在实现文件系时,为加快文件目录的检索速度,可利用“文件控制块分解法”。假设目录文件存放在磁盘上,每个盘块512 字节。文件控制块占64 字节。其中文件名占8 字节。通常将文件控制块分解成两部分,第一部分占10 字节(包括文件名和文件内部号),第二部分占 56 字节(包括文件内部号和文件其他描述信息)。 ① 假设某一目录文件共有254 个文件控制块,试分别给出采用分解法前和分解法后,查找该目录文件的某一个文件控制块的平均访问磁盘次数。 ② 一般地,若目录文件分解前占用 n 个盘块,分解后改用 m 个盘块存放文件名和文件内部号部分,请组出访问磁盘次数减少的条件。 5.在创建一个文件时,可能发生哪几种情况?应如何处理? 6.文件存取控制方式有哪几种?比较它们的优缺点。 7.文件系统采用多级索引结构搜索文件内容。设块长为512 字节,每个块号长3 字节,如果不考虑逻辑块号在物理块中所占的位置,分别求二级索引和三级索引时可寻址的文件最大长度。 8 7 1.设备管理的目标和功能是什么? 2.什么是I/O 缓冲?为什么要引入I/O 缓冲? 3.设备驱动程序是什么?为什么要有设备驱动程序?用户进程怎样使用设备驱动程序? 4.为什么在单缓冲与双缓冲情况下,系统对一块数据的处理时间分别为 max(C,T)+M 和 max(C,T)?其中,C:CPU 的计算时间,T:数据从I/O 控制器到缓冲区的传输时间,M:数据从缓冲区到用户工作区的传输时间。 5.为什么要引入设备独立性?如何实现设备独立性? 6.某移动臂磁盘的柱面由外向里顺序编号,假定当前磁头停在100 号柱面且移动臂方向是向里的,现有如下表1 所示的请求序列在等待访问磁盘: 表1 访问磁盘请求序列 请求次序 1 2 3 4 5 6 7 8 9 10 柱面号 190 10 160 80 90 125 30 20 140 25 回答下面的问题: ① 写出分别采用“最短查找时间优先算法”和“电梯调度算法”时,实际处理上述请求的次序。 ② 针对本题比较上述两种算法,就移动臂所花的时间(忽略移动臂改向时间)而言,哪种算法更合适?简要说明之。 9 8 1.ext2 文件系统为什么有磁盘I 节点和内存I 节点? 2.在Linux 系统中,用于打开文件的系统调用open 的格式为 fd = open( pathname, flags) 其中,pathname 为欲打开的文件路径名,flags 指示打开方式(读、写),open 的返回值为文件描述符。 1)给出open 的实现算法。 2)说明用户文件描述符表、系统打开文件表与I 节点表的作用及三者之间的关系。 3.在Linux 系统中,文件共享有哪两种方式? 4.说明Linux 虚拟文件系统VFS 的工作原理。 5.说明Linux 虚拟文件系统VFS 中查找文件的过程。 6.什么是块设备驱动程序? 7.分别给出文件的磁盘索引节点与内存索引节点的引用数可能大于1的情况。 10 9 1.什么是死锁?给出产生死锁的个必要条件。 2.有三个进程P1、P2 和P3 并发工作。进程P1 需用资源S3 和S1;进程P2 需用资源S1 和 S2;进程P3 需用资源S2 和S3。回答: (1) 若对资源分配不加限制,会发生什么情况?为什么? (2) 为保证进程正确工作,应采用怎样的资源分配策略?为什么? 3.某系统有R1,R2,R3 三种资源,在T0 时刻P1,P2,P3,P4 四个进程对资源的占用和需求情况如表1 所示,此刻系统的可用资源向量为(2, 1, 2),问题: ① 将系统中各种资源总数和此刻各进程对各资源的需求数目用向量或矩阵表示出来; ② 如果此时P1 和P2 均发出资源请求向量Request(1, 0, 1),为了保持系统安全性,应该如何分配资源给这两个进程?说明你所采用策略的原因; ③ 如果②中两个请求立刻得到满足后,系统此刻是否处于死锁状态? 表1 T0 时刻P1,P2,P3,P4 四个进程对资源的占用和需求情况表 Maximum demand Current allocation R1 R2 R3 R1 R2 R3 P1 3 2 2 1 0 0 P2 6 1 3 4 1 1 P3 3 1 4 2 1 1 P4 4 2 2 0 0 2 4.在解决死锁问题的几种方法中,哪一种方法最容易实现?哪一种方法使资源利用率最高?

阅读全文

与连续分配需要多少次磁盘io删除一个物理块相关的资料

热点内容
word中化学式的数字怎么打出来 浏览:739
乙酸乙酯化学式怎么算 浏览:1404
沈阳初中的数学是什么版本的 浏览:1350
华为手机家人共享如何查看地理位置 浏览:1042
一氧化碳还原氧化铝化学方程式怎么配平 浏览:884
数学c什么意思是什么意思是什么 浏览:1408
中考初中地理如何补 浏览:1299
360浏览器历史在哪里下载迅雷下载 浏览:701
数学奥数卡怎么办 浏览:1387
如何回答地理是什么 浏览:1023
win7如何删除电脑文件浏览历史 浏览:1055
大学物理实验干什么用的到 浏览:1484
二年级上册数学框框怎么填 浏览:1699
西安瑞禧生物科技有限公司怎么样 浏览:969
武大的分析化学怎么样 浏览:1247
ige电化学发光偏高怎么办 浏览:1337
学而思初中英语和语文怎么样 浏览:1650
下列哪个水飞蓟素化学结构 浏览:1423
化学理学哪些专业好 浏览:1486
数学中的棱的意思是什么 浏览:1057