操作系统-4.1-文件

Posted LL.LEBRON

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统-4.1-文件相关的知识,希望对你有一定的参考价值。

操作系统-4.1-文件

本文讲文件的属性 and 文件逻辑结构 and 文件目录。

1. 初识文件管理

1.1文件的属性

一个文件有哪些属性?

  • 文件名:由创建文件的用户决定文件名,主要是为了方便用户找到文件,同一目录下不允许有重名文件
  • 标识符:一个系统内的各文件标识符唯一,对用户来说毫无可读性,因此标识符只是操作系统用于区分各个文件的一种内部名称。
  • 类型:指明文件的类型。
  • 位置:文件存放的路径(让用户使用)、在外存中的地址(操作系统使用,对用户不可见)。
  • 大小:指明文件大小。
  • 创建时间、上次修改时间
  • 文件所有者信息
  • 保护信息:对文件进行保护的访问控制信息。

1.2文件内部的数据应该怎样组织起来?

  • 无结构文件:(如文本文件)由一些二进制或字符流组成,又称“流式文件”。

  • 有结构文件:(如数据库表)有一组相似的记录组成,又称“记录式文件“。

    记录:是一组相关数据项的集合。

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

  1. 可以“创建文件”,(点击新建后,图形化交互进程在背后调用了“create系统调用“)。
  2. 可以“读文件”,将文件数据读入内存,才能让CPU处理(双击后,“记事本”应用程序通过操作系统提供的“读文件”功能,即read系统调用,将文件数据从外存读入内存,并显示在屏幕上)。
  3. 可以“写文件”,将更改过的文件数据写回外存(我们在“记事本”应用程序中编辑文件内容,点击“保存”后,“记事本”应用程序通过操作系统提供的“写文件”功能,即 write系统调用,将文件数据从内存写回外存)。
  4. 可以“删除文件”,(点了“删除”之后,图形化交互进程通过操作系统提供的“删除文件”功能,即delete系统调用,将文件数据从外存中删除)。

向上提供的几个最基本的功能:

  1. 创建文件(create系统调用)
  2. 删除文件(delete系统调用)
  3. 读文件(read系统调用)
  4. 写文件(write系统调用)
  5. 打开文件(open系统调用)。读/写文件之前,需要“打开文件”。
  6. 关闭文件(close系统调用)。读/写文件结束之后,需要“关闭文件”。

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

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

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

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

1.6总结

2.文件的逻辑结构

2.1无结构文件

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

无结构文件:文件内部的数据就是一系列二进制流或字符流组成。又称”流式文件“。如:Windows操作系统中的.txt文件。

注:文件内部的数据其实就是一系列字符流,没有明显的结构特性。因此也不用探讨无结构文件的“逻辑结构”问题。

2.2有结构文件

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

2.3有结构文件的逻辑结构

2.3.1顺序文件

顺序文件:文件中的记录一个接一个地顺序排列(逻辑上),记录可以是定长的或可变长的。

各个记录在物理上可以顺序存储链式存储

  • 顺序存储:逻辑上相邻的记录,物理上也相邻(类似于顺序表)。
    • 可变长记录:无法实现随机存取,每次只能从第一个记录开始依次往后查找。
    • 定长记录:可实现随机随机存取,记录长度为L,则第i个记录存放的相对位置是i*L
      1. 若采用串结构,无法快速找到某关键字对应的记录。
      2. 若采用顺序结构,可以快速找到某关键字对应的记录(如折半查找)。
  • 链式存储:逻辑上相邻的记录,物理上不一定相邻(类似于链表)。
    • 无论是定长/可变长记录,都无法实现随机存取,每次只能从第一个记录开始依次往后查找。

顺序文件还可以分为串结构顺序结构

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

2.3.2索引文件

对于可变长记录文件,要找到第i个记录,必须先顺序第查找前i-1个记录,但是很多应用场景中又必须使用可变长记录。如何解决这个问题?

索引表本身是定长记录的顺序文件。因此可以快速找到第i个记录对应的索引项。

可将关键字作为索引号内容,若按关键字顺序排列,则还可以支持按照关键字折半查找。

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

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

2.3.3索引顺序文件

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

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

索引顺序文件的检索效率分析:

为了进一步提高检索效率,可以为顺序文件建立多级索引表。例如,对于一个含 1 0 6 10^6 106个记录的文件,可先为该文件建立一张低级索引表,每100个记录为一组,故低级索引表中共有10000个表项(即10000个定长记录),再把这10000个定长记录分组,每组100个,为其建立顶级索引表,故顶级索引表中共有100个表项。

2.4总结

3.文件目录

3.1文件控制块

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

FCB 实现了文件名和文件之间的映射。使用户(用户程序)可以实现“按名存取”。


3.2目录结构

3.2.1单级目录结构

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

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

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

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

3.2.2两级目录结构

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

3.2.3多级目录结构


3.2.4无环图目录结构

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

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

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

3.3索引节点

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

所以引入了索引节点。可以把除了文件名之外的文件描述信息都放到这里来。

思考:这样做有什么好处?

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

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

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

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

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

3.4总结

以上是关于操作系统-4.1-文件的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——git命令操作一个完整流程

VSCode 如何操作用户自定义代码片段(快捷键)

VSCode自定义代码片段15——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程

Java itext为pdf 文件添加水印核心功能代码片段

Android 逆向Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )(代码片段