Курынин Р.В., Машечкин И.В., Терехин А.Н. - Конспект лекций по ОС (1114685), страница 58
Текст из файла (страница 58)
Например, для таймера скорее всего будутотсутствовать функции чтения и записи, причем при попытке чтения или записи система должна«ругнуться» (т.е. заглушка типа nodev()).Некоторые из перечисленных точек входа являются специализированными. С помощьюфункции βioctl() можно производить разного рода настройки и управление драйвером. Функцияβintr() вызывается при поступлении прерывания, ассоциированного с данным устройством.Традиционно часть функций драйверов может быть реализовано синхронным способом, адругая часть — асинхронным способом. Соответственно, синхронная часть драйвера называетсяtop half, а асинхронная — bottom half.6.2.3Ситуации, вызывающие обращение к функциям драйвераСписок ситуаций, при которых происходит обращение к функциям драйверов, четкодетерминирован.
Во-первых, это старт системы и инициализация устройств и драйверов. Пристарте системы она имеет перечень устройств, которые могут быть к ней подключены. Этотперечень — содержимое каталога /dev. После этого она просматривает данный перечень иопределяет те устройства, которые есть в наличии, а затем подключает их посредством вызовасоответствующей функции коммутатора (функции βioctl()).Во-вторых, это обработка запросов на обмен. Если процессу необходимо произвестисчитывание или запись данных, то в этом случае происходит обращение к соответствующей точкевхода в драйвер.В-третьих, это обработка прерывания, связанного с данным устройством.
Например, былинициирован обмен, и он закончился (успешно или неуспешно), или же по линии связи пришелкакой-то сигнал, который необходимо обработать. В этом случае возникает прерывание,обработка которого происходит в соответствующем драйвере.И, в-четвертых, это выполнение специальных команд управления устройством. Функцииуправления могут быть самыми разными, их наполнение зависит от конкретного устройства и отконкретного драйвера.6.2.4Включение, удаление драйверов из системыИзначально Unix-системы предполагали, как и большинство систем, «жесткие» статическиевстраивание драйверов в код ядра.
Это означало, что при добавлении нового драйвера илиудалении существующего необходимо было выполнить достаточно трудоемкую операциюперетрансляции (когда ядро создается «с нуля») или, как минимум, перекомпоновку (когда естьготовые объектные модули) ядра. Соответственно, эти операции требовали серьезных навыков отсистемного администратора. Чтобы минимизировать число перекомпоновок ядра, надо быломаксимизировать число драйверов, встроенных в систему. Но такая модель была неэффективной,поскольку в системе присутствовали драйверы, которые никак не используются.Альтернативной моделью, существующей и по сей день, является модель динамическогосвязывания драйверов. В этом случае в системе присутствуют программные средства,позволяющие динамически, «на лету» подключить к операционной системе тот или иной драйвер.Данная модель предполагает решение следующих задач.
Во-первых, это задача именованияустройства. Во-вторых, инициализация драйвера (т.е. формирование системных областей данныхи т.п.) и устройства (приведение устройства в начальное состояние). В-третьих, добавлениеданного драйвера в соответствующую таблицу драйверов устройств (либо блок-, либо байториентированных). И, наконец, «установка» обработчика прерывания, т.е. предоставление ядруинформации, что при возникновении определенного прерывания управление необходимо передатьв соответствующую точку входа в данный драйвер.223Для реализации указанной модели в различных системах имеются разные средства: разныесистемные вызовы и разные, соответственно, команды, при этом обычно присутствуют каккоманды подключения драйверов, так и симметричные команды удаления драйверов.6.2.5Организация обмена данными с файламиВ этом разделе мы рассмотрим механизм организации обмена данными с файлами, послечего станет понятным, что происходит в системе, когда один и тот же файл открывается в системеодновременно несколькими процессами, а в каждом из них, возможно, по нескольку раз.Для организации операций обмена в ОС Unix используются системные таблицы иструктуры, часть которых ассоциирована с каждым процессом (т.е.
они располагаются в адресномпространстве процесса), а часть — с самой ОС.Таблица открытых файлов (ТОФ) создается в адресном пространстве процесса. Каждаязапись этой таблицы соответствует открытому в процессе файлу. Говоря о номере дескриптораоткрытого в процессе файла, — т.н. файловый дескриптор — подразумевается соответствующийномер записи в таблице открытых файлов процесса. Размер данной таблицы определяется принастройке операционной системы: этот параметр декларирует предельное количество открытых водном процессе файлов.Каждая запись ТОФ содержит целый набор атрибутов, который в данный момент нам неинтересен, но в этом наборе имеется один достаточно важный атрибут — это ссылка на номерзаписи в таблице файлов операционной системы (ТФ).
Таблица файлов ОС является системнойтаблицей, она представлена в системе в единственном экземпляре. В этой таблице происходитрегистрация всех открытых в системе файлов.В таблице файлов ОС помимо прочего содержатся такие атрибуты, как указательчтения/записи (ссылающийся на позицию в файле, начиная с которой будет происходить,соответственно, чтение или запись), счетчик кратности (речь о нем пойдет ниже) и ссылка натаблицу индексных дескрипторов открытых файлов.Таблица индексных дескрипторов открытых файлов (ТИДОФ) также являетсясистемной структурой данных, содержащей перечень индексных дескрипторов всех открытых вданный момент в системе файлов. Каждая запись этой таблицы содержит актуальную копиюоткрытого в системе индексного дескриптора.
Здесь также хранится целый набор параметров,среди которых имеется и счетчик кратности.Для иллюстрации рассмотрим следующий пример (6.2.5). Пускай в системе запущенПроцесс1, для которого система при его создании сформировала ТОФ1. Затем этот процесспосредством обращения к системному вызову open() открывает файл с именем name.
Это означает,что в свободном месте этой таблицы заводится файловый дескриптор для работы с даннымфайлом. В этой записи ТОФ хранится ссылка на соответствующую запись в ТФ. Если файлоткрывается впервые в системе, то в ТФ заводится новая запись для работы с этим файлом. Вданной записи хранится указатель чтения/записи, а также коэффициент кратности, который вначале устанавливается в значение 1 — это означает, что с данной записью ТФ ассоциированаединственная запись из какой-либо ТОФ. И, конечно, в данной записи ТФ хранится ссылка назапись в ТИДОФ, содержащую актуальную копию индексного дескриптора обрабатываемогофайла.
Таблицы ТФ и ТИДОФ хранят оперативную информацию, поэтому они располагаются вОЗУ. Соответственно, файловая система, работая с блоками открытого файла, оперирует данными,хранимыми именно в ТИДОФ.224ТИДОФТОФ1ТФname22pointer1ТОФ3Дескрипт.1pointer2fork()nameТОФ2nameРис. 148.Организация обмена данными с файлами.Пускай в системе позже был запущен Процесс2, который также открыл файл name. В этомслучае в ТФ заводится новая запись, в которой устанавливается свой указатель чтения/записи, ноэта запись ТФ будет ссылаться на тот же номер записи в ТИДОФ. Такой механизм позволяеткорректно (с системной точки зрения) обрабатывать ситуации одновременной работы с одним итем же файлом: поскольку в итоге все сводится к единственной актуальной копии индексногодескриптора в ТИДОФ, то работа ведется с соответствующими блоками файла. При этом данныепроцессы работают с файлом каждый «по-своему», т.к. каждый из них оперирует независимымиуказателями чтения/записи, хранимыми в различных записях ТФ.Теперь предположим, что после открытия файла name, Процесс1 обращается к системномувызову fork() и порождает своего потомка — Процесс3.
При обращении к системному вызовуfork() ТОФ родительского процесса копируется в ТОФ сыновнего процесса. Соответственно, всезаписи ТОФ3 будут ссылаться на те же записи ТФ, что и записи ТОФ 1. Это означает, что припорождении сыновнего процесса в соответствующих записях ТФ происходит увеличение на 1счетчика кратности. Заметим, что подобный механизм наследования подразумевает, что дочернийпроцесс будет работать с теми же указателями чтения/записи, что и родительский процесс.Рассмотренная модель организации обмена данными с файлами имеет свои достоинства инедостатки.
Так, ТИДОФ располагается в оперативной памяти. Это означает, что становитсяэффективнее работа с файловой системой, поскольку уменьшается число обращений кпространству индексных дескрипторов файловой системы, т.е. этот механизм можно считатькэшированием системных обменов. Но эта модель имеет главный недостаток, связанный снекорректным завершением работы операционной системы: если в системе происходит сбой, тосодержимое ТИДОФ будет потеряно, а это означает, что будут потери и в файловой системе.6.2.6Буферизация при блок-ориентированном обменеОдним из достоинств ОС Unix является организация многоуровневой буферизации привыполнении неэффективных действий.
В частности, для организации блок-ориентированныхобменов система использует стандартную стратегию кэширования. Все действия тут те же самые(вплоть до отдельных нюансов). Цель кэширования — минимизация обменов с внешнимиустройствами.Для буферизации используют пул буферов, размером в один блок каждый. Вкратцерассмотрим алгоритм, состоящий из пяти действий.1. Поиск заданного блока в буферном пуле.