Linux Kernel (Ядро линукса) (часть 2)


Общая файловая модель

Основная идея, лежащая в основе VFS, сводится к созданию общей файловой модели, способной представить все поддерживаемые файловые системы. Эта модель строго отражает файловую модель традиционной файловой системы Unix, что неудивительно, поскольку Linux стремится работать со своей "родной” файловой системой с минимальными накладными расходами. Однако реализация каждой конкретной файловой системы должна отображать свою физическую организацию в общую файловую модель VFS.

Например, в общей файловой модели каждый каталог считается файлом, который содержит список файлов и других каталогов. Однако некоторые файловые системы в ОС, отличных от Unix, используют таблицу размещения файлов (FAT), в которой хранится адрес каждого файла из дерева каталогов. В таких файловых системах каталоги не являются файлами. Чтобы удовлетворять требованиям общей файловой модели VFS, реализация файловой системы, работающей с FAT, в операционной системе Linux должна быть в состоянии динамически создавать файлы, соответствующие каталогам, когда потребуется. Такие файлы существуют только как объекты в памяти ядра.

Что более важно, в ядре Linux нельзя жестко закодировать какую-то конкретную функцию для обработки операции, например, read или iocti . Вместо этого приходится использовать указатель, которому присваивается адрес соответствующей функции в конкретной файловой системе.

Чтобы проиллюстрировать этот подход, покажем, как функция read , , может быть транслирована ядром в вызов, специфичный для файловой системы MS-DOS. Когда приложение вызывает read , ядро обращается к служебной процедуре sys reado, как сделал бы любой другой системный вызов. Как мы увидим далее в этой главе, файл представлен структурой file в памяти ядра. Эта структура имеет поле f op, содержащее указатели на функции, специфичные файловой системы MS-DOS, в том числе и на функцию чтения файла. Процедура sys read находит указатель на эту функцию и вызывает ее. Таким образом, вызов read о превращается в непрямой вызов:
file->f_op->read
Аналогичным образом, функция write обеспечивает выполнение функции записи из файловой системы Ext2, которая пишет в выходной файл. Короче говоря, ядро ответственно за присваивание соответствующего набора указателей переменной file, ассоциированной с каждым открытым файлом, а затем — за вызов функции, специфичной для каждой файловой системы, на которую указывает поле f op.

Можно считать общую файловую модель объектно-ориентированной. Тогда объектом будет программная конструкция, определяющая как структуру данных, так и методы, работающие с ней. Из соображений эффективности, система Linux не кодируется на объектно-ориентированном языке, таком как C++. Объекты реализованы в виде простых структур данных языка С, причем некоторые их поля указывают на функции, соответствующие методам этого объекта.
Общая файловая модель включает в себя следующие типы объектов:
- суперблок — этот объект хранит информацию, относящуюся к смонтированной файловой системе. В случае дисковых операционных систем он обычно соответствует управляющему блоку файловой системы, хранящемуся на диске;
- индексный дескриптор — этот объект хранит в себе общую информацию о конкретном файле. В случае дисковых операционных систем он обычно соответствует управляющему блоку файла, хранящемуся на диске. Каждый индексный дескриптор связан со специальным номером, уникально идентифицирующим файл в файловой системе;
- файловый объект— этот объект хранит информацию о взаимодействии процесса с открытым файлом. Информация фактически присутствует только в памяти ядра в течение того времени, когда процесс имеет открытый файл;
- элемент каталога — этот объект хранит информацию о связи записи в каталоге с файлом (иными словами, конкретное имя файла). Каждая дисковая файловая система хранит эту информацию на диске специфичным для себя способом.

Три разных процесса открыли один файл, причем два из них пользуются одной жесткой ссылкой. В этом случае каждый из трех процессов
работает с собственным объектом, в то время как требуются только два объекта элемент каталога”, по одному на каждую жесткую ссылку. Оба объекта элемент каталога” ссылаются на один объект индексный дескриптор”, который идентифицирует объект-суперблок и вместе с ним обычный файл на диске
Помимо предоставления общего интерфейса ко всем реализациям файловых систем, VFS играет важную роль, имеющую отношение к производительности системы. Самые свежие” объекты элемент каталога” содержатся в кэше диска, называемом кэшем элементов каталога. Это ускоряет трансляцию пути к файлу в объект индексный дескриптор” последнего компонента пути.

Вообще говоря, кэш диска является программным механизмом, позволяющим ядру держать в оперативной памяти информацию, которая в нормальной ситуации хранится на диске. Это позволяет быстрее обращаться к данным, избегая дисковых операций, которые сами по себе выполняются медленно.
Обратите внимание на отличие дискового кэша от аппаратного кэша или кэша памяти, которые не имеют никакого отношения к дискам и другим устройствам. Аппаратный кэш — быстрая статическая оперативная память, которая ускоряет выполнение запросов к более медленной динамической оперативной памяти Кэш памяти— программный механизм, введенный для того, чтобы обойти аллокатор памяти ядра.
Кроме кэша элементов каталога и кэша индексных дескрипторов, в Linux применяются и другие дисковые кэши. Самый важный из них — кэш страниц.

Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без про...

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга...

Linux Kernel (Ядро линукса) (ч...

Спин-блокировкаСпин-блокировка необходима в многопроцессорной системе, потому что могут возникнуть...

Linux Kernel (Ядро линукса) (ч...

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно...

Linux Kernel (Ядро линукса) (ч...

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer...