• 进程表/文件表/inode/vnode


      一般我们讲,都说进程有文件描述符表,文件描述符表中的指针指向某个inode,这中间省略了file,dentry对象,对准确理解VFS结构无益,本文结合网络所查,并根据APUE8.3和LKD13.11章节校对,总结在下,希望有用。  

      内核中,对应于每个进程都有一个文件描述符表,表示这个进程打开的所有文件。文件描述表中每一项都是一个指针,指向一个用于描述打开的文件的数据块———file对象,file对象中描述了文件的打开模式,读写位置等重要信息,当进程打开一个文件时,内核就会创建一个新的file对象。需要注意的是,file对象不是专属于某个进程的,不同进程的文件描述符表中的指针可以指向相同的file对象,从而共享这个打开的文件。file对象有引用计数,记录了引用这个对象的文件描述符个数,只有当引用计数为0时,内核才销毁file对象,因此某个进程关闭文件,不影响与之共享同一个file对象的进程.

      file对象中包含一个指针,指向dentry对象。dentry对象代表一个独立的文件路径,如果一个文件路径被打开多次,那么会建立多个file对象,但它们都指向同一个dentry对象。
      dentry对象中又包含一个指向inode对象的指针。inode对象代表一个独立文件。因为存在硬链接与符号链接,因此不同的dentry对象可以指向相同的inode对象.inode 对象包含了最终对文件进行操作所需的所有信息,如文件系统类型、文件的操作方法、文件的权限、访问日期等。
      打开文件后,进程得到的文件描述符实质上就是文件描述符表的下标,内核根据这个下标值去访问相应的文件对象,从而实现对文件的操作。



      注意,同一个进程多次打开同一个文件时,内核会创建多个file对象。
      当进程使用fork系统调用创建一个子进程后,子进程将继承父进程的文件描述符表,因此在父进程中打开的文件可以在子进程中用同一个描述符访问。

     
      关于vnode节点,是VFS一部分,我还没来得及查证,但是如MOS(《现代操作系统》)10.6.4节所说,vnode用以识别inode是本地还是远程的,属于NFS的思想。日后再补。
     
  • 相关阅读:
    2018ICPC青岛I Soldier Game (线段树)
    2018icpc青岛
    HDU2899 Strange fuction(模拟退火)
    CF833B The Bakery(线段树维护dp)
    CF685B Kay and Snowflake(重心性质)
    使用paramiko模块远程连接遇到paramiko.ssh_exception.NoValidConnectionsError的解决办法
    django中使用celery异步发送邮件
    Celey异步发送邮件时报django.core.exceptions.ImproperlyConfigured的解决办法
    ubantu中安装redis及遇到的问题
    Celery异步处理任务时遇到的错误ValueError: not enough values to unpack (expected 3, got 0)
  • 原文地址:https://www.cnblogs.com/zhaoyl/p/2502010.html
Copyright © 2020-2023  润新知