来都来了不点个赞真说不过去啦
目录
一、文件管理的概念
二、文件的逻辑结构
1.无结构文件
2.有结构文件
2.1顺序文件
编辑
2.2索引文件
2.3索引顺序文件
三、文件目录
1.单级目录结构
2.二级目录结构
3.多级目录结构(树形结构)
4.无环图目录结构
四、文件分配方式
1.连续分配
2.链接分配
2.1隐式链接
2.2显示链接
3.索引分配
五、文件存储空间管理
1.存储空间的划分与初始化
2.管理方式
2.1空闲表法
2.2空闲盘块法和空闲盘区法
2.3位示图法
2.4成组链接法
六、文件的操作
1.创建文件
2.删除文件
3.打开文件
4.关闭文件
5.读文件
6.写文件
七、文件的共享和保护
1.文件共享
1.1基于索引节点的共享方式(硬链接)
2.基于符号链的共享方式(软链接)
⭐2文件保护方法
2.1.口令保护
2.2.加密保护
2.3.访问控制
文件的属性
- 文件名:由创建文件的用户决定文件名,主要是为了方便用户找到文件,同一目录下不允许有重名文件。
- 标识符:一个系统内的各文件标识符唯一,对用户来说毫无可读性,因此标识符只是操作系统用于区分各个文件的一种内部名称。
- 类型:指明文件的类型
- 位置:文件存放的路径(让用户使用)、在外存中的地址(操作系统使用,对用户不可见)
- 大小:指明文件大小创建时间、上次修改时间文件所有者信息
- 保护信息:对文件进行保护的访问控制信息
⭐文件控制块(FCB)组成
FCB,即文件控制块,是由文件系统创建或分配的特殊数据结构,用于管理文件的存储和访问。FCB包含了文件的元数据信息,如文件名、文件大小、文件创建时间、修改时间等,以及文件在磁盘上的存储位置和状态信息。
⭐文件逻辑结构
文件的逻辑结构可以分为以下两种:
- 无结构文件
- 有结构文件
⭐无结构文件也可以称为”流式文件“,文件内部的数据就是一系列二进制流或字符流组成。又如:Windows操作系统中的.txt文件。
有结构文件:由一组相似的记录组成,又称“记录式文件”。每条记录又若干个数据项组成。如:数据库表文件。一般来说,每条记录有一个数据项可作为关键字(作为识别不同记录的ID)
顺序文件:文件中的记录一个接一个地顺序排列(逻辑上),记录可以是定长的或可变长的。各个记录在物理上可以顺序存储(相当于数组)或链式存储(相当于链表)。
结定长记录的顺序文件,若物理上采用顺序存储,则可实现随机存取;若能再保证记录的顺序结构,则可实现快速检索(即根据关键字快速找到对应记录)
文件系统的索引文件可以看作是一个索引表。它为每个文件提供一个唯一的索引,以便快速查找和访问文件。
可将关键字作为索引号内容,若按关键字顺序排列,则还可以支持按照关键字折半查找。
每当要增加/删除一个记录时,需要对索引表进行修改。由于索引文件有很快的检索速度,因此主要用于对信息处理的及时性要求比较高的场合。
另外,可以用不同的数据项建立多个索引表。如:学生信息表中,可用关键字“学号”建立一张索引表。也可用“姓名”建立一张索引表。这样就可以根据“姓名”快速地检索文件了。(Eg: SQL就支持根据某个数据项建立索引的功能)
思考索引文件的缺点:每个记录对应一个索引表项,因此索引表可能会很大。比如:文件的每个记录平均只占8字节,而每个索引表项占32个字节,那么索引表都要比文件内容本身大4倍,这样对存储空间的利用率就太低了。
那么如何解决呢?
我们可以建立一个索引顺序文件。
索引顺序文件是索引文件和顺序文件思想的结合。索引顺序文件中,同样会为文件建立一张索引表,也就是索引表的索引项对应着一个顺序文件。
单级目录结构是指整个文件系统中只建立一张目录表,每个文件占一个目录项,建立一个新文件时,必须确保没有重名的情况,实现了按名存取,查找速度慢。用于早期的操作系统。
把目录设置为二级目录,分为主目录和用户目录。
树形目录结构,也被称为多级目录结构,是UNIX系统和Windows系统中常见的文件系统结构。这种结构会用一定的结构来存放文件的一些属性,其包含唯一的一个根节点,一般把主文件目录称为根目录(也就是C、D盘),根目录下面有一些节点,称为中间节点,最终的文件是叶子节点。在Linux中,只有一个根目录,而在Windows中,根目录可以理解为盘符。树形目录结构允许在不同的目录下有同名文件。
树形目录结构可以很方便地对文件进行分类,层次结构清晰,也能够更有效地进行文件的管理和保护。但是,树形结构不便于实现文件的共享。为此,提出了“无环图目录结构”。
可以用不同的文件名指向同一个文件,甚至可以指向同一个目录(共享同一目录下的所有内容)。
需要为每个共享结点设置一个共享计数器,用于记录此时有多少个地方在共享该结点。用户提出删除结点的请求时,只是删除该用户的FCB、并使共享计数器减1,并不会直接删除共享结点。
只有共享计数器减为0时,才删除结点。
注意:共享文件不同于复制文件。在共享文件中,由于各用户指向的是同一个文件,因此只要其中一个用户修改了文件数据,那么所有用户都可以看到文件数据的变化。
连续分配方式要求每个文件在磁盘上占有一组连续的块。
优点:支持顺序访问和直接访问(即随机访问);连续分配的文件在顺序访问时速度最快
缺点:不方便文件拓展(要连续存取可能后面以及没有空间了);存储空间利用率低,会产生磁盘碎片(会有小块用不了)
隐式链接发会在每个数据块中设置一个指针指向下一个块所在的地址。
用户给出要访问的逻辑块号i,操作系统找到该文件对应的目录项(FCB)
从目录项中找到起始块号(即0号块),将0号逻辑块读入内存,由此知道1号逻辑块存放的物理块号,于是读入1号逻辑块,再找到2号逻辑块的存放位置…以此类推。
因此,读入i号逻辑块,总共需要i+1次磁盘l/O。
结论:采用链式分配(隐式链接)方式的文件,只支持顺序访问,不支持随机访问,查找效率低。另外,指向下一个盘块的指针也需要耗费少量的存储空间。
假设我们是要找文件A.txt,我们只需要知道A.txt的起始地址,从1->10->7按照链表的方式遍历直到结束块。
优点:无碎片,方便扩展
缺点:不支持随机访问效率低,指针容易丢失导致文件缺损
由于在老电脑硬件中,很有可能摔一下数据就有变化,所以会导致指针丢失,找不到文件后面的内容了,导致文件损坏,把用于链接文件各物理块的指针显式地存放在一张表中。即文件分配表。
结论:采用链式分配(显式链接)方式的文件,支持顺序访问,也支持随机访问(想访问i号逻辑块时,并不需要依次访问之前的 0~i-1号逻辑块),由于块号转换的过程不需要访问磁盘,因此相比于隐式链接来说,访问速度快很多。
索引分配允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块(索引表的功能类似于内存管理中的页表――建立逻辑页面到物理页之间的映射关系)。索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为数据块。
如果一个文件的索引表太大,一个磁盘块放不下,那么如何解决呢?
可以用以下三种方式解决。
①链接方案:如果索引表太大,一个索引块装不下,那么可以将多个索引块链接起来存放。
②多层索引:建立多层索引(原理类似于多级页表)。使第一层索引块指向第二层的索引块。还可根据文件大小的要求再建立第三层、第四层索引块。
③混合索引:多种索引分配方式的结合。例如,一个文件的顶级索引表中,既包含直接地址索引(直接指向数据块),又包含一级间接索引(指向单层索引表)、还包含两级间接索引(指向两层索引表)。
存储空间的划分:将物理磁盘划分为一个个文件卷(逻辑卷、逻辑盘)。所谓的文件卷就相当于电脑上的C盘,D盘等。
为一个磁盘创建一个表,来存储空闲磁盘块的位置。
如何分配磁盘块 : 与内存管理中的动态分区分配很类似,为一个文件分配连续的存储空间。同样可采用首次适应、最佳适应、最坏适应等算法来决定要为文件分配哪个区间。
如何回收磁盘块:与内存管理中的动态分区分配很类似,当回收某个存储区时需要有四种情况―—①回收区的前后都没有相邻空闲区;②回收区的前后都是空闲区;③回收区前面是空闲区;④回收区后面是空闲区。总之,回收时需要注意表项的合并问题。
两者的区别就是空闲盘区链式把连续在一起的盘块组合成了一个盘区
位示图:每个二进制位对应一个盘块。在本例中,“0”代表盘块空闲,“1”代表盘块已分配。位示图一般用连续的“字”来表示,如本例中一个字的字长是16位,字中的每一位对应一个盘块。因此可以用(字号,位号)对应一个盘块号。当然有的题目中也描述为(行号,列号)
(字号,位号)=(i j) 的二进制位对应的盘块号 b= ni + j (此处的n也就是字长16位)
b号盘块对应的字号i = b/n,位号j = b%n。
如何分配:若文件需要K个块,
①顺序扫描位示图,找到K个相邻或不相邻的“0”;
②根据字号、位号算出对应的盘块号,将相应盘块分配给文件;
③将相应位设置为“1”。
如何回收:
①根据回收的盘块号计算出对应的字号、位号;
②将相应二进制位设为“0”。
空闲表法、空闲链表法不适用于大型文件系统,因为空闲表或空闲链表可能过大。UNIX系统中采用了成组链接法对磁盘空闲块进行管理。
文件卷的目录区中专门用一个磁盘块作为“超级块”,当系统启动时需要将超级块读入内存。并且要保证内存与外存中的“超级块”数据一致。如图所示。
如何分配?
Eg :需要100个空闲块
①检查第一个分组的块数是否足够。100=100,是足够的。
②分配第一个分组中的100个空闲块。但是由于300号块内存放了再下一组的信息,因此300号块的数据需要复制到超级块中。
Eg :需要1个空闲块
①检查第一个分组的块数是否足够。1
②分配第一个分组中的1个空闲块,并修改相应数据
如何回收?
Eg :假设每个分组最多为100个空闲块,此时第一个分组已有99个块,还要再回收一块。
Eg : 假设每个分组最多为100个空闲块,此时第一个分组已有100个块,还要再回收一块。需要将超级块中的数据复制到新回收的块中,并修改超级块的内容,让新回收的块成为第一个分组。
进行Create系统调用时,需要提供的几个主要参数:
所需的外存空间大小(如:一个盘块,即1KB)
文件存放路径(“D:/Demo”)
文件名(这个地方默认为“新建文本文档.txt”)
操作系统在处理Create系统调用时,主要做了两件事:
1.在外存中找到文件所需的空间
2.根据文件存放路径的信息找到该目录对应的目录文件(此处就是 D:/Demo目录),在目录中创建该文件对应的目录项。目录项中包含了文件名、文件在外存中的存放位置等信息。
进行Delete系统调用时,需要提供的几个主要参数:
1.文件存放路径(“D:/Demo”)
2.文件名(“test.txt”)
操作系统在处理Delete系统调用时,主要做了几件事:
1.根据文件存放路径找到相应的目录文件,从目录中找到文件名对应的目录项。
2.根据该目录项记录的文件在外存的存放位置、文件大小等信息,回收文件占用的磁盘块。
3.从目录表中删除文件对应的目录项。
在很多操作系统中,在对文件进行操作之前,要求用户先使用open系统调用“打开文件”,需要提供的几个主要参数:
1.文件存放路径(“D:/Demo”)
2.文件名( “test.txt”)
3.要对文件的操作类型(如:r只读;rw读写等)
操作系统在处理open系统调用时,主要做了几件事:
1.根据文件存放路径找到相应的目录文件,从目录中找到文件名对应的的目录项,并检查该用户是否有指定的操作权限。
2.将目录项复制到内存中的“打开文件表”中。并将对应表目的编号返回给用户。之后用户使用打开文件表的编号来指明要操作的文件。
进程使用完文件后,要“关闭文件”。
操作系统在处理Close系统调用时,主要做了几件事:
1.将进程的打开文件表相应表项删除
2.回收分配给该文件的内存空间等资源
3.系统打开文件表的打开计数器count 减1,若count =0,则删除对应表项。
进程使用read系统调用完成写操作。
需要指明是哪个文件(在支持“打开文件”操作的系统中,只需要提供文件在打开文件表中的索引号即可),还需要指明要读入多少数据(如:读入1KB)、指明读入的数据要放在内存中的什么位置。
操作系统在处理read 系统调用时,会从读指针指向的外存中,将用户指定大小的数据读入用户指定的内存区域中。
进程使用write系统调用完成写操作,
需要指明是哪个文件(在支持“打开文件”操作的系统中,只需要提供文件在打开文件表中的索引号即可),还需要指明要写出多少数据(如:写出1KB)、写回外存的数据放在内存中的什么位置
操作系统在处理write系统调用时,会从用户指定的内存区域中,将指定大小的数据写回写指针指向的外存。
硬链接也就是是同一个文件
知识回顾:索引结点,是一种文件目录瘦身策略。由于检索文件时只需用到文件名,因此可以将除了文件名之外的其他信息放到索引结点中。这样目录项就只需要包含文件名、索引结点指针。
索引结点中设置一个链接计数变量 count,用于表示链接到本索引结点上的用户目录项数。
若count =2,说明此时有两个用户目录项链接到该索引结点上,或者说是有两个用户在共享此文件。若某个用户决定“删除”该文件,则只是要把用户目录中与该文件对应的目录项删除,且索引结点的count值减1。
若count>0,说明还有别的用户要使用该文件,暂时不能把文件数据删除,否则会导致指针悬空。当count =0时系统负责删除文件。
软链接只是执行文件的地址
当User3访问“ccc”时,操作系统判断文件“ccc”属于Link类型文件,于是会根据其中记录的路径层层查找目录,最终找到User1的目录表中的“aaa”表项,于是就找到了文件1的索引结点。类似于快捷方式。
软链接的方式要比硬链接的效率低并且还要占用一定的磁盘空间。
为文件设置一个“口令”(如: abc112233),用户请求访问该文件时必须提供“口令”。
口令一般存放在文件对应的FCB或索引结点中。用户访问文件前需要先输入“口令”,操作系统会将用户提供的口令与FCB中存储的口令进行对比,如果正确,则允许该用户访问文件。
优点:保存口令的空间开销不多,验证口令的时间开销也很小。
缺点:正确的“口令”存放在系统内部,不够安全。
使用某个“密码”对文件进行加密,在访问文件时需要提供正确的“密码”才能对文件进行正确的解密。
Eg:一个最简单的加密算法――异或加密。
假设用于加密/解密的“密码”为“01001”。
在每个文件的FCB(或索引结点)中增加一个访问控制列表(Access-Control List, ACL),该表中记录了各个用户可以对该文件执行哪些操作。如图所示:
在windows中也就是: