文件的逻辑结构
文件内部的数据是如何组织起来的;文件的数据是如何存放在外存的
无结构文件:文件内部的数据就是一系列二进制流或字符流。又称“流式文件”。如.txt 文件
有结构文件:又称“记录式文件”。由若干记录组成,每条记录又由若干个数据项组成。表格文件。一般来说,每条记录有一个数据项可作为关键字(表格的表头)。根据各条记录的长度(占用的存储空间)是否相等,又可分为定长记录和可变长记录两种
有结构文件的逻辑结构:
- 顺序文件
存储方式
结构
已知文件的起始位置。能否找到第i个记录的地址(随机存取)? 能否找到某个关键字对应的记录(快速检索)?
一般说的顺序文件是指顺序存储的顺序文件
顺序文件不方便增添删除
- 索引文件
索引表本身是定长顺序文件,可以随机存取,如果按关键字顺序排列,则可以快速检索
索引文件用于为信息处理及时性要求较高的场合
解决的顺序文件不方便增删的问题,也实现了不定长文件的随机存取,但索引表会占用很多空间
- 索引顺序文件
索引指向的不是记录,而是一组记录。先根据索引找到对应的组,组内是顺序文件。
减少了索引表大小,平均查找次数。
当记录过多时,可以建立多级索引(套娃)。
文件目录 (常考选择)
文件控制块FCB(文件目录项)
每个文件目录(文件夹)存放的都是这样的一个表,表中记录文件目录内的内容
包含文件的各种信息,最重要的是文件名和文件的物理地址
实现了文件名和文件的映射,用户可以按名存取
目录结构:
1、单级目录结构
整个系统只有一张目录表,不允许重名。因此不适合多用户操作(多用户容易有重名文件)。
2、两级目录结构
分为主目录和用户目录,主目录存用户信息 ,每个用户有一个目录。
允许不同用户重名,同一用户不能,以为只有一张表。用户不能对自己的文件进行进一步的分类,缺乏灵活性。
3、多级目录结构
Windows的目录结构,目录套目录。只要是不同目录下,就可以重名。
系统根据绝对路径查找文件位置, 先从外存读入根目录,从根目录里找到“照片”的存放位置,再从外存导入“照片”目录……因此找到自拍的存放位置需要三次IO操作
4、无环图目录结构
两个目录可以通过相同或不同的文件名指向同一个文件或文件夹(文件夹也是特殊的文件)
指向同一文件不同于复制文件(复制等于有两个文件)或快捷方式(删除原文件就没了)
索引节点:FCB的改进
该读取一个文件夹的时候,需要把该文件目录的整张表放入内存, 这么多项,表太大,浪费空间且效率低。给目录表“瘦身”: 仅保留文件名,其余信息用指针索引,需要用到再从外存读入,这样表就小了,速度变快,占用内存也少。
文件的物理结构(文件分配方式): (挺重要)
外存和内存一样,也被分为一个个的内存块。为了方便IO,磁盘块的大小常设置与内存块相同
1、连续分配:
物理块号=起始块号+逻辑块号
当然,IO是需要检查逻辑块号是否合法(逻辑块号不能大于长度)
优点:支持顺序访问和随机访问。读取速度快(磁盘的读取方式---磁针转转转)
缺点:
若文件aaa要拓展,需要再增加个1磁盘块(总共需要连续的4个磁盘块)由于采用连续结构,因此文件A占用的磁盘块必须是连续的。所以必须将文件整个迁移
连续分配不方便拓展,并且容易产生碎片
2、链接分配
- 隐式链接
除了文件最后一个磁盘块之外,每个磁盘块都跑村指向下一个磁盘块的指针,指针对用户是透明的
优点:方便拓展,无碎片、利用率高
缺点:只支持顺序访问,不支持随机访问,查找效率低,每个块存放指针也占用空间
- 显式链接
目录只记录起始块号。文件分配表FAT(一个磁盘只有一个FAT,开机时放入内存常驻;FAT每个表项长度相同,因此物理块号可以是隐含的)存放每个物理块的指针 -1表示最后一块。
采用显式链接方式的文件,支持顺序访问,也支持随机访问(为啥???),由于块号转换的过程不需要访问磁盘,因此相比于隐式链接来说,访问速度快很多。
优点:方便拓展,无碎片,支持随机访问,地址转换不需要访问磁盘(为啥???)、效率高
缺点:FAT占用内存
3、索引分配
索引分配允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块。索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为块。 索引表每项定长,因此可以隐含块号。
支持随机访问,易拓展
若文件很大,索引表一个块装不下?
- 链接方案
索引块最后有下一个索引块的指针
- 多层索引
如果索引块非常多,前者效率低
K层索引,访问一个数据块需要k+1次IO
- 混合索引
多级索引虽然容量大了,但需要的IO次数太多。数据使用频率不同有的数据块常用,有的不常用。
这种索引支持的最大文件长度为:8+256+65536
文件空间管理 对空闲区域的管理
存储空间的划分:
将一个磁盘划为多个分区(文件卷),每个分区需要有文件区和目录区
也可以把多个磁盘划分成一个分区
存储空间管理方法:空闲表法
如何分配磁盘块:与内存管理中的动态分区分配很类似,为一个文件分配连续的存储空间。同样可采用首次适应、最佳适应、最坏适应等算法来决定要为文件分配哪个区间。
回收空间时:表中该合并的就合并
空闲列表法: 由OS保存链头链尾指针
空闲盘块链:以一个空闲块作为单位
空闲盘区链:以一组连续的空闲块作为单位
位示图法:
表中:位号最大为机器字长(一行对应一个字,字号说明了表占用了几个字)。字中的每一位对应了一个块的状态,1是占用,0是空闲。
重点是会盘块号和字号位号的转换: (n是字长)
文件的基本操作
打开文件: 调用OS的open指令
流程:从打开文件的所在目录中找到该文件的目录项,检验权限,目录项复制到打开文件表、将编号给用户,之后用户通过编号指明文件进行操作
打开文件表(这个表在内存里):
将已经打开的文件记录在表里。打开文件并没有对文件进行什么操作,因此文件并没有调入内存,而是把文件的存储地址等信息放入内存,在对文件进行具体操作的时候在调入文件。
两种打开文件表:系统的打开文件表(记录所有打开文件);进程的打开文件表(记录进程打开的文件)
打开计数器清零前,文件是删不掉的
读文件:
进程使用 read系统调用完成。需要指明是哪个文件(打开文件表中的编号),还需要指明要读入多少数据(如:读入1KB),指明读入的数据要放在内存中的什么位置。操作系统在处理read系统调用时,会从读指针指向的外存中,将用户指定大小的数据读入用户指定的内存区域中
写文件:
与读文件类似。注意,写文件指的是完成对文件的修改之后,保存修改时OS对外存的修改,而非用户对文件的修改。(例如写txt文档,写文件指的不是用户编辑的过程,而是编辑完保存时,系统的操作)
文件共享
硬链接(索引链接)
前面其实说过
软连接:快捷方式,一看就懂
文件保护
口令保护
口令一般存放在文件的FCB或者索引节点中
加密保护
对文件原始数据通过秘钥处理,即系统中存放的并不是原始数据,而是加密后的数据,用户需要对加密数据进行解密才能得到正确数据
控制访问
OS对用户的权限进行限制(rwx权限啥的)
访问控制表:
优点:实现灵