文件:一组有意义的信息/数据集合。或者说,文件就是字节序列。
文件的属性:文件名,标识符(即文件描述符,操作系统区分文件的内部名称,用户不可见),文件类型,文件位置(文件存放路径,以及供操作系统使用的外存中的地址),文件大小,创建时间,上次修改时间,文件所有者信息,文件保护信息等。
操作系统内核提供虚拟文件系统,为用户程序提供统一的文件系统操作接口,屏蔽各不同文件系统的差异和操作细节。
虚拟文件系统的特点:
文件系统挂载到操作系统:
(Linux)
(Windows)
文件系统在外存(磁盘)中的结构:
对于Windows,安装操作系统时,就进行了磁盘分区(将一个物理磁盘划分成一个个的文件卷,文件卷又称逻辑卷或逻辑盘)和磁盘初始化(将各个文件卷换分为目录区和工作区)。
有些系统支持超大文件,可以多个物理磁盘组成一个文件卷。
文件系统在主存中的结构:
打开文件时,系统根据文件存放路径一层一层将目录表调入主存,直到找到对应文件,在主存中的打开文件表添加或修改记录,系统将文件描述符返回给用户,此后,用户通过文件描述符对文件进行相应的操作。
打开文件表:
1、系统的打开文件表:整个系统一张系统打开文件表。记录整个系统所有进程打开的文件。
特有属性:打开计数器(指明有多少进程打开了该文件)。
2、用户进程的打开文件表:每个用户一张用户进程打开文件表。记录该用户打开的文件。
特有属性:读写指针(对该文件的读写操作所进行到的位置),访问权限(只读,读写等)。
注:用户进程的打开文件表中系统表的索引号(是系统的打开文件表中该文件对应的编号)。
文件描述符是用户进程的打开文件表中文件对应的编号。
文件的基本操作:创建文件(create系统调用),删除文件(delete系统调用),读文件(read系统调用),写文件(write系统调用),打开文件(open系统调用),关闭文件(close系统调用)。
系统调用是用户程序和操作系统之间的接口,由内核函数实现进入操作系统内核。
内核是操作系统的核心,负责管理进程、内存、I/O、文件和网络等。
文件之间通过一层一层的目录(即文件夹)有序地组织起来。
目录是一种特殊的有结构文件。各层之间的目录用"/"连接。
每个目录都有对应的目录表(也称目录文件),目录表中每一条记录就是一个文件目录项就是一个文件控制块(FCB)。目录表是FCB的有序集合。
文件控制块(FCB):实现文件目录的关键数据结构。FCB包含文件的各信息(文件名,类型,创建时间、物理地址、逻辑结构、物理结构、访问权限等)。FCB按名存取。
文件目录结构:
索引节点(inode):【FCB的改进】
为了方便存储、查找以及文件共享,将文件名之外的信息作为索引节点,而目录表中的目录项只需要文件名和索引节点指针。
通过匹配文件名找到对应的索引节点指针,将索引节点调入主存,再从索引节点找到文件的物理地址等信息。
注:索引节点存放在外存又称磁盘索引节点,放入内存称为内存索引节点。放入内存时需增加一些信息(文件是否被修改,此时有几个进程正在访问该文件等)。
文件共享:
文件共享:多个用户共享地使用同一个文件。意味着共享的文件其实只有一份文件数据。
操作系统需要保护文件的数据安全,方法有:口令保护、加密保护、访问控制等。
文件的逻辑结构:无结构文件,有结构文件。
有结构文件:顺序文件,索引文件,索引顺序文件。
- 定长记录:每条记录占用的存储空间相同。
- 可变长记录:每条记录占用的存储空间不同。
- 顺序存储:逻辑上相邻的记录,物理上也相邻。
- 链式存储:逻辑上相邻的记录,物理上不相邻。不能随机存取,只能从第一个开始找。
- 串结构:记录的顺序与关键字的顺序无关,即记录的顺序不按关键字的顺序排列。
- 顺序结构:记录的顺序按照关键字的顺序排列。
文件的物理结构:即文件分配方式,各个文件是怎样存放在外存(磁盘)中。
磁盘存储一般以块为单位,称为磁盘块或者物理块。很多操作系统,磁盘块大小等于内存块大小等于页面大小。
而文件的逻辑地址空间也被分为“块”。用户使用逻辑地址操作文件,而操作系统实现从逻辑地址到物理地址的映射。
系统将逻辑块的内容放到物理块中(即给文件分配磁盘块)。
磁盘中的磁盘块分配给文件之后称为非空闲磁盘块,没有分配处于空闲状态的称为空闲磁盘块。
磁盘块的分配方式有:连续分配,链接分配、索引分配。
(1)连续分配
磁盘为每个文件分配的磁盘块必须是连续的,并且保持相对顺序(即与逻辑块的顺序一致)。
目录表中的目录项记录起始块号(磁盘块)和长度(连续多少个磁盘块)。
用户提供逻辑地址,操作系统将逻辑地址转换为物理地址,找到文件对应目录项:
物理块号 = 起始块号 + 逻辑块号
支持顺序访问,也支持直接访问(随机访问),顺序访问速度最快。但文件拓展不方便,存储空间利用率低,产生磁盘碎片。
(2)链接分配(离散分配)
磁盘为文件分配的磁盘块是不连续的,各磁盘块之间用指针链接。
① 隐式链接(默认)
目录表中的目录项记录起始块号(磁盘块)和结束块号。
根据逻辑块号找到文件对应的FCB(目录项):
根据目录项中的起始块号找到第一个磁盘块,将对应的第一个逻辑块的内容读入主存,根据指针找到第二个磁盘块,将对应的第二个逻辑块号的内容读入主存,并根据各指针找到下一个磁盘块,依次下去,直到找到需要的逻辑块号对应的磁盘块。
方便扩展,支持顺序访问,不产生碎片。但不支持随机访问,查找速度慢,指针占用少量存储空间。
② 显示链接
目录表中的目录项记录起始块号(磁盘块)。
建立文件分配表(FAT),在FAT查找逻辑块号对应的磁盘块。
文件分配表(FAT,File Allocation Table):记录各磁盘块以及指针指向的下一个磁盘块。各文件的最后一个磁盘块的指针指向的下一个磁盘块可标识为-1。
一个磁盘一张FAT。FAT各表项连续存储且长度相同。开机时,FAT读入内存并常驻内存。
根据逻辑块号找到文件对应的FCB(目录项):
根据目录项中的起始块号,只需查找主存中的文件分配表(FAT),依次根据指针查找,找到需要的逻辑块号对应的磁盘块。
支持顺序访问,也支持随机访问,不产生外部碎片。但文件分配表需占用部分存储空间。
(3)索引分配(离散分配)
目录表中的目录项记录索引块(索引表所在的磁盘块)。
索引表:一个文件一张索引表,存放文件的各逻辑块对应的物理块。记录逻辑块号(可以是隐含的)和对应磁盘块号。
磁盘块中存放索引表的称为索引块,磁盘块中存放文件数据的称为数据块。
根据逻辑块号找到文件对应的FCB(目录项):
根据目录项中的索引块(索引表所在的磁盘块),将索引块中的索引表调入主存,查找索引表,找到需要的逻辑块号对应的磁盘块。
支持随机访问,文件拓展容易。但索引表需占用部分存储空间。
若索引表太大,一个磁盘块装不下怎么办?解决方法:链接方案,多层索引,混合索引。
① 链接方案
目录项中记录第一个索引块的块号。
多个索引块,各索引块用指针链接起来。
只能顺序访问,查找效率低。
② 多层索引
目录项中记录顶级索引块(第一个索引块)的块号。
多层索引,每层索引块指向下一层索引块。
各层索引表大小不能超过一个磁盘块。
文件最大长度:第1层索引表大小*第2层索引表大小*...*第i层索引表大小*数据块大小。
③ 混合索引(多种索引方式的结合)
目录项中记录顶级索引块(第一个索引块)的块号。
顶级索引块中有直接地址(直接指向数据块)、一级间接索引(指向单层索引表)、二级间接索引(指向两层索引表)。
存储空间管理:空闲表法,空闲链表法,位示图法,成组链接法(UNIX系统)。
(1)空闲表法:适用于连续分配
空闲(盘块)表记录空闲盘块起始块号和连续的空闲盘块数量。
磁盘块连续分配的算法:
磁盘块的分配:查看空闲表,根据一定算法(首次适应、最佳适应算法等),将满足空间大小的连续的空闲盘块分配给文件。
磁盘块的回收:(注意合并)① 回收区前后没有空闲盘块,在空闲表添加;② 回收区前或后有空闲盘块,在空闲表修改对应项;③ 回收区前后都有空闲盘块,在空闲表将对应项合并为一个。
(2)空闲链表法:空闲盘块链,空闲盘区链
以盘块/盘区为单位组成一条空闲链。操作系统保存着链头、链尾指针。
① 空闲盘块链:适用于离散分配。
以空闲盘块为单位组成一条空闲链。
每个空闲盘块中存储着下一个盘块的指针。
磁盘块的分配:从空闲链的链头开始,依次取出满足空间大小的空闲盘块分配给文件。
磁盘块的回收:将回收的盘块依次挂到空闲链的链尾。
② 空闲盘区链:适用于离散分配和连续分配。
将连续的空闲盘块作为一个盘区,以盘区为单位组成一条空闲链。
每个空闲盘区的第一个盘块中存储着盘区长度(有多少空闲盘块)和下一个盘区的指针。
磁盘块的分配:从空闲链的链头开始,根据一定算法(首次适应、最佳适应算法等),取出满足空间大小的空闲盘块分配给文件;若没有合适的连续盘块,可将不同盘区的盘块同时分配给文件。
磁盘块的回收:① 回收区与空闲盘区相邻,合并到对应盘区;② 回收区没有与空闲盘区相邻,将回收的盘块单独作为一个盘区挂到空闲链的链尾。
(3)位示图法
每个二进制位对应一个盘块,一行的长度一般为一个字长,每一行对应一个字号,字长的每一位对应一个位号,因此可用(字号,位号)对应盘块号。假设:空闲盘块为0,非空闲的盘块为1。
假设:盘块号(b),字号(i),位号(j),字长(n)
根据(字号,位号)获取盘块号:盘块号 b = n * i + j
根据盘块号获取(字号,位号):字号 i = b / n。位号 j = b % n
磁盘块的分配:若文件需要K个盘块,则顺序扫描位示图,找到K个相邻或不相邻的“0”,根据字号和位号换算成对应的盘块号,将相应空闲盘块分配给文件,并将位示图相应位设置为1。
磁盘块的回收:将回收的盘块号换算成对应的字号和位号,并将位示图相应位设置为0。
(4)成组链接法(UNIX系统)
用于UNIX系统的大型文件系统。
超级块:在目录区专门用一个磁盘块作为超级块,超级块中记录下一组有多少空闲盘块以及对应空闲盘块号,若遇到特殊值-1则表示没有下一组空闲盘块。系统启动时,将超级块读入内存。
磁盘块的分配:检查超级块,若需要的盘块数量小于空闲盘块数,将第一组中的空闲盘块分配给文件并修改空闲盘块数;若需要的盘块数量大于等于空闲盘块数,将第一组所有空闲块分配给文件,将存放的下一组数据复制到超级块中,比对剩余需要的盘块数量和空闲盘块数,直到分配足够的盘块数给文件。
磁盘块的回收:若回收的盘块数小于等于最大可回收数,将回收的盘块号放入超级块并修改空闲盘块数;若回收的盘块数大于最大可回收数,将超级块的数据复制到新回收的块中(作为第一个分组),将新回收的块号放入超级块并修改空闲盘块数。
补充:
操作系统对设备的管理