操作系统——文件系统

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都不会阻塞。

 

posted @   花与不易  阅读(323)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示