2011. Машбук (1114722), страница 68
Текст из файла (страница 68)
Во-первых, это старт системы и инициализация устройств идрайверов. При старте система имеет перечень устройств, которые могут быть к нейподключены. Этот перечень — содержимое каталога /dev. После этого она просматриваетданный перечень и определяет те устройства, которые есть в наличии, а затем подключаетих посредством вызова соответствующей функции коммутатора (функции βioctl()).Во-вторых, это обработка запросов на обмен. Если процессу необходимопроизвести считывание или запись данных, то происходит обращение к соответствующейточке входа в драйвер.В-третьих, это обработка прерывания, связанного с данным устройством.Например, был инициирован обмен, и он закончился (успешно или неуспешно), или же полинии связи пришел какой-то сигнал, который необходимо обработать. В этом случаевозникает прерывание, обработка которого происходит в соответствующем драйвере.И, в-четвертых, это выполнение специальных команд управления устройством.Функции управления могут быть самыми разными, их наполнение зависит от конкретногоустройства и от конкретного драйвера.6.2.4 Включение, удаление драйверов из системыИзначально Unix-системы (как и большинство систем) предполагали «жесткое»статические встраивание драйверов в код ядра.
Это означало, что при добавлении новогодрайвера или удалении существующего необходимо было выполнить достаточнотрудоемкую операцию перетрансляции (когда ядро создается «с нуля») или, как минимум,перекомпоновку ядра (когда есть готовые объектные модули). Соответственно, этиоперации требовали серьезных навыков от системного администратора. Чтобыминимизировать число перекомпоновок ядра, надо было максимизировать числодрайверов, встроенных в систему.
Но такая модель была неэффективной, поскольку всистеме присутствовали драйверы, которые никак не используются.Альтернативной моделью, существующей и по сей день, является модельдинамического связывания драйверов. В этом случае в системе присутствуютпрограммные средства, позволяющие динамически, «на лету» подключить к254операционной системе тот или иной драйвер. Данная модель предполагает решениеследующих задач. Во-первых, это задача именования устройства. Во-вторых,инициализация драйвера (т.е. формирование системных областей данных и т.п.) иинициализация устройства (приведение устройства в начальное состояние). В-третьих,добавление данного драйвера в соответствующую таблицу драйверов устройств (либоблок-, либо байт-ориентированных). И наконец, «установка» обработчика прерывания, т.е.предоставление ядру информации, что при возникновении определенного прерыванияуправление необходимо передать в соответствующую точку входа в данный драйвер.Для реализации указанной модели в различных системах имеются разные средства:разные системные вызовы и, соответственно, разные команды; при этом обычноприсутствуют как команды подключения драйверов, так и симметричные командыудаления драйверов.6.2.5 Организация обмена данными с файламиВ этом разделе мы рассмотрим механизм организации обмена данными с файлами,рассмотрим, что происходит в системе, когда один и тот же файл открывается в системеодновременно несколькими процессами и в каждом из них, возможно, по нескольку раз.Для организации операций обмена в ОС Unix используются системные таблицы иструктуры, часть которых ассоциирована с каждым процессом (т.е.
они располагаются вадресном пространстве процесса), а часть — с самой ОС.Таблица открытых файлов (ТОФ) создается в адресном пространстве процесса.Каждая запись этой таблицы соответствует открытому в процессе файлу. Говоря о номередескриптора открытого в процессе файла (т.н. файлового дескриптора); подразумеваетсясоответствующий номер записи в таблице открытых файлов процесса. Размер даннойтаблицы определяется при настройке операционной системы: этот параметр декларируетпредельное количество открытых в одном процессе файлов.Каждая запись ТОФ содержит целый набор атрибутов, который в данный моментнам не интересен, но в этом наборе имеется один достаточно важный атрибут — этоссылка на номер записи в таблице файлов операционной системы (ТФ). Таблица файловОС является системной таблицей, она представлена в системе в единственном экземпляре.В этой таблице происходит регистрация всех открытых в системе файлов.В таблице файлов ОС помимо прочего содержатся такие атрибуты, как указательчтения/записи (ссылающийся на позицию в файле, начиная с которой будетпроисходить, соответственно, чтение или запись), счетчик кратности (речь о немпойдет ниже) и ссылка на таблицу индексных дескрипторов открытых файлов.Таблица индексных дескрипторов открытых файлов (ТИДОФ) также являетсясистемной структурой данных, содержащей перечень индексных дескрипторов всехфайлов, открытых в данный момент в системе.
Каждая запись этой таблицы содержитактуальную копию открытого в системе индексного дескриптора. Здесь также хранитсяцелый набор параметров, среди которых имеется и счетчик кратности.Для иллюстрации рассмотрим следующий пример (Рис. 158). Пусть в системезапущен Процесс1, для которого система при его создании сформировала ТОФ1. Затемэтот процесс, посредством обращения к системному вызову open(), открывает файл сименем name. Это означает, что в свободном месте этой таблицы заводится файловыйдескриптор для работы с данным файлом.
В этой записи ТОФ хранится ссылка насоответствующую запись в ТФ. Если файл открывается впервые в системе, то в ТФзаводится новая запись для работы с этим файлом. В данной записи хранится указательчтения/записи, а также коэффициент кратности, который в начале устанавливается взначение 1 — это означает, что с данной записью ТФ ассоциирована единственная записьиз какой-либо ТОФ.
И, конечно, в данной записи ТФ хранится ссылка на запись вТИДОФ, содержащую актуальную копию индексного дескриптора обрабатываемогофайла. Таблицы ТФ и ТИДОФ хранят оперативную информацию, поэтому они255располагаются в ОЗУ. Соответственно, файловая система, работая с блоками открытогофайла, оперирует данными, хранимыми именно в ТИДОФ.ТИДОФТОФ1ТФname22pointer1ТОФ3Дескрипт.1pointer2fork()nameТОФ2nameРис. 158.
Организация обмена данными с файлами.Пусть в системе позже был запущен Процесс2, который также открыл файл name. Вэтом случае в ТФ заводится новая запись, в которой устанавливается свой указательчтения/записи, но эта запись ТФ будет ссылаться на тот же номер записи в ТИДОФ. Такоймеханизм позволяет корректно (с системной точки зрения) обрабатывать ситуацииодновременной работы с одним и тем же файлом: поскольку в итоге все сводится кединственной актуальной копии индексного дескриптора в ТИДОФ, то работа ведется ссоответствующими блоками файла.
При этом данные процессы работают с файломкаждый «по-своему», т.к. каждый из них оперирует независимыми указателямичтения/записи, хранимыми в различных записях ТФ.Теперь предположим, что после открытия файла name, Процесс1 обращается ксистемному вызову fork() и порождает своего потомка — Процесс3. При обращении ксистемному вызову fork() ТОФ родительского процесса копируется в ТОФ сыновнегопроцесса. Соответственно, все записи ТОФ3 будут ссылаться на те же записи ТФ, что изаписи ТОФ1. Это означает, что при порождении сыновнего процесса в соответствующихзаписях ТФ происходит увеличение на 1 счетчика кратности. Заметим, что подобныймеханизм наследования подразумевает, что сыновний процесс будет работать с теми жеуказателями чтения/записи, что и родительский процесс.Рассмотренная модель организации обмена данными с файлами имеет своидостоинства и недостатки.
Так, ТИДОФ располагается в оперативной памяти. Этоозначает, что становится эффективнее работа с файловой системой, посколькууменьшается число обращений к пространству индексных дескрипторов файловойсистемы, т.е. этот механизм можно считать кэшированием системных обменов. Но этамодель имеет главный недостаток, связанный с некорректным завершением работыоперационной системы: если в системе происходит сбой, то содержимое ТИДОФ будетпотеряно, а это означает, что будут потери и в файловой системе.6.2.6 Буферизация при блок-ориентированном обменеОдним из достоинств ОС Unix является организация многоуровневой буферизациипри выполнении неэффективных действий.
В частности, для организации блокориентированных обменов система использует стандартную стратегию кэширования. Вседействия тут те же самые (вплоть до отдельных нюансов). Цель кэширования —минимизация обменов с внешними устройствами.256Для буферизации используют пул буферов, размером в один блок каждый. Вкратцерассмотрим алгоритм, состоящий из пяти действий.1. Поиск заданного блока в буферном пуле. Если удачно, то переход на п.42. Поиск буфера в буферном пуле для чтения и размещения заданного блока.3. Чтение блока в найденный буфер.4. Изменение счетчика времени во всех буферах.5.
Содержимое данного буфера передается в качестве результата.Итак, повторимся: ОС Unix была одной из первых массово распространенныхоперационных систем, использующих кэширование дисковых обменов. Соответственно,за счет минимизации реальных обращений к физическим устройствам работа системыболее эффективная. Но эта организация системы имеет и свои очевидные недостатки. Вопервых, кэширование дисковых обменов приводит к тому, что имеется несоответствиереального содержимого диска и того содержимого, которое должно быть на нем.Соответственно, при сбое системы возможна потеря информации в КЭШах,расположенных в оперативной памяти. В частности, при сбое возможна потеряиндексного дескриптора.