数据结构的一些小问题

数据结构的一些小问题,第1张

54 文件系统的实现

541 存储空间的分配与回收

在计算机系统中,存储空间是一种宝贵的资源。外存储设备中的空间容量虽然比较大,但也不是无限的,故对文件删除之后而不再使用的空间,必须加以回收,然后在建立文件等操作中重新利用。

对于制度的存储设备,无所谓回收,也无所谓动态分配,这种存储设备在物理上就是不可重用的。

为了进行存储空间的分配与回收,在外存储设备上设置有空闲空间登记表,该表动态跟踪该外存储设备上所有还没有分配给任何文件的空闲块的数目和块号。

该空闲空间登记表虽然称为表,但不一定以一个二维表格的形式实现。从方便、高效和安全的角度考虑,通常把空闲空间登记表放在存储介质上。

对空闲空间表的访问与修改工作是经常发生的。在进行文件删除、文件建立、写文件等操作中都会访问和修改空闲空间表。

在设计空闲空间登记表的数据结构时,一般有四种不同的方案可以考虑,下面分别介绍。

1、 位示图

位示图的基本思想是,利用一串二进制位(BIT)的值来反映磁盘空间的分配使用情况。在位示图中,没一个磁盘中物理块用一个二进制位对应,如果某个物理块为空闲,则相应的二进制位为0;如果该物理块已分配了,则相应的二进位为,如图5-15所示。

位示图对空间分配情况的描述能力强。一个二进位就描述一个物理块的状态。另外,位示图占用空间较小,因此可以复制到内存,使查找既方便又快速。位示图适用于各种文件物理结构的文件系统。使用位示图能够简单有效地在盘上找到N个连续的空闲块。

2、 空闲块表

空闲块表是专门为空闲块建立的一张表,该表记录外存储器全部空闲的物理块:包括每个空闲块的第一个空闲物理块号和该空闲块只能感空闲物理块的个数。如图5-16所示。空闲块表方式特别适合于文件物理结构为顺序结构的文件系统。

在建立新文件时,应该寻找一组连续的空闲物理块,其空闲块个数恰好等于所申请值,或接近于所申请值。系统首先查找空闲块表,主要查看该空闲块表项中是否有符合上述申请值的对应表项,如果有,就将该表项从空闲块表中删去,并且把所对应的一组连续的空闲物理块分配给申请者。

当删除文件时,系统收回它所占用的物理块,并且考虑所收回的物理块是否可以与原有空闲块相邻接,以便合并成更大的空闲区域,最后修改有关空闲块表项。

3、 空闲块链表

将外存储器中所有的空闲物理块连成一个链表,用一个空闲块首指针指向第一个空闲块,随后的每个空闲块中都含有指向下一个空闲块的指针,最后一块的指针为空,表示链尾,这样就构成了一个空闲块链表,如图5-17所示。

在图45-17中,一个空闲块链表的首指针维持一个指向物理块12的指针,该块是第一个空闲物理块。物理块12包含一个指向物理块13的指针,物理块13指向物理块14,如此等等。

空闲块链表模式效率低。要遍历整张空闲块链表,必须读每一个物理块,这就需要大量的I/O时间。

在空闲块链表模式中对空间的申请和释放是以块为单位的。申请空间时从链首取空闲块。空间释放时将物理块接入链尾。

空闲块链表法节省内存,但申请空间和回收空间的速度较慢,实现效率较低。

4、 成组链接

对链接表的一个改进方案是将N个空闲盘块的地址存放在第一个空闲块中,如图5-18所示。期于N-1个空闲盘块是实际空闲的。假设每100个空闲块为一组。第一组的100个空闲块块号放在第二组的头一块中,而第二组的其余99块是完全空闲的。第二组的100个块号又放在第三组的头一块中,依次类推,组与组之间形成链接关系。在最后一组的块号中第2个单元填“0”,表示该块中指出的块号是最后一组的块号,空闲块链到此结束。在这个空闲块链中,不组100块的一个组的块号,通常放在内存的一个专用块中。这种方式称为成组链接。

系统在初始化时先把专用块内容读到内存中,当需分配空闲块时,就直接在内存中找到哪些块是空闲的,每分配一块后把空闲块数减1。但在把一组中的第一个空闲块分配出去之前,应把登记在该块中的下一组的块号及块数保存到专用块中(此时原专用块中的信息已经无用,因为它指出的一组空闲块都已被分配了)。当一组空闲块被分配完后,则再把专用块的内容读到内存中,指出另一组可供分配的空闲块。

假设初始化时系统已把专用块读入主存储器L单元开始的区域中,分配和回收的算法如下:

⑴分配一个空闲块

查L单元内容(空闲块数):

当空闲块数>1,I:=L+空闲块数;

从I单元得到一空闲块号;

把该块分配给申请者;

空闲块数减1。

当空闲块数=1,取出L+1单元内容(一组的第一块块号或0);

取值 =0,无空闲块,申请者等待;

≠0,把该块内容复制到专用块;

把专用块内容独到主存L开始的区域。

⑵归还一块

查L单元的空闲块数;

当空闲块数〈100,空闲块数加1;

J:=L+空闲块数;

规划块号填入J单元。

当空闲块数=100,把主存中登记的信息写入归还块中;

把归还块号填入L+1单元;

将L单元置成1。

采用成组链接后,分配回收空闲块时均在内存中查找和修改,只有在一组空闲块分配完或空闲的磁盘块构成一组时才需要启动磁盘读写。因此,成组链接的管理方式比普通的链接方式效率高。

成组链接这种方案能够迅速找到大量空闲盘块地址。有些版本的UNIX操作系统便采用了这种方案。

542 实现文件系统的表目

当用户申请打开一个文件时,系统要在内存中为该用户保存一些必要的信息,这些信息以表格栏目中内容的形式出现,被称为表目。在实现文件系统时所需要的表目有若干种,其中在内存中所需的重要表目有如下一些:

1、 系统打开文件表

系统打开文件表,专门用于保存已打开文件的文件控制块。该系统打开文件表放在内存。除了保存已打开文件的文件控制块之外,在该表格中还保存有已打开的文件号、共享计数、修改标志等等,图5-19。

2、 用户打开文件表

在每个进程中,都有一个“用户打开文件表”。该表的内容有文件描述符、打开方式、读写指针、系统打开文件表入口等,图5-20。另外在进程的进程控制块PCB中,还记录了“用户打开文件表”的位置。

3、 系统打开文件表与用户打开文件表之间的关系

用户打开文件表指向了系统打开文件表。如果多个进程共享同一个文件,则一定有多个用户打开文件表目对应着系统打开文件表的同一入口,图5-21。

543 记录的成组与分解

用户的文件毫无疑问是由用户按名自己的需要组织的。用户还可按信息的内在逻辑关系,把文件划分成若干个逻辑记录。显然,逻辑记录的大小是由文件性质决定的。

另外,存储介质上的物理分块与存储介质的特性有关,尤其是磁盘。磁盘上的块的大小是在磁盘初始化时预先划好的。因此,逻辑记录的大小往往与存储介质物理分块的大小不一直。

当用户文件的逻辑记录比存储介质的物理分块小得多时,把一个逻辑记录存入一个物理块中,就会造成存储空间的浪费。为此,可把多个逻辑记录存放在一个物理块中,当用户需要某个逻辑记录时再从一物理块信息中将其分解出来。

1、 记录的成组

把若干个逻辑记录合成一组存放一物理块的工作称“记录的成组”,每块中的逻辑记录个数称“块因子”。

记录的成组在不同存储介质上进行信息转储是很有用的。

由于信息交换以块为单位,所以,要进行成组操作时必须使用内存的缓冲区。该缓冲区的长度等于要进行成组的最大逻辑记录长度乘以成组的块因子。成组转储操作如图5-22所示。

在进行记录成组时,还应考虑逻辑记录的格式。这是因为在记录式文件中,有“定长记录格式”和“不定长记录格式”。对定长记录格式的文件按记录成组的方式存储到存储介质上,则除最后一块外,每块中存放的逻辑记录个数是相同的。故只要在文件目录中说明逻辑记录的长度和块因子,在需要使用某个记录时就能方便地将其找出。

如果是一个不定长记录格式的文件,各个逻辑记录的长度可能不相等,在进行记录成组操作时,就应在每个逻辑记录前附加说明该记录长度的控制信息。

2、 记录的分解

对应签署记录成组的操作,有必要考虑从一组逻辑记录中把一个逻辑记录分离出来的操作,这种操作称为“记录的分解”。

显然,从事记录的分解操作也要使用内存缓冲区。

当用户请求读一个文件中的某个记录时,文件系统首先找出该记录所在物理块的位置,然后把含有该记录的物理块全部信息读入内存缓冲区,由于读入内存缓冲区的物理块信息中含有多个逻辑记录,所以要再从内存缓冲区中分解出指定的记录,然后传送到用户工作区。

对定长记录格式,只要的逻辑记录的长度就可容易地进行分解。对不定长记录格式,要根据说明逻辑记录长度的控制信息,计算出用户所指定的记录在内存缓冲区中的位置,然后把记录分解出来。图5-23是记录的分解操作示例。

在图5-23中,用户要求读出逻辑记录K4。用户文件中的记录是成组存放在磁盘上的,系统找出含有记录K4的物理块,从中读出了6个逻辑记录K1,K2,K3,K4,K5和K6,并且知道这些逻辑记录的长度为80,块因子为6。该块信息被读入内存缓冲区后,根据逻辑记录的长度和块因子胃,立即就能取出其中的逻辑记录K4,并把K4传送到用户工作区。

从上面的讨论可以看到,为了提高存储空间的利用率和减少启动设备的次数,采用了记录的成组和分解技术。但是上述效果的获得也付出了代价,主要包括:需要设立内存缓冲区,另外操作系统增加了成组和分解的操作的功能。

544 文件的操作

文件系统是提供给用户使用的,用户可以进行按名存取所需要的文件。在文件系统的实现中,为用户提供使用文件的手段是文件系统的重要任务之一。

1、 建立文件

用户首先调用文件系统的“建立文件”操作,在请求调用该操作时,提供所要创建的文件的文件名及若干参数:用户名、文件名、存取方式、存储设备类型、记录格式、记录长度,等等。

系统依据用户提供的文件名及若干参数,为这一新创建的文件分配一个文件控制块,填写文件控制块中的有关项。

建立文件的实质是建立文件的文件控制块FCB,并建立必要的存储空间,分配空的FCB。从而建立起系统与文件的联系。

建立文件系统调用的一般格式为:CREATE(文件名,访问权限,(最大长度))。

建立文件的具体步骤如下:

⑴检查参数的合法性:

文件名是否符合命名规则,若是,则进行下一步⑵;否则报错,返回。

⑵检查同一目录下有无重名文件:

若没有,则进行下一步⑶;否则报错,返回。

⑶在目录中有无空闲位置;

若有,则进行下一步⑷;否则,不成功返回。

⑷填写目录项内容:

包括:文件名、用户名、存取权限、长度置零,首地址等等。

⑸返回

2、 打开文件

打开文件,是使用文件的第一步,任何一个文件使用前都要先打开,即把文件控制块FCB送到内存。

打开文件系统调用的一般格式为:FD=OPEN(文件路径名,打开方式)。

打开文件时,系统主要完成以下工作:

⑴根据文件路径名查目录,找到FCB主部。

⑵根据打开方式、共享说明和用户身份检查访问合法性。

⑶根据文件号查系统打开文件表,看文件是否已被打开。

如果是,共享计数加1;

否则,将外存中的CB主部等信息填入系统打开文件表空表项,共享计数置为1。

⑷在用户打开文件表中取一空表项,填写打开方式等,并指向系统打开文件表对应表项。

返回信息:FD:文件描述符,是一个非负整数,用于以后读写文件。

3、 读文件

打开文件后,就可以读取文件中的信息。

读文件系统调用的一般格式为:READ(文件名,(文件内位置),要读的长度,内存目的地址)。

隐含参数:文件主。

读写方式可为读、写合既读又写等。

读文件时,系统主要完成以下工作:

⑴检查长度是否为正整数;

若是,则进行下一步;否则,转向(10)。

⑵根据文件名查找目录,确定该文件在目录中的位置。

⑶根据隐含参数中的文件主和目录中该文件的存储权限数据,检查是否有权读:

若是,则进行下一步,否则,转向(10)。

⑷由文件内位置与要读的长度计算最末位置,将其与目录中的文件长度比较,超过否?

若是,则转向(10);否则,进行下一步(5)。也可将参数中的长度修正为目录中的文件长度。

⑸根据参数中的位置、长度和目录中的映射信息,确定物理块号、需要读出的块数等读盘参数。

⑹根据下一块号读块至内存缓冲区。

⑺取出要读的内容,也许要进行成组的分解,将取出的内容送至参数中的内存目的地址。

⑻根据块内长度或起始块号+块数,确定还读下一块吗?同时确定下一块号:

若是,则转向(5);否则,进行下一步(9)。

⑼正常返回。

⑽错误返回,返回响应错误号。

4、 写文件

写文件系统调用的一般格式为:WRITE文件名,记录键,内存位置)。

把内存中指定单元的数据作为指定的一个记录写入指定文件中,系统还将为其分配物理块,以便把记录信息写到外存上。

5、 关闭文件

若文件暂时不用每则应将它关闭。文件关闭后一般不能存取,若要存取,则必须再次打开

6、 删除文件

删除文件文件系统调用的一般格式为:DELETE(文件名)。

7、 指针定位

指针定位的一般格式为:SEEK(FD,新指针的位置)。

指针定位时,系统主要完成以下工作:

⑴由FD检查用户打开文件表,找到对应的入口;

⑵将用户打开文件表中文件读写指针位置设为新指针的位置,供后续读写命令存取该指针处文件内容。

希望对你有帮助

位示图为20行、16列,在进行盘块分配时,若找到的空闲盘块其行号为3,列号也为3,则相应的盘块号是_35_。在回收盘块时,若某盘块号为55,则它位于位示图的第4行,第__7____列。

一、文件控制块(FCB)

目的:为了能对一个文件进行正确的存取。

内容:

1、基本信息类:包括文件名,文件物理位置,文件逻辑结构,文件的物理结构。

2、存取控制信息类:包括文件主的存取权限,核准用户的存取权限和一般用户的存取权限。

3、使用信息类:建立日期和时间、文件上次修改的日期和时间

4、当前使用信息:打开该文件的进程数、是否被进程锁住、是否已修改等。

二、索引节点

文件名、文件具体信息分开,使文件描述信息单独形成一个索引结点。

磁盘索引结点:存放在磁盘上的索引结点。主要包括以下内容:文件主标识符、文件类型、文件存取权限、文件物理地址、文件长度、文件连接计数、文件存取时间。

内存索引结点:文件被打开后,将磁盘索引结点拷贝到内存索引结点中以便使用。比磁盘索引结点增加了以下内容:索引结点编号、状态、访问计数、文件所属文件系统的逻辑设备号、链接指针。

三、目录结构

(1)单级目录结构

整个文件系统中只建立一张目录表,每个文件一个目录项,含有文件相关信息。

优点:简单,能实现基本功能

缺点:不允许重名,不便于共享,

(2)两级目录结构

为每一个用户建立一个单独的用户文件目录UFD,UFD由用户所有文件的文件控制块组成。

系统建立一个主文件目录MFD, MFD中每个用户目录文件都占有一个目录项,其中包括用户名和指向UFD的指针。

优点:提高了速度,不同目录可重名,可共享

缺点:不提供子目录操作,还不方便;各用户之间被完全隔离的话用户访问其他用户文件时,不方便合作。

(3)多级目录结构

这一路径上的目录和数据文件名用“/”连接成路径名,称为相对路径名。从根开始的路径名称为绝对路径名

优点:便于系统和用户将文件分散管理;提供更灵活的权限管理等

四、文件共享与保护

1、共享

基本FCB法:直接在文件目录中包含文件的物理地址

文件名+索引结点指针:一个用户修改指针指向地址里的内容,指针不变,其他用户通过指针总能感知索引结点中的最新内容

符号链法:创建一个link类型的文件:“文件名+共享文件路径”。文件主人删除文件,共享者只会出现找不到文件错误。

五、文件操作

创建、删除;读、写;设置读写位置;打开、关闭;修改属性操作。

六、文件的逻辑结构

1、文件逻辑结构的类型

有结构文件(记录式):定长记录(通常为顺序文件);变长记录(通常为索引文件、索引顺序文件)。

无结构文件(字符流式):字节为单位,利用读写指针依次访问。系统对该类文件不需格式处理。

(1)顺序文件

两种记录排列方式:串结构(按记录形成的时间顺序串行排序);顺序结构(按关键字排序)

检索方法:从头检索;顺序结构,可用折半查找、插值查找、跳步查找等算法提高效率。

优缺点:

不方便随机存取某条记录,但适用批量存取的场合。

适合磁带等特殊介质。

单记录的查找、修改等交互性差;增减不方便

(2)索引文件

为文件建立一个索引表,记录每项记录在文件的逻辑地址及记录长度;该索引表按关键字排序。索引表内容:索引号、长度、记录地址指针

优缺点

适用于变长记录,可提高检索速度,实现直接存取。

索引表增加了存储开销。

(3)索引顺序文件

将顺序文件的所有记录分组;还是建立索引表,但每个表项记录的是每组第1条记录的键值和地址;组内记录仍按顺序方式检索和使用。

七、外存分配方式

1、连续分配

为每一个文件分配一组相邻的盘块。逻辑文件中的记录顺序与存储器中文件占用盘块的顺序一致。

优点:顺序访问容易,读写速度快

缺点:会产生外存碎片;利于文件的动态增加和修改

2、链接分配

设置链接指针,将同属于一个文件的多个离散盘块链接成一个链表。这样形成的文件称为链接文件。会有链接成本。

优点:离散分配,消除外部碎片,提高利用率;同时适用于文件的动态增长;修改容易

(1)隐式链接

链接信息隐含记录在盘块数据中;每个盘块拿出若干字节,记录指向下一盘块号的指针。

问题:只能顺着盘块读取,可靠性低

(2)显式链接

记录盘块链接的指针显示地记录为一张链接表。所有已分配的盘块号都记录在其中,称文件分配表。链条的首地址作为文件地址记录在相应文件的FCB的“物理地址”字段中。

为了提高文件系统访问速度,FAT一般常驻内存

计算:

表项个数 = 盘块个数= 容量 / 盘块大小

表项大小=决定于盘块数量编号需要的位数

FAT表大小 = 表项个数 表项大小

磁盘组织:以簇为单位分配回收、但不规定盘块大小;

文件组织:以卷为单位,将卷的所有文件信息、目录信息、可用未分配空间记录在主控文件表MFT中。

3、索引分配

系统运行时只涉及部分文件,FAT表无需全部调入内存。每个文件单独建索引表(物理盘块索引),记录所有分配给它的盘块号;建立文件时,便分配一定的外存空间用于存放文件盘块索引表信息;

(1)单级索引分配:适合大文件

(2)多级索引:若文件较大,存放索引表也需要多个盘块(索引盘块)。若索引盘块较多,需对索引盘块也采用索引方式管理,形成多级索引。

(3)混合组织索引

一个索引结点定义为13个地址项:

iaddr(0)~iaddr(12),总的来说分为两种:直接地址、间接地址

iaddr(0)~iaddr(9)存放直接地址,即存文件数据的盘块号;

iaddr(10)存放单级索引的索引盘块号;

剩余的用于文件较大时存放多级索引数据。

iaddr(11)存放二级索引的主索引盘块号

iaddr(12)存放三级索引的主索引盘块号

八、存储空间的管理

记住空闲存储空间使用情况;为空间设置相应的数据结构;提供对存储空间分配、回收的操作手段。

1、空闲表法

(1)数据结构:系统为外存上的所有空闲区建立一张空闲表,表项包括序号、空闲区的第一个盘块号、空闲盘块数等。将所有空闲区按其起始盘块号递增的次序排列。

(2)空间的分配和回收:与内存的动态分配类似,同样可采用首次适应算法、循环首次适应算法等。回收主要解决对数据结构的数据修改。

2、空闲链表法

(1)数据结构:链(空闲盘块链、空闲盘区链)

(2)空间的分配和回收:

空闲盘块链:请求分配空间时,系统从链首依次摘下适当数目的空闲盘块分配给用户。释放存储空间时,系统将回收的盘块依次插入空闲盘块链的末尾。

空闲盘区链:分配通常采用首次适应算法。回收盘区时,将回收区与相邻的空闲盘区相合并。为提高检索速度,可以采用显式方法,为空闲盘区建立一张链表放在内存中。

优缺点:

空闲盘块链:分配回收简单。链表长,大量分配时需要操作的指针多

空闲盘区链:链表长度不定,分配时操作的指针数量相对较少,但分配回收操作相对复杂。

3、位示图法

利用二进制的一位来表示一个盘块的使用情况。值为0表示对应的盘块空闲,为1表示已分配。有的系统则相反。磁盘上的所有盘块都有一个二进制位与之对应,这样由所有盘块所对应的位构成一个集合,称为位示图。

(1)数据结构:二维数组

(2)空间的分配和回收:

分配:1、顺序扫描位示图。找到为0的二进制位。2、将所找到的一个或一组二进制位,转换成与之对应的盘块号。进行分配操作。盘块号计算公式为:盘块号 = 列总数(i-1)+ j;(注意下标i,j从1开始)。3、修改位示图。

回收:

1、将回收盘块的盘块号转换成位示图中的行号和列号。转换公式为:i=(盘块号-1)div列数+1;j=(盘块号-1)mod列数+1(Div 求商,mod 取余,公式中的i、j都是从1开始的。如12号盘块转换后为1,12)

2、修改位示图。

4、成组链接法

所有盘块按规定大小划分为组;组间建立链接;组内的盘块借助一个系统栈可快速处理,且支持离散分配回收。组内的盘块借助一个系统栈可快速处理,且分配回收比较简单。支持离散分配回收。

(1)数据结构:空闲盘块号栈(用来存放当前可用的一组空闲盘块的盘块号);链接

(每一组的第一个盘块记录下一组的盘块号,形成了一条链。总将链的第一组盘块总数和所有的盘块号,记入栈,作为当前可供分配的空闲盘块号。)

(2)空闲盘块的分配与回收

分配:须调用分配过程来完成

1、检查空闲盘块号栈是否上锁,如没有,便从栈顶取出一空闲盘块号,将与之对应的盘块分配给用户,然后将栈顶指针下移一格。

2、若该盘块号已是栈底,即Sfree(0),到达当前栈中最后一个可供分配的盘块号。

3、读取该盘块号所对应的盘块中的信息:即下一组可用的盘块号入栈。

4、原栈底盘块分配出去。修改栈中的空闲盘块数。

回收:

1、回收盘块号记入栈顶,空闲数N加1

2、N达到100时,若再回收一块,则将该100条信息填写入新回收块。

以上就是关于数据结构的一些小问题全部的内容,包括:数据结构的一些小问题、位示图为20行、16列,在进行盘块分配时.....、目录、文件与磁盘空间管理等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:聚客百科

原文地址: http://juke.outofmemory.cn/life/3757716.html

()
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存