содержание
- предисловие
- структура файловой системы
- Новый файл и индекс
- процесс создания файла
- синтаксический анализ инода
- открыть файл
- Ссылаться на
- Наконец
предисловие
На этот раз давайте поговорим о файловой системе. Файловая система очень важна. Улучшение использования диска, снижение износа диска и т. д. — это все проблемы, которые должны решать файловые системы. На рынке существует бесчисленное множество файловых систем, и чем больше часто используемые, такие какext4, xfsа такжеntfsПодожди, отечественные как гусиные фабричныеtfs, а затем солнце называется "последнее слово в файловой системе"ZFS, от изучения ZFSbtrfs.
предыдущий нижеСхема архитектуры компонентов файловой системы Linux, нарисовал интегрировав несколько литератур и объединив собственный опыт.Видно что самое главное этоvfsИменно потому, что это было так, что Linux может поддерживать несколько файловых систем. Например, вы установили двойную систему, такие как Mint + Windows, в MINT, вы можете увидеть Windows NTFS Disk, но возвращается в Windows, вы не увидите диск мяты.
Какие файловые системы поддерживает Linux Зайдите в папку fs исходников, там много файловых систем, поддерживаемых Linux, обратите внимание на синие.
структура файловой системы
Про секторы диска много говорить не буду.Может будет статья о носителях,о структуре ssd.Пропустим железо и начнем со структуры файловой системы.Заметьте,я говорю об общей модели,каждой конкретной реализация fs отличается, и разница довольно велика.Семейство ext является fs по умолчанию в Linux.На самом деле, ext2/ext3 и ext4 также очень разные.
- superblock: Запишите общую информацию об этой файловой системе, включая общее количество инодов/блоков, использование, оставшееся количество, а также формат и связанную информацию о файловой системе;
- inode table: После суперблока идет таблица инодов, в которой хранятся все иноды.
- data block: После таблицы инодов находится блок данных.В этой области хранится содержимое файла.Все блоки на диске имеют одинаковый размер.
- inode: Запишите свойства файла, запишите номер блока этого файла в этом файле.Каждый индексный дескриптор соответствует структуре файла/каталога, которая содержит длину файла, время создания и изменения, разрешения, отношения, расположение диска и другую информацию. .
- block: Собственно запись содержимого файла.Большой файл легко распределяется по тысячам уникальных дисковых блоков и вообще не сплошной, слишком разбросанный приведет к резкому падению производительности чтения и записи.
Что ж, я думаю, вы правы, как и я, как на картинке выше:
Видно, что это файловая система с многоуровневой структурой индекса, лучшим решением является использование дерева b+, напримерbtrfs.inode table указывает на inode, inode указывает на один или несколько блоков, обратите внимание, что рисунок по-прежнему указывает прямо, что будет описано позжемногослойное наведение.Больше всего опасается, что блок, на который указывает inode, слишком разбросан.Лучшее решение —Данные продолжают добавлять до конца файлаНе новый файл.
Новый файл и индекс
Создайте новый файл и папку и используйте команду stat для просмотра информации о файле.
touch hello
stat hello
mkdir hellodir
stat hellodir
Вы можете увидеть некоторую информацию, например, начальный размер каталога 4 КБ, 8 блоков, сектор 512 байт, а блок ввода-вывода 4 КБ, что соответствует первой картинке.General Block Device LayerLayer.Эти на самом деле известны не глядя, при условии, что это обычная фс.
процесс создания файла
Есть 4 шага для успешного создания файла:
- свойство хранения: То есть при хранении атрибутов файла ядро сначала находит пустой инод.Например предыдущий 1049143.Ядро записывает информацию о файле.Такую как размер файла,владелец файла и время создания и т. д. можно увидеть с помощью команды stat прибытия.
- Хранение данных: То есть хранение файлового содержимого, например для создания файла 1Б, что один блок, 8 секторов, ядро кладет данные в свободный логический блок, то есть свободный блок.Очевидно, проблема фрагментации появился здесь. Да. 1B тоже будет использовать 4K, верно?
- запись заданий: Если данные хранятся в 3 блоках, позиция должна быть записана в списке серийный номер диска Inode. Эти 3 номера помещаются в первые 3 позиции. Затем при чтении он будет прочитан одновременно, вы можете увидеть мой вторая картинка. КонечноfatИндексного дескриптора нет, он помещает позицию следующего блока в блок, чтобы сформировать цепочку, а диск u — это своего рода fs.
- Добавить имя файла в каталог: Соответствие между именем файла и индексом связывает имя файла с файлом и атрибутами содержимого файла.Если имя файла найдено, можно найти индекс файла, а также атрибуты и содержимое файла. можно найти через inode.Люди смотрят на соединения, такие как URL и ip.Конечно, если вы можете различать файлы, глядя на inode, четвертый шаг не требуется (вручную забавно).
Если есть каталог, то есть еще .файлы (указывая на себя), ..файлы (указывая на каталог верхнего уровня).Тогда добавьте свой инод в каталог верхнего уровня.Вы можете понять это за секунды, посмотрев на картинке.
синтаксический анализ инода
Используйте команду df, чтобы увидеть общее количество и использование инодов.
df -i
Dumpe2FS открывает указанный диск, чтобы увидеть размер индекса, вот 256.
Как inode записывает файл и сколько максимум? Область, в которой inode записывает номер блока, определяется как 12 прямой, один косвенный, один двойной непрямой и одна трехсторонняя косвенные зоны записи. Инод 4b, поэтому 4k Блок может иметь 1К inodes.
- Прямой: 12*4К
- Косвенный: (4K / 4) * 4K
- Двойной непрямой: (4K/4) * (4K/4) * 4K
- Три непрямых: (4K/4) * (4K/4) * (4K/4) * 4K
Итак, 4Т, ты в порядке? В конце концов, ФС постоянно развивается, и это устаревший размер. В Ext4 один файл может достигать 16 ТБ, а FS может достигать 1eb. Но обратите внимание, автор Ext4 сказал, Ext4 Это только переход, BTRFS будет лучше, на самом деле, XFS, используемые Cent OS, также очень хорошо.
открыть файл
Конечно, его нужно открыть после создания.Существует также ряд процессов для открытия файла.Давайте сначала рассмотрим две команды:
sysctl -a | grep fs.file-max
ulimit -n
- Первая команда смотрит на максимальное количество открытых ОС, т.е.Ограничения на системном уровне.
- Вторая команда смотрит на максимальное открытое число одного процесса, т.е.Ограничения на уровне пользователя.
- Дескриптор процесса (task_struct):
- Чтобы управлять процессами, операционная система должна четко описывать, что делает каждый процесс.С этой целью операционная система использует структуры данных для представления различных обрабатываемых объектов.Эта структура данных обычно называетсядескриптор процессаилиБлок управления технологическим процессом (PCB)Говоря простым языком, структура, описывающая процесс в операционной системе, называется PCB.
- Ядро Linux работает черездескриптор процессаизструктура task_structДля управления процессом эта структура содержит всю информацию, необходимую процессу.Она определена в файле include/linux/sched.h.Это не основное внимание в этот раз, но эта структура task_struct действительно важна и сложна.
- Каждому процессу будет выделена структура task_struct, которая содержит всю информацию о процессе, и информация этой структуры может быть отслежена операционной системой в любое время.
-
таблица файловых дескрипторов (file_struct): В этой таблице записываются файлы, открытые процессом.В записи этой таблицы есть указатель, указывающий на файл, хранящийся в пространстве ядра.Файловая таблицаЗапись в формате . Она предоставляет пользователю простойДескриптор документа (FD), чтобы пользователи могли легко получить доступ к файлу. Например, когда процесс использует open для открытия файла, ядро добавит запись в эту таблицу. Если один и тот же файл открывается несколько раз, будет несколько записей. dup, запись также будет добавлена.
-
файловая таблица: В таблице файлов сохраняется смещение чтения и записи файла процессом, в таблице также сохраняются права доступа процесса к файлу и т. д. Например, процесс открывает файл в режиме O_RDONLY, что будет записано в соответствующий файл table entry , Затем каждая таблица имеет указатель на индекс в таблице индексов. В сочетании с предыдущим изображением все структуры связаны, поэтому индекс является основной точкой.
Над картинкой выше:
- В процессе A файловые дескрипторы 1 и 2 указывают на одну и ту же открытую файловую таблицу A. Это может быть вызвано многократным вызовом dup(), dup2(), fcntl() или вызовом open() для одного и того же файла, сформированного функцией .
- И файловый дескриптор 0 процесса A, и файловый дескриптор 2 процесса B указывают на одну и ту же открытую файловую таблицу A. Такая ситуация может возникнуть после вызова fork() (т. передает дескриптор открытого файла другому процессу через сокет домена UNIX. Более того, разные процессы вызывают функцию открытия, чтобы открыть тот же файл самостоятельно. В это время внутренние дескрипторы процесса выделяются точно так же, как другие процессы открывают файл.
- Кроме того, дескриптор 0 процесса A и дескриптор 255 процесса B указывают на разные таблицы открытых файлов, но все эти таблицы файлов указывают на одну и ту же запись в таблице inode (гипотетически), то есть указывают на один и тот же файл. каждый процесс выдал вызов open() одному и тому же файлу. Аналогичная ситуация возникает, когда один и тот же процесс дважды открывает один и тот же файл.
Почему вы говорите об этих ситуациях?Потому что, если вы не понимаете их ясно, это, скорее всего, вызовет путаницу при чтении и записи при выполнении многопроцессорного и многопоточного чтения и записи.
Ссылаться на
Я прочитал много замечательных статей и делюсь ими здесь.
- blog.CSDN.net/Новости месяца…
- 呜呜 .ibm.com / Weveloper Me ...
- От. Net / Cpp / HTML / 27 ...
- Вууху. Руан Ифэн.com/blog/2011/1…
- ву ву ву.cn блог на.com/teenager 10…
- blog.CSDN.net/Дай мне бояться/Аретти…
- blog.CSDN.net/Camel44/AR…
- blog.CSDN.net/M ошибка 2/Аретти…
- Блог.csdn.net/u014379540/...
- zhuanlan.zhihu.com/p/34280875
- blog.CSDN.net/Ga posts/art…
- git source.com/2017/07/30/…
Наконец
На этот раз мы будем постепенно отделять файловую систему от структуры.Inode является основным моментом.Конечно, будет две или более последующих статей.И наконец, я напишу простую файловую систему пользовательского режима.Если хотите это, не забудьте поставить лайк или подписаться на меня~