Ядро Linux-что значит "поместить" индекс?

Я видел следующий комментарий поверх 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.
 */

для меня это звучит так, как будто это не" положить "что-нибудь, а" отбросить " его. Я знаю о drop_inode функция, которая вызывается из iput в некоторых случаях, поэтому использование термина " put " здесь еще более запутано.

3 ответов


put - распространенная терминология в коде ядра для уменьшения количества ссылок на объект. Это дополнение get, что увеличивает количество ссылок. Вы можете найти его много мест, а не только с inodes.

подсчеты ссылок используются для предотвращения уничтожения общих объектов до тех пор, пока они используются. Код с использованием объекта gets объект, использует его, затем puts это, чтобы освободить его.


iput напротив iget который ищет индекс, при необходимости выделяет для него память и возвращает ссылку на индекс абонент.

iput принимает этот индекс "назад", т. е. освобождает память, если это необходимо.

система счетчика ссылки, такая что один индекс можно использовать параллельно более чем одним абонентом и может поэтому быть удаленным (т. е. удаленным из памяти), если нет пользователя больше (каждый пользователь позвонил 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 будет иметь указатель inode на элемент в таблице I-node (также поддерживается ядром). Таблица I-node содержит всю информацию о файле (информация о файле и указатель на данные файла хранилища блоков)

при открытии файла элемент inode добавляется в таблицу I-node. Для того, чтобы достичь и освободить индекс быстрее, система будет поддерживать кэш индекса. Когда таблица I-node нуждается в новом элементе, она будет использовать iget () для получения индекса из кэша, а когда файл закрыт, он вернет связанный индекс в кэш с помощью iput ().

таким образом, iput() означает, что индекс помещается в кэш индекса, а удаление означает уменьшение ссылки на индекс в таблице I-node. См.на этой странице чтобы получить больше подробности.