操作系统-文件管理笔记
文件系统的组成
文件系统的基本数据单位是文件。
目的:组织管理磁盘上的文件。
根据组织方式的不同可分为不同的文件系统。例如:NFT、多级目录文件系统。
文件数据结构
- 索引节点:存放在磁盘中,记录文件的元信息,唯一标识一个文件。
- 目录项:由内核维护,缓存在内存而不是在存放在磁盘中。
作用:记录文件的元信息和目录层次结构。
目录和目录项的区别?
目录是一种文件保存在磁盘中,文件内容是子目录或文件;目录项是一种数据结构,缓存在内存中,指向目录或文件。
目录项就是文件控制块FCB。
文件是如何存储在磁盘的?
磁盘的基本单位是扇区,多个扇区组成一个逻辑块。
磁盘在格式化后会被分为三个区域:
超级块:存储文件系统的详细信息。(成组链接法)
加载时机:当文件系统被挂载时进入内存。
索引节点区:用来存储索引节点。
当文件被访问时进入内存。
数据块区:用来存储文件或目录数据。
虚拟文件系统
操作系统对用户提供的一个统一操作文件的接口,虚拟文件系统是介于用户层和文件系统层的。
文件的使用
进程在打开文件后,操作系统会追踪这些文件,即为每个进程都维护一个打开文件表,表中的表项为文件描述符,文件描述符是打开文件的标识。
文件的存储方式
-
连续空间
文件头里指定
起始块的位置
和长度
。优点:读写效率高。
缺点:容易产生磁盘空间碎片,文件长度不易扩展。
-
非连续空间
-
链表方式
-
隐式链表
文件头包含第一块和最后一块的位置,并且每个数据块要保存下一块的位置(指针)。
优点:不会产生磁盘碎片,文件长度可以动态扩展。
缺点:无法随机访问,指向下一个数据库的指针需要占用一定空间,稳定性差(当软件/硬件错误导致链表中的指针丢失或损坏时,会导致文件数据丢失)
-
显式链表
把用于链接各个数据块的指针,显式地放在内存的一张链接表中,每个表项存放链接指针和指向下一块的数据号。
优点:查找过程是在内存中的,提高检索速度。
缺点:不适合与大磁盘。
-
-
索引方式
为每个文件创建一个索引数据块,里面存放指向文件数据块的指针列表。文件头包含这个索引数据块的指针。
优点:文件大小的扩展很方便,支持顺序和随机读写,不会有碎片问题。
缺点:存储索引需要占用一定的空间。
-
空闲空间的管理
-
空闲表法
为文件的空闲空间建立一个表,表项为空闲区的第一个块号和空闲区的块个数。(连续分配)
缺点:当存储空间存在大量空闲区时,查询效率低。
-
空闲链表法
用链表的方式将空闲块串联起来。
缺点:不支持随机访问。
-
位图法
采用二进制的一位来表示磁盘一个盘块的情况,磁盘上的所有盘块都有一个二进制位与之对应。
文件系统的结构
目录的存储
目录文件里存储是目录里面一项一项的文件信息。
Linux中ext文件系统采用了哈希表的方式来保存目录里面文件信息,
key: 文件名称, value: 索引节点块号
。
文件I/O
-
缓冲和非缓冲I/O
- 缓冲/O:利用标准库的缓存加速对文件内容的访问,标准库再通过系统调用访问文件。
- 非缓冲I/O:不使用标准库的缓存,直接通过系统调用访问文件内容。
-
直接和非直接I/O
操作系统在(文件相关的)系统调用后,会把用户数据拷贝到内核中缓存起来,这个内核缓存空间称为页缓存。
- 直接I/O:不会发生内核缓存和用户程序之间的数据复制,而是直接通过文件系统访问磁盘。
- 非直接I/O:读操作时,数据从内核缓存中拷贝给用户程序,写操作时,数据从用户程序拷贝给内核程序,再由内核程序决定什么时候写回磁盘。
以下场景会触发内核缓存数据写回磁盘:
- 调用
write
时,发现内核缓存满了,内核会把数据写到磁盘上。 - 用户主动调用
sync
,内核缓存会刷到磁盘上。 - 内存紧张,无法再分配页面时,内核缓存会被刷到磁盘上。
- 内核缓存的数据的缓存时间超过某个时间时,也会被刷到磁盘上。
-
阻塞和非阻塞I/O、同步I/O与异步I/O
I/O分为两个过程:
- 数据准备过程
- 数据从内核空间拷贝到用户进程缓冲区的过程
解析:
- 阻塞I/O:当执行系统调用时,从第一个过程开始一直阻塞到数据拷贝到用户进程缓冲区完成为止。
- 非阻塞I/O:当执行系统调用时,如果数据没有准备好就立即返回不会阻塞,那么就需要用户程序不断轮询,当数据准备好后,再执行系统调用时,会阻塞直到数据拷贝完成。
- 同步I/O:当执行系统调用时,会阻塞到数据准备好为止,此时操作系统会唤醒用户程序并通知其数据已准备好,用户程序再执行系统调用拷贝数据(这一过程也是阻塞的)。
- 异步I/O:当执行系统调用后就立马返回,当操作系统把数据拷贝到用户缓冲区时,再通知用户程序。
__EOF__

本文链接:https://www.cnblogs.com/yghr/p/15769013.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)