zoukankan      html  css  js  c++  java
  • Linux 文件系统

    索引节点 (Index Node)和 目录项(directory entry)

    •  索引节点,简称 inode,用来记录文件的元数据,比如inode编号、文件大小、访问权限、修改日期、数据位置。

    索引节点和文件一一对应,它跟文件内容一样,都会被持久化存储到磁盘中。所以记住索引节点同样占用磁盘空间。

    •     目录项,简称 dentry,用来记录文件的名字、索引节点指针以及与其他目录项的关联关系。多个关联的目录项,就构成了文件系统的目录结构。 不过不同于索引节点,目录项是由内核维护的一个内存数据结构,所以通常也被叫做目录项缓存

     索引节点和目录项记录了文件的元数据,以及文件见的目录关系,具体来说,文件数据到底是怎么存储的呢?是不是直接写到磁盘中就好了呢?

    • 磁盘的读写       磁盘读写的最小单位是扇区,扇区 512B大小,如果每次都读写这么小的单位,效率很低。  文件系统把连续的扇区组成了逻辑块(四大基本要素),然后每次都以逻辑块为最小单元,来管理数据。 常见逻辑块大小 4KB,也就是 8个扇区组成。

            磁盘格式化时,会被分成三个存储区域:1. 超级块(四大基本要素):存储整个文件系统的状态。

                                                                             2.索引节点(四大基本要素)区 : 用来存储索引节点

                                                                             3. 数据块(四大基本要素)区: 用来存储文件数据

    虚拟文件系统

         为了支持不同的文件系统,Linux 内核在用户进程和文件系统的中间,又引入一个抽象层,也就是虚拟文件系统VFS(Virtual File System)

    VFS 定义了一组所有文件系统都支持的数据结构 和标准接口, 这样,用户进程和内核其他子系统,只需要跟VFS提供的统一接口进行交互就可以了,而不需要再关心底层的各种文件系统的实现细节。

    文件系统

         大致分为3类:

                 第一类:基于磁盘的文件系统,也就是把数据直接存储在计算机本地挂载的磁盘中。常见的Ext4、XFS、OverlayFS等,都是这类文件系统。

                 第二类:基于内存的文件系统,也就是我们常说的虚拟文件系统。这类文件系统,不需要任何磁盘分配存储空间,但会占用内存。我们经常用到的 /proc 文件系统,其实就是一种常见的虚拟文件系统。此外, /sys 文件系统也属于这一类,主要向用户空间导出层次化的内核对象。

                第三类:  网络文件系统,也就是用来访问其他计算机的文件系统,比如NFS、SMB、iSCSI 等。

      这些文件系统,要先挂载到VFS目录树种的某个子目录(称为挂载点), 然后才能访问其中的文件。

    文件系统I/O

      把文件系统挂载到挂载点后,你就能通过挂载点,再去访问它管理的文件了。VFS提供了一组标准的文件访问接口。这些接口以系统调用的方式。

    分类:

     第一种,根据是否利用标准缓存库,可以把文件I/O 分为缓冲I/O 与 非缓冲I/O。

     第二种,根据是否利用操作系统页缓存,分为 直接 I/O 和非直接 I/O。

    第三种,根据应用程序是否阻塞自身运行,分为阻塞I/O 和 非阻塞 I/O

    第四种,根据是否等待响应结果,分为同步和异步I/O.

    Linux 一切皆文件,深刻含义。无论是普通文件和块设备、还是网络套接字和管道等,它们都是通过统一的VFS接口来访问的。

    性能观测

    容量

    缓存

    free 输出的Cache,是页缓存可回收Slab缓存的和,可以从/proc/meminfo.直接获取

     3057888 不等于 2998100    3057888-2998100 =59788(58M)

     cat  /proc/meminfo | grep -E "SReclaimable|Cached"

    2930152+ 67948 = 2998100KB

    可回收Slab缓存

     

     = dentry + inode_cache + .....

    目录项缓存 和 索引缓存

    是通过 slab机制  /proc/meminfo 只给出了Slab 整体大小。

     sudo cat /proc/slabinfo | grep -E "^#|dentry|inode"

     dentry  目录项缓存 :  192

    inode  VFS索引节点缓存:  592

    sudo cat /proc/slabinfo | awk '{sum+=$4 } END {print sum} '

    91106.1   =  67948

    slabtop 查看占用内存最多的缓存类型。

  • 相关阅读:
    USASO Greedy Gift Givers
    Mat 类型用法
    OpenCV错误:Unhandled exception at 0x0133bc63 ....0xC0000005: Access violation reading location 0x00000004.
    C++ seekp 函数文件流跳转功能产生数据覆盖问题解决
    C++中文件名称必须是C风格的char*格式
    char*, char[] ,CString, string的转换
    Visual Stdio 2008 最大内存分配块大小问题: 使用new 分配连续723M内存 出错 std::bad_alloc at memory location 0x0013e0b8
    string类型转化为char*错误: error C2440: '=' : cannot convert from 'const char *' to 'char *'
    Mat 和 IplImage、CvMat格式的互相转换
    指针数组和数组指针
  • 原文地址:https://www.cnblogs.com/qifei-liu/p/15040141.html
Copyright © 2011-2022 走看看