这是本人根据王道考研操作系统课程整理的笔记,希望对您有帮助。
文件的属性
文件名:由创建文件的用户决定文件名,主要是为了方便用户找到文件,同一目录下不允许有重名文件
标识符:一个系统内的各文件标识符唯一,对用户来说毫无可读性因此标识符只是操作系统用于区分各个文件的一种内部名称
类型:指明文件的类型
位置:文件存放的路径(让用户使用)、在外存中的地址(操作系统使用,对用户不可见)
大小:指明文件大小
创建时间、上次修改时间
文件所有者信息
保护信息:对文件进行保护的访问控制信息
操作系统向上提供的几个最基本的功能
创建文件:create系统调用
删除文件:delete系统调用
读文件:read系统调用
写文件:write系统调用
打开文件:open系统调用
关闭文件:close系统调用
读/写文件之前,需要“打开文件”
读/写文件结束之后,需要“关闭文件”
文件的存储
与内存一样,外存也是由一个个存储单元组成的,每个存储单元可以存储一定量的数据(如1B)。每个存储单元对应一个物理地址
操作系统以“块”为单位为文件分配存储空间,因此即使一个文件大小只有10B,但它依然需要占用1KB的磁盘块。外存中的数据读入内存时同样以块为单位。
操作系统需要提供的其他文件管理功能
文件保护:如何保证不同的用户对文件有不同的操作权限
文件共享:使多个用户可以共享使用一个文件
顺序文件
文件中的记录一个接一个地顺序排列(逻辑上),记录可以是定长的或可变长的。各个记录在物理上可以顺序存储或链式存储。
串结构:记录之间的顺序与关键字无关(通常按照记录存入的时间决定记录的顺序)
顺序结构:记录之间的顺序按关键字顺序排列
- 顺序存储
- 可变长记录
- 无法实现随机存取。每次只能从第一个记录开始依次往后查找。
- 定长记录
- 可实现随机存取。若记录长度为
L
,则第i
个记录存放的相对位置是i * L
。- 若采用串结构,无法快速找到某关键字对应的记录。
- 若采用顺序结构,可以快速找到某关键字对应的记录(如折半查找)。
- 链式存储
索引表本身是定长记录的顺序文件。因此可以快速找到第i
个记录对应的索引项。
索引顺序文件
索引顺序文件是索引文件和顺序文件思想的结合。索引顺序文件中,同样会为文件建立一张索引表,但不同的是:并不是每个记录对应一个索引表项,而是一组记录对应一个索引表项。
多级索引顺序文件
当记录过多时,为了进一步提高检索效率,可以为顺序文件建立多级索引表。
目录本身就是一种有结构文件,由条条记录组成。每条记录对应一个在该放在该目录下的文件。
目录文件中的一条记录就是一个文件控制块(FCB)。
FCB的有序集合称为“文件目录”,一个FCB就是一个文件目录项。
FCB中包含了文件的基本信息(文件名、物理地址、逻辑结构、物理结构等),存取控制信息(是否可读/可写、禁止访问的用户名单等),使用信息(如文件的建立时间、修改时间等)。
目录结构——单级目录结构
早期操作系统并不支持多级目录,整个系统中只建立一张目录表,每个文件占一个目录项。
单级目录实现了“按名存取”,但是不允许文件重名。
目录结构——两级目录结构
早期的多用户操作系统,采用两级目录结构。分为主文件目录 (MFD, Master File Directory) 和用户文件目录 (UFD, User Flie Directory)。
两级目录结构允许不同用户的文件重名,也可以在目录上实现实现访问限制(检查此时登录的用户名是否匹配)。但是两级目录结构依然缺乏灵活性,用户不能对自己的文件进行分类
可以用不同的文件名指向同一个文件,甚至可以指向同一个目录(共享同一目录下的所有内容)。
需要为每个共享结点设置一个共享计数器,用于记录此时有多少个地方在共享该结点。用户提出删除结点的请求时,只是删除该用户的FCB、并使共享计数器减1,并不会直接删除共享结点。
只有共享计数器减为0时,才删除结点。
索引结点(FCB的改进)
在查找各级目录的过程中只需要用到“文件名”这个信息,只有文件名匹配时,才需要读出文件的其他信息。因此可以考虑让目录表“瘦身”来提升效率。
目录项中只包含文件名、索引结点指针,因此每个目录项的长度大幅减小。
由于目录项长度减小,因此每个磁盘块可以存放更多个目录项,因此检索文件时磁盘I/O的次数就少了很多。
文件的逻辑地址可以表示为**(逻辑块号,块内地址)**的形式。
文件分配方式——连续分配
优点:
缺点:
文件分配方式——链接分配(隐式链接)
链接分配采取离散分配的方式,可以为文件分配离散的磁盘块。分为隐式链接和显式链接两种。
除了文件的最后个磁盘块之外,每个磁盘块中都会保存指向下一个盘块的指针,这些指针对用户是透明的。
目录中记录了文件存放的起始块号和结束块号。当然,也可以增加一个字段来表示文件的长度。
优点:很方便文件拓展,不会有碎片问题,外存利用率高。
缺点:只支持顺序访问,不支持随机访问,查找效率低,指向下一个盘块的指针也需要耗费少量的存储空间。
文件分配方式——链接分配(显式链接)
把用于链接文件各物理块的指针显式地存放在一张表中。即文件分配表 (FAT, File Allocation Table)。
注意:一个磁盘仅设置一张FAT。开机时,将FAT读入内存,并常驻内存。FAT的各个表项在物理上连续存储,且每一个表项长度相同,因此“物理块号”字段可以是隐含的。
优点:很方便文件拓展,不会有碎片问题,外存利用率高,并且支持随机访问。相比于隐式链接来说,地址转换时不需要访问磁盘,因此文件的访问效率更高。
缺点:文件分配表的需要占用一定的存储空间。
文件分配方式——索引分配
索引分配允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块。索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为数据块。
优点:
缺点:
若文件太大,索引表项太多,可以采取以下三种方法解决:
存储空间的划分与初始化
存储空间的划分:将物理磁盘划分为一个个文件卷(逻辑卷、逻辑盘)
有的系统支持超大型文件,可支持由多个物理磁盘组成一个文件卷。
存储空间管理——空闲表法
空闲表法适用于连续分配方式。可使用首次适应、最佳适应、最坏适应等算法来决定要为文件分配哪个区间。
存储空间管理——空闲链表法
空闲盘块链:以盘块为单位组成一条空闲链。(适用于离散分配的物理结构。为文件分配多个盘块时可能要重复多次操作)
空闲盘区链:以盘区为单位组成一条空闲链。(离散分配、连续分配都适用。为一个文件分配多个盘块时效率更高)
存储空间管理——位示图法
位示图:每个二进制位对应一个盘块。在本例中,“0”代表盘块空闲,“1”代表盘块已分配。位示图一般用连续的“字”来表示,如本例中一个字的字长是16位,字中的每一位对应一个盘块。因此可以用**(字号,位号)对应一个盘块号**。当然有的题目中也描述为**(行号,列号)**。
存储空间管理——成组链接法
适合大型文件系统,是Unix采用的策略。
文件卷的目录区中专门用一个磁盘块作为**“超级块**”,当系统启动时需要将超级块读入内存。并且要保证内存与外存中的“超级块”数据一致。
创建文件
删除文件
打开文件
将目录项中的信息复制到内存中的打开文件表中,并将打开文件表的索引号返回给用户。
打开文件之后,对文件的操作不再需要每次都查询目录,可以根据内存中的打开文件表进行操作。
每个进程有自己的打开文件表,系统中也有一张总的打开文件表。
进程打开文件表中特有的属性:读写指针、访问权限(只读?读写?)
系统打开文件表中特有的属性:打开计数器(有多少个进程打开了该文件)
系统的打开文件表可以方便实现某些文件管理的功能。例如在Windows系统中,我们尝试删除某个txt文件,如果此时该文件已被某个“记事本”进程打开,则系统会提示我们“暂时无法删除该文件”。其实系统在背后做的事就是先检查了系统打开文件表,确认此时是否有进程正在使用该文件。
关闭文件
将进程打开文件表中的相应表项删除。
系统打开文件表的打开计数器减1,若打开计数器为0,则删除系统表的表项。
读文件
写文件
根据写指针、写出数据量、内存位置将文件数据从内存写出外存。
基于索引结点的共享方式(硬链接)
各个用户的目录项指向同一个索引结点
基于符号链的共享方式(软链接)
在一个Link型的文件中记录共享文件的存放路径(如:Windows快捷方式)
口令保护
为文件设置一个“口令”(如:abc112233),用户请求访问该文件时必须提供“口令”。
口令一般存放在文件对应的FCB或索引结点中。用户访问文件前需要先输入“口令”,操作系统会将用户提供的口令与FCB中存储的口令进行对比,如果正确,则允许该用户访问文件。
优点:保存口令的空间开销不多,验证口令的时间开销也很小。
缺点:正确的“口令”存放在系统内部,不够安全。
加密保护
使用某个“密码”对文件进行加密,在访问文件时需要提供正确的“密码”才能对文件进行正确的解密。
优点:保密性强,不需要在系统中存储“密码”。
缺点:编码/译码,或者说加密/解密要花费一定时间。
访问控制
在每个文件的FCB(或索引结点)中增加一个访问控制列表(Access-.Control List., ACL),该表中记录了各个用户可以对该文件执行哪些操作。
访问类型:
- 读:从文件中读数据
- 写:向文件中写数据
- 执行:将文件装入内存并执行
- 添加:将新信息添加到文件结尾部分
- 删除:删除文件,释放空间
- 列表清单:列出文件名和文件属性
有的计算机可能会有很多个用户,因此访问控制列表可能会很大,可以用精简的访问列表解决这个问题。
精简的访问列表:以“组”为单位,标记各“组”用户可以对文件执行哪些操作。如:分为系统管理员、文件主、文件主的伙伴、其他用户几个分组。
磁盘、磁道、扇区
磁盘的表明由一些磁性物质组成,可以用这些磁性物质来记录二进制数据。
注意:最内侧磁道上的扇区面积最小,因此数据密度最大。
磁盘的物理地址
可用**(柱面号,盘面号,扇区号)**来定位任意一个“磁盘块”。
可根据该地址读取一个“块”,步骤如下:
磁盘的分类
一次磁盘读/写操作需要的时间
寻道时间:在读/写数据前,启动磁臂、移动磁头所花的时间
延迟时间:通过旋转磁盘,将目标扇区转到磁头下面所花的时间
传输时间:从磁盘读出或向磁盘写入数据所花费的时间
先来先服务算法(FCFS)
优点:公平;如果请求访问的磁道比较集中的话,算法性能还算过的去。
缺点:如果有大量进程竞争使用磁盘,请求访问的磁道很分散,则FCS在性能上很差,寻道时间长。
最短寻找时间优先(SSTF)
每次都优先响应距离磁头最近的磁道访问请求
优点:性能较好,平均寻道时间短。
缺点:可能产生“饥饿”现象。
扫描算法(电梯算法、SCAN)
优点:性能较好,平均寻道时间较短,不会产生饥饿现象。
缺点:
循环扫描算法(C-SCAN)
只有磁头朝某个方向移动时才会响应请求,移动到边缘后立即让磁头返回起点,返回途中不响应任何请求。
优点:比起SCAN来,对于各个位置磁道的响应频率很平均。
缺点:只有到达最边上的磁道时才能改变磁头移动方向。
LOOK算法
SCAN算法的改进,只要在磁头移动方向上不再有请求,就立即改变磁头方向。
优点:比起SCAN算法来,不需要每次都移动到最外侧或最内侧才改变磁头方向,使寻道时间进一步缩短。
C-LOOK算法
C-SCAN算法的改进,只要在磁头移动方向上不再有请求,就立即让磁头返回。
优点:比起C-SCAN算法来,不需要每次都移动到最外侧或最内侧才改变磁头方向,使寻道时间进一步缩短。
磁头读入一个扇区数据后需要一小段时间处理,如果逻辑上相邻的扇区在物理上也相邻,则读入几个连续的逻辑扇区,可能需要很长的“延迟时间
交替编号
若采用交替编号的策略,即让逻辑上相邻的扇区在物理上有一定的间隔,可以使读取连续的逻辑扇区所需要的延迟时间更小。
错位命名
磁盘初始化
Step 1 低级格式化/物理格式化
将磁盘的各个磁道划分为扇区。
一个扇区通常可分为头、数据区域(如512B大小)、尾三个部分组成。管理扇区所需要的各种数据结构一般存放在头、尾两个部分,包括扇区校验码(如奇偶校验、CC循环冗余校验码等,校验码用于校验扇区中的数据是否发生错误)
Step 2 磁盘分区
Step 3 逻辑格式化
建立文件系统。包括创建文件系统的根目录、初始化存储空间管理所用的数据结构(如位示图、空闲分区表)
引导块
计算机开机时需要进行一系列初始化的工作,这些初始化工作是通过执行**初始化程序(自举程序)**完成的
ROM中存放很小的“自举装入程序”。
完整的自举程序放在磁盘的启动块(即引导块/启动分区)上,启动块位于磁盘的固定位置。
开机时计算机先运行“自举装入程序”,通过执行该程序就可找到引导块,并将完整的“自举程序”读入内存,完成初始化。
坏块的管理
简单的磁盘:逻辑格式化时(建立文件系统时)对整个磁盘进行坏块检查,将坏块标记出来。(坏块对操作系统不透明)
复杂的磁盘:磁盘控制器维护一个坏块链,在磁盘出厂前进行低级格式化时就将坏块链进行初始化。同时保留一些“备用扇区”,用于替换坏块。(坏块对操作系统透明)