我在iput
函数上面看到以下评论:
/** * iput - put an inode * @inode: inode to put * * Puts an inode, dropping its usage count. If the inode use count hits * zero, the inode is then freed and may also be destroyed. * * Consequently, iput() can sleep. */
对我来说,这听起来不是“放”什么,而是“放”它。 我知道在某些情况下从iput
调用的drop_inode
函数,所以术语“put”的用法在这里更加令人困惑。
put
是内核代码中用于递减对象引用计数的常用术语。 这是get
的补充,增加了引用计数。 你可以找到很多地方,而不仅仅是inode。
引用计数用于保持共享对象不被破坏,只要它们在使用中。 使用对象的代码get
对象,使用它,然后put
它释放它。
iput
与iget
相反,它搜索inode,必要时为它分配内存,并向调用者返回对inode的引用。
iput
把这个inode“回来”,即释放内存,如果需要的话。
有一个引用计数器系统,这样一个inode可以由多个调用者并行使用,因此如果没有用户(每个用户都称为iput
),则只能被丢弃(即从内存中删除)。
/** * iget_locked - obtain an inode from a mounted file system * @sb: super block of file system * @ino: inode number to get * * Search for the inode specified by @ino in the inode cache and if present * return it with an increased reference count. This is for file systems * where the inode number is sufficient for unique identification of an inode. * * If the inode is not in cache, allocate a new inode and return it locked, * hashed, and with the I_NEW flag set. The file system gets to fill it in * before unlocking it via unlock_new_inode(). */ struct inode *iget_locked(struct super_block *sb, unsigned long ino)
基本上,一个进程有一个文件描述符表,其中包括一个文件指针指向进程打开的文件,文件指针实际上是指向Open File Table(由内核维护)的项目的指针指针。 Open File Table将有一个inode指针,指向I节点表中的项目(也由内核维护)。 I节点表包含文件的所有信息(文件信息和指向块存储文件数据的指针)
当你打开一个文件时,一个inode项被添加到I节点表中。 为了更快地实现和释放inode,系统将维护一个inode缓存。 当I节点表需要一个新项时,它将使用iget()从缓存中获取一个inode,当一个文件关闭时,它会使用iput()将相关的inode返回到缓存。
因此,iput()意味着将inode放入inode缓存中,DROPPING意味着减少I节点表中inode的引用。 请参阅此页面以获取更多详细信息。