Понимание концепции Inodes
Я имею в виду ссылку на понятия Inodes
Я запутался в деталях:
- 12 прямых указателей на блоки
- 1 одиночный косвенный указатель блока
- 1 двойной косвенный указатель на блок
- 1 тройной косвенный блок указатель
Теперь диаграмма говорит, что каждый указатель имеет 32/64 бита.
- [Запрос]: Почему и как эти значения выводятся? Я имею в виду, почему конкретно есть только 32 или 64-битные указатели?
Диаграмма гласит: один блок данных {8 КБ} для каждого указателя {4 байта /8 байтов}
- [Запрос]: Как это на самом деле работает? то есть 8*1024 байта /8 байтов = 1024 байта? Какова логика наличия 8-байтового указателя для блока 8 КБ?
3 ответа
Упомянутые указатели являются адресами блоков диска - каждый указатель содержит информацию, необходимую для идентификации блока на диске. Поскольку каждый дисковый блок занимает не менее 512 байтов (иногда 4096 или 8192 байта), при использовании 32-битных адресов диск может адресовать до 512 * 4 * 10243 = 2 ТиБ (Тебибайт - чаще называемый терабайтами), предполагая 1/2 КиБ блоки; соответственно большие размеры при увеличении размера блока (таким образом, 32 ТиБ при размере блока 8 КиБ). Для схемы адресации для больших дисков вам придется перейти на больший размер блока или больший адрес диска - следовательно, 48-битные или 64-битные адреса могут быть правдоподобными.
Итак, чтобы ответить на вопрос 1, 32-битный код является общим размером для многих вещей. Очень часто, когда 32 бита уже недостаточно велики, следующий разумный размер - 64 бита.
Ответ на вопрос 2:
Если для блока данных по 8 КБ используется файл размером 96 КБ или менее, он использует 12 дисков или менее на диске, и все эти адреса блоков сохраняются непосредственно в самом inode.
Когда размер файла увеличивается, драйвер диска выделяет один косвенный блок и записывает его в inode. Когда драйверу нужно получить блок, он считывает косвенный блок в память, а затем находит адрес нужного ему блока из косвенного блока. Таким образом, для получения данных требуется (номинально) две операции чтения, хотя, конечно, косвенные данные обычно кэшируются в памяти.
С размером блока 8 КиБ и 4-байтовыми адресами дисков вы можете разместить 2048 адресов дисков в одном косвенном блоке. Таким образом, для файлов размером от 96 КиБ + 1 байт до 16 МБ или около того существует только один косвенный блок.
Если файл становится еще больше, драйвер выделяет двойной косвенный блок. Каждый указатель в двойном косвенном блоке указывает на один косвенный блок. Таким образом, вы можете иметь еще 2048 косвенных блоков, каждый из которых может эффективно указывать на 16 МБ, что приводит к сохранению файлов до 32 ГБ (приблизительно).
Если файл становится еще больше, драйвер выделяет тройной косвенный блок. Каждый из 2048 указателей в тройном непрямом блоке указывает на двойной блок. Таким образом, в рамках 32-разрядной схемы адресации с 32-разрядными адресами можно адресовать файлы размером до 64 ТиБ. За исключением того, что до этого у вас заканчивались адреса дисков (максимум 32 ТиБ из-за 32-битных адресов на 8 блоков по КиБ).
Таким образом, структура inode может обрабатывать файлы, размер которых превышает 32-битные адреса дисков.
Я оставлю это в качестве упражнения для читателя, чтобы увидеть, как все меняется с 64-битными адресами дисков.
Пример расчета максимального размера файла
* Assume that there are 10 direct pointers to data blocks, 1 indirect pointer, 1 double indirect pointer, and 1 triple indirect pointer
* Assume that the size of the data blocks is 1024 bytes = 1Kb, i.e., BlockSize = 1Kb
* Assume that the block numbers are represented as 4 byte unsigned integers, i.e., BlockNumberSize = 4b
* Some data blocks are used as index blocks. They store 1024 bytes / 4 bytes/entry = 256 entries
* Maximum number of bytes addressed by 10 direct pointers is
= Number of direct pointers * Blocksize
= 10 * 1Kb
= 10Kb
* Maximum number of bytes addressed by single indirect pointer is
= NumberOfEntries * BlockSize
= (Blocksize / BlockNumberSize) * BlockSize
= (1Kb / 4b) * 1Kb
= 256 * 1Kb
= 256Kb
* Maximum number of bytes addressed by double indirect pointer is
= NumberOfEntries^2 * BlockSize
= (Blocksize / BlockNumberSize)^2 * BlockSize
= (1Kb / 4b)^2 * 1Kb
= (2^10 / 2^2)^2 * (2^10b)
= (2^8)^2 * (2^10)b
= (2^16) * (2^10)b
= 2^6 * 2^20 b
= 64 Mb
* Maximum number of bytes addressed by triple indirect pointer is
= NumberOfEntries^3 * BlockSize
= (Blocksize / BlockNumberSize)^3 * BlockSize
= (1Kb / 4b)^3 * 1Kb
= (2^10 / 2^2)^3 * (2^10b)
= (2^8)^3 * (2^10)b
= (2^24) * (2^10)b
= 2^4 * 2^30 b
= 16 Gb
* Maximum file size is 16Gb + 64Mb + 266Kb
Прежде чем дать ответы, вы должны понять, как работает файловая система:
Всякий раз, когда пользователь или программа ссылаются на файл по имени, операционная система использует это имя для поиска соответствующего inode, что затем позволяет системе получать необходимую информацию о файле для выполнения дальнейших операций. Таким образом, имя файла в Unix-подобной операционной системе является просто записью в таблице с номерами инодов, а не связано непосредственно с файлом (в отличие от других операционных систем, таких как системы Microsoft Windows). Номера инодов и соответствующие им иноды хранятся в таблицах инодов, которые хранятся в стратегических местах в файловой системе, в том числе рядом с ее началом.
Ответ на первый вопрос заключается в том, что битовое пространство занимает все 32 или 64 бита. просто он составляет 2^32, и он достаточно большой, чтобы определить все эти переменные. Также для дальнейшего использования он должен знать размер битов для операций. В вашем примере они просто определены таким образом.
Во-вторых, каждый указатель (размер зависит от емкости вашего диска) ссылается на блок данных (8 КБ на диске, диск имеет блоки), но имейте в виду, что файловая система Unix имеет иерархическую структуру. Таблица, которая указывает на множество других таблиц и, наконец, последняя таблица указывает на блок данных.
Я предлагаю вам просмотреть эту книгу, очень полезную для понимания файловой системы Unix.