操作系统角度分析文件的操作

文件系统基础

文件目录: 统一管理每个文件的元数据,以支持文件名到文件物理地址的转换 ;将所有文件的管理信息组织在一起,即构成文件目录。文件目录通常以文件的形式存放在磁盘上,当文件很多时,文件目录可能要占用大量的盘块,在查找的过程中,先将存放目录文件的第一个盘块中的目录调入内存,然后把用户所给定的文件名和目录项中的文件名逐一对比。若未找到指定文件,则再将下一个盘块中的目录项调入内存。在检索目录文件时,只用到了文件名,仅当找到一个目录项(即其中的文件名与指定要查找的文件名相匹配)时,才需要从该目录项中读出该文件的物理地址,而其他一些对该文件进行描述的信息,在检索目录时一概不用,显然,这些信息在检索目录时不需要调入内存。为此,在有的系统中,如UNIX系统,便采用了把文件名和文件描述信息分开的方法,亦即,使文件描述信息单独形成一个称为索引结点的数据结构,简称为i结点,在文件目录中的每个目录项由文件名和指向该文件所对应的i结点的指针所构成。

目录项: 构成文件目录的基本单元;目录项可以是FCB,目录是文件控制块的有序集合。

FCB: 为了便于对文件进行控制和管理,在文件系统内部,给每个文件惟一地设置一个文件控制块。FCB包含了索引表的位置信息。其中一个文件的信息存放在若干不连续物理块中;系统为每个文件建立一个专用数据结构—索引表,并将这些物理块的块号存放在该索引表中;索引表就是磁盘块地址数组,其中第i个条目指向文件的第i块。unix文件系统中FCB 由 目录项 和i节点组成。其中目录项包括文件名 和 i节点号。目录文件由目录项构成 ;i节点描述文件的相关信息 。每个文件由一个目录项、一个i节点和若干磁盘块构成 。

在这里插入图片描述

系统打开文件表和用户打开文件表:
在这里插入图片描述

文件是存放在物理磁盘上的,包括文件控制块(FCB)和数据块。文件控制块通常包括文件权限、日期(创建、读取、修改)、拥有者、文件大小、数据块信息。数据块用来存储实际的内容。对于打开的文件,操作系统是这样管理的:系统维护了两张表,一张是系统级打开文件表,一张是进程级打开文件表(每个进程有一个)。

  • 系统级打开文件表复制了文件控制块的信息FCB等;进程级打开文件表保存了指向系统级文件表的指针及其他信息。

  • 系统级文件表每一项都保存一个计数器,即该文件打开的次数。我们初次打开一个文件时,系统首先查看该文件是否已在系统级文件表中,如果不在,则创建该项信息,否则,计数器加1。当我们关闭一个文件时,相应的计数也会减1,当减到0时,系统将系统级文件表中的项删除。

  • 进程打开一个文件时,会在进程级文件表中添加一项。每项的信息包括当前文件偏移量(读写文件的位置)、存取权限、和一个指向系统级文件表中对应文件项的指针。系统级文件表中的每一项通过文件描述符(一个非负整数)来标识。

page cache其中存储的数据在I/O完成后并不回收,而是一直保存在内存中,除非内存紧张,才开始回收占用的内存。inode模块可链接到address_space模块,方便查找自身文件数据是否已经缓存。address_space是Linux内核中的一个关键抽象,它被作为文件系统和页缓存的中间适配器,用来指示一个文件在页缓存中已经缓存了的物理页。因此,它是页缓存和外部设备中文件系统的桥梁。如果将文件系统可以理解成数据源,那么address_space可以说关联了内存系统和文件系统。地址空间address_space链接到页缓存基数树和inode,因此address_space通过指针可以方便的获取文件inode和page的信息。读文件的流程:

1、进程调用库函数向内核发起读文件请求;

2、内核通过检查进程的文件描述符定位到虚拟文件系统的已打开文件列表表项;

3、调用该文件可用的系统调用函数read()

3、read()函数通过文件表项链接到目录项模块,根据传入的文件路径,在目录项模块中检索,找到该文件的inode;

4、在inode中,通过文件内容偏移量计算出要读取的页;

5、通过inode找到文件对应的address_space;

6、在address_space中访问该文件的页缓存树,查找对应的页缓存结点:

(1)如果页缓存命中,那么直接返回文件内容;

(2)如果页缓存缺失,那么产生一个页缺失异常,创建一个页缓存页,同时通过inode找到文件该页的磁盘地址,读取相应的页填充该缓存页;重新进行第6步查找页缓存;

7、文件内容读取成功。

文件目录检索:用户给出文件名,按文件名查找到目录项/FCB。根据路径名检索:全路径名或相对路径名。**文件寻址:**根据目录项/FCB中文件物理地址等信息,计算出文件中任意记录或字符在存储介质上的地址。寻址过程:首先,系统应先读入第一个文件分量名usr,用它与根目录文件(或当前目录文件)中各目录项中的文件名顺序地进行比较,从中找到匹配者,并得到匹配项的索引结点号是6,再从6号索引结点中得到usr目录文件放在132号盘块中,将该盘块内容读入内存。接着,系统再将路径名中的第二个分量名ast读入,用它与放在132号盘块中的第二级目录文件中各目录项的文件名顺序进行比较,又找到匹配项,从中得到ast的目录文件放在26号索引结点中,再从26号索引结点中得知/usr/ast是存放在496号盘块中,再读入496号盘块。然后,将文件的第三个分量名mbox读入,用它与第三季目录文件/usr/ast中各目录项的文件名进行比较,最后得到/usr/ast/mbox的索引结点号为60,即在60号索引结点中存放了指定文件的物理地址,目录查询操作到此结束,如果在顺序查找过程中发现有一个文件分量名没有找到,则停止查找,并返回文件未找到信息。
在这里插入图片描述

磁盘数据传输:

寻道(时间):磁头移动定位到指定磁道
旋转延迟(时间):等待指定扇区从磁头下旋转经过
数据传输(时间):数据在磁盘与内存之间的实际传输 。

块高速缓存: 又称为文件缓存、磁盘高速缓存、缓冲区高速缓存 是指:在内存中为磁盘块设置的一个缓冲区,保存了磁盘中某些块的副本 。检查所有的读请求,看所需块是否在块高速缓存中。如果在,则可直接进行读操作;否则,先将数据块读入块高速缓存,再拷贝到所需的地方。由于访问的局部性原理,当一数据块被读入块高速缓存以满足一个I/O请求时,很可能将来还会再次访问到这一数据块。

文件操作的实现;

一、创建文件:

建立系统与文件的联系,实质是建立文件的FCB 。在目录中为新文件建立一个目录项,根据提供的参数及需要填写相关内容。分配必要的存储空间。

二、打开文件:

当用户要访问一个已存在的文件时,系统首先利用用户提供的文件名对目录进行查询,找出该文件的文件控制块或对应索引结点,然后,根据FCB或索引结点中所记录的文件物理地址(盘块号),换算出文件在磁盘上的物理位置,最后,再通过磁盘驱动程序,将所需文件读入内存。根据文件名在文件目录中检索,并将该文件的目录项读入内存,建立相应的数据结构,为后续的文件操作做好准备 。

① 根据文件路径名查目录,找到目录项 (或I节点号) ;
② 根据文件号查系统打开文件表,看文件是否已被打开;是 → 共享计数加1。否则 → 将目录项 (或I节点)等信息填入系统打开文件表空表项,共享计数置为1;
③ 根据打开方式、共享说明和用户身份检查访问合法性;
④ 在用户打开文件表中获取一空表项,填写打开方式等,并指向系统打开文件表对应表项
返回信息:fd:文件描述符,是一个非负整数,用于以后读写文件

三、读文件

① 根据打开文件时得到的文件描述符,找到相应的文件控制块(目录项),确定读操作的合法性。读操作合法→②,否则→出错处理。
② 将文件的逻辑块号转换为物理块号
根据参数中的读指针、长度与文件控制块中的信息,确定块号、块数、块内位移
③ 申请缓冲区
④ 启动磁盘I/O操作,把磁盘块中的信息读入缓冲区,再传送到指定的内存区(多次读盘)
⑤ 反复执行③、④直至读出所需数量的数据或读至文件尾

四、文件的写入策略

1、通写(write-through):内存中的修改立即写到磁盘 ,缺点:速度性能差 。例: FAT文件系统
2、延迟写(lazy-write) :利用回写(write back)缓存的方法得到高速 ,可恢复性差 。
3、可恢复写(transaction log) :采用事务日志来实现文件系统的写入 。既考虑安全性,又考虑速度性能 。例:NTFS

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值