目录
- 页面置换算法
- 最佳置换算法(OPT)
- 先进先出置换算法
- 最近最久未使用置换算法(LRU)
- 时钟置换算法(CLOCK)
- 改进型的时钟置换算法
- 总结
- 页面分配策略
- 页面分配、置换策略
- 何时调入页面
- 从何处调入页面
- 抖动现象
- 工作集
- 总结
- 初识文件管理
- 文件属性
- 文件内部的数据应该怎么组织起来
- 文件之间应该如何组织起来?
- 操作系统应该向上提供什么功能?
- 从上往下看,文件应如何存放在外存
- 其它需要操作系统实现的文件管理功能
- 总结
- 文件的逻辑结构
- 两种结构文件
- 有结构文件的逻辑结构
- 索引文件
- 索引顺序文件
- 多级索引顺序文件
- 总结
- 文件目录
- 文件控制块
- 目录结构--单级目录结构
- 目录结构--两级目录结构
- 多级目录结构
- 无环图目录结构
- 索引节点(FCB改进)
- 总结
- 文件的物理结构
- 文件块、磁盘块
- 文件分配方式--连续分配
- 文件分配方式--链接分配
- 两种链接的总结
- 文件分配--索引分配
- 总结
- 文件存储空间管理
- 存储空间的划分与初始化
- 存储空间管理--空闲表法
- 存储空间管理--空闲链表法
- 存储空间管理--位示图法
- 存储空间管理--成组链接法
- 总结
- 文件的基本操作
- 创建文件
- 删除文件
- 打开文件
- 关闭文件
- 读文件
- 写文件
- 总结
- 文件共享
- 基于索引节点的共享方式(硬链接)
- 基于符号链的共享方式(软链接)
- 总结
- 文件保护
- 口令保护
- 加密保护
- 访问控制
- Windows的访问控制
- 文件系统的层次结构
- 磁盘结构
- 磁盘、磁道、扇区
- 如何在磁盘读写数据
- 磁盘的物理地址
- 磁盘的分类
- 磁盘调度算法
- 一次磁盘读写所需的时间
- 先来先服务算法
- 最短寻找时间优先(SSTF)
- 扫描算法(SCAN)
- LOOK调度算法
- 循环扫描算法(C-SCAN)
- C-LOOK调度算法
- 减少磁盘延迟时间的方法
- 减少延迟时间的方法:交替编号
- 磁盘地址结构的设计
- 减少延迟时间的方法:错位命名
- 总结
页面置换算法
- 好的算法让换入换出尽可能少
最佳置换算法(OPT)
- 淘汰今后不会使用的页面,或者很长时间不再没有使用的页面,所以需要预测。
- 操作系统不可能提前预判执行的序列所以无法实现。
先进先出置换算法
- 每次淘汰的页面都是先进来的页面。
- 实现方法:可以通过队列,每次把队头页面的弄出去就可以了。
- 先进先出的性能很差,内存块增多反而缺页率更大,原因就是先进的页可能访问的次数频率也很高。
最近最久未使用置换算法(LRU)
- 淘汰最久没有使用的页面。
- 这个思路其实就是直接看之前访问的前几个页面,然后剩下最后的那个就换出。因为他就是最近最久没有被访问的页面。
时钟置换算法(CLOCK)
也可以被称为最近未使用算法。
- 最佳置换无法实现,LRU成本大,先进先出的效率低。
- 简单clock算法,把页链接成一个环,每次页面被访问的时候就会访问位就是设置为1,第一轮扫描的时候会把这些1设置为0。然后第二轮扫描如果发现刚好指向的页面是0那么就换出。
改进型的时钟置换算法
-
简单的时钟置换算法只是考虑到一个页面最近是否被访问过。但是没有考虑到页面是否修改过。
-
算法规则
- 第一轮扫描找(0,0)没有访问也没有修改的换出。不修改标志位(找最近没访问且没有修改的页面)
- 第二轮找(0,1),并且把访问位设置为0。(找最近没有访问且修改的页面)
- 第三轮和第一轮一样。(最近访问,但是没有修改的)
- 第四轮和第二轮的规则一样。 但是不修改标志位,因为第二轮扫描已经可以保证有(0,1)出现了。(最近访问而且修改的页面)
- 最多只需要4轮扫描。
总结
- 页面置换算法解决的是内存不够用的时候置换掉一些不需要使用的页面数据。分了多种方式,并且分析了每种方式的一个优缺点,但是最重要的是需要知道为什么会有置换算法的出现。就是因为虚拟内存导致的缺页现象,缺页现象就会导致请求这个页的时候内存空间不足,不足那么就要去选择一个页面换出,所以需要知道换出哪个页面。这就是算法的目的。
页面分配策略
页面分配、置换策略
- 驻留集:请求分页管理分配给进程的物理块,驻留集通常小于进程的总大小
驻留集太大会导致并发度下降,太小导致频繁换页。所以驻留集不能太大也不能太小
驻留集分配策略
- 固定分配:每个进程的分配相同数量的物理块
- 可变分配:可以分配数量不同的物理块,驻留集可以改变。
置换
- 局部置换:缺页的时候只能选择进程自己的物理块
- 全局置换:缺页的时候由操作系统分配空闲物理块。
也就是这个局部和全局置换页面的区别就是页面是不是只能是某个进程的。
区别
- 对于固定分配来说只能使用局部置换,因为全局置换一定是进程的驻留集会发生改变。
固定分配局部置换
-
为每个进程分配固定的物理块,运行期间不改变。
-
缺页的时候只能从分配的页面中置换。
-
缺点就是不能知道程序到底需要多少物理块,所以无法合理分配。
可变分配全局置换
- 进程一开始分配一定数量的物理块
- 当缺页的时候就会分配一些物理块给这个进程。
- 如果操作系统已经没有空闲物理块,那么就开始进行置换操作。
- 问题就是进程缺页就立刻分配物理块很明显就是不合理的。
可变分配局部置换
- 为进程分配一定数量的物理块。
- 只能在分配的物理块中选出页面置换
- 如果置换次数太多可以分配多几个物理块。
可变的两种置换策略区别
- 全局置换,只要缺页就分配
- 局部置换,缺页率高的时候才会分配。
何时调入页面
- 预调页策略:调用一个页面顺便把附近的页面调入进来。利用的是局部性原理。现在通常是进程首次调入由程序员指出哪些应该预先调入。防止调入的页面使用率低。
- 请求调页策略:缺页的时候再进行调入。IO开销很大。
从何处调入页面
- 对换区连续分配,所以速度很快。因为是顺序IO操作。
- 如果缺少足够的对换区空间,可以先把不修改的数据从文件区调入,会被修改的数据可以写回磁盘对换区,下次需要的时候从对换区调入。(减少修改的页面重新写入外存的消耗。)
- Unix方式:运行之前进程的数据存放到文件区,未使用过的可以从文件区调入,如果使用过需要换出的可以写回对换区,下次需要的时候可以从对换区中获取。
抖动现象
- 换出的页面马上换入内存,换入的页面马上换出外存,这种频繁的换入换出就是抖动现象。这是因为物理块不足的原因。
工作集
- 某段时间间隔,进程实际访问的页面集合。
- 可以根据工作集的大小分配内存块。
- 驻留集不能小于工作集不然就会发生抖动现象。
总结
- 主要讲解了驻留集的概念
- 页面分配的三种策略
- 固定分配局部置换:问题就是程序需要物理块预测难度大
- 可变分配全局置换:问题是每次缺页都会分配内存
- 可变分配局部置换:解决了上面的两个问题,根据缺页率来进行分配页面。
- 对于调页来说
- 对换区大,可以直接在对换区调入调出
- 对换区小:不会修改的数据从文件区调入,修改的数据调换到对换区,需要的时候再从对换区调入。
- unix:第一次使用的页面从文件区调入,调出的页面写到对换区,再次使用从对换区调入。
- 抖动现象:频繁的换入换出
- 工作集:某段时间访问的物理块集合,通常驻留集要比这个大,不然就会发生抖动现象。
- 对于这里的页面分配和置换策略,主要是针对可请求分配页面管理的机制,由于这种机制的特性,程序不一定全部一起存入内存,而是非连续的方式来分开段,然后每个段有页表来把段分开存储到页上面。所以才会有页面分配的机制,你要给程序分配多少内存,程序常用的数据是哪些,这也可以说是局部性原理。而且分配的内存少会导致抖动,分配内存多导致并发低,所以这些都是页面分配和置换策略需要考虑的事情,所以后面才会引入工作集和抖动的概念。
- 当然这里的置换策略更多指的是要不要使用全部的操作系统空闲块,还是只能使用部分的操作系统空闲块。
初识文件管理
-
文件是一组有意义的信息和数据集合。
-
一个文件有哪些属性?
-
文件内部的数据应该怎么组织起来?
-
文件之间又应该怎么组织起来?
-
从下往上看操作系统提供什么功能才能让用户和应用程序使用文件?
-
从上往下看文件数据应该怎么存放到外存?
文件属性
- 文件名:同一目录不能有同名的文件。
- 标识符:标识符对于每个文件是唯一的。
- 类型:文件的类型。
- 位置:文件存放的路径(给用户使用)。
- 文件的大小
- 保护信息:对文件保护的控制信息
文件内部的数据应该怎么组织起来
- 无结构文件,比如txt由一些二进制和字符流组成的文件。
- 有结构的文件:数据库表,由一条一条记录组成。
文件之间应该如何组织起来?
- 通过目录树
操作系统应该向上提供什么功能?
- 当创建文件的时候系统调用create文件
- 当读文件的时候调用了read系统调用,把数据从外存读进来。
- 写文件自然就是调用了write
- 还提供删除、打开和关闭文件操作。
从上往下看,文件应如何存放在外存
- 外存也是被分为一个一个块来进行存放,所以即使文件很小也是会占用1KB的。
- 外存也是多个存储单元,单位按字节编址。
其它需要操作系统实现的文件管理功能
- 文件共享:使多个用户可以共享文件
- 文件保护:如何保证不同用户对文件的不同操作权限。
总结
- 文件的属性,文件名,标识符等
- 文件内部如何被组织,无结构或者是有结构的。
- 文件之间通过目录树来把组织文件
- 操作系统向上提供创建,删除,读写文件等操作
- 存放到外存的结构和内存相似。
文件的逻辑结构
- 逻辑结构,用户看来是文件怎么组织起来的
- 物理结构:文件的数据是如何存放到外存的。
两种结构文件
- 无结构文件:文件内部数据通过二进制或者是字符流组成。流式文件。
- 有结构文件:由一组相似的记录组成,记录式文件。
- 定长记录
- 可变长记录。
有结构文件的逻辑结构
顺序文件
- 文件记录一个一个顺序排列,记录可以是定长或者是可变长的。可以是顺序或者是链式存储。
- 结构
- 串结构:按照时间顺序,不按照关键字
- 顺序结构:按照关键字顺序来进行排序。
- 两个问题(如果知道文件起始地址)
- 能否快速找到第i个文件的位置
- 能否快速找到某个关键字对应的记录存放的位置。
解答问题
- 链式存储:不能够快速存取,因为链表结构只能一个一个查找和对比。
- 顺序存储
- 可变长结构也是不能快速定位随机存取的。
- 定长结构可以实现快速存取,因为长度相同所以知道起始地址就能够快速定位。
- 串结构:因为与关键字无关,所以无法快速定位关键字的位置
- 顺序结构:和关键字相关排序可以快速定位。
索引文件
经常使用可边长记录,但是顺序存储只能够一个一个查询,怎么解决?
- 可以使用索引表,索引表本身就是一个定长记录的顺序文件。可以快速找到第i个记录。
- 可以把关键字作为索引号的内容查找。 可以使用折半查找
- 支持快速检索。对信息处理及时性比较高的场所。
- 索引是为了快速定位文件的记录位置。
索引顺序文件
- 可以通过给文件分组,索引顺序文件只是建立了对每个分组头的一个索引指向。那么就不需要那么多个索引项了。也不需要存放长度了。
- 但是如果记录太多那么分组之后还是会有很多记录需要查询,怎么处理?
多级索引顺序文件
- 相当于就是在原来的所有表项里面再次分组,再来一个索引表。这样扇出范围大,而且定位速度快。
总结
- 顺序文件的定长记录可以完成随机存取,但是变长记录不行,而且定长的记录串结构不和关键字相关联所以无法快速定位关键词的位置,但是顺序结构可以快速定位。
- 顺序文件的逻辑结构
- 顺序文件
- 索引文件:就是一个定长的顺序文件,快速定位关键词的位置。问题就是占用内存太大
- 索引顺序文件:把定位的文件记录分组。然后索引表就专门去记录这些组的头的位置,快速定位,再顺序查询。减少了索引表占用的内存。
文件目录
文件控制块
- 目录本身就是有结构文件,一条一条记录组成
- 实际上这些记录就是FCB文件控制块。
下面的点击文件
- 操作系统会根据目录表找到‘照片’的位置,然后把‘照片’的目录信息读入内存,照片的内容就可以显示了。
FCB
- FCB的有序集合称为文件目录,一个FCB就是一个文件的目录项。
- FCB包括了文件的基本信息,存取信息,使用信息。
- 文件名和文件存放地址是最重要的。实现了按名存储。
需要对文件目录进行什么操作?
- 搜索:当使用一个文件的时候根据文件名去搜索目录,找到文件的目录项。
- 创建文件:在所属的目录创建一个目录项。
- 删除文件:所属目录删除目录项。
- 显示目录:可以显示目录的文件和对应的属性。
- 修改目录:可以修改对应文件目录项。
目录结构–单级目录结构
-
实现了按名存取,但是不允许重名。
-
每次创建文件的时候都需要检查是否检查是否会重名
-
不适用于多用户操作系统。
目录结构–两级目录结构
- 主文件目录(MFD):记录了用户名和用户文件目录存放位置
- 用户文件目录(UFD):该用户的文件FCB组成。
- 这种的问题就是用户不能够对自己的文件进行分类。
多级目录结构
- 用户访问文件需要用一个文件路径名称标识文件,路径名是字符串,各级目录使用/分开。
- 根目录出发是绝对路径。
存取过程
- 然后根据根目录找到照片
- 然后从外存读入照片的目录表,找到2015-08
- 然后读入2015-08的目录项最后才是直接访问到自拍.JPG.
- 一共是3次读磁盘操作。找照片目录一次,找2015-08一次,找自拍.jpg一次。
- 但是如果每次都需要从根目录开始那么效率是很低的。
- 比如现在已经打开了照片的目录。说明照片的目录表已经载入,可以把目录设置为当前目录。从当前目录出发就是相对路径。
- 所以引入当前目录和相对路径之后磁盘IO就减少了,不需要从根目录开始访问。
无环图目录结构
- 这里实际上就是通过目录项指向同一个文件来完成文件共享,他和复制不同的地方就是,文件修改两个地方的指向其实都是会修改的。
索引节点(FCB改进)
- 实际上就是把类型,存储权限这些东西全部存入到索引节点,这样的好处就是缩小目录项占用的空间。原本每个目录项都需要占用64B,每个块是1KB,也就是每个块只能存放16个FCB,640个目录项就需要40个块,那么如果要访问某个文件名比如访问320个目录项还需要平均加载320/16=20次这样块,速度非常慢
- 所以可以把文件名+索引指针来做成目录,节点的其它信息让索引节点来存储。那么每个目录项的存储就是16B。也就是每个块可以存储64个块,所以读入320个目录项相当于读取5个磁盘块,速度大大加快。
- 然后就是把索引节点加载进内存。这里的索引节点就包括了文件的所有描述信息。包括文件的位置。
总结
- 实际上目录结构就有很多种不断进化过来
- 单级
- 二级:无法分类
- 多级:可以分类
- 无环图:实现了文件共享
- 但是还有一个目录项占用太多内存的问题。原因就是目录项不仅有指针还包括了一大堆文件属性信息。所以可以通过索引节点来解决这个问题,也就是目录项只会存储一个文件名+索引指针。对于访问下一级目录就是直接去访问这个目录表,如果是文件,那么就是直接访问这个文件的索引节点。
文件的物理结构
文件数据应该如何存放到外存中?
文件块、磁盘块
- 磁盘块和内存块和页的大小相同。
- 文件的逻辑空间也是被划分为一个一个文件块。
- 文件也可以通过逻辑块号+块内地址的形式表示逻辑地址。
- 怎么把逻辑块号映射为物理块号。其实逻辑块也有自己的一个编号,但是这只是逻辑上的一个地址而已,但是实际上存储到外存是非连续的。所以文件的各个块的逻辑地址需要转换成物理地址。
文件分配方式–连续分配
- 每个文件在磁盘上占用连续的块。
- 用户通过逻辑地址操作文件,但是操作系统如何实现从逻辑地址到物理地址的映射?所以要实现地址映射的功能。
- 由于连续存储是每个块都分配到一起,所以只需要节点记录文件名和起始块号,还有长度,然后根据用户给出的逻辑块号,找到文件的起始块号+逻辑块号,那么就是我们要访问的块。最后再根据块内地址访问想要的数据。
- 连续分配可以完成随机存取,支持顺序访问和直接访问。如果访问逻辑块2,顺序访问的意思就是从0到2才能访问到2,直接访问就是直接通过计算访问到2.
- 由于是连续分配,所以磁盘块是连在一起的,那么磁头移动遍历就很快,这也是为什么连续分配文件的时候顺序读和写的速度都是最快的。如果磁盘块相隔太远那么就会导致移动磁头所需要的时间很长。
连续分配的缺点
- 由于每个文件都是连续分配的说明,要拓展的时候就很麻烦,因为你后面也跟着一个文件不可能把后面定文件给覆盖了,所以需要迁移和重新分配空间给文件,性能消耗非常大。
- 还有一个问题就是产生大量的磁盘碎片。因为每次都是需要连续分配,如果我每次都是小的分配,那么就会占用很多零碎空间导致没有大块的连续空间。
文件分配方式–链接分配
- 离散分配磁盘块
隐式链接
- 用户给出逻辑块号i,操作系统找到文件对应的目录项
- 从目录项中找到文件的起始块号,然后把0号逻辑块读入,然后读入1号。。。直到i。
- 所以一共需要i+1次磁盘访问。访问目录项,还需要访问i个逻辑块的物理块获取指针读取下一个逻辑块对应的物理块。
- 只支持顺序访问,不支持随机访问。查找效率低。每个块还需要存储指针。
优点
- 块利用率很高,不会产生碎片
缺点
- 占用内存,只能顺序访问
- 查找速度慢。
显式链接
- 对于显式链接实际上就是一个FAT(File Allocation Table)表记录了所有的物理块号+指向的下一个物理块号而不是像上面那种把指针放到磁盘块上面。显式的说明下一个位置。
如何实现逻辑块号到物理块号的转变?
- 用户给出逻辑块号i,用户找到该文件对应的目录项(FCB)
- 从目录项中找到起始块号。
- 找到起始块号之后就可以根据逻辑块号和起始的下一个块号找到这个逻辑块号的位置。
- 它是支持随机访问,只需要通过FAT表来计算就可以了,不需要多次去访问这个磁盘块。
- 也不会产生外部碎片。
两种链接的总结
- 隐式链接分配(记录起始块号和结束的块号)不会产生碎片,但是问题就是需要多次访问磁盘,所以需要显式链接来优化,通过FAT表完成每个文件的一个逻辑块连接关系。同时记录的是物理块号,所以可以随机存取磁盘块。速度很快
- 对于连续分配来说虽然会产生磁盘碎片但是顺序读和写的速度很快。因为磁盘块是连续到一起的,并且可以通过目录来记录文件的起始位置和长度,由于块的长度相同所以可以完成随机存取。
- 我们访问文件的顺序就是找到文件的目录项,根据目录项找到对应的物理块。意思就是FCB记录了自己的文件存放的位置。隐式链接记录的是起始块号+结束块号,显式链接记录的是起始块号并且通过FAT表来快速访问。连续分配通过的记录起始块号+长度来记录每个磁盘块的位置。然后可以通过逻辑块号i来通过各个方式获取最后的磁盘块。
文件分配–索引分配
- 索引分配通过索引表记录文件的各个逻辑块对应的物理块。
- 索引表存放的磁盘块可以称为索引块,文件数据存放的磁盘块是数据块。
- 所以对于文件的FCB需要记录索引块的位置。
- 索引表的结构是逻辑块号+物理块号。逻辑块号是隐含的。这里的物理块号的长度是需要知道磁盘块到底有多少个需要表示才能计算出来。
- 文件的拓展直接增加表项就可以了。
如果索引表太大怎么办?比如1KB的块,只能存储256个项,那么超过256个索引项怎么办?
- 链接方案:分配多个索引表,并且链接起来。使用一个指针连接,这种方案的问题就是每次都需要访问到最后一个索引项的时候才能跳转到下一个索引块,假设一个文件需要的索引块很大,那么访问的速度就会非常慢。
- 多层索引:建立多层索引。k层索引需要访问k+1次磁盘。每次都是访问下一级目录,最后就是访问对应的块。
二级的计算方式
- 逻辑号/256,这个256就是每组最多是256个索引项,得出来的就是这个索引快所在的一级目录的第几组索引,逻辑块号%256得到就是在这个组的第几块就是我们要找的索引项。最后就是访问磁盘读入内存。
多级索引表示的文件最大长度
- 每个索引目录最多256个项,每组都是256个索引项,每个项对应都是一个块。所以二级目录就是256 * 256 *1KB
- 如果是三级目录,那么也是同样的计算方式。相当于就是把二级目录分组,每个组都是256刚好就是占满一个块。
- 混合索引:多种索引方式的结合。相当于里面有目录,也有直接指向数据块的。
越往下面的使用到的目录索引级别就越大。
总结
-
文件分配方式分为了连续分配和链接分配和索引分配。
-
对于索引分配来说,文件比较大的时候
- 链接方案的问题就是访问的速度太慢,因为每次都要访问到索引块的尾才能访问下一个
- 多层索引的话就是相对速度快,而且访问磁盘数量相对较少,但是索引目录级别越来越大的时候,访问磁盘的次数就越来越多
- 混合索引:包括一级,二级,小文件能够通过低级索引快速查找,大文件才需要建立更高级的目录。
文件存储空间管理
- 用什么方式记录、组织空闲块
- 如何分配磁盘块
- 如何回收磁盘块。
存储空间的划分与初始化
- 为磁盘分区,物理磁盘分为一个一个文件卷。
- 文件卷
- 目录区:文件目录信息(FCB)、磁盘存储空间管理信息
- 文件区:存储文件数据
- 也可以是多个磁盘组成一个超大的文件卷。
存储空间管理–空闲表法
- 这种方法必须建立在文件是连续分配的情况下,然后这里的空闲区间都是连续的,通过一个空闲表记录第一个空闲盘块号,然后记录连续多少个空闲。
- 可以通过首次适应,最佳适应、最坏适应算法来为文件分配哪个区间。
- 回收磁盘块的方案基本和动态分区分配是相同的。
存储空间管理–空闲链表法
- 空闲盘块链:以盘块为单位组成空闲链
- 操作系统会保存链头和链尾指针。每次分配就从链表头开始
- 回收直接从链表尾巴开始加上那些新的空闲区。
- 适用于离散物理结构,但是分配的时候需要多次操作。
- 空闲盘区链:以盘区为单位组成一条空闲链。第一个盘块会记录盘区的长度和下一个盘区的指针。
- 操作系统保持链表头和链表尾。
- 可以通过最佳适应等算法完成盘区的分配。
- 回收的时候可以合并相邻的空闲区。
- 离散分配和连续分配都是适用的。
存储空间管理–位示图法
- 每个二进制对应一个盘块。0是空闲,1是使用。
- 推出盘块号的公式就是b=ni+j
- 字号等于b/n,位号就是b%n
- 如果需要文件需要分配①扫描位示图找到k个相邻或者不相邻的0②根据字号和位号计算出对应的盘块号。分配给文件。③相应的位设置为1.
- 回收①根据盘块号计算出字号和位号②设置为0。
存储空间管理–成组链接法
- 空闲表和空闲链表都是不适合大文件系统可能导致链表和表太大。所以使用成组链接法。
- 文件卷的目录区专门用一个磁盘块作为超级块。当系统启动的时候将超级块读入内存。保证超级块内外存都是一致的。
- 超级块记录的是下一组空闲块的大小,和空闲块号。根据空闲块号可以找到下一个分组的盘块。对于每组的第一个块号是用来记录下一组空闲磁盘块的位置。 也就是空闲盘块数+下一个分组的超级块+一堆空闲块。
- 如果是-1说明已经没有分组了。
- 如何分配?
- 检查第一个分组的块数是不是够
- 然后分配出去。并且把空闲块从超级块里面删除。 并且修改超级块的空闲盘块数。
- 如果刚好超级块分配完了
- 检查块数
- 刚好分配完,那么就把下一组的所有数据复制到超级块上面。
回收块的时候
- 如果超级块足够空间回收,那么就添加一个块号到超级块。
- 如果超级块空间不够,那么先复制超级块的所有数据到一个块,并且把原来的超级块,指向复制的分组,并且清空下面的空间来存放回收的空闲块。
总结
- 介绍了文件存储的空闲区管理方案
- 空闲表:通过一个表格来记录空闲的空间,类似于之前的动态分配,里面很多条记录起始盘块号和多少个连续空闲空间。可以通过最佳适应算法来分配空间。
- 空闲链表
- 空闲盘块:这种就是可以使用离散的分配。但是每次分配给文件空间的时候操作太多了。
- 空闲盘区:这种就是多个连续盘块作为一个区,首个盘块带指针。
- 位示图法:这种其实就是通过一个二维的图,每个bit代表一个盘块,通过字号和位号与盘块之间的计算来分配回收空闲空间。
- 成组链接法:文件卷目录上带一个超级块,记录下一组和一部分的空闲块。
- 实际上这部分就是在讲文件如何分配空闲空间的方案。不同方案的分配也对应上文件分配的方式方案。比如索引这类型的文件分配需要对应一个能够非连续分配的空闲空间,可以通过空间链表。或者能够通过位图等。来分配空间给文件,文件就通过自己的方式串联这些空间。比如链接分配的显式或者是隐式或者是通过索引的分配方式。来组织整个文件,但是对于这章的方案是空闲空间分配而不是文件的组织分配方案。他们很明显就不是一个东西。
文件的基本操作
创建文件
create的系统调用参数
- 所需的外存空间大小
- 文件存放的路径。
- 文件名
操作系统干的事
- 在外存找到文件的所需空间(文件的空闲空间分配方案)
- 根据当前目录创建文件的目录项
删除文件
delete参数
- 文件存放路径
- 文件名
操作系统干的事
- 根据文件存放路径找到对应的目录文件,从目录找到文件的目录项
- 回收文件占用的磁盘块
- 删除在文件所在的目录的目录项。
打开文件
open的参数
- 文件存放路径
- 文件名
- 对文件的操作类型。
操作系统干的事
- 根据存放路径找到目录文件并且找到对应的目录项,检查用户是否具备权限。
- 把目录项复制到内存的打开文件表中,用户可以根据文件的编号来指明要操作的文件。
放到进程的打开文件表的好处是下次调用不需要重新去访问磁盘了。来找到这个目录项。
- 有一个系统打开文件表和多个用户打开文件表。用户打开文件表对应的项就是指向这个系统打开文件表的。而且有打开计数器防止文件在被打开的时候被删除。
- 对于用户的打开文件表规定了用户可以访问的权限,每次访问系统的打开文件表其实都会检查权限。
关闭文件
- 删除进程的文件打开表对应的文件表项
- 回收分配给这个文件的内存空间。
- 系统打开文件表的计数器count-1
读文件
- 通过read系统调用读文件
- 需要指明文件,指明读入多少数据,读入数据放到哪里
- 最后操作系统根据读指针读取文件,放到用户指定的内存位置。
写文件
- 指明写哪个文件,写入多少数据,写的数据放到哪里。
- write系统调用会从用户指定的内存区域,把指定大小的数据写会写指针指向的外存位置。
总结
- 系统打开文件表,表示整个系统打开的文件。记录这个文件被引用的次数
- 进程打开文件表只包含进程使用的那个。记录用户访问权限,读写指针等。
文件共享
基于索引节点的共享方式(硬链接)
- 这个其实就是通过文件的目录项引用同一个索引节点,索引节点可以记录被引用多少次。、
- 只有索引节点的count是0那么才能删除。
基于符号链的共享方式(软链接)
- 这个其实就是用户需要访问共享文件的时候记录了一个Link文件,文件记录了共享文件的路径,通过路径重新访问。类似于快捷方式。
总结
- 硬链接就是基于索引节点,直接引用索引节点
- 软链接就是记录要引用的文件的路径。
文件保护
口令保护
- 访问的时候需要验证口令。然后和FCB的进行对比。
- 优点:开销小 ,验证快。
- 缺点:口令存放到系统内部,不够安全。
加密保护
- 直接给文件进行加密编码,使用的时候需要通过某种方式来解密。
- 优点:不需要在系统存储密码
- 缺点:编码解码需要花费时间。
访问控制
- 每个FCB加上访问控制表,记录每个用户的权限,但是用户太大可能导致表太大占用空间大
- 精简访问列表
- 把权限分组,比如系统管理员,文件主。。每个都有自己的权限
- 然后给用户分组到上面这些组中。
Windows的访问控制
文件系统的层次结构
- 文件系统向上层用户提供接口,处理用户的系统调用。
- 文件目录系统,用户通过路径访问文件,找到FCB
- 存取控制模块:验证文件是不是有访问权限
- 把文件的记录号转换为逻辑地址。
- 物理文件系统,把逻辑地址转换为实际的物理地址。
- 辅助分配模块:负责分配和回收存储空间。
- 设备管理模块:直接和硬件进行交互。
案例
- 首先是根据用户根据操作系统接口发出请求(用户接口)
- 然后就是根据文件的存放路径,查找文件的目录项(文件目录系统)
- 验证权限(存取控制模块)
- 接着就是根据要删除的记录号转换为对应的逻辑地址,实际上就是找到文件内部记录的逻辑地址。(逻辑文件与文件信息缓冲区。)
- 知道目标记录对应的逻辑地址后,还需要转换成实际的物理地址(物理文件系统)
- 删除记录还需要对磁盘设备发出请求(设备管理程序模块)
- 最后就是回收空间(辅助分配模块)
磁盘结构
磁盘、磁道、扇区
- 磁盘:磁性物质,可以表示二进制数据
- 磁盘的盘面划分的圈就是磁道,磁道还会划分出扇区
- 最内侧扇区面积小但是数据密度大
如何在磁盘读写数据
- 磁头移动到想要读的扇区所在的磁道。
- 磁盘转起来,让目标扇区从磁头下面划过去
磁盘的物理地址
- 盘面就是下面的,一个盘片可能两个盘面
- 磁头是共进退的,磁头指向的磁道就是柱面
- 块号需要转换成(柱面号,盘面号,扇区号)
如何读取块
- 根据柱面移动磁臂,让磁头指向对应定柱面。
- 激活指定盘面的磁头
- 磁盘旋转,扇区从磁头下面划过去
磁盘的分类
- 活动头磁盘:磁头可以移动
- 固定头磁盘:磁头不可以移动,每个磁道都有磁头。
- 可换盘磁盘:盘片可换
- 固定盘磁盘:盘片不可以换
磁盘调度算法
一次磁盘读写所需的时间
- 寻道时间:移动磁头到对应的磁道上。所需要的时间
- 启动磁臂的时间s
- 移动磁头每次跨越一个磁道就是m时间,总共跨越n个磁道
T=s+m*n
- 延迟时间:旋转磁盘,让磁头定位到目标扇区所需要的时间。转速r,平均都是只需要转半圈。
- 传输时间:从磁盘读出或者向磁盘写入数据所经历的时间。转速r,每次读写字节数b,每个磁道的字节数是N,需要计算b字节数到底占用多少磁道,而且还要计算转一圈多少时间。然后计算一共需要遍历b/N个磁道所需要的时间。
- 延迟时间和传输时间是无法优化的。所以只能优化寻道时间
先来先服务算法
- 根据进程请求访问磁盘的先后顺序进行调度
- 优点:公平,访问磁道集中的话,那么算法性能还行
- 缺点:如果大量进程竞争使用磁盘,那么访问的磁道分散,FCFS的性能就会很差。寻道时间很长,因为需要跨越太多的磁道。
最短寻找时间优先(SSTF)
- 优先处理与当前磁头近的磁道。保证每次寻道时间最短。并不能保证总的寻道时间最短。
- 优点:性能比较好
- 缺点:容易产生饥饿问题,如果一直有新的进程就在磁头附近,导致右边的进程可能无法读入数据。而且还会有一段跳跃性的磁道访问。
扫描算法(SCAN)
- 每次移动到最外侧的时候才能开始移动到内侧。移动到最内侧的时候才能往外移动。解决了饥饿问题
- 优点:性能好,解决饥饿
- 缺点:
- 每次都要移动到最边上。实际上并不需要
- 对各个位置的磁道响应不平均,对接近边界的磁道访问一次之后,请求再次满足还能够再次访问,但是对于中间的磁道就需要等待很长的时间了。
LOOK调度算法
- 和扫描算法相似,但是会观察是否还有请求在右边,如果没有那么就立刻改变方向访问。
- 解决了Scan第一个缺点,不需要移动到边上。
循环扫描算法(C-SCAN)
- C-SCAN解决响应磁道请求不平均问题。磁头只有在访问某个方向的时候才会处理请求。返回的时候快速移动不处理任何请求。
- 优点:访问磁盘的频率更平均。
- 缺点:每次都要返回到最左边导致,导致有些跨越磁道没有必要。
C-LOOK调度算法
- 和C-SCAN的思想差不多,但是不会返回到边缘磁道。而且可以检测访问的时候是否有对磁道请求,没有那么就返回。返回过程也会检查。只需要移动到最靠近边缘的磁道即可。
减少磁盘延迟时间的方法
- 磁头每次读完一个扇区的内容的时候都需要一点时间进行处理。所以可能需要旋转到一圈才能读取下一个扇区。
- 所以逻辑上的块和物理上的块都是连续的话可能会导致更长的延迟时间。
减少延迟时间的方法:交替编号
- 实际上这种就是间隔一个扇区来进行编号,这样就能够有一个转动扇区的时间来进行对之前的划过的扇区的数据进行处理。
磁盘地址结构的设计
为什么一定是(柱面号,盘面号,扇区号)?
- 因为如果是(盘面号,柱面号,扇区号)作为地址读取下面的(00,000,000)-(00,000,111)只需要转两圈,但是如果要读(00,001,000)-(00,001,111)需要移动磁臂到上面的磁道花费一定的时间。
- 但是如果是柱面号在前,盘面号在的时候(000,00,000)-(000,00,111)也是需要转两圈,但是(000,01,000)-(000,01,111)这个不需要移动磁臂,直接读取下面的盘面就可以了。
- 这种可以减少读取连续磁盘块的时候的磁头移动的时间,因为它的走向是先往下面的盘面走,之前的那个连续分配就是先移动到对应磁道导致需要移动磁头花费时间。
减少延迟时间的方法:错位命名
- 如果是对于两个盘面的扇区编号都是一样的话,那么导致的问题就是现在读取完(000,00,111)之后,准备读取(000,01,000)刚好这两个处于不同盘面但是相邻的扇区。那么读到(000,01,000)的时候由于上面的扇区处理需要时间,导致无法立刻读取,所以对于第二个盘面来说就需要转多一圈。
解决方案
- 可以通过把上下两个盘面的编号错开一个,刚好读取到相邻的位置的时候就能够有一个间隔扇区作为缓冲。
总结
- 减少延迟时间,第一种需要了解的是磁头划过扇区需要一定时间的处理,所以逻辑连续的块在物理上面最好不是连续的。间隔给与磁头的缓冲时间。这种就是通过交替编号实现的
- 还有另外一个问题就是为什么一定要是(柱面号,盘面号,扇区号),目的就是为了让连续空间存放的文件能够减少磁臂移动读取。因为如果是(盘面号,柱面号,扇区号),相当于每次要读取下一个连续区间的时候就需要移动磁臂到下一个磁道浪费的延迟时间。
- 最后一个需要解决的就是两个盘块之间的编号为什么需要间隔?因为不间隔的话,读取连续物理块的问题就是由于下一组的就是在下一个盘块,而且(000,00,111)和(000,01,000)刚好是相邻的,那么就导致了磁头读取缓冲不过来,那么第二个盘块就需要转多一圈,所以解决方案就是让上下两个盘块错位命名,就是编号不是相同的意思。