操作系统--文件管理笔记(一)

文件管理

初识文件管理

文件的属性

文件名:由创建文件的用户决定文件名,主要是为了方便用户找到文件吗,同一目录下不允许有重名文件

标识符:一个系统内的各文件标识符唯一,对用户来说毫无可读性,因此标识符只是操作系统用于区分各个文件的一种内部名称

类型:指明文件的类型

位置:文件存放的路径(让用户使用)在外存中的地址(操作系统使用,对用户不可见)

大小:指明文件大小

创建时间、上次修改时间

文件所有者信息

保护信息:对文件进行保护的访问控制信息

文件之间应该怎样组织起来

在这里插入图片描述

用户可以自己创建一层一层的目录,各层目录中存放相应的文件。系统中的各个文件就通过一层一层的目录合理有序的组织起来了

所谓目录就是"文件夹",目录也是一种特殊的有结构文件(由记录组成)

操作系统应该向上提供哪些功能?

1.创建文件(点击新建后,图形化交互进程在背后调用了“creat系统调用”)

2.读文件,将文件数据读入内存,才能让CPU处理(双击后,记事本应用程序通过操作系统提供的读文件功能,即read系统调用,将文件数据从外存读入内存

3.写文件,将更改过的文件数据写回外存(我们在记事本应用程序中编辑文件内容,点击保存后,记事本应用程序通过操作系统提供的写文件功能,即write系统调用,将文件数据从内存写回外存)

4.删除文件(点了删除之后,图形化交互进程通过操作系统提供的删除文件功能即delete系统调用,将文件从外存中删除)

5.打开文件,在读写文件之前,需要打开文件

6.关闭文件读写文件结束后,需要关闭文件

可以用几个基本操作完成更复杂的操作,比如:复制文件,先创建一个新的空文件,再把源文件读入内存,再将内存中的数据写入新文件中

从上往下看,文件应如何存放在外存

在这里插入图片描述

与内存一样,外存也是由一个个存储单元组成的,每个存储单元可以存储一定量的数据(如1B)。每个存储单元对应一个物理地址

类似于内存分为一个个内存块,外存也会分为一个个“块/磁盘块/物理块”/每个磁盘块的大小是相等的,每块一般包含2的整数幂个地址(如本例中,一块包含2的10次方个地址,即1KB)同样类似的是,文件的逻辑地址也可以分为逻辑块号,块内地址,操作系统同样需要将逻辑地址转换为外存的物理地址(物理块号,块内地址)的形式。块内地址的位数取决于磁盘块的大小

操作系统以“块”为单位为文件分配存储空间,因此即使一个文件大小只有10B,但它依然需要占用1KB的磁盘块。外存中的数据读如内存时同样以块为单位

其他需要由操作系统实现的文件管理功能

文件共享:使多个用户可以共享使用一个文件

文件保护:如何保证不同的用户对文件有不同的操作权限

知识回顾与重要考点

在这里插入图片描述

文件的逻辑结构

所谓的逻辑结构,就是指在用户看起来,文件内部的数据应该是如何组织起来的,而物理结构指的是在操作系统看来,文件的数据是如何存放在外存中的。

类似于数据结构的逻辑结构和物理结构

如线性表就是一种逻辑结构,在用户看来,线性表就是一组有先后关系的元素序列

线性表这种逻辑结构可以用不同的物理结构实现,顺序表的各个元素在逻辑上相邻,在物理上也相邻,而链表的各个元素在物理上可以是不相邻的。因此,顺序表可以实现“随机访问”,而链表无法实现随机访问

可见,算法的具体实现与逻辑结构,物理结构都有关。文件也一样,文件操作的具体实现与文件的逻辑结构,物理结构都有关

无结构文件

按文件是否有结构分类,可以分成无结构文件和有结构文件两种

无结构文件:文件内部的数据就是一系列二进制流或字符流组成。又称流式文件,如Windows操作系统中的txt文件,因为没有明显的结构特性,因此也不用探讨无结构文件的逻辑结构问题

有结构文件

有结构文件:由一组相似的记录组成又称记录式文件,每条记录又由若干个数据项组成,如数据库表文件。一般来说,每条记录有一个数据项可作为关键字。根据各条记录的长度 (占用的存储空间)是否相等,又可分为定长记录可变长记录两种

在这里插入图片描述

有结构文件的逻辑结构

顺序文件

顺序文件:文件中的记录一个接一个地顺序排列(逻辑上),记录可以是定长的或可变长的。各个记录在物理上可以是顺序存储或链式存储

顺序文件的两种结构:串结构和顺序结构

串结构:记录之间的顺序与关键字无关(通常按照记录存入的时间决定记录的顺序)

顺序结构:记录之间的顺序按关键字顺序排列

若采用不同的存储方式:

链式存储:无论是定长还是可变长都无法实现随机存取,每次只能从第一个记录开始依次往后查找

顺序存储的可变长记录:无法实现随机存取。每次只能从第一个记录开始依次往后查找

在这里插入图片描述

顺序存储的定长记录:可实现随机存取。记录长度为L,则第i个记录存放的相对位置是i*L

若采用串结构,无法快速找到某关键字对应的记录

若采用顺序结构,可以快速找到某关键字对应的记录(如折半查找)

注意:一般来说,考试题目中所说的“顺序文件”指的是物理上顺序存储的顺序文件。

顺序文件的缺点是增加/删除一个记录比较困难(如果是串结构则相对简单)

索引文件

对于可变长记录文件,要找到第i个记录,必须从第一个记录开始查找,但是很多应用场景中又必须使用可变长记录,因此引入了索引文件

在这里插入图片描述

索引表本身是定长记录的顺序文件。因此可以快速找到第i个记录对应的索引项。可将关键字作为索引号的内容,若按关键字顺序排列,则还可以支持按照关键字折半查找。

每当要增加/删除一个记录时,需要对索引表进行修改。由于索引文件有很快的检索速度,因此主要用于对信息处理的及时性要求比较高的场合。

另外,可以用不同的数据项建立多个索引表。如:学生信息中表中,可用关键字学号建立一张索引表。也可用姓名建立一张索引表。这样就能根据姓名快速的检索文件了

(SQL就支持根据某个数据项建立索引的功能)

索引顺序文件

索引文件的缺点:每个记录对应一个索引表项,因此索引表可能会很大:比如:文件的每个记录平均只占8B,而每个索引表项占32个字节,那么索引表都要比文件内容本身大4倍,这样对存储空间的利用率太低了

索引顺序文件是索引文件和顺序文件思想的结合。索引顺序文件中,同样会为文件建立一张索引表,但不同的是:并不是每个记录对应一个索引表项,而是一组记录对应一个索引表项

在这里插入图片描述

在本例中,学生记录按照学生姓名的开头字母进行分组,每个分组就是一个顺序文件,分组内的记录不需要按关键字排序

索引顺序文件的索引表项也不需要按关键字顺序排序,这样可以极大地方便新表项地插入

索引顺序文件的检索效率

若一个顺序文件有10000个记录,则根据关键字检索文件,只能从头开始顺序查找(这里指的并不是定长记录,顺序结构的顺序文件)平均需要查找5000个记录

若采用索引顺序文件结构,可把10000个记录分为100组,每组100个记录,则需要先顺序查找索引表找到分组(共100个分组,因此索引表长度为100,平均需要查50次)找到分组后,再在分组中顺序查找记录(每个分组100个记录,因此平均需要查50次)。可见,采用索引顺序文件结构后,平均查找次数减少为100次

多级索引顺序文件

为了进一步提高检索效率,可以为顺序文件建立多级索引表。例如对于一个含10的6次方个记录的文件,可先为该文件建立一张低级索引表,每100个记录为一组,故低级索引表中有10000个表项,再把这10000个定长记录分组,每组100个,为其建立顶级索引表,故顶级索引表中共有100个表项
在这里插入图片描述

文件目录

文件控制块

在这里插入图片描述

FCB的有序集合称为文件目录,一个FCB就是一个文件目录项,FCB中包含了文件的基本信息(文件名,物理地址、逻辑地址 、逻辑结构、物理结构等),存取控制信息(是否可读/可写、禁止访问的用户名单等),使用信息(如文件的建立时间、修改时间等)

最重要,最基本的还是文件名,文件存放的物理地址(FCB实现了文件名和文件之间的映射。使用户(用户程序0可以实现“按名存取”)

需要对目录进行哪些操作?

搜索:当用户要使用一个文件时,系统要根据文件名搜索目录,找到该文件对应的目录项

创建文件:创建一个新文件时,需要在目录中删除相应的目录项

删除文件:当删除一个文件时,需要在目录中删除相应的目录项

显示目录:用户可以请求显示目录的内容,如显示该目录中的所有文件及相应属性

修改目录:某些文件属性保存在目录中,因此这些属性变化是需要修改相应的目录项(如文件重命名)

目录结构–单级目录结构

早期操作系统并不支持多级目录,整个系统中只建立一张目录表,每个文件占一个目录项

在这里插入图片描述

单级目录实现了按名存取,但是不允许文件重名

在创建一个文件时,需要先检查目录表中有没有重名文件,确定不重名后才允许建立文件,并将新文件对应的目录插入目录表中。

显然,单级目录结构不适用于多用户操作系统

目录结构–两级目录结构

早期的多用户操作系统,采用两级目录结构,分为主文件目录,和用户文件目录

在这里插入图片描述

两级目录结构允许不同用户的文件重名,也可以在目录上实现访问限制,但是两级目录结构依然缺乏灵活性,用户不能对自己的文件进行分类

目录结构–多级目录结构

又称树形目录结构

在这里插入图片描述

用户要访问某个文件时要用文件路径名称标识文件,文件路径名是个字符串。各级目录之间用“/”隔开。从根目录出发的路径称为绝对路径

例如:自拍.jpg的绝对路径是“/照片/2015-08/自拍.jpg”

系统根据绝对路径一层一层地找到下一级目录。刚开始从外存读入根目录的目录表;找到照片目录的存放位置后,从外存读入对应的目录表;再找到2015-08目录存放位置,再从外存读入对应目录表;最后才找到文件自拍.jpg的存放位置。整个过程需要3次读磁盘I/O操作

很多时候,用户会连续访问同一目录内的多个文件,显然每次都从根目录开始查找,是很低效的。因此可以设置一个“当前目录”

例如,此时已经打开了照片的目录文件,也就是说这张目录表已经调入内存,那么可以把它设置为当前目录,当用户想要访问某个文件时,可以使用从当前目录出发的相对路径

在Linux中 . 表示当前目录,因此如果照片是当前目录,则自拍.jpg的相对路径为./2015-08/自拍.jpg 从当前路径出发,只需要查询内存中的照片目录表,即可知道2015-08目录表存放的位置,从外存调入该目录即可知道自拍.jpg存放的位置了

目录结构–无环图目录结构

在这里插入图片描述

可以用不同的文件名指向同一个文件,甚至可以指向同一个目录(共享同一个目录下的所有内容)

需要为每个共享节点设置一个共享计数器,用于记录此时有多少个地方在共享该结点.用户提出删除结点的请求时,只是删除该用户的FCB,并使共享计数器减1,并不会直接删除共享结点,只有共享计数器减为0时,才删除结点

注意:共享文件不同于复制文件.在共享文件中,由于各用户指向的是同一个文件,因此只要其中一个用户修改了文件数据,那么所有用户都可以看到数据的变化

索引结点(FCB的改进)

在这里插入图片描述

在查找各级目录结构的过程中只需要用到文件名这个信息,只有文件名匹配时,才需要读出文件的其他信息.因此可以考虑让目录表瘦身,来提高效率

在这里插入图片描述

假设一个FCB是64B,磁盘块大小为1KB,则每个盘块中只能存放16个FCB.若一个文件目录中共有640个目录项,则共需要占用640/16=40个盘块,因此按照某文件名检索该目录,平均需要查询320个目录项,平均需要启动磁盘20次(每次磁盘I/O读入一块)

若使用索引结点机制,文件名占14B,索引结点指针占2B,则每个盘块可以存放64个目录项,那么按文件名检索目录平均只需要读入320/64=5个磁盘块,这将大大提升文件检索速度

当找到文件名对应的目录项时,才需要将索引结点调入内存,索引结点中记录了文件的各种信息,包括文件在外存中的存放位置,根据存放位置即可找到文件

存放在外存中的索引结点称为磁盘索引结点,当索引结点放入内存后称为内存索引结点

个盘块,因此按照某文件名检索该目录,平均需要查询320个目录项,平均需要启动磁盘20次(每次磁盘I/O读入一块)

若使用索引结点机制,文件名占14B,索引结点指针占2B,则每个盘块可以存放64个目录项,那么按文件名检索目录平均只需要读入320/64=5个磁盘块,这将大大提升文件检索速度

当找到文件名对应的目录项时,才需要将索引结点调入内存,索引结点中记录了文件的各种信息,包括文件在外存中的存放位置,根据存放位置即可找到文件

存放在外存中的索引结点称为磁盘索引结点,当索引结点放入内存后称为内存索引结点

相比之下内存索引结点中需要增加一些信息,比如:文件是否被修改,此时有几个进程正在访问该文件

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值