- 进程执行I/O大致过程 :
用户程序提出I/O请求
用户进程A阻塞,进程A的PCB块插入阻塞队列,CPU执行其他操作。
I/O完成后,向CPU发出中断请求,CPU暂停当前进程B的执行,转到处理中断处理程序
执行完后,CPU返回暂停进程B继续执行。
进程A,从阻塞态变为就绪态,进程A的PCB插入就绪队列。- 用户的输入输出以文件为基本单位,计算机以进程为基本单位进行资源的调度和分配。
- 卷:包含文件系统的分区。可以是磁盘的一部分,可以是整个磁盘,可以是多磁盘组成的RAID集。
文件系统
文件:抽象数据类型,由OS映射到物理设备(通常非易失)上。用户视角,文件是逻辑外存的最小分配单元,数据只有通过文件才能写到外存。
文件系统提供高效、便捷的磁盘访问,以便允许存储定位,提取数据。
- 文件属性(文件元数据):名称、标识符、类型、位置、大小、权限、时间日期、用户标识(创建者、所有者)
- 文件拓展名:指示①文件类型②可用于文件的操作。(e.g.
.com
.exe
.sh
文件可运行等等)
- 文件拓展名:指示①文件类型②可用于文件的操作。(e.g.
- 文件信息保存在目录结构(非易失如磁盘)中,目录结构保存在外存上。
- 文件控制块FCB维护文件属性:即目录项。创建一个文件后,系统分配一个FCB存放在文件目录中。
有些系统简化为i结点(只有文件名and指向文件的指针) - 磁盘索引结点:存放在磁盘上,每个文件唯一。<文件主标识符,文件类型,文件存取地址、文件物理地址,文件长度,文件链接计数,文件存取时间>
- 内存索引结点:存放于内存,文件打开时将磁盘索引结点复制到内存索引结点中,同时增加+=<,,,不想看>
1文件操作
- 创建文件:先遍历所有目录项,确保没有重名的。①找到空间;②目录中创建新文件条目
- 写文件:按。文件名在目录中查找到FCB,合法性检查。①使用一个系统调用指定文件名称、要写入文件的信息。
②根据文件名,在目录中搜索
③保留写指针,指向下一次写位置,每次写操作时,写指针更新。 - 读文件:按文件名在目录中查找到FCB,合法性检查。①使用一个系统调用,指定文件名称、需要文件的下一块在哪(内存位置)。
②在目录中搜索到它
③保留读指针,指向下一次读取位置,每次读完都更新。- so读写可共用简化-->当前文件位置指针
- 重定位文件、文件定位:更新当前文件位置指针位置。
- 删除文件:①根据文件名在目录中找到文件 ②释放回收所有空间 ③删除目录条目。
- 截断文件:删除内容,保留文件属性(除了长度其他都允许不变)。释放文件空间,让文件重置为0;
1.1 文件打开与关闭
- 检索目录-->OS维护一个打开文件列表,文件不再使用时-->OS删除该条目。
- 通常OS有两个表:每个进程表、整个系统表:
- 每个进程表跟踪自己打开的所有文件;每个条目指向整个系统的打开文件列表。
- 系统表:包含与进程无关的信息(在磁盘上的位置、访问日期、文件大小、访问权限)。不必要文件名,因为FCB块利用name完成对磁盘上的定位后,系统不再使用name,使用文件描述符。
每个文件关联一个打开计数cnt,记录多少个进程打开了该文件。cnt=0时删除该文件条目。
文件打开后,不再使用文件名访问文件,使用文件描述符
1.2 文件锁定机制
- 强制锁:一点进程A获取独占锁,只有进程A可以访问文件FILE,其他进程都不行。直到这个锁被释放。Windows采用。
- 程序员要确认只有在访问文件时才锁定独占文件,不然干扰别的进程进行访问。采取措施防止产生死锁。
- 建议锁:程序员干活。内核只提供加减锁and检测是否加锁的操作,不提供锁的控制与协调工作。就是内核不监督。Unix采用。
1.3 文件保护 权限属性
- 口令保护(防止用户文件被他人存取、窃取):FCB上附上对应口令,用户访问时提供口令。(不够安全)
- 加密保护(防止用户文件被他人存取、窃取):访问文件时需要密钥。
- 访问控制(控制用户对文件访问方式):为每个文件and目录增加一个访问控制列表,规定每个用户名和它可以做的操作。
- 用户、拥有者在同一用户组:按同组权限访问
- 不在同组:按照其他用户权限访问。
1.4 访问方法
- 顺序访问:文件信息按顺序进行处理。最常见,最简单。
- 直接访问(相对访问):文件由固定长度逻辑记录组成,允许程序以任意顺序快速读取、写入记录。
基于文件的磁盘模型,磁盘允许任何文件块的随机访问。
适用于大量信息的立即访问。e.g.数据库 - 其他方法:索引文件
1.5 文件逻辑结构
用户视角出发。
- 无结构文件:流式文件。
- 有结构文件(记录式):
- 顺序文件:串结构(按存入时间先后)/顺序结构(按关键字)
- 索引文件:
1.5 文件物理结构
重复:文件是一种抽象数据类型,
- 文件在物理存储设备上如何分布、如何组织?两种答案
- 分配方式:磁盘非空闲块的管理
- 文件存储空间管理:对磁盘空闲块的管理
所以其实所谓物理结构,回答文件分配问题:连续、链接、索引。3种。
1 连续分配
每个文件在磁盘上有一组连续的块,寻道数和寻道时间最小。支持顺序/直接访问。
- 文件目录项中<文件物理地址>=<第一块地址,文件区域长度>。e.g.从b开始到b+n-1 => <b,n>
- 缺:①不太能够支持动态增加文件(要求连续,但后面的块可能分出去了)。②要注意保持文件有序性,增删添改时涉及到相邻的块就很麻烦了。③反复增删后外部碎片。(反正不可能内部碎片嘛) ④只适用于固定长度文件。
- 优:访问快、实现简单。
2 链接分配
采用离散分配的方式,无须提前直到文件大小,消除磁盘外部碎片,提高利用率。
- 隐式链接
- 显式链接
2.1 隐式链接
每个文件对应一个磁盘块的链表。
- 目录项:文件第一块指针+文件最后一块指针。(每个盘块(除最后一个)包含指向下一个盘的指针,对用户透明)
- 缺:只适用于顺序访问,随机访问效率太低,每次都要遍历嘛。
- 解决每次遍历all的方法:几个盘-->一个簇,按簇分配。但增加了内碎片。
2.2 显式链接
把隐式链接中每个块包含的*next
指针提取出来,显式保存到FAT 文件分配表中。
- 文件分配表:①记录文件块先后链接关系,②标记空闲磁盘块。
系统启动时就被读入内存。查找记录在内存中进行。
整个磁盘只有一张文件分配表。存放<盘块号,下一块块号>
对最后一块or空闲块可以指定-1、-2、-3这种特殊数字来表示。(e.g.-1表示最后一块,-2表示空闲块) - 缺:FAT占用较大内存空间
3 索引分配
改进:不需要将整个FAT调入内存
- 索引块:集中存放每个文件所有的盘块号。它自己通常也是一个磁盘块。
每个文件都有自己的索引块(一个磁盘块地址的数组)。 - 优:支持直接访问;没有外部碎片,
- 缺:多了一个索引块,增加了系统存储空间开销。
- 索引块不可以太大:有以下的解决机制
- 链接方案:索引块本身作为磁盘块可以进行读写,对大文件,将多个索引块连接起来。
- 多层索引:一级索引块-->二级索引块
- 混合索引:多种方式结合。
- 索引块不可以太大:有以下的解决机制
目录
目录的类型
- 单级目录结构:整个文件系统一张目录表,一个文件一个目录项
- 二级目录结构:主文件目录-->用户文件目录-->该用户文件的FCB信息。
搜索用户对应的UFD。解决不同用户文件重名问题,提高安全性。 - 树形目录结构:明显提高速度和性能。更方便对文件分类,层次结构清晰。
不便于实现文件共享。 - 无环图目录结构:树形目录+指向一些同一节点的有向边-->有向无环图。
可以为每个共享结点设置共享计数器(增加共享链-cnt++/删除共享链-cnt--),当cnt=0时删除结点,否则只是删除共享链。
≠文件拷贝;就是原件。
问题:确保没有环
目录操作
- 搜索:在文件系统中找到对应的目录项
- 创建文件:目录中增加目录项
- 删除文件:目录中删除目录项
- 创建目录:树形目录结构中,用户可在自己的文件目录下创建子目录
- 删除目录:①不删除非空目录,需要先删除所有文件,递归删除子目录。 ②可删除非空目录,目录中文件、子目录同时删除。
- 移动目录
- 显示目录
- 修改目录
文件系统结构
- 磁盘的两个优势:
- 磁盘可以原地重写
- 磁盘可以实现按简单顺序/随机访问文件,移动读写磁头,等待磁盘旋转。
- 文件系统的两个问题
- 定义文件系统用户接口,涉及定义文件属性、允许的文件操作、组织文件目录结构。
- 创建算法、数据结构,以便映射逻辑文件(虚拟文件)到物理外存设备。
合理的文件系统层次结构
- 设备
↕ - I/O控制:包括设备驱动程序、中断处理程序。在内存和磁盘系统之间传输
- 设备驱动程序:(翻译器)——高速I/O控制器对设备xx位置进行xx工作。即:将输入的命令翻译成底层硬件的特定指令,硬件控制器利用这些指令控制I/O设备与系统交互。
- 中断处理程序好理解,在进程I/O完毕之后向CPU发出中断请求,CPU处理需要。
↕
- 基本文件系统:发送命令给对应设备驱动程序,从而读取、写入磁盘的物理块。管理这部分的缓冲区
↕ - 文件组织模块:
- 可以将逻辑块地址(从0开始编号)转换成物理块地址。
- 跟踪未分配的空闲块
↕
- 逻辑文件系统:管理元数据信息。管理系统目录结构。文件保护。
- 元数据:包括文件系统所有结构,不包括实际数据。
↕
- 元数据:包括文件系统所有结构,不包括实际数据。
- 应用程序
在磁盘中的结构
文件系统存放在磁盘上,磁盘-->分区(每个分区独立的文件系统)
- 主引导记录 MBR:位于磁盘0号扇区,引导计算机。后面是分区表(给出每个分区的起始、结束地址)
- 引导块:MBR执行引导块中的程序后,该程序负责启动该分区中的OS,(每个分区都从一个引导块开始)
- 超级块:包含文件系统所有关键信息,计算机启动/文件首次使用时,超级块载入内存,典型信息(块数量、块大小、空闲块数量和指针、空闲FCB数量等等)
在内存中的结构
内存中的信息用于管理文件,通过缓存提高性能。
安装时加载,操作期间更新,卸载时丢弃。
- 内存的安装表:包含已安装文件系统分区的有关信息。
- 内存中的目录结构的缓存,包含最近访问目录的信息。
- 整个系统的打开文件列表
- 每个进程的打开文件列表
文件内部结构
定位文件的偏移对OS是复杂的。磁盘通常具有明确定义的块大小(大小相同,由扇区大小决定)。所有磁盘I/O按块(物理记录)为单位执行,又∵物理记录≠逻辑记录-->多个逻辑记录包装到物理块。
磁盘空间按照块为单位分配。每个文件的最后一块通常被浪费。
外存空闲空间管理
在一个卷中,存放文件数据的空间(文件区)和FCB空间(目录区)是分离的。
卷在提供服务之前,必须由对应的文件程序进行初始化,划分好目录区+文件区,建立空闲空间管理表格+存放卷信息的超级块。
文件存储设备-->分成许多大小相同的物理块,以块为单位交换信息。
**文件存储设备管理的实质:对空闲块的组织和管理(组织、分配、回收等)
- 空闲表法:连续分配方式
- 空闲链表法
- bitmap位图法
- 成组链接法
1 空闲表法
不适用大型文件系统。
连续分配方式,
- 空闲盘区分配:采用首次适应+最佳适应算法等
2 空闲链表法
不适用大型文件系统。
- 所有空闲盘区拉成一条空闲链:
- 空闲盘块链:以盘块为单位;用户请求分配时从链首分配、用户删除时回收盘块插入到链尾。
- 空闲盘区链:(一个盘区可能包含多个盘块,每个盘区
*next
指针指向下一空闲盘区+本盘区大小信息);首次适应算法。- 回收盘区时,将回收区与相邻空闲盘区合并。
3 bitmap位图法
磁盘上每一个盘块都有一个bit位与之对应。(0闲/1已分配)
4 成组链接法
UNIX采用。
虚拟文件系统 VFS
VFS为用户程序提供文件操作的统一接口,屏蔽不同文件系统的差异和细节。面向对象思想OO。
用户write() --> VFS:sys_write() --> 文件系统写方法 --> 物理介质
每个VFS对象存放在适当的数据结构中,
- 超级块对象:存储已安装文件系统的元信息(文件系统基本属性:文件系统类型、文件系统基本块大小、挂载的设备、操作函数指针)
- 索引结点对象:处理文件需要的所有信息,对文件唯一。(例文件的索引结构)
- 有脏位
- 有操作接口(读写、文件同步等)
- 目录项对象:
- 文件对象
分区、安装
害再见
有舍才有得...
文件共享
- 一致性语义:规定系统的多个用户如何访问共享文件。规定了一个用户的数据修改何时为另一用户可见。
- UNIX:文件作为独占资源 一个文件单个图像
- 用户A对已打开文件F的写入,其他打开F的用户立即可见改变
- 一个文件单个图像,允许不同用户交替访问
- Open AFS:Android 一个文件多个图像
- 不立即可见
- 文件的改变只有在关闭后打开它才可见,已打开的文件实例不反映变化。
- UNIX:文件作为独占资源 一个文件单个图像
用于评估支持文件共享的文件系统。
与同步算法直接相关。(但传输速率慢、延迟大 同步算法不适合直接用于文件系统)
- 多用户:OS支持多用户时,实现共享和保护。
- 远程文件系统:例如网络WWW。
- 客户机/服务器模型
- 分布式信息系统
- 故障模式: