操作系统——文件系统
Linux系统下一切皆文件。
首先,系统找到这个文件名对应的inode号码。
其次,通过inode号码,获取inode信息。
最后,根据inode信息,找到文件数据所在的block,读出数据。
文件是文件系统的基本数据单位,Linux文件系统会为每个文件分配两个数据结构,分别是索引节点和目录项。
索引节点就是inode,用来记录磁盘上文件的元信息,是文件的唯一标识。索引节点也占用磁盘空间。
目录项,是记录文件的名字、索引节点指针、目录层级结构,是由内核维护的一个数据结构,不存在磁盘上,而是缓存在内存。目录项可以表示目录,也可以表示文件。
inode的特有现象:(1)有时候文件名包含特殊字符无法正常删除。这是,直接删除inode节点就能起到删除文件的作用。(2)移动文件或者对文件进行重命名,只是改变文件名,不影响inode号码。(3)打开一个文件之后,系统就用inode号码来识别这个文件,不再考虑文件名。
硬链接就是多个目录项的索引节点指针指向同一个文件。
注意注意:目录项绝对不是目录,目录是一个文件,也是持久化在磁盘的。
用户要通过内核去读取文件系统的内容,但是文件系统有很多种(如磁盘的文件系统,Ext2/3/4、XFS;内存的文件系统,/proc和/sys;网络的文件系统,NFS/SMB等),因此有必要引入一个中间层,叫做虚拟文件系统VFS。
虚拟文件系统定义了一组所有文件系统都支持的数据结构和接口,这样程序员不需要了解文件系统的工作原理,只了解VFS提供的统一接口就可以。
文件的使用如下:
文件系统的基本操作单位是数据块。
文件的存储:文件数据存在硬盘上面,数据在磁盘的存放方式有两种:
连续空间存放方式、非连续空间存放方式(链表方式、索引方式)
怎么找存储在哪里?(空闲空间管理方法)
答:空闲表法、空闲链表法、位图法。 位图法时利用二进制的一位来表示磁盘中的一个盘块的使用情况,磁盘上的所有的盘块都有一个二进制位与之对应。当值为0的时候,表示对应的盘块空闲;值为1的时候,表示对应的盘块已经分配。
在Linux文件系统就采用了位图的方式来管理空闲空间,不仅用于数据空闲块的管理,还用于inode空闲块的管理。
目录的存储:目录文件的块里面保存的是目录里面一项一项的文件信息。
给文件取别名,可以使用硬链接和软链接。https://blog.csdn.net/qq_26129413/article/details/110228234
硬链接就是多个目录项的索引指针指向同一个inode。因此只有删除文件所有硬链接和所有源文件的时候,才算彻底删除文件。由于inode无法跨文件系统,每个文件系统都有各自的inode数据结构和列表,所以硬链接也不能跨文件系统。
多个文件名指向同一个inode号码,可以用不同的文件名访问同样的内容;修改文件内容会影响到所有的文件名;删除一个文件名不影响另一个。
软链接就是常见的快捷方式,就是在磁盘重新创建一个文件,文件的内容就是被链接文件的地址。所以这个软链接也是有自己的inode的。软链接可以跨文件系统,就算目标文件被删除了,也不会影响软链接文件的存在,只是软链接指向地址的文件找不到了。
软链接和硬连接的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode链接数目不会因此发生变化。
文件IO:阻塞IO/非阻塞IO
阻塞IO:当用户程序执行read,线程会被阻塞,一直等到内核数据准备好,并把数据从内核缓冲区拷贝到用户缓冲区。当拷贝过程完成,read才会返回。
非阻塞IO:read请求在数据没有准备好的情况下立刻返回,可以继续往下执行,但是这时候用户程序一直在轮询内核,直到数据准备好,内核将数据拷贝到应用程序缓冲区,read调用之后才可以获取结果。
多路IO复用:应用程序每次都轮询内核的IO是否准备好,有点傻,因为在轮询的过程中,应用程序只能循环,啥也做不了。
为了解决这种傻乎乎轮询问题,多路IO复用技术出现了,如select/poll。通过IO事件分发,当内核准备好数据,再以事件的形式,通知应用程序进行操作。
同步IO:阻塞IO、非阻塞IO、多路IO复用。因为他们在read的过程中,内核将数据从内核区拷贝到用户空间的这个过程都需要等待,也就是这个过程是同步的。
异步IO:当发起aio_read之后,就立即返回,内核自动将数据从内核空间拷贝到用户空间,这个拷贝过程是异步的,内核自动完成,和前面的同步不同,异步的应用程序并不需要主动发起拷贝动作。
IO分为两个过程:(1)数据准备过程(2)数据从内核空间拷贝到用户进程缓冲区过程。
阻塞IO会阻塞在过程1和过程2。非阻塞IO和多路复用IO只会阻塞在过程2。这三者都是同步IO。
异步IO则不同,过程1和过程2都不会阻塞。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?