操作系统~文件管理, 文件目录, 文件的物理结构, 文件共享与文件保护的实现

文件管理

计算机中存放了各种各样的文件,一个文件有哪些属性?
文件内部的数据应该怎样组织起来?
文件之间又应该又应该怎么组织起来?

文件属性

一个文件有哪些属性?

文件名:由创建文件的用户决定文件名,主要是为了方便用户找到文件,同一目录下不允许有重名文件。

标识符:一个系统内的各文件标识符唯一,对用户来说毫无可读性,因此标识符只是操作系统用于区分各个文件的一种内部名称。

类型:指明文件的类型

位置:文件存放的路径(让用户使用)、在外存中的地址(操作系统使用,对用户不可见)

大小:指明文件大小创建时间、上次修改时间文件所有者信息

保护信息:对文件进行保护的访问控制信息

在这里插入图片描述

文件内部数据的组织结构

文件的组织结构像是设计模式中的组合模式一样, 一个个文件作为叶子节点, 目录作为父节点

在这里插入图片描述

操作系统对文件提供的功能

创建文件(create系统调用)

删除文件(delete系统调用)

读文件(read系统调用)

写文件(write系统调用)

打开文件(open系统调用)

关闭文件(close系统调用)

文件如何存储在外存

外存与内存一样,外存也是由一个个存储单元组成的,每个存储单元可以存储一定量的数据(如1B)。每个存储单元对应一个物理地址

操作系统以“块”为单位为文件分配存储空间,因此即使一个文件大小只有10B,但它依然需要占用1KB的磁盘块。外存中的数据读入内存时同样以块为单位

类似于内存分为一个个“内存块”,外存会分为一个个“块/磁盘块/物理块”。每个磁盘块的大小是相等的,每块一般包含2的整数幂个地址(如本例中,一块包含2^10个地址,即1KB)。同样类似的是,文件的逻辑地址也可以分为(逻辑块号,块内地址),操作系统同样需要将逻辑地址转换为外存的物理地址(物理块号,块内地址)的形式。块内地址的位数取决于磁盘块的大小

文件目录

在这里插入图片描述
当我们双击“照片”后,操作系统会在这个目录表中找到关键字“照片”对应的目录项(也就是记录),然后从外存中将“照片”目录的信息读入内存,于是,“照片”目录中的内容就可以显示出来了。
s
目录文件表中的一条记录就是一个“文件控制块(FCB)

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

多级目录

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

例如:自拍.jpg的绝对路径是“/照片/2015-08/自拍.jpg”

系统根据绝对路径一层一层地找到下一
级目录。刚开始从外存读入根目录的目录表;找到“照片”目录的
存放位置后,从外存读入对应的目欢衣;X到才程h典?次读磁盘I/O操作。…P最后才找到文件“自拍.jpg”的存放位置。整个过程需要3次读磁盘I/o操作。

很多时候,用户会连续访问同一目录内的多个文件(比如:接连查看2015-08"目录内的多个照片文件)显然,每次都从根目录开始查找,是很低效的。因此可以设置一个“当前目录”。

例如,此时已经打开了“照片”的目录文件,也就是说,这张目录表已调入内存,那么可以把它设置为“当前目录”。当用户想要访问某个文件时,可以使用从当前目录出发的“相对路径”。

在Linux中,“.”表示当前目录,因此如果“照片”是当前目录,则"自拍.jpg"的相对路径为:

“./2015-08/自拍.jpg”。从当前路径出发,只需要查询内存中的“照片”目录表,即可知道"2015-08"目录表的存放位置,从外存调入该目录,即可知道“自拍.jpg”存放的位置了。

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

索引结点(FCB的改进)

在这里插入图片描述
思考有何好处?

假设一个FCB是64B,磁盘块的大
小为1KB,则每个盘块中只能存放16个FCB。若一个文件目录中共有
640个目录项,则共需要占用640/16=40个盘块。因此按照某文件名检索该目录,平均需要查询320个目录项,平均需要启动磁盘20次(每次磁盘I/o读入一块)。

若使用索引结点机制,文件名占14B,索引结点指针站2B,则每个盘块可存放64个目录项,那么按文件名检索目录平均只需要读320/64=5个磁盘块。显然,这将大大提升文件检索速度。

文件的物理结构

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
那么文件在磁盘上被切割成一个个小磁盘块的时候是如何分配这些磁盘块的

链接分配一一隐式链接

在这里插入图片描述
用户给出要访问的逻辑块号i,操作系统找到该文件对应的目录项(FCB)

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

结论:采用链式分配(隐式链接)方式的文件,只支持顺序访问,不支持随机访问,查找效率低。另外,指向下一个盘块的指针也需要耗费少量的存储空间。

采用隐式链接的链接分配方式,很方便文件拓展。另外,所有的空闲磁盘块都可以被利用,不会有碎片问题,外存利用率高。

链接分配一―显式链接

把用于链接文件各物理块的指针显式地存放在一张表中。即文件分配表(FAT,File Allocation Table)
在这里插入图片描述
假设某个新创建的文件“aaa”依次存放在磁盘块2>5>0→1
假设某个新创建的文件“bbb”依次存放在磁盘块4>23 >3
注意:一个磁盘仅设置一张FAT。开机时,将FAT读入内存,并常驻内存。FAT的各个表项在物理上连续存储,且每一个表项长度相同,因此“物理块号”字段可以是隐含的。

用户给出要访问的逻辑块号i,操作系统找到该文件对应的目录项(FCB) 在这里插入图片描述

从目录项中找到起始块号,若i>o,则查询内存中的文件分配表FAT,往后找到i号逻辑块对应的物理块号。逻辑块号转换成物理块号的过程不需要读磁盘操作。
结论:采用链式分配(显式链接)方式的文件,支持顺序访问,也支持随机访问(想访问i号逻辑块时,并不需要依次访问之前的0~i-1号逻辑块),由于块号转换的过程不需要访问磁盘,因此相比于隐式链接来说,访问速度快很多。
显然,显式链接也不会产生外部碎片,也可以很方便地对文件进行拓展。

索引分配

索引分配允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块(索引表的功能类似于内存管理中的页表――建立逻辑页面到物理页之间的映射关系)。索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为数据块。
在这里插入图片描述
假设某个新创建的文件“aaa”的数据依次存放在磁盘块2>5→13>9。7号磁盘块作为“aaa”的索引块,索引块中保存了索引表的内容。

注:在显式链接的链式分配方式中,文件分配表FAT是一个磁盘对应一张。而索引分配方式中,索引表是一个文件对应一张。

从目录项中可知索引表存放位置,将索引表从外存读入内存,并查找索引表即可只i号逻辑块在外存中的存放位置。

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

如果一个文件的大小超过了256块,那么一个磁盘块是装不下文件的整张索引表的,如何解决这个问题?

多层索引

①链接方案:如果索引表太大,一个索引块装不下,那么可以将多个索引块链接起来存放。
在这里插入图片描述
假设磁盘块大小为1KB,一个索引表项占4B,则一个磁盘块只能存放256个索引项。
若一个文件大小为256256KB =65,536 KB =64MB
该文件共有256
256个块,也就对应256*256个索引项,也就需要256个索引块来存储,这些索引块用链接方案连起来。
若想要访问文件的最后一个逻辑块,就必须找到最后一个索引块(第256个索引块),而各个索引块之间是用指针链接起来的,因此必须先顺序地读入前255个索引块。
这显然是很低效的。如何解决呢?

②多层索引:建立多层索引(原理类似于多级页表)。使第一层索引块指向第二层的索引块。还可根据文件大小的要求再建立第三层、第四层索引块。

在这里插入图片描述
假设磁盘块大小为1KB,一个索引表项占4B,则一个磁盘块只能存放256个索引项。
若某文件采用两层索引,则该文件的最大长度可以到2562561KB =65,536 KB =64MB
可根据逻辑块号算出应该查找索引表中的哪个表项。如:要访问1026号逻辑块,则
1026/256=4,1026%256= 2
因此可以先将一级索引表调入内存,查询4号表项,将其对应的二级索引表调入内存,再查询二级索引表的2号表项即可知道1026号逻辑块存放的磁盘块号了。访问目标数据块,需要3次磁盘I/O。

文件共享

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

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

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

索引结点中设置一个链接计数变量count,用于表示链接到本索引结点上的用户目录项数。
若count =2,说明此时有两个用户目录项链接到该索引结点上,或者说是有两个用户在共享此文件
在这里插入图片描述

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

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

文件保护

口令保护

为文件设置一个“口令”(如: abc112233),用户请求访问该文件时必须提供“口令”。
口令一般存放在文件对应的FCB或索
引结点中。用户访问文件前需要先输入“口令”,操作系统会将用户提供的口令与FCB中存储的口令进行对比,如果正确,则允许该用户访问文件
优点:保存口令的空间开销不多,验证口令的时间开销也很小。缺点:正确的“口令”存放在系统内部,不够安全。

加密保护

使用某个“密码”对文件进行加密,在访问文件时需要提供正确的“密码”才能对文件进行正确的解密。
Eg:一个最简单的加密算法―—异或加密
假设用于加密/解密的“密码”为“01001”

在这里插入图片描述
优点:保密性强,不需要在系统中存储“密码”
缺点:编码/译码,或者说加密/解密要花费一定时间。

访问控制

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

在这里插入图片描述
在这里插入图片描述
在每个文件的FCB(或索引结点)中增加一个访问控制列表(Access-Control List, ACL),该表中记录了各个用户可以对该文件执行哪些操作。
精简的访问列表:以“组”为单位,标记各“组”用户可以对文件执行哪些操作。
如:分为系统管理员、文件主、文件主的伙伴、其他用户几个分组。
当某用户想要访问文件时,系统会检查该用户所属的分组是否有相应的访问权限。

在这里插入图片描述

文件系统层次结构

在这里插入图片描述
用一个例子来辅助记忆文件系统的层次结构:
假设某用户请求删除文件“D:/工作目录/学生信息.xlsx”的最后100条记录。1.用户需要通过操作系统提供的接口发出上述请求――用户接口
2. 由于用户提供的是文件的存放路径,因此需要操作系统一层一层地查找目录,找到对应的目录项――文件目录系统
3.不同的用户对文件有不同的操作权限,因此为了保证安全,需要检查用户是否有访问权限―一存取控制模块(存取控制验证层)
4.验证了用户的访问权限之后,需要把用户提供的“记录号”转变为对应的逻辑地址――逻辑文件系统与文件信息缓冲区
5.知道了目标记录对应的逻辑地址后,还需要转换成实际的物理地址――物理文件系统6.要删除这条记录,必定要对磁盘设备发出请求――设备管理程序模块
7.删除这些记录后,会有一些盘块空闲,因此要将这些空闲盘块回收――辅助分配模块

猜你喜欢

转载自blog.csdn.net/Shangxingya/article/details/113810781