Linux 内核 - "put" 一个 inode 是什么意思?

Linux Kernel - What does it mean to "put" an inode?

我在 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.
 */

对我来说,这听起来像是 "putting" 什么都不是,而是 "dropping"。我知道 drop_inode 函数,它在某些情况下会从 iput 调用,因此术语 "put" 的用法在这里更加令人困惑。

iputiget 相反,它搜索一个 inode, 如有必要,为其分配内存,并 returns 对 inode 的引用 来电者。

iput 获取此 inode "back",即在需要时释放内存。

有引用计数器系统,可以使用一个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)

put 是内核代码中用于递减对象引用计数的常用术语。它是 get 的补码,它增加了引用计数。您可以在很多地方找到它,而不仅仅是 inode。

引用计数用于防止共享对象在使用期间被销毁。使用对象的代码 get 对象,使用它,然后 put 释放它。

基本上一个进程有一个文件描述符Table,其中包括一个指向进程打开的文件的文件指针,文件指针实际上是指向打开文件的一项的指针Table(由内核维护)。打开文件 Table 将有一个 inode 指针指向 I-node Table 中的项目(也由内核维护)。 I节点table包含文件的所有信息(文件信息和指向存储文件数据的块的指针)

当您打开一个文件时,一个 inode 项目被添加到 I-node table。为了更快的实现和释放inode,系统会维护一个inode缓存。当i节点Table需要一个新的item时,它会使用iget()从缓存中获取一个inode,当一个文件关闭时,它会return将相关的inode放到缓存中使用输入().

所以iput()表示PUT inode到inode cache,DROPPING表示减少I-node中某个inode的引用Table。请参阅 this page 以获取更多详细信息。