第四章 文件管理

文件系统基础

文件的定义:一组有意义的信息/数据的集合。

文件的属性:

  • 文件名:由创建文件的用户决定文件名,主要是为了方便用户找到文件,同一目录下不允许有重名文件
  • 标识符:一个系统内的各个文件标识符唯一,都用户来说毫无可读性,只是操作系统用于区分各个文件的一种内部名称
  • 类型:文件的类型
  • 位置:文件存放的路径(供用户使用),在外存中的地址(操作系统使用)
  • 大小:指明文件大小
  • 创建时间,上次修改的时间
  • 文件所有者信息
  • 保护信息,对文件进行保护的访问控制信息

文件内部的组织方式:无结构文件由一些二进制位或字符流组成,又称“流式文件”;有结构文件由一组相似的记录组成,又称“记录式文件”,记录是一组相关数据项的集合。

文件之间的组织方式:目录结构。

操作系统向上层提供的基本功能:创建文件,删除文件,读文件,写文件,打开文件,关闭文件。

文件在外存中的存储:文件的物理结构。

操作系统需要提供的其他文件管理功能:文件共享,文件保护。

文件的逻辑结构:

按文件是否有结构分类,可以分为无结构文件和有结构文件有。

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

有结构文件:有一组相似的记录组成,又称记录式文件。每条记录由若干个数据项组成。一般来说,每条记录有一个数据项可作为关键字。根据各条记录的长度是否相等,又可以分为定长记录和变长记录两种。

  • 顺序文件:不方便增 / 删。文件中的记录一个接一个的顺序排列(逻辑上),记录可以是定长的或可变长的,各个记录在物理上可以是顺序存储或链式存储。①串结构:记录之间的顺序与关键字无关。②顺序结构:记录之间的顺序按关键字进行排列。③链式存储:无论定长或者可变长记录,,都无法实现随机存储,每次只能从第一个记录开始依次往后查找。④顺序存储:可变长记录无法实现随机存取,每次只能从第一个记录依次往后查找;定长记录可以实现随机存取,记录长度为L,则第i个记录存放的相对位置就是i*L。若采用串结构,无法快速找到某个关键字对应的相对位置;若采用顺序结构,可以快速找到某关键字对应的记录。
  • 索引文件:建立一张索引表以加快文件检索的速度。媒体哦啊记录对应一个索引项。文件中的这些记录可以在物理上离散的存放。索引表本身是记录定长记录的顺序文件,因此可以快速地找到第i个记录对应的索引项。可将关键字作为索引内容,若按关键字顺序排列,则还可以按关键字折半查找。每当要增加 / 删除一个记录时,需要对索引表进行修改。由于索引文件有很快的检索速度,因此主要用于对信息处理的及时性要求比较高的场合。
  • 索引顺序文件:是索引文件和顺序文件思想的结合,索引顺序文件中同样会为文件建立一张索引表,是一组记录对应一个索引表项,记录过多时,可建立多级索引表。

文件目录

文件控制块:目录文件中的一条记录就是一个文件控制块FCB,FCB的有序集合称为“文件目录”,一个FCB就是一个文件目录项。FCB中包含了文件的基本信息,存取控制信息,使用信息。对目录进行的操作有搜索,创建文件,删除文件,显示目录,修改目录等。

目录结构

单级目录

早期操作系统并不支持多级目录,整个文件系统中只建立一张目录表,每个文件占一个目录项。单级目录实现了按名存取,但不允许文件重名。在创建一个文件时,需要先检查目录表中有没有重名文件,确定不重名后才允许建立文件,并将新文件对应的目录项插入目录表中。

两级目录结构

早期的多用户操作系统,采用两级目录结构,分为主文件目录和用户文件目录。主文件目录记录用户名及相应用户文件目录的存放位置;用户文件目录由该用户的文件FCB组成。两级目录结构允许不同用户文件重名,也可以在目录上实现访问限制。但是两级目录依然缺乏灵活性,用户不能对自己的文件进行分裂。

多级目录 / 树形目录结构

用户或用户进程要访问某个文件时要用文件路径名标识文件。文件路径名是个字符串,各级目录之间用“/”隔开,从根目录出发的路径称为绝对路径。从当前目录出发的是相对路径。磁盘I/O次数减少,提升了访问文件的速率。

树形目录结构可以很方便地对文件进行分类,层次结构清晰,也能更有效地进行文件的管理和保护,但树形结构不便于实现文件共享,为此提出了“无环圈目录结构”。可以利用不同的文件名指向同一个文件,甚至可以指向同一个目录,共享同一个目录下的所有内容。需要为每个共享结点设置一个共享计数器,用于记录此时有多少个地方在共享该结点。用户提出删除节点的请求时,只删除该用户的FCB,并使共享计数器-1,并不会直接删除共享结点,只有共享计数器为0时,才删除该结点。

共享文件不同于复制文件,在共享文件中,由于各用户指向的的是同一个文件,因此,只要其中一个用户修改了文件数据,那么所有的用户都可以看到数据的变化。

索引节点

 除了文件名之外的所有信息都放在索引结点中,每个文件对应一个索引结点,目录项中只包含文件名和索引结点指针,因此每个目录项的长度大幅度减小。由于目录项长度减小,因此每个磁盘块可以存放更多的目录项,检索文件时磁盘I/O的次数就减少了很多。

文件的物理结构

文件的物理结构实际上是文件的分配方式,说明了文件数据应该怎样存放在外存中。

连续分配

连续分配要求每个文件在磁道上占用一组连续的块。用户给出要访问的逻辑块号,操作系统找出该文件对应的目录项(FCB),物理块号 = 起始块号 + 逻辑块号。连续分配支持顺序访问和直接访问(随机访问)。

连续分配的文件在顺序读 / 写时速度最快。物理上采用连续分配不方便拓展,存储空间利用率低,会产生难以利用的磁盘碎片,可以利用紧凑技术来处理碎片,但需要花费很大的时间代价。

链接分配

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

隐式链接:目录中记录了文件存放的起始块号和结束块号,也可以增加一个字段表示文件的长度。除了文件的最后一个磁盘块之外,每一个磁盘块中都会保存指向下一个盘块的指针。这些指针对用户是透明的(看不见的)。

从目录项中找到起始块号(即0号逻辑块),将0号逻辑块读入内存,由此知道1号逻辑块存放的物理块,于是读入1号逻辑块,再找到2号逻辑块...以此类推读入i号逻辑块,总共需要i+1次磁盘I/O。

优点:很方便文件扩展,不会有碎片问题,外存利用率高。                                                              缺点:只支持顺序访问,不支持随机访问,查找效率低,指向下一个盘块的指针需要消耗少量的存储空间。

显示链接:把用于链接文件物理块的指针显示的存放在一张表中,即文件分配表FAT。一个磁盘仅设置一张FAT。开机时,将FAT读入内存,并常驻内存。FAT的各个表项在物理块上连续存储,且每一个表项长度相同,因此物理块号字段可以是隐含的。

优点:方便文件拓展,不会有碎片问题,外存利用率高,支持随机访问。地址转换时不需要访问磁盘,文件的访问效率高。                                                                                                                    缺点:文件分配表FAT需要占用一定的存储空间。

索引分配

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

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

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

链接方案:如果索引表太大,一个索引块装不下,那么可以将多个索引块链接起来存放,若想要访问最后一个逻辑块,就必须找到最后一个索引块,而各个索引块是用指针链接起来的,因此必须先顺序地读入前面地索引块,很低效。

多层索引:建立多层索引(类似于多层页表),使第一层索引块指向第二层的索引块,还可根据文件大小的要求再建立第三层,第四层索引块。采用K层索引结构,且顶级索引表调入内存,则访问一个数据块只需K+1次读磁盘操作。

混合索引:多种索引分配方式的结合。对于小文件来说,访问一个数据块所需的读磁盘数更少。

文件系统

文件存储空间的管理

存储空间的划分与初始化:

存储空间的划分:将物理磁盘划分为一个个文件卷(逻辑卷,逻辑盘)。

存储空间的初始化:将各个文件卷划分为目录区和文件区。目录去主要存放目录信息FCB,用于磁盘空间管理的信息。文件区用于存放文件数据。

空闲表法(适用于连续分配):

分配逻辑块:与内存管理中的动态分配很类似,为一个文件分配连续的存储空间,同样采用首次适应,最佳适应,最快适应等算法来决定要为文件分配哪个空闲区。

回收磁盘块:与内存管理中的动态分区分配类似,回收区的前后都没有相邻空闲区;回收区的前后都是空闲分区;回收区前是空闲分区;回收区后是空闲分区。回收时注意表项的合并。

空闲链表法:

空闲盘块链:以盘块为单位组成一条空闲链。操作系统保存着链头,链尾指针。若某个文件申请K个盘块,则从链头开始依次摘下K个盘块分配,并修改空闲链的链头指针。回收的盘块依次挂到空闲链的链尾,并修改链的链尾指针。

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

离散分配,连续分配都适用。为每一个文件分配多个盘块时更高效。

位示图法:

每一个二进制位对应一个盘块,用(字号,位号)或(行号,列号)对应一个盘块号。若盘块号,字号,位号从0开始,n表示字长,则盘块号 = 字长*字号+位号;字号 = 盘块号 / 字长;位号 = 盘块号 % 字长。

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

回收:①根据回收的盘块号计算出相对应的字号和位号,②将二进制位设为“0”。

成组链接法:

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

文件的基本操作

创建文件create():进行create()系统调用时需要提供如下参数:所需的外存大小;文件的存放路径;文件名。操作系统处理create系统调用时主要做了两件事:①在外存中找到文件所需的空间(空闲链表法,位示图法,成组链接法等管理策略,找到空闲空间);②根据文件存放路径的信息找到该目录对应的目录文件,在目录中创建该文件对应的目录项。目录项中包含了文件名,文件在外存中存放的位置等信息。

删除文件delete():进行delete()系统调用时,需要提供文件存放的路径和文件名。操作系统在处理delete系统调用时,主要做了两件事:①根据文件存放路径找到相对应的目录文件,从目录文件中找到文件名对应的目录项;②根据该目录项记录的文件在外存中存放的位置文件大小等信息回收文件占用的磁块。

打开文件open():在很多操作系统中,在对文件进行操作之前,要求用户先使用open系统调用“打开文件”,需要提供几个参数:文件存放的路径;文件名;要对文件操作的类型(r只读,rw读写)。操作系统在处理open系统调用时:①根据文件存放路径找到相对应的目录文件,从目录文件中找到文件名对应的目录项,并检查该用户是否有指定的操作权限;②将目录项复制到内存中的“打开文件表”中,并将对应表相的编号返回给用户,之后用户使用打开文件表的编号来指明要操作的文件,之后再操作文件不需要每次都查目录了,加快文件的访问速度。

关闭文件close():进程使用完文件后,要“关闭文件”,操作系统在处理close系统调用时,主要做了几件事:①将进程的打开文件表相应表项删除,②回收分配给该文件的内存空间等资源,③系统打开文件的打开计数器-1,若打开计数器 = 0,则删除对应表项。

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

写文件write():进程使用write系统调用时需要指明哪个文件,还需指明要写出多少数据,写回外存的数据放在内存中的什么位置。操作系统在处理write系统调用时,会从用户指定的内存区域中将指定大小的数据写回指针指向的外存。

文件共享

操作系统为用户提供文件共享功能,可以让多个用户共享的使用同一个文件。多个用户共享同一个文件,意味着系统中只有“一份”文件数据,并且只要某个用户修改了该文件的数据,其他用户也可以看到文件数据的变化。如果是多个用户都复制了同一个文件,那么系统中会有“好几份文件数据”,其中一个用户修改了自己的那份文件数据,对其他用户的文件数据并没有影响。

基于索引结点的的共享方式(硬链接):

索引结点中设置一个链接计数变量count,用于表达链接到本索引结点上的用户目录项数。若count=2,说明此时有两个用户目录项链接到该索引结点上,或者说有两个用户在共享此文件。若某个用户决定“删除”该文件,则只要把用户目录中与该文件对应的目录项删除,目录索引结点的count-1;若count>0,说明还有别的用户要使用该文件,暂时不能把文件数据删除,否则会导致指针悬空。当count=0时,系统负责删除文件。

基于符号链接的共享方式(软连接):

在一个Link型的文件中记录共享文件的存放路径(Windows快捷方式),操作系统根据路径一层一层查找目录,最终找到共享文件。即使软连接指向的共享文件已经被删除,Link文件依然存在,只是通过Link型文件的路径去查找共享文件时会失败(找不到对应目录项)。由于用软连接的方式访问共享文件时需要查询多级目录,会有多次磁盘I/O,因此用软链接访问文件速度比硬链接慢。

文件保护

口令保护:

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

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

缺点:正确的“口令”。存放在系统内部,不够安全。口令一般存放在文件对应的FCB或索引系结点中

加密保护:

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

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

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

访问控制:

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

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

实现灵活,可以实现复杂的文件保护功能。

文件系统的结构层次

 

 用户接口:文件系统需要向上层的用户提供一些简单易用的功能接口。这层就是用于处理用户发出的系统调用请求。

文件目录系统:用户是通过文件路径来访问文件的,因此这一层需要根据用户给出的路径找到相对应的FCB或索引结点。所有和目录,目录项相关的管理工作都在本层完成。

存取控制模块:为了保证文件数据的安全,还需要验证用户是否有访问权限。这一层主要完成了文件保护相关功能。

逻辑文件系统与文件信息缓冲区:用户指明想要访问文件的记录号。这一层需要将记录号转换为对应的逻辑地址。

物理文件系统:这一层需要把上一层提供的文件逻辑地址转换为实际的物理地址。

辅助分配模块:负责文件存储空间的管理,即负责分配和回收存储空间。

设备管理模块:直接与硬件交互,负责和硬件直接相关的一些管理工作。

虚拟文件系统VFS

虚拟文件系统的特点:

向上层用户进程提供统一标准的系统调用接口,屏蔽底层具体文件系统的实现差异。

VFS要求下层的文件系统必须实现某些规定的函数功能。一些新的文件系统想要在某操作系统上被使用,就必须满足该操作系统VFS的要求。

每打开一个文件,VFS就在主存中新建一个vnode,用统一的数据表结构表示文件,无论该文件存储在哪个文件系统。

文件系统挂载:

文件系统挂载即文件系统装载/安装。文件系统挂载要做的事:

1.在VFS中注册新挂载的文件系统。内存中挂载表包含每个文件系统的相关信息,包括文件系统类型,容量大小等。

2.新挂载的文件系统要向VFS提供一个函数列表。

3.将新文件系统加载到挂载点,也就是将新文件系统挂载到某个父目录下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值