16 操作系统第四章 文件管理 文件的基本操作 文件共享 文件保护 文件系统的层次结构

1 文件的基本操作

1.1 创建文件

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

进行Create系统调用时,需要提供的几个主要参数:

  1. 所需的外存空间大小(如:一个盘块,即1KB
  2. 文件存放路径(“D:/Demo”)
  3. 文件名(这个地方默认为“新建文本文档.txt”)

操作系统在处理Create系统调用时,主要做了两件事:

  1. 在外存中找到文件所需的空间(结合上小节学习的空闲链表法、位示图、成组链接法等管理策略,找到空闲空间)
  2. 根据文件存放路径的信息找到该目录对应的目录文件(此处就是D:/Demo目录),在目录中创建该文件对应的目录项。目录项中包含了文件名、文件在外存中的存放位置等信息。

1.2 删除文件

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

进行Delete系统调用时,需要提供的几个主要参数:

  1. 文件存放路径(“D:/Demo”)
  2. 文件名(“test.txt”)

操作系统在处理Delete系统调用时,主要做了几件事:

  1. 根据文件存放路径找到相应的目录文件,从目录中找到文件名对应的目录项
  2. 根据该目录项记录的文件在外存的存放位置、文件大小等信息,回收文件占用的磁盘块。
    (回收磁盘块时,根据空闲表法、空闲链表法、位图法等管理策略的不同,需要做不同的处理)
  3. 从目录表中删除文件对应的目录项

1.3 打开文件

在很多操作系统中,在对文件进行操作之前,要求用户先使用open系统调用

“打开文件”,需要提供的几个主要参数:

  1. 文件存放路径(“D:/Demo”)
  2. 文件名(“test.txt”)
  3. 要对文件的操作类型(如:r只读;rw读写等)

操作系统在处理open系统调用时,主要做了几件事:

  1. 根据文件存放路径找到相应的目录文件,从目录中找到文件名对应的的目录项,并检查该用户是否有指定的操作权限。
  2. 将目录项复制到内存中的“打开文件表”中。并将对应表目的编号返回给用户。之后用户使用打开文件表的编号来指明要操作的文件
    16 操作系统第四章 文件管理 文件的基本操作 文件共享 文件保护 文件系统的层次结构

打开文件表又可分为系统的打开文件表和进程的打开文件表

  1. 进程的打开文件表
    16 操作系统第四章 文件管理 文件的基本操作 文件共享 文件保护 文件系统的层次结构
    读写指针:记录了该进程对文件的读/写操作进行到的位置
    访问权限:如果打开文件时声明的是“只读”,则该进程不能对文件进行写操作
  2. 系统的打开文件表:
    可以方便实现某些文件管理的功能。例如:
    Windows系统中,我们尝试删除某个txt文件,如果此时该文件已被某个“记事本”进程打开,则系统会提示我们“暂时无法删除该文件”。其实系统在背后做的事就是先检查了系统打开文件表,确认此时是否有进程正在使用该文件。
    16 操作系统第四章 文件管理 文件的基本操作 文件共享 文件保护 文件系统的层次结构
    打开计数器:记录此时有多少个进程打开了此文件

1.4 关闭文件

进程使用完文件后,要“关闭文件”

操作系统在处理Close系统调用时,主要做了几件事:

  1. 将进程的打开文件表相应表项删除
  2. 回收分配给该文件的内存空间等资源
  3. 系统打开文件表的打开计数器count减1,若count=0,则删除对应表项。

1.5 读文件

读文件,将文件数据读入内存,才能让CPU处理(双击后,“记事本”应用程序通过操作系统提供的“读文件”功能,即read系统调用,将文件数据从外存读入内存,并显示在屏幕上)

16 操作系统第四章 文件管理 文件的基本操作 文件共享 文件保护 文件系统的层次结构

  1. 进程使用read系统调用完成写操作。需要指明是哪个文件(在支持“打开文件”操作的系统中,只需要提供文件在打开文件表中的索引号即可),还需要指明要读入多少数据(如:读入1KB)、指明读入的数据要放在内存中的什么位置。
  2. 操作系统在处理read系统调用时,会从读指针指向的外存中,将用户指定大小的数据读入用户指定的内存区域中。

1.6 写文件

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

进程使用write系统调用完成写操作,需要指明是哪个文件(在支持“打开文件”操作的系统中,只需要提供文件在打开文件表中的索引号即可),还需要指明要写出多少数据(如:写出1KB)、写回外存的数据放在内存中的什么位置操作系统在处理write系统调用时,会从用户指定的内存区域中,将指定大小的数据写回写指针指向的外存。

1.7 文件基本操作小结

16 操作系统第四章 文件管理 文件的基本操作 文件共享 文件保护 文件系统的层次结构

2 文件共享

2.1 基于索引结点的共享方式(硬链接)

索引结点,是一种文件目录瘦身策略。由于检索文件时只需用到文件名,因此可以将除了文件名之外的其他信息放到索引结点中。这样目录项就只需要包含文件名、索引结点指针。
16 操作系统第四章 文件管理 文件的基本操作 文件共享 文件保护 文件系统的层次结构

索引结点中设置一个链接计数变量count,用于表示链接到本索引结点上的用户目录项数。

  1. count=2,说明此时有两个用户目录项链接到该索引结点上,或者说是有两个用户在共享此文件。
  2. 若某个用户决定“删除”该文件,则只是要把用户目录中与该文件对应的目录项删除,且索引结点的count值减1。
  3. count>0,说明还有别的用户要使用该文件,暂时不能把文件数据删除,否则会导致指针悬空。
  4. count=0时系统负责删除文件。

2.2 基于符号链的共享方式(软链接)

16 操作系统第四章 文件管理 文件的基本操作 文件共享 文件保护 文件系统的层次结构

User3访问“ccc”时,操作系统判断文件“ccc”属于Link类型文件,于是会根据其中记录的路径层层查找目录,最终找到User1的目录表中的“aaa”表项,于是就找到了文件1的索引结点。

IntelliJ IDEA 2018.2.5 x64就是一个Link类型的文件名,可以不同
16 操作系统第四章 文件管理 文件的基本操作 文件共享 文件保护 文件系统的层次结构
双击打开时,操作系统判断这个文件是Link类型的“快捷方式”文件,于是会根据其中记录的“路径信息”检索目录,最终找到“idea4.exe”

2.3 文件共享小结

16 操作系统第四章 文件管理 文件的基本操作 文件共享 文件保护 文件系统的层次结构

3 文件保护

3.1 口令保护

为文件设置一个“口令”(如:abc112233),用户请求访问该文件时必须提供“口令”。

口令一般存放在文件对应的FCB或索引结点中。用户访问文件前需要先输入“口令”,操作系统会将用户提供的口令与FCB中存储的口令进行对比,如果正确,则允许该用户访问文件

优点:保存口令的空间开销不多,验证口令的时间开销也很小。
缺点:正确的“口令”存放在系统内部,不够安全。

3.2 加密保护

使用某个“密码”对文件进行加密,在访问文件时需要提供正确的“密码”才能对文件进行正确的解密。

优点:保密性强,不需要在系统中存储“密码”
缺点:编码/译码,或者说加密/解密要花费一定时间。

3.3 访问控制

在每个文件的FCB(或索引结点)中增加一个访问控制列表(Access-Control List,ACL),该表中记录了各个用户可以对该文件执行哪些操作。
16 操作系统第四章 文件管理 文件的基本操作 文件共享 文件保护 文件系统的层次结构
精简的访问列表:以“组”为单位,标记各“组”用户可以对文件执行哪些操作。
如:分为系统管理员、文件主、文件主的伙伴、其他用户几个分组。
当某用户想要访问文件时,系统会检查该用户所属的分组是否有相应的访问权限。
16 操作系统第四章 文件管理 文件的基本操作 文件共享 文件保护 文件系统的层次结构

3.4 文件保护小结

16 操作系统第四章 文件管理 文件的基本操作 文件共享 文件保护 文件系统的层次结构

4 文件系统的层次结构

16 操作系统第四章 文件管理 文件的基本操作 文件共享 文件保护 文件系统的层次结构
用一个例子来辅助记忆文件系统的层次结构:

假设某用户请求删除文件“D:/临时文件目录/学生信息.xIsx”的最后100条记录。

  1. 用户需要通过操作系统提供的接口发出上述请求——用户接口
  2. 由于用户提供的是文件的存放路径,因此需要操作系统一层一层地查找目录,找到对应的目录项——文件目录系统
  3. 不同的用户对文件有不同的操作权限,因此为了保证安全,需要检查用户是否有访问权限——
    存取控制模块(存取控制验证层)
  4. 验证了用户的访问权限之后,需要把用户提供的“记录号”转变为对应的逻辑地址——逻辑文件系统与文件信息缓冲区
  5. 知道了目标记录对应的逻辑地址后,还需要转换成实际的物理地址——物理文件系统
  6. 要删除这条记录,必定要对磁盘设备发出请求——设备管理程序模块
  7. 删除这些记录后,会有一些盘块空闲,因此要将这些空闲盘块回收——辅助分配模块