2015-12-03 31 views
7

sah ich den folgenden Kommentar oben auf der iput Funktion:Linux Kernel - Was bedeutet es, einen Inode zu "putten"?

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

Für mich klingt es nicht ist alles „setzen“, aber es „fallen“. Ich bin mir der drop_inode Funktion bewusst, die in einigen Fällen von iput aufgerufen wird, so dass die Verwendung des Begriffs "Put" hier noch verwirrender ist.

Antwort

6

put ist gemeinsame Terminologie in Kernel-Code zum Dekrementieren einer Referenzzählung des Objekts. Es ist das Komplement von get, das den Referenzzähler erhöht. Sie können es viele Orte finden, nicht nur mit Inoden.

Referenzzählungen werden verwendet, um zu verhindern, dass gemeinsame Objekte zerstört werden, solange sie verwendet werden. Code mit einem Objekt get s das Objekt, verwendet es, dann put s es, um es zu lösen.

3

iput ist das Gegenteil von iget die für einen inode sucht, Speicher zuweist für die es notwendig, wenn und gibt eine Referenz auf die inode zum Anrufer.

nimmt diesen Inode "zurück", d. H. Gibt den Speicher bei Bedarf frei.

Es ist ein Referenzzählersystem, so dass eine inode parallel von mehr als ein Anrufer verwendet werden kann, und fiel nur deshalb werden kann (dh aus dem Speicher entfernt), wenn kein Benutzer davon ist mehr (jede Benutzer hat iput aufgerufen).

/** 
* 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) 
1

Grundsätzlich hat ein Prozess eine File Descriptor Table, die einen Dateizeiger auf die Dateien enthält, die der Prozess geöffnet hat, der Dateizeiger ist eigentlich ein Zeiger auf ein Element der Open File Table (die vom Kernel verwaltet wird). Und die Open File Table wird einen Inode Pointer Point auf das Item in der I-Node Table haben (ebenfalls vom Kernel verwaltet). Die I-Node-Tabelle enthält alle Informationen der Datei (Dateiinformationen und Zeiger auf Blöcke speichern Dateidaten)

Wenn Sie eine Datei öffnen, wird ein Inode-Element zur I-Node-Tabelle hinzugefügt. Um Inode schneller zu erreichen und freizugeben, wird das System einen Inode-Cache beibehalten. Wenn die I-Knoten-Tabelle ein neues Element benötigt, verwendet sie iget(), um einen Inode aus dem Cache zu holen, und wenn eine Datei geschlossen wird, gibt sie den zugehörigen Inode unter Verwendung von iput() an den Cache zurück.

Also die iput() bedeutet PUT die Inode zum Inode-Cache, und DROPPING bedeutet, reduzieren Sie die Referenz eines Inode in der I-Knoten-Tabelle. Weitere Informationen finden Sie unter this page.