Без дальнейшего контекста неясно, говорит ли Stalling о таблице inode в памяти или о таблицах в файловой системе. Я одолжил кому-то намного более раннее издание книги, но так и не получил его; поэтому я не могу посмотреть контекст самостоятельно.
Существует три «файловых таблицы», но обсуждаемую здесь чаще называют « таблицей inode в памяти »; вторая обычно называется « таблицей открытых файлов » и существует для каждого процесса. Обе таблицы находятся в памяти ядра и не доступны для программы. Третья «таблица» на самом деле представляет собой два набора таблиц в файловой системе (на диске), первая - это таблица inode на диске, а вторая - сами блоки данных (примечание: это обсуждение касается традиционного управления файловой системой UNIX, более новые системы могут есть разные организации). Записи в таблице индексов имеют последовательности ссылок на блоки данных, которые содержат либо косвенные ссылочные блоки, либо фактические данные. Ключ к файлув файловой системе находится индекс, а не сами блоки данных. Когда Stalling говорит о «файловой таблице» на диске, обычно это будет «меньшая» таблица на диске, которая обозначает файлы, такие как таблица inode или таблица определения блоков в системах FAT.
С точки зрения таблицы inode в памяти, inode загружается из файловой системы, его значение st_nlink увеличивается, а затем становится доступным для остальной системы, когда данные inode записываются на диск, st_ctime обновляется. Если индекс больше не нужен в памяти, значение st_nlink уменьшается, и запись в таблице помечается как свободная. Каждый процесс начнется со ссылками на три или пять записей в памяти в таблицу инф.узлов: иноды из stdin
, stdout
, stderr
- это часто файл устройство (терминал) - а затем ссылки на текущий каталог и корневой каталог. Инод будет находиться в таблице только один раз, поэтому в таблице может быть несколько ссылок на один инод.
Таблица открытых файлов сохраняется для каждого процесса и содержит ссылки на таблицу inode в памяти, а также указатели на буферы и информацию о состоянии (например, fseek(2)
значение и флаги из open(2)
. Дескриптор файла является буквально индексом в таблице открытых файлов; но большинство люди обращаются к записи в таблице открытых файлов, когда говорят о «дескрипторе файла».
Когда файл открывается с использованием open(2)
доступной записи в таблице открытых файлов, определяется индекс узла с указанием пути к файлу, этот индекс загружается в таблицу индексов в памяти, если он еще не загружен, счетчик st_nlink увеличивается, и запись дескриптора указывается в дескрипторе файла, устанавливаются флаги и выделяются буферы. В закрытом состоянии происходит обратное.
Подпрограммы в ядре называются « системой управления файлами », а « файловая система » - это организация на диске. В настоящее время существует несколько «подключаемых» модулей, которые могут быть загружены ( modprobe(8)
) в систему управления файлами для различных организаций на диске. Например, существуют типы файловых систем ext2 / ext3 / ext4, и у каждого из них есть свой модуль в системе управления файлами ядра; то же самое с ntfs, sbfs, nfs, vfat, jfs и т. д.
Это немного сложнее, чем я планировал, поэтому я на этом остановлюсь.