文件的基本知识
文件——一组有意义的信息/数据集合
文件的属性:文件名(同一目录下不允许有重名文件),标识符(一个系统内的各个文件标识符唯一,是操作系统用于区分各个文件的内部名称),类型(指明文件的类型),位置(文件存放路径(用户使用),在外存中的地址(操作系统使用,对用户不可见)),大小,创建时间,上次修改时间,文件所有者信息,保护信息(对文件进行保护的访问控制信息)
无结构文件(流式文件):有二进制或字符流组成;
有结构文件(记录式文件):由一组相似的记录(记录是一组相关数据项的集合)组成,一般来说,每条记录有一个数据项作为关键字,根据记录的长度是否相等,又可分为定长记录项和可变长记录项
文件之间的组织方式:树状组织形式,通过目录(一种特殊的有结构文件,由记录组成)组织起来
操作系统对上层提供的功能:创建文件(调用了create系统调用),读文件(read系统调用),写文件(调用write系统调用)删除文件(调用了delete系统调用),打开文件(open系统调用),关闭文件(close系统调用)
操作系统以‘块’(磁盘块/物理块)为单位分配储存空间,外存中的数据读入内存同样以块为单位。每个块的大小相等
文件的逻辑结构
所谓逻辑结构就是用户看来,文件内部的数据是如何组织起来的,二物理结构是指操作系统看来,文件的数据是如何放在外存中的
有结构文件的逻辑组织形式
顺序文件
顺序文件:文件中的记录会一个接一个地顺序排列(逻辑上),记录可以是定长的或可变长的,各个记录在物理上可以顺序存储或链式存储。顺序文件又可以分为串结构(记录之间的顺序与关键字无关)和顺序结构(记录之间的顺序按关键字排列)
链式存储和顺序记录中的可变长记录一定无法实现随机读取,每次只能从第一个开始向后查找;
顺序存储中的定长记录可以实现随机存取,其中串结构无法快速查找;顺序结构可以快速查找
顺序文件的缺点是增加,删除一个记录比较困难(串结构会相对简单)
索引文件
建立一张索引表(定长记录的顺序文件)以加快文件检索速度,每一条记录对应一个索引项,文件中这些记录在物理上可以离散地存放。每当要增加或删除一个记录时,需要对索引表进行修改,而索引表有很快的检索速度,因此主要用于信息处理及时性要求比较高的场合
另外,可以用不同的数据项建立多个索引表
索引顺序文件
同样为文件建立一张索引表(定长记录的串结构的顺序文件),但一组记录对应一个索引表项,索引顺序文件的索引项也不需要按关键字排序,这样可以极大地方便新表项的插入。
文件目录
文件控制块
目录文件中的一条记录就是一个文件控制块(FCB),FCB的有序集合称为‘文件目录’,一个FCB就是一个文件目录项,FCB中包含了文件的基本信息(文件名,物理地址,逻辑结构,物理结构等),存取控制信息(是否可读,可写,禁止访问的用户名单等),使用信息(文件的建立时间,修改时间等),其中最重要的是文件名和物理地址
需要对目录进行的操作:搜索,创建文件,删除文件,显示目录,修改目录,
目录结构
单级目录结构
整个系统只建立一张目录表,每个文件占一个目录项。实现了“按名存取”,但不允许文件重名,因此创建文件时要首先检查是否重名;
两级目录结构
分为主文件目录(记录了用户名以及相应用户目录存放的位置)和用户文件目录(用户文件和FCB组成),允许不同用户的文件重名(实际对应的文件不同)
多级目录结构(树形目录结构)
用户或用户进程要访问某个文件时要用文件路径标识文件名,文件路径名是字符串,各级目录中用“/”隔开,从根目录出发的路径称为绝对路径
每读一级目录都要从外存中调取目录表,进行I/O操作
树形目录结构的缺点:不便于实现文件共享
无环图目录
在树形目录结构的基础上,增加了指向同一节点的有向边,使整个目录称为一个有向无环形图
可以用不同的文件名指向同一个文件,甚至可以指向同一个目录
每一个共享节点有一个共享寄存器,用于记录有多少地方指向该节点,用户提出删除节点的请求时,只是删除了该用户的FCB,并使共享计数器减一,不会直接删除共享节点,只有共享计数器为0时才会删除该节点(注意共享文件不等于复制文件,一方更改共享文件,另一方面也会同步更改)
索引节点(FCB的改进)
查找各级目录的过程中只需要用到“文件名”,只有文件名匹配时,才需要读出文件的其他信息,因此可以对目录表进行简化,将除文件名以外的文件描述信息都放到索引节点中去
在外存中的索引节点称为磁盘索引节点,当索引节点放入内存后称为内存索引节点,内存索引节点需要增加一些信息,比如:文件是否有被修改,此时有几个进程正在访问该文件等
文件的物理结构(文件的分配方式)
连续分配
外存管理当中,文件的大小也会被划分成一个个大小相等的文件块,文件的逻辑地址也可以表现为(逻辑块号,块内地址),操作系统为文件分配存储空间都是以块为单位进行的
连续分配方式要求每个文件在磁盘上占有一组连续的块,文件目录中记录存放了起始块号和长度
用户给出逻辑块号,操作系统找到该文件对应的目录项(FCB),物理块号 = 起始块号 + 逻辑块号,
连续分配方式支持顺序访问和随机访问
连续分配方式要求,每个文件在磁盘上占有一组连续的块
`读取某个磁盘块时,需要移动磁头,访问的两个磁盘块相隔越远,移动磁头所需的时间就越长`
连续分配的文件在顺序读/写时速度最快,但物理上采用连续分配的文件不方便拓展,且存储空间利用率低,会产生难以利用的磁盘碎片(可以用紧凑来解决)
链接分配
采用离散分配的方式,可以为文件分配离散的磁盘块,分为隐式链接和显式链接两种
隐式链接
目录中记录了文件的起始块号和结束块号,除文件的最后一个磁盘块以外,每个磁盘块都会保留指向下一个盘块的指针,这些指针对用户是透明的。
隐式链式分配只支持顺序访问,不支持随机访问(读入i号逻辑块,总共需要i+1次磁盘操作),查找效率低,指向下一个盘块的指针也会占据空间,但很方便进行拓展,且不会产生碎片问题,文件利用率很高
显式链接
把用于链接文件各物理块的指针显式地存放在一张表里(会记录链接关系),即文件分配表
一张磁盘仅设置一张FAT,开机时,将FAT读入内存,并常驻内存(因此查询FAT不需要读磁盘操作),FAT的各个表项在物理上连续存储,且每一个表项的长度相同
采用显式链接,支持随机访问,,且不需要访问磁盘,访问速度会快很多,且不会产生外部碎片
索引分配
允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块。索引表存放的磁盘块称为**‘索引块’,文件数据存放的磁盘块称为数据块**。
显式链接分配方式中,FAT是一个磁盘对应一张。而索引分配方式中,索引表是一个文件对应一张表。
####实现从逻辑块到物理块的转化
从目录项中找到索引表的存放位置,将索引表从外存读入内存,并查找索引表中的某个逻辑块号对应的物理块号
(支持随机访问,且容易拓展,但索引表需要占用空间)
对文件过大而导致的磁盘无法装下所有索引表问题的解决方案
1.链接方案:如果文件的索引表过大,可以为索引表分配多个索引块,并将他们链接起来存放。
2.多层索引:建立多层的索引表,使第一层索引块指向第二层索引块,还可以根据文件大小要求再建立第三层,第四层索引块。(FCB中仅存放顶层的索引块号),若采取多层索引,则各层索引表大小不能超过一个磁盘块。
3.混合索引4多种索引分配方式的结合。例如一个文件的顶级索引表中,既包含直接地址索引(直接指向数据块),又包含一级简介索引(指向单层索引),还包含两级间接索引(指向两层索引表),对于小文件来说访问磁盘的次数少,对于大文件来说,可以用多级索引合理保存数据。
文件存储空间管理
存储空间的划分:将物理磁盘划分为一个个文件卷(逻辑卷,逻辑盘)
存储空间的初始化:将各个文件卷划分为目录区(主要存放FCB,用于磁盘存储空间管理的信息)和文件区(存放普通的文件数据)
空闲表法
适用于“连续分配方式”,会生成一个色空闲表,每个开头的空闲盘号对应一个空闲盘块数
分配磁盘块的方式:可采用首次适应,最佳适应,最坏适应等算法进行分配
回收磁盘块,会合并相邻的空闲区
空闲链表法
空闲盘块链:以盘块为单位组成一条空闲链,每一个盘块中存放着指向下一个盘块的指针,操作系统保存着链头链尾的指针,回收时,回收的盘块一次挂到链尾
空闲盘区链:以盘区(连续的空闲盘块)为单位组成一条空闲链,
位示图法
用每个二进制位对应一个磁盘块(是否已分配),形成一个矩阵表,横坐标为位号,纵坐标为字号,横长为字长
分配方式:若文件需要K个块,顺序扫描位示图,找到K个相邻或不相邻的空闲块(0),根据字号,位号算出对应的盘块号,将相应盘块分配给文件。最后将相应位设置为“1”
回收方式:根据回收的盘块好的字号和位号计算出对应的字号,位号;将相应的二进制位设置为0
成组链接法
文件卷的目录区中专门用一个磁盘作为“超级块”,当系统启动时需要将超级块读入内存,并且保证内存与外存中的超级块的数据一致。超级块中每组空闲块号记录了它的子组块号的起始值。
如果没有下一组空闲块,需要设置特殊值
分配方式:检查第一个分组的块数是否足够,如果足够则分配,但如果这个块内存放着下一组的信息,则需要将其中的数据复制到超级块中
文件的基本操作
创建文件
进行create系统调用时需要提供的参数:
- 1.所需外存空间的大小
- 2.文件存放路径
- 3.文件名
系统在处理create系统调用时所做的事情:
- 1.在外存中找到所需空间
- 2.创建该文件对应的目录项
删除文件
进行Delete系统调用时需要提供的参数:
- 1.文件存放路径
- 2.文件名
系统在处理Delete系统调用时所做的事情:
- 1.根据文件存放路径找到对应的目录文件,从目录表中找到文件名对应的目录项
- 2.根据该目录项记录的文件存放的位置,文件大小等信息,回收文件占用的磁盘块
- 3.从目录表中删除文件对应的目录项
打开文件
进行open系统调用时需要提供的参数:
- 1.文件存放路径
- 2.文件名
- 3.要对文件进行的操作类型(r只读,rw读写等)
系统在处理open系统调用时所做的事情:
- 1.根据文件存放路径找到对应的目录文件,从目录表中找到文件名对应的目录项,检查用户是否拥有操作权限
-
- 将目录项复制到内存中的“打开文件表”中,并将对应表目的的编号返回给用户,之后用户使用打开文件表的编号来指明要操作的文件(不会重复访问目录,系统(拥有打开计数器)与进程(拥有读写指针和访问权限)各有一张打开文件表)
关闭文件
系统在处理open系统调用时所做的事情:
- 1.将进程文件的打开文件表的相应项删除
-
- 回收分配给这个文件的内存空间等资源
读文件
进行read系统调用时需要提供的参数:
-
- 指明文件,可以提供打开文件表中的索引号
- 2.读入多少数据
-
- 读入的数据放在内存中的位置
系统在处理read系统调用时所做的事情:
- 从读指针指向的外存中,将用户指定大小的数据读入用户指定的内存区域中
写文件
进行write系统调用时需要提供的参数:
-
- 指明文件,可以提供打开文件表中的索引号
- 2.写出多少数据
-
- 写出的数据放在内存中的位置
系统在处理write系统调用时所做的事情:
- 从用户的内存区域中,将指定大小的数据写回用户指针指向的外存
文件共享
硬链接:各个目录项指向同一个索引节点,索引节点中有一个链接计数count,每个用户删除时只删除用户目录项,然后count减一,只有count为0时文件才会真正被删除
软连接(符号链接):每个link型文件保存了一个共享文件的存放路径(windows的快捷方式),使用软连接会多次产生I/O操作,如果共享文件被删除,link文件虽然存在,但会失效
##文件保护
口令保护
为文件设置一个口令,用户请求访问必须提供"口令",口令一般存放在文件对应的FCB或索引节点中,访问时操作系统会对用户提供的口令与存放的口令进行对比。
优点:保存和验证的开销少,缺点:保存在内部,不够安全
加密保护
使用密码对文件进行加密,在访问文件时需要提供正确的密码进行解密
优点:保密性强,不需要储存密码;缺点:加密解密会花费时间
访问控制
在每个FCB或索引节点中增加一个访问控制列表,该表记录了各个用户可以对该文件进行那些操作
精简的访问控制表:以组为单位,标记各组(管理员,用户等)可以对文件指向哪些操作
文件系统的结构层次
- 用户接口(提供功能接口(read,write,open等)),
- 文件目录系统(用于访问,查找文件),
- 存取控制系统(保护数据安全,验证访问权限,完成文件保护等功能),
- 逻辑文件系统与文件信息缓冲区(将用户想要访问文件的记录号转化为逻辑地址),
- 物理文件系统(将逻辑地址转化为物理地址),
- 辅助分配模块(负责文件存储空间的管理,即负责分配空间和回收储存空间),
*( 设备管理模块(与设备直接进行交互,包括磁盘调度,分配设备,启动设备)