目录
初识文件
文件属性
文件分类
文件的组织
操作系统提供的功能
其他由操作系统实现的文件管理功能
文件如何存放在外存
文件存放方式
文件的逻辑结构
有结构文件
顺序文件
索引文件
索引顺序文件
多级索引顺序文件
文件目录
文件控制块
对目录进行的操作
目录结构
单级目录结构
两级目录结构
多级目录结构(树形目录结构)
无环图目录结构
索引节点
文件的物理结构
操作系统对磁盘的管理
文件分配方式
文件块,磁盘块
连续分配
连续分配的缺点
链接分配
隐式链接
显式链接
索引分配
解决索引表装不下问题
总结
文件的存储空间管理
存储空间的划分与初始化
基础知识
存储空间的管理方法
空闲表法
空闲链表法
位视图法
文件的基本操作
创建文件
进行create系统调用提供参数
操作系统在进行create系统调用时主要做了两件事
删除文件
进行delete系统调用提供参数
操作系统在进行delete系统调用时主要做了几件事
打开文件
进行open系统调用提供参数
操作系统在进行open系统调用时主要做了几件事
打开文件表
关闭文件
操作系统在进行close系统调用时主要做了几件事
读文件
进行read系统调用提供信息
写文件
进行write系统调用提供信息
文件共享
文件共享方式
硬链接
软链接
文件保护
文件保护分类
口令保护
口令保护的优缺点
加密保护
异或加密
密码保护优缺点
访问控制
文件系统的层次结构
案例
初识文件
含义:一组有意义的信息/数据集合
文件属性
- 文件名:由创建文件的用户决定文件名,主要是为了方便用户找到文件,同一目录下不允许有重名文件
- 标识符:一个系统内的各个文件标识符唯一,对用户来说毫无可读性,因此标识符只是操作系统用于区分各个文件的一种内部名称
- 文件类型:指明文件类型(如:.txt默认用记事本打开)
- 文件位置:文件的存放路径(让用户使用)、在外存中的地址(操作系统使用,对用户不可见)
- 文件大小:指明文件大小
- 保护信息:对文件进行保护的访问控制信息
文件分类
- 无结构文件:由一些二进制或字符流组成,又称流式文件(如文本文件)
- 有结构文件:由一组相似的记录组成,又称"记录式文件";每条记录由若干个数据项组成,如数据库表文件。一般来说,每条记录有一个数据项作为关键字;根据各条记录的长度(占用存储空间)是否相等,又分为定长记录和可变长记录
文件的组织
注意:
- 用户可以自己创建一层一层的目录,各层目录中存放相应的文件。系统中的各个文件就通过一层一层的目录合理有序的组织起来
- 所谓的目录其实就是我们所熟悉的文件夹(一种有结构文件)
操作系统提供的功能
- 创建文件:点击创建文件后,图形化交互进程在背后调用了create系统调用
- 读文件:可以读文件,将文件数据读入内存,才能让CPU处理(双击后,记事本应用程序通过操作系统提供的读文件功能,即read系统调用,将文件数据从外存读入内存,并显示在屏幕上)
- 写文件:可以写文件,将更改的文件数据写回外存(我们在记事本应用程序中编辑文件内容,点击保存后,记事本应用程序通过操作系统提供的写文件功能,即write系统调用,将文件数据从内存写回外存)
- 删除文件:可以删除文件(点了删除文件后,图形化交互进程通过操作系统提供的删除文件功能即delete系统调用,将文件数据从外存中删除)
- 打开文件:读写文件之前,需要打开文件(调用open系统调用)
- 关闭文件:读写文件结束之后,需要关闭文件(调用close系统调用)
注意:可用几个基本操作完成更复杂的操作,比如:复制文件就是先创建一个空文件,再把源文件读入内存,再将内存中的数据写到新文件中
其他由操作系统实现的文件管理功能
- 文件共享:使多个用户可以共享使用一个文件
- 文件保护:如何保证不同用户对文件有不同的操作权限
文件如何存放在外存
注意:文字从下到上的顺序读
文件存放方式
- 文件数据放在连续的几个磁盘块中
- 文件数据放在离散的几个磁盘块中
文件的逻辑结构
注意:
- 所谓的逻辑结构就是指在用户看来,文件内部的数据应该是如何组织起来的。而物理结构就是指在操作系统看来,文件的数据结构是如何存放在外存中的
- 无结构文件的文件内部数据其实就是一系列字符流,没有明显的结构特性。因此也不用探讨无结构文件的逻辑结构问题
有结构文件
顺序文件
含义:文件中的记录一个接一个的顺序排列(逻辑上),记录可以是定长的或可变长的。各个记录在物理上可以顺序存储或链式存储
顺序文件分类
- 串结构:记录之间的顺序与关键字无关
- 顺序结构:记录之间的顺序按关键字顺序排列
注意:串结构中记录的顺序通常按照记录存入的时间决定记录的顺序。
问题:已经知道文件的起始地址(第一个记录存放的位置)那么能否快速找到第i个记录对应的地址(能否实现随机存取)
注意:
- 可变长记录无法实现随机存取的原因——可变长记录在内存分配上,不能通过某种公式找到规律性
- 顺序文件的缺点:增加/删除一个记录比较困难(若是串结构则相对简单)
索引文件
前言:对于可变长记录文件,要找到第i个记录,必须先顺序地查找前i-1个记录,但是在很多应用场景中又必须使用可变长记录,因此出现了索引文件
理解:
- 每个文件建立一张索引表以加快文件的检索速度,每个索引表的表项对应文件的一条记录;文件的记录在物理上不需要连续存放,但索引表的表项在物理上需要连续存放;
- 因为每条索引表的表项大小相等,所以索引表本身也可以理解为定长记录的顺序文件
- 可以将关键字作为索引号的内容,若按关键字顺序排列,则还可以支持按照关键字折半查找
- 每当要增加或删除一个记录时,需要对索引表进行修改。由于索引文件有很快的检索速度,因此主要用于对信息处理的及时性要求比较高的场合
- 可以用不同的数据项建立多个索引表
索引顺序文件
前言:索引文件缺点——每个记录对应一个表项,因此索引表可能会很大。比如:文件的每个记录平均只占有8B,而每个索引表项占32个字节,那么索引表都要比整个文件内容本身大4倍,这样对存储空间的利用率就太低了
索引顺序文件:索引顺序文件是索引文件和顺序文件思想的结合。索引顺序文件中同样会为文件建立一张索引表,但不同的是:并不是每个记录对应一个索引表项,而是一组记录对应一个索引表项
多级索引顺序文件
前言:为了进一步提高检索效率,可以为顺序文件建立多级索引表。例如,对于一个含10^6个记录的文件,可先为该文件建立一张低级索引表,每100个记录为一组,故低级索引表中共有10000个表项,再把这10000个定长记录分组,每组100个,为其建立顶级索引表,故顶级索引表中共有100个表项
注意:此时,检索一个记录平均需要查找50+50+50=150次
文件目录
前言:文件目录就是我们很熟悉的windows操作系统的文件夹
文件控制块
含义:目录本身就是一种有结构的文件,由一条条记录组成。每条记录对应一个放在该放在该目录下的文件,目录文件中的一条记录就是一个文件控制块(FCB)
注意:
- FCB的有序集合称为文件目录,一个FCB就是一个文件目录项。
- FCB中包含了文件的基本信息(文件名、物理地址、逻辑结构、物理结构等);存取控制信息(是否可读/可写、禁止访问的用户名单等);使用信息(文件建立时间、修改时间等);但是最重要的最基本的信息还是文件名、文件存放的物理地址
对目录进行的操作
- 搜索:当用户要使用一个文件时,系统要根据文件名搜索目录,找到该文件对应的目录项
- 创建文件:创建一个新文件时,需要在其所属的目录中增加一个目录项
- 删除文件:当删除文件时,需要在目录中删除相应的目录项
- 显示目录:用户可以请求显示目录的内容,如显示该目录中的所有文件及相应属性
- 修改目录:某些文件属性保存在目录中,因此这些属性变化时需要修改相应的目录项(如文件重命名)
目录结构
单级目录结构
前言:早期操作系统并不支持多级目录,整个系统中只建立一张目录表,每个文件占一个目录项
注意:
- 单级目录实现了按名存取,但是不允许文件重名,所以在创建一个文件时,需要先检查目录表中有没有重名文件,确定不重名后才允许建立文件,并将新文件对应的目录插入到目录表中
- 若计算机有很多用户在使用,那么不同用户文件名很容易重复,因此,单级目录结构不适用于多用户操作系统
两级目录结构
前言:早期的多用户操作系统,采用两级目录结构,分为主文件目录和用户文件目录
注意:
- 主文件目录记录用户名及相应用户文件目录的存放位置
- 用户文件目录由该用户的FCB组成
- 允许不同用户的文件重名(文件名虽然相同,但是对应的是不同的文件)
- 两级目录也可在目录上实现访问限制。但两级目录结构依然缺乏灵活性,用户不能对自己的文件分类
多级目录结构(树形目录结构)
注意:
- 每个目录下面可以有更低级的目录,同时在各个目录下面也可以有普通的文件,并且不同目录下的文件是可以重名的
- 用户(或用户进程)要访问某个文件时要访问某个文件时要用文件路径名标识文件,文件路径名是个字符串。各级目录之间用/隔开。从根目录出发的路径称为绝对路径,从当前目录出发的路径称为相对路径
无环图目录结构
前言:树形目录结构可以很方便的对文件进行分类,层次结构清晰,也能够更加有效的对文件进行管理和保护。但是,树形结构不便于实现文件的共享,为此提出无环图目录结构
注意:
- 无环图目录结构在树形目录结构的基础上,增加了一些指向同一节点的有向边,使整个目录成为一个有向的无环图。可以更方便的实现多个用户间的文件共享
- 无环图目录结构可以用不同文件名指向同一个文件,甚至可以指向同一个目录(共享同一目录下的所有内容)
- 无环图目录结构删除共享文件时需要为每个共享节点设置一个共享计数器,用于记录此时有多少个地方在共享该节点。用户提出删除节点的请求时,只删除该用户的FCB,并使共享计数器减一,并不会直接删除共享节点(只有共享计数器减为0时,才删除该节点)
- 共享文件不同于复制文件。在共享文件中,由于各用户指向同一个文件,因此只要将其中一个用户修改了文件数据,那么所有的用户都可以看到文件数据的变化
索引节点
前言:操作系统在查找各级目录过程中只需要用到文件名这个信息,只要文件名匹配,才需要读出文件以及其他信息。因此可以考虑让目录表瘦身来提升效率
注意:
- 可以把除文件名的其他信息放到索引节点中,每个文件都会有唯一的索引节点,采用索引节点这种机制后目录中只会存在文件名以及指向索引节点的指针这两个信息,如此目录表占用空间小很多
- 系统根据文件名找到索引节点后需要把索引节点调入内存,之后根据索引节点记录的信息(文件存放位置)就可以找到该文件
- 存放在外存中的索引节点被称为磁盘索引节点,当索引节点放入内存后就成为内存索引节点;相比之下内存索引节点中需要增加一些信息,比如:文件是否被修改、此时有几个进程正在访问该文件等
文件的物理结构
操作系统对磁盘的管理
- 对非空闲磁盘的管理(存放文件数据的磁盘块)
- 对空闲磁盘块的管理
文件分配方式
- 连续分配
- 链接分配(隐式链接、显式链接)
- 索引分配
文件块,磁盘块
- 类似于内存分页,磁盘中的存储单元也会被分成一个个“块/磁盘块/物理块”。很多操作系统中,磁盘块的大小与内存块、页面的大小相同
- 内存与磁盘之间的数据交换(即读/写操作、磁盘IO)都是以块为单位进行的。每次读入一块或每次写出一块
- 外存管理中,为了方便对文件数据的管理,文件的逻辑地址空间也被分成了一个个的文件块,于是文件的逻辑地址也可以表示为(逻辑块号,块内地址)的形式,逻辑块号从0开始
- 用户在操作自己文件时主要用逻辑块号和块内地址的形式,于是操作系统就需要把用户提供的逻辑块号和块内地址转换为文件块实际存放的物理块号和块内地址
连续分配
前言:连续分配方式要求每个文件在磁盘上占有一组连续的块
注意:
- 采用连续分配方式,那么操作系统仅需转换块号就可以,块内地址保持不变(逻辑块号,块内地址)——(逻物理号,块内地址)
- 为了实现地址映射的功能,在文件目录表中必须记录两个文件属性(起始块号,文件长度)
- 假设用户给出要访问的逻辑块号,则操作系统需要找到用户想要访问的文件对应的目录项FCB从中得到起始块号,最后根据起始块号+逻辑块号得到物理块号
- 因为可以直接算出逻辑块号对应的物理块号,所以连续分配方式支持顺序访问和随机访问
- 读取某个磁盘块时需要移动磁头,访问两个磁盘块相隔越远,移动磁头所需的时间就越长。因此连续分配的文件在顺序读写时速度最快
连续分配的缺点
- 由于连续分配方式要求文件在磁盘中占有连续的块,因此对文件的扩展很不方便
- 物理上采用连续分配对存储空间的利用率低,会产生难以利用的磁盘碎片
链接分配
前言:链接分配采取离散分配的方式,可以为文件分配离散的磁盘块。分为隐式链接和显式链接
隐式链接
注意:目录中记录了文件的起始块号和结束块号,当然,也可以增加一个字段来表示文件的长度
注意:除了文件的最后一个磁盘块之外,每个磁盘中都会保存指向下一个盘块的指针,这些指针对用户是透明的
过程
- 用户给出要访问的逻辑块号i,操作系统找到该文件对应的目录项(FCB)
- 从目录项中找到起始块号(0号块)将0号逻辑块读入内存,由此知道1号逻辑块存放的物理块号,于是读入1号逻辑块,再找到2号逻辑块的存放位置……以此类推
- 因此读入i号逻辑块总共需要i+1次磁盘IO
结论:
- 隐式链接缺点:若采用链式分配(隐式链接)方式的文件,只支持顺序访问,不支持随机访问,查找效率低。另外,指向下一个盘块的指针也需要耗费少量的存储空间
- 隐式链接优点:若采用链式分配(隐式链接)方式,很方便文件的扩展,另外,所有的空闲磁盘块都可以被利用,不会有碎片问题,外存利用率高
显式链接
前言:相对于隐式链接方式,显示链接方式把用于链接文件各物理块的指针显式的存放在一张表中,即文件分配表(FAT)。
注意:显式链接的文件目录中只需要记住文件的起始块号
理解:假设某个新创建的文件aaa依次存放在磁盘块2——5——0——1
注意:一个磁盘仅设置一张FAT。开机时,将FAT读入内存。FAT的各个表项在物理上连续存储,且每一个表项长度相同,因此“物理块号”字段是隐含的。
过程
- 用户给出要访问的逻辑块号i,操作系统找到该文件对应的目录项(FCB)
- 从目录项中找到起始块号,若i>0,则查询内存中的文件分配表FAT,往后找到i号逻辑块对应的物理块号。(FAT常驻内存)逻辑块号转换成物理块号的过程不需要磁盘操作
结论:
- 采用显式链接分配方式的文件,支持顺序访问,也支持随机访问(想访问i号逻辑块并不需要顺序的依次访问0——i-1号逻辑块,可以直接通过FAT表查到i号逻辑块存放的地址)由于块号转换过程不需要访问磁盘,因此相比隐式链接来说,访问速度块很多
- 显示链接也不会产生外部碎片,也可以很方便的对文件进行扩展
索引分配
前言:索引分配允许文件离散的分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块(索引表的功能类似于内存管理中的页表——建立逻辑页面到物理页面之间的映射关系)。索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为数据块
注意:采用索引分配方式的文件需要在自己的目录项(FCB)中记录自己的索引块到底是那个磁盘块
理解:假设某个新创建的文件aaa的数据依次存放在磁盘块2——5——13——9,7号磁盘块作为aaa的索引块,索引表中保存了索引表的内容
注意:
- 在显式连接的链式分配方式中,文件分配表FAT是一个磁盘对应一张。而索引分配方式中,索引表是一个文件对应一张
- 可以用固定长度表示物理块号,此时只要知道索引表的首地址就可以知道任意一个表项所在位置;因此,索引表中的逻辑块号是隐含的
- 索引分配方式可以支持随机访问,文件扩展也很容易实现(只需要给文件分配一个空闲块,并增加一个索引表项即可)但索引表需要占用一小段存储空间
过程
- 用户给出要访问的逻辑块号i,操作系统找到该文件对应的目录项(FCB)
- 从FCB中找到索引块的块号,进而从索引块中读出索引表的内容
- 通过索引表中的逻辑块号查询索引表就可以找到对应的物理块号
解决索引表装不下问题
问题:若一个磁盘块1KB,一个索引表项4B,则一个磁盘块只能存放256个索引项;若有个文件大小已经超过256个索引项,那么一个磁盘块装不下整张文件索引表,那么怎么办
链接方案
含义:若索引表太大,一个索引块装不下,那么可以将多个索引块链接起来存放
注意:
- 将索引表拆分,为该文件分配多个索引块;每个索引块中存放256个索引项,并且在每个索引块中用一定的空间存储指向下一个索引块的指针,这样就可以把很长的索引表查分成不同部分,并且用链接的方式将他们链接起来
- 若采用链接方案,那么文件的FCB中只需要记录第一个索引块的块号即可
- 若用户想要访问256号的物理块,那么操作系统首先会将第一个索引块读入内存,然后根据这个索引块中的指针找到第二个索引块的块号并且把第二个索引块读入内存,最终找到256逻辑块号对应的物理块号
多层索引
含义:建立多层索引(类似于多级页表)使第一层索引块指向第二层索引块。还可以根据文件的大小的要求再建立第三层第四层索引块
注意:若采用多层索引,则各层索引表的大小不能超过一个磁盘块
逻辑块到物理块号之间的转变:可根据逻辑块算出应该查找索引表中的那个表项,如访问1026号逻辑块,则1026/256=4(查找4号二级索引表中存放的)1026%256=2(查找2号索引项)
总结:可以先将1级索引表调入内存,查询4号表项,将其对应的二级索引表调入内存,再查询二级索引表的2号表项就知道1026号逻辑块存放的磁盘块号了
混合索引
前言:若一个文件本来很小,数据块只有1KB,但该文件物理上采用2层索引结构,那么读入这个文件1KB内容依然需要3次读磁盘,为了解决该问题人们提出混合索引
含义:多种索引分配方式相结合。例如,一个文件的顶级索引表中,即包含直接地址索引(索引项直接指向数据块)又包含一级间接索引(索引项指向单层索引表)还包含两级间接索引(索引项指向两层索引表)
注意:使用混合索引这种方式,对于小文件,只需要较少的读磁盘次数就可以访问目标数据块(一般计算机中小文件更多)
总结
文件的存储空间管理
存储空间的划分与初始化
基础知识
- 含义:将物理磁盘划分为一个个的文件卷(逻辑卷、逻辑盘)
- 存储空间的初始化:将各个文件卷划分为目录区、文件区
- 目录区主要用于存放文件目录信息(FCB)、用于磁盘存储空间管理的信息
- 有的系统支持超大型文件,可支持由多个物理磁盘组成一个文件卷
存储空间的管理方法
空闲表法
前言:空闲表主要记录了每个空闲区间的起始位置和空闲区间的长度
注意:
- 空闲表法适用于文件的物理结构是连续分配的这种场景下
- 如何分配磁盘块:与内存管理中的动态分区分配类似,为一个文件分配连续的存储空间。同样可以采取首次适应、最佳适应、最坏适应等算法来决定要为文件分配那个区间
- 如和回收磁盘块:根据回收某个存储区时的四种情况,决定空闲表项的增加与合并(修改空闲表)
空闲链表法
分类
- 空闲盘块链:以盘块为单位组成一条空闲链
- 空闲盘区链:以盘区为单位组成一条空闲链
注意:
- 对于空闲盘块链来说,每一个空闲盘块中都会存储着指向下一个空闲盘块的指针
- 连续的空闲盘块可以组成一个空闲盘区
- 对于空闲盘区链来说,空闲盘区中的第一个盘块内记录了盘区的长度、下一个盘区的指针
- 空闲盘块链主要适用于离散分配的物理结构,空闲盘区链既适应离散分配,又适应连续分配。为一个文件分配多个盘块时效率更高
空闲盘块链的分配与回收
- 空闲盘块链分配:操作系统会保存着链头、链尾的指针,当需要分配K个磁盘块的话,系统就会从链头的位置开始依次摘下K个磁盘块进行分配,并修改空闲链的链头指针
- 空闲盘块链回收:回收的盘依次挂到链尾,并修改空闲链的链尾指针
空闲盘区链的分配与回收
- 空闲盘区链分配:操作系统会保存着链头、链尾的指针,当文件需要分配K个磁盘块的话,则可以采用首次适应、最佳适应等算法,从链头开始检索,按照算法规则找到一个大小符合要求的空闲盘曲分配给文件。若没有合适的连续空闲块,也可以将不同盘区的盘块分配给同一个文件,注意分配后要修改相应的链指针、盘区大小等数据
- 空闲盘区链回收:若回收区和某个空闲盘区相邻,则需要将回收区合并到空闲盘区中。若回收区没有和任何空闲区相邻,将回收区作为单独的一个空闲盘区挂到链尾
位视图法
位视图:每个二进制对应一个盘块。在本例中,0代表盘块空闲,1代表盘块分配。位视图一般用连续的字表示,如本例中一个字的字长为6位,字中每一位对应一个盘块。因此可以用(字号,位号)对应一个盘块号,当然,有的题目中也描述为(行号,列号)
注意:
- 盘块号,字号,位号从0开始,n表示字长,则(字号,位号)=(i,j)的二进制位对应的盘块号b=ni+j
- 采用位视图法,那么分配盘块连续分配、离散分配都适用
位视图法磁盘块的分配与回收
- 磁盘块分配:若文件需要K个块则(1顺序扫描位视图,找到K个相邻或不相邻的0;2根据字号、位号算出对应的盘块号,将相应的盘块分配给文件;3将相应的位设置为1)
- 磁盘块回收:(1根据回收盘块号计算出对应的字号、位号;2将相应的二进制设为0)
成组链接法
前言:空闲表法、空闲链表法不适用于大型文件系统,因为空闲表或空闲链表可能过大。unix系统中采用了成组连接法对磁盘块进行了管理
注意:
- 文件卷的目录区中专门用一个磁盘作为超级块,当系统启动时需要将超级块读入内存。并且保证内外存中的超级块数据一致
- 在超级块中记录了下一组空闲盘块的数量,还应记录该数量盘块的盘块号,通过这些盘块号就可以依次找到写一个分组的各个盘块了(后级盘块以此类推)用这种方式就可以把系统中所有的空闲盘块联系起来了
- 超级块是一个占用磁盘空间的块,唯一不是空闲的块,固定于磁盘的某位置
- 每个分组的盘块号并不要求连续,并且每个分组的空闲盘都记录了下一分组的磁盘块号信息
- 盘块号的值位-1表示之后已经没有更多分组了
成组链接法磁盘的分配和回收
- 磁盘的分配:(假设此时某一个文件需要分配1个空闲块,那么先检查第一组的块数是否足够,1<100,因此足够;之后分配第一个分组中的一个空闲块,并修改相应数据)(假设需要分配100个空闲块,那么检查第一个分组是否足够,足够后分配第一个分组中的100个空闲块。但由于300号块内存放了下一组的信息,因此需要将300号的数据复制到超级块中)
- 磁盘的回收:(假设某个分组最多100个空闲块,此时第一个分组已有99块,还要再回收一块;因此可以把该块挂到第二个分组的尾部,用超级块进行连接,同时修改超级快的空闲盘块数)(假设每个分组最多100个空闲块,此时第一个分组已有100块还需要再回收一块,那么需要将超级块中的数据复制到新回收的块中,并修改超级块的内容,让新回收的块成为超级块的第一个分组)
文件的基本操作
创建文件
前言:点击创建文件后,图形化交互进程在背后调用了create系统调用
进行create系统调用提供参数
- 所需外存空间大小(如:一个盘块,即1KB)
- 文件的存放路径(D:/Demo)
- 文件名(这个地方默认为:新疆文本文档.txt)
操作系统在进行create系统调用时主要做了两件事
- 在外存中找到文件所需的空间(结合上小节学习的空闲链表法、位视图、成组链接法等管理策略,找到空闲空间)
- 根据文件存放路径的信息找到该目录对应的目录文件,在目录中创建该文件对应的目录项,目录项中包含文件名、文件在外存中的位置等信息
删除文件
前言:点击删除文件后,图形化交互进程通过操作系统提供的删除文件功能,即delete系统调用,将文件数据从外存中删除
进行delete系统调用提供参数
- 文件存放路径(D:/Demo)
- 文件名(test.txt)
操作系统在进行delete系统调用时主要做了几件事
- 根据文件存放路径找到相应的目录文件,从目录中找到文件名对应的目录项
- 根据该目录项记录的文件在外存中存放的位置、文件大小等信息,回收文件占用的磁盘块(回收磁盘块时,根据空闲表法、空闲链表法、位图法等管理策略的不同,需要做不同的处理)
- 从目录表中删除文件对应的目录项
打开文件
前言:很多操作系统中,在对文件进行操作之前,要求用户先使用open系统调用
进行open系统调用提供参数
- 文件存放路径(D:/Demo)
- 文件名(test.txt)
- 要对文件的操作类型(r:只读;rw:读写)
操作系统在进行open系统调用时主要做了几件事
- 根据文件存放的路径找到相应的目录文件,从目录中找到文件名对应的目录项,并检查该用户是否有指定的操作权限
- 将目录项复制到内存中的打开文件表中。并将对应表目的编号返回给用户。之后用户使用打开文件表的编号来指明要操作的文件
打开文件表
前言:有了打开文件表之后,用户进程A再操作文件就不需要每次都重新查目录了,这样就可以加快文件的访问速度
两种打开文件表
注意:
- 系统打开文件表整个系统只有一张(记录了所有的被其他进程使用的文件信息)
- 每个进程也会有一个自己的打开文件表(记录了自己的进程此时已经打开的文件到底是那些)
- 进程自己的打开文件表有个系统表索引号,该索引号就是系统打开文件表的编号
- 进程打开文件表中的读写指针记录了该进程对文件进行读写操作进行到了什么位置,在该表内也需要标明该进程对文件的访问权限
- 在系统打开文件表中有个字段(打开计数器)该字段用来记录该字段已经被几个进程打开了
关闭文件
前言:读写文件结束之后,需要关闭文件,要求用户先使用close系统调用
操作系统在进行close系统调用时主要做了几件事
- 将进程的打开文件表相应的表项删除
- 回收分配给该文件的内存空间等资源
- 系统打开文件表的打开计数器count减一,若count=0,则删除对应表项
读文件
前言:将文件数据读入内存,才能让CPU处理(双击后,记事本应用程序通过操作系统提供的读文件功能,即read系统调用,将文件数据从外存读入内存,并显示在屏幕上)
进行read系统调用提供信息
进程使用read系统调用完成写操作,需要指明是那个文件(在支持打开文件的操作系统中,只需要提供文件在打开文件索引表中的索引号即可),还需要指明读入多少数据,指明读入数据放在内存的什么位置
注意:
- 在读文件之前一定要先打开文件,所以在正式开始读文件时记事本中的打开文件表中已经有了该文件对应的表项
- 操作系统处理read系统调用时,会从读指针指向的外存中,将用户指定大小数据读入用户指定的内存区域中
写文件
前言:可以写文件,将更改过的文件数据写回外存(在记事本文件中编辑文件内容,点击保存后,记事本应用程序通过操作系统提供的写文件功能,即write系统调用将文件数据从内存写回外存)
进行write系统调用提供信息
进程使用write系统调用完成写操作,需要指明是那个文件(在支持打开文件的操作系统中,只需要提供文件在打开文件索引表中的索引号即可),还需要指明写入多少数据,写回外存的数据放在内存的什么位置
注意:操作系统在处理write系统调用时,会从用户指定的内存区域中,将指定大小的数据写回指针指向的外存
文件共享
前言:操作系统为用户提供文件共享功能,可以让多个用户共享的使用同一个文件
文件共享方式
- 基于索引节点的共享方式(硬链接)
- 基于符号链的共享方式(软链接)
注意:多个用户共享的使用同一个文件,意味着系统只有一份文件数据。并且只要某个用户修改了该文件数据,其他用户也可以看到文件数据的变化
硬链接
前言:索引节点是一种文件瘦身策略。由于检索文件时只需要用到文件名,因此可以将解除了文件名之外的其他信息放到索引节点中。这样目录项就只包含文件名索引节点指针
注意:
- 索引节点内包含该文件的物理地址和与该文件相关的其他属性
- 索引节点中设置一个链接计数变量count,用于表示链接到本索引节点上的用户目录项数
- 若有第二个用户也想共享的使用该文件,那么该用户目录中也会有一个目录项指向该文件的索引节点的
- 若某个用户决定删除该文件,则只是把用户目录中与该文件对应的目录项删除,且索引节点的count值减一,若count值为0时系统负责删除文件
软链接
理解:当user3访问ccc时,操作系统判断文件ccc属于link类型的文件,于是会根据其中记录的路径层层查找目录,最终找到user1的目录表中的aaa表项,于是就找到了文件1的索引节点
文件保护
含义:保护文件数据的安全
文件保护分类
口令保护
含义:为文件设置一个口令(如:abc112233),用户请求访问该文件时必须提供口令
理解:口令一般存放在FCB或索引节点中。用户访问文件前需要先输入口令,操作系统会将用户提供的口令与FCB中存储的口令进行对比,若正确,则允许该用户访问文件
口令保护的优缺点
- 优点:保存口令的空间开销不多,验证口令的时间开销也很小
- 缺点:正确的口令存放在系统内部,不安全
加密保护
含义:使用某个密码,对文件进行加密,在访问文件时需要提供正确的密码才能对文件进行正确的解密
异或加密
原理:使用文件的二进制密码与文件数据依次进行异或运算得到密文,之后再将密文与文件密码进行异或运算得到文件原始数据
例子:假设用于加密/解密的密码为01001
密码保护优缺点
- 优点:保密性强,不需要在系统中存储密码
- 缺点:编码/译码,或者说加密/解密需要花费一定时间
访问控制
前言:在每个文件的FCB(或索引节点)中增加一个访问控制表(ACL)该表中记录了各个用户可以对该文件执行那些操作
注意:有的计算机可能会有很多个用户,因此访问控制列表可能会很大,可以用精简的访问列表来解决这个问题
精简的访问控制表:以组为单位,标记各组用户可以对文件执行那些操作(如:分为系统管理员、文件主、文件主的伙伴、其他用户等)
注意:
- 当某个用户想要访问文件时,系统会检查该用户所属的分组是否具有相应的访问权限。
- 若对某个目录进行了访问权限的控制,那么也要对目录下所有的文件进行相同的访问控制
文件系统的层次结构
- 用户接口:文件系统需要向上层的用户提供一些简单易用的功能接口。这层就是用于处理用户发出的系统调用请求(read、write、open、close等系统调用)
- 文件目录系统:用户通过文件路径来访问文件,因此这一层需要根据用户给出的文件路径找到相应的FCB或索引节点。所有和目录、目录项相关的管理操作都在本层完成,如管理活跃的文件目录表,管理打开文件表等
- 存取控制模块:为了保证文件数据的安全,还需要验证用户是否有访问权限,这一层主要完成用户保护相关功能
- 逻辑文件系统与文件信息缓冲区:用户指明想要访问文件的记录号,这一层需要将记录号转变为相应的逻辑地址
- 物理文件系统:这一层需要把上一层提供的文件逻辑地址转化为实际的物理地址
- 辅助分配模块:负责文件存储空间的管理,即负责分配和回收存储空间
- 设备管理模块:直接与硬件交互,负责和硬件直接相关的一些管理工作。如分配设备、分配设备缓冲器、磁盘调度、启动设备、释放设备等
案例
假设某用户请求删除文件D:/工作目录/学生信息.xlsx的最后100条记录