• 【性能基石之IO~~~Linux操作系统相关知识体系补充&虚拟文件系统&文件描述符&PageCache内核缓存页】


    一、关于Linux相关知识的补充:

    1.1 Linux操作系统中一些基本名词概念的解释:

    kernel:操作系统的内核态
    VFS树:虚拟操作文件系统
    FD:文件描述符
    inode:索引节点

    硬盘分区,格式化、创建文件系统
    被格式化的磁盘分为两部分:第一部分是Inode 第二部分是block
    block是用来存储实际数据用的,例如:照片、视频等普通文件数据
    inode是用来存储这些数据的属性的(也就是ls-l的结果)
    inode包含的属性信息有文件大小、属主、归属的用户组、读写权限、问价类型、修改时间,还有指向文件实体指针的功能(inode节点----block的对应关系),但是唯独不包含文件名

    inode id:操作节点的编号
    pageache 4k:每次读取的缓存大小
    dirty:用户修改了缓存后该缓存需要被修改
    flush:最后将所有的结果flush到内存中

    1.2 Linux操作系统中七种文件类型

    在Linux系统下,有七种文件类型:

    1.2.1 普通文件类型

    最常使用的一类文件,其特点是不包含有文件系统信息的结构信息。通常用户所接触到的文件,比如图形文件、数据文件、文档文件以及声音文件都属于这种文件,这种类型的文件是按照其内部结构又可分为纯文本文件(ASCII)、二进制文件(binary)、数据格式的文件(data)、各种压缩文件。

    1.2.1.1 查看文件的命令
    # 第一种方式
    ls -ld /etc
    # 第二种方式
    file xxx.txt
    # 第三种方式 查看文件的详细属性(其中包括文件时间属性)
    stat xxx.txt      
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1.2.1.2 文件的相关属性信息
    644265 -rw-r–r--. 1 root root 3 Jan 28 20:55 xxx.txt
    
    inode 索引节点编号:644265
    文件类型 :文件类型是’-’,表示这是一个普通文件
    文件权限:rw-r–r-- 表示文件可读、可写、可执行,文件所归属的用户组可读可执行,其他用户可读可执行
    硬链接个数 表示xxx.txt这个文件没有其他的硬链接,因为连接数是1,就是他本身
    文件属主 表示这个文件所属的用户,这里的意思是a.txt文件被root用户拥有,是第一个root
    文件属组 表示这个文件所属的用户组,这里表示a.txt文件属于root用户组,是第二个root
    文件大小 文件大小是3个字节
    文件修改时间 这里的时间是该文件最后被更新(包括文件创建、内容更新、文件名更新等)的时间可用如下命令查看文件的修改、访问、创建时间
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1.2.2 目录文件类型

    用于存放文件名以及其相关信息的文件,是内核组织文件系统的基本节点。目录文件可以包含下一级文件目录或者普通文件,在Linux中,目录文件是一种文件。

    1.2.3 块设备文件类型

    块设备文件 : 就是存储数据以供系统存取的接口设备,简单而言就是硬盘。例如一号硬盘的代码是 /dev/hda1等文件。

    1.2.4 字符设备类型

    字符设备文件:即串行端口的接口设备,例如键盘、鼠标等等。

    1.2.5 套接字文件类型

    这类文件通常用在网络数据连接。可以启动一个程序来监听客户端的要求,客户端就可以通过套接字来进行数据通信

    1.2.6 管道文件类型

    是一种很特殊的文件,主要用于不同进程的信息传递。当两个进程需要进行数据或者信息传递时,可以使用通道文件,一个进程将需要传递的数据或者信息写入管道的一端,另一进程从管道的另一端取得所需要的数据或者信息,通常管道是建立在调整缓存中。

    1.2.7 链接文件类型

    是一种特殊文件,指向一个真实存在的文件链接,类似于Windows下的快捷方式,链接文件的不同,又可分为硬链接文件和符号链接文件。

    1.3 Linux中proc目录以及一些命令解释

    /proc 包含内核程序的一些进程属性、ID号等等
    $$ 当前bash的pid
    $BASHPID 当前bash的pid
    /proc/$$/fd(文件描述符有哪些)
    lsof -op $$(文件描述符具体的一些细节问题)

    二.文件系统层次

    2.1 文件系统层次分析

    由上而下主要分为用户层、VFS层、文件系统层、缓存层、块设备层、磁盘驱动层、磁盘物理层

    1. 用户层:最上面用户层就是我们日常使用的各种程序,需要的接口主要是文件的创建、删除、打开、关闭、写、读等。
    2. VFS层:我们知道Linux分为用户态和内核态,用户态请求硬件资源需要调用System Call通过内核态去实现
      用户的这些文件相关操作都有对应的System Call函数接口,接口调用 VFS对应的函数。
    3. 文件系统层:不同的文件系统实现了VFS的这些函数,通过指针注册到VFS里面。所以,用户的操作通过VFS转到各种文件系统。文件系统把文件读写命令转化为对磁盘LBA的操作,起了一个翻译和磁盘管理的作用。
    4. 缓存层:文件系统底下有缓存,Page Cache,加速性能。对磁盘LBA的读写数据缓存到这里。
    5. 块设备层:块设备接口Block Device是用来访问磁盘LBA的层级,读写命令组合之后插入到命令队列,磁盘的驱动从队列读命令执行。Linux设计了电梯算法等对很多LBA的读写进行优化排序,尽量把连续地址放在一起。
    6. 磁盘驱动层:磁盘的驱动程序把对LBA的读写命令转化为各自的协议,比如变成ATA命令,SCSI命令,或者是自己硬件可以识别的自定义命令,发送给磁盘控制器。Host Based SSD甚至在块设备层和磁盘驱动层实现了FTL,变成对Flash芯片的操作。
    7. 磁盘物理层:读写物理数据到磁盘介质。

    在这里插入图片描述

    2.2 虚拟文件系统

    1. VFS的思想是把不同类型文件的共同信息放入内核,具体思路是通过Linux在用户进程(或C库)和文件系统之间引入了一个抽象层,该抽象层称之为虚拟文件系统(VFS)。
    2. 虚拟文件系统也可称为虚拟文件转换,是一个内核软件层,用来处理与 Unix 标准文件系统相关的所有系统调用。
    3. VFS 能为各种文件系统提供一个通用的接口。

    2.3.文件描述符

    2.3.1 文件描述符的概念

    文件描述符:Linux 系统中,把一切都看做是文件一切皆文件,当进程打开现有文件或创建新文件时,内核向进程返回一个文件描述符,文件描述符就是内核为了高效管理已被打开的文件所创建的索引,用来指向被打开的文件,所有执行I/O操作的系统调用都会通过文件描述符。

    2.3.2 文件描述符、文件、进程间的关系:
    1. 每个文件描述符会与一个打开的文件相对应;
    2. 不同的文件描述符也可能指向同一个文件;
    3. 相同的文件可以被不同的进程打开,也可以在同一个进程被多次打开;
    2.3.3 文件描述符注意事项
    1. 一个进程能够同时打开多个文件,对应需要多个文件描述符,所以需要用一个文件描述符表对文件描述符进行管理;通常默认大小为1024,也即能容纳1024个文件描述符;
    2. 文件描述符表中0、1、2三个位置对应的文件描述符固定不变,标准输入、标准输出、标准错误;
    3. 当打开一个文件时,内核会自动在文件描述符表中寻找一个空闲且最小的文件描述符;
    4. 同一个文件可以被多次打开,但是每打开一次都需要一个新的文件描述符;
    5. 已经被占用的文件描述符在被释放后,可以后重新被占用。

    2.4 PageCache内核缓存页

    2.4.1 为什么使用ageCache?
    1. 数据一般存放在硬盘中,CPU 并不能直接访问硬盘中的数据,而是需要先将硬盘中的数据读入到内存中,然后才能被 CPU 访问。
    2. 由于读写硬盘的速度比读写内存要慢很多,所以为了避免每次读写文件时,都需要对硬盘进行读写操作,Linux 内核使用 页缓存(Page Cache) 机制来对文件中的数据进行缓存。
    2.4.2 什么是页缓存?

    为了提升对文件的读写效率,Linux 内核会以页大小(4KB)为单位,将文件划分为多数据块。当用户对文件中的某个数据块进行读写操作时,内核首先会申请一个内存页(称为 页缓存)与文件中的数据块进行绑定。

    2.4.3 进行读写操作的时候页缓存怎么工作?
    1. 当从文件中读取数据时,如果要读取的数据所在的页缓存已经存在,那么就直接把页缓存的数据拷贝给用户即可。否则,内核首先会申请一个空闲的内存页(页缓存),然后从文件中读取数据到页缓存,并且把页缓存的数据拷贝给用户。
    2. 当向文件中写入数据时,如果要写入的数据所在的页缓存已经存在,那么直接把新数据写入到页缓存即可。否则,内核首先会申请一个空闲的内存页(页缓存),然后从文件中读取数据到页缓存,并且把新数据写入到页缓存中。对于被修改的页缓存,内核会定时把这些页缓存刷新到文件中。
      在这里插入图片描述

    补充拓展相关知识:
    冯诺依曼计算机体系结构:
    计算机的主存是指内存,分为ROM(只读内存)和RAM(随机存取存储器)
    在这里插入图片描述

    更加宏观的PageCache整个执行流程:
    在这里插入图片描述

    好了,【性能基石之IO~~~Linux操作系统相关知识体系补充&虚拟文件系统&文件描述符&PageCache内核缓存页】就先学习到这里,更多内容持续学习创作中!!!

  • 相关阅读:
    深入了解Linux中的scp命令及高级用法
    云计算模式的优势
    3A通过pmp有多大比例?
    外汇天眼:FCA 已向交易应用程序运营商发出警告,要求其停止交易游戏化
    【python小项目】用python写一个小工具——番茄钟
    Java如何从字符串中提取数字
    【C++】面向对象示例 - 数组类 ( 示例需求 | 创建封装类 | 数组类头文件 Array.h | 数组类实现 Array.cpp | 测试类 Test.cpp - 主函数入口 )
    基于uniapp微信小程序的汽车租赁预约系统
    LeViT:Facebook提出推理优化的混合ViT主干网络 | ICCV 2021
    volatile修饰数组
  • 原文地址:https://blog.csdn.net/Coder_ljw/article/details/127590934