Опубликован: 16.09.2004 | Уровень: специалист | Доступ: свободно | ВУЗ: Московский физико-технический институт
Лекция 9:

Организация ввода-вывода в UNIX. Файлы устройств. Аппарат прерываний. Сигналы в UNIX

Аннотация: Понятие виртуальной файловой системы. Операции над файловыми системами. Монтирование файловых систем. Блочные, символьные устройства. Понятие драйвера. Блочные, символьные драйверы, драйверы низкого уровня. Файловый интерфейс. Аппаратные прерывания (interrupt), исключения (exception), программные прерывания (trap, software interrupt). Их обработка. Понятие сигнала. Способы возникновения сигналов и виды их обработки. Понятия группы процессов, сеанса, лидера группы, лидера сеанса, управляющего терминала сеанса. Системные вызовы getpgrp(), setpgrp(), getpgid(), setpgid(), getsid(), setsid() Системный вызов kill и команда kill(). Системный вызов signal(). Установка собственного обработчика сигнала. Восстановление предыдущей реакции на сигнал. Сигналы SIGUSR1 и SIGUSR2. Использование сигналов для синхронизации процессов. Завершение порожденного процесса. Системный вызов waitpid(). Сигнал SIGCHLD. Возникновение сигнала SIGPIPE при попытке записи в pipe или FIFO, который никто не собирается читать. Понятие о надежности сигналов. POSIX-функции для работы с сигналами.
Ключевые слова: пространство, Unix, драйвер устройства, базовая подсистема ввода-вывода, виртуальная файловая система, ядро, ПО, микроядерная архитектура, файловая система s5fs, файл, inode, виртуальный узел (vnode), таблица индексных узлов открытых файлов, таблица виртуальных узлов открытых файлов, минимум, тип файла, счетчик, операции, таблица операций, адрес, системный вызов, файловая система, корневая файловая система, ациклический, граф, монтирование файловой системы, mount, Директория, точка монтирования, информация, команда mount, команда, ADF, coherency, HFS+, HPFS, minix, UDFS, UFS, VFAT, команда umount, структура системы, деление, базовая, подсистема ввода-вывода, интерфейс, символьное устройство, блочное устройство, диск, инициализация, завершение работы, запись, опрос, коммутатор устройств, старший номер устройств, массив, младший номер устройства, partition, доступ, разделы, драйвер, операционная система, место, регулярный файл, указатель, сигнал, аппаратное прерывание, исключение, программное прерывание, polling, процессор, контроллер прерываний, interrupt request, exception, защита памяти, software interrupt, trap, пользовательский процесс, исполнение, команда kill, сигнальные средства связи, реакция, сигнал SIGKILL, пользовательский контекст, дерево, Лес, группа процессов, очередь, сеанс, управляющий терминал сеанса, терминал, системный вызов getpgid(), BSD, system, системный вызов getpgrp(), системный вызов setpgid(), системный вызов setpgrp(), системный вызов setsid(), лидер группы процессов, идентификатор, системный вызов getsid(), лидер сеанса, текущая группа процессов, фоновая группа процессов, сигнал SIGHUP, сигнал SIGINT, ctrl, сигнал SIGQUIT, завершение процесса, core, эффективный идентификатор пользователя (EUID), атрибут процесса, interrupt, системный вызов kill(), идентификатор процесса, параметр, сигнал SIGTERM, SIG, список, PID, SID, TTY, системный вызов signal(), значение, функция, программа, корректность, сигнал SIGUSR1, сигнал SIGUSR2, компиляция, запуск, pipe, связь, механизмы, нить исполнения, thread, идентификатор нити исполнения, статус завершения, зомби-процесс, системный вызов waitpid(), системный вызов wait(), бит, сигнал SIGCHLD, порожденные процессы, порожденный процесс, родительский процесс, PIPS, FIFO, сигнал SIGPIPE, время выполнения, надежность, POSIX, POSIX-сигнал, manual

Понятие виртуальной файловой системы

Cеминары 11–12 были посвящены устройству файловой системы s5fs. Существуют и другие файловые системы, имеющие архитектуру, отличную от архитектуры s5fs (иные способы отображения файла на пространство физического носителя, иное построение директорий и т.д.). Современные версии UNIX-подобных операционных систем умеют работать с разнообразными файловыми системами, различающимися своей организацией. Такая возможность достигается с помощью разбиения каждой файловой системы на зависимую и независимую от конкретной реализации части, подобно тому, как в лекции 13, посвященной вопросам ввода-вывода, мы отделяли аппаратно-зависимые части для каждого устройства – драйверы – от общей базовой подсистемы ввода-вывода. Независимые части всех файловых систем одинаковы и представляют для всех остальных элементов ядра абстрактную файловую систему, которую принято называть виртуальной файловой системой . Зависимые части для различных файловых систем могут встраиваться в ядро на этапе компиляции, либо добавляться к нему динамически по мере необходимости, без перекомпиляции системы (как в системах с микроядерной архитектурой).

Рассмотрим схематично устройство виртуальной файловой системы. В файловой системе s5fs данные о физическом расположении и атрибутах каждого открытого файла представлялись в операционной системе структурой данных в таблице индексных узлов открытых файлов (см. семинар 11–12, раздел "Системные вызовы и команды для выполнения операций над файлами и директориями"), содержащей информацию из индексного узла файла во вторичной памяти. В виртуальной файловой системе, в отличие от s5fs, каждый файл характеризуется не индексным узлом inode, а некоторым виртуальным узлом vnode. Соответственно, вместо таблицы индексных узлов открытых файлов в операционной системе появляется таблица виртуальных узлов открытых файлов. При открытии файла в операционной системе для него заполняется (если, конечно, не был заполнен раньше) элемент таблицы виртуальных узлов открытых файлов, в котором хранятся, как минимум, тип файла, счетчик числа открытий файла, указатель на реальные физические данные файла и, обязательно, указатель на таблицу системных вызовов, совершающих операции над файлом, – таблицу операций. Реальные физические данные файла (равно как и способ расположения файла на диске и т.п.) и системные вызовы, реально выполняющие операции над файлом, уже не являются элементами виртуальной файловой системы. Они относятся к одной из зависимых частей файловой системы, так как определяются ее конкретной реализацией.

При выполнении операций над файлами по таблице операций, чей адрес содержится в vnode, определяется системный вызов, который будет на самом деле выполнен над реальными физическими данными файла, чей адрес также находится в vnode. В случае с s5fs данные, на которые ссылается vnode, – это как раз данные индексного узла, рассмотренные на семинарах 11–12 и на лекции 12. Заметим, что таблица операций является общей для всех файлов, принадлежащих одной и той же файловой системе.

Операции над файловыми системами. Монтирование файловых систем

В материалах семинаров 11–12 рассматривалась только одна файловая система, расположенная в одном разделе физического носителя. Как только мы переходим к сосуществованию нескольких файловых систем в рамках одной операционной системы, встает вопрос о логическом объединении структур этих файловых систем. При работе операционной системы нам изначально доступна лишь одна, так называемая корневая, файловая система. Прежде, чем приступить к работе с файлом, лежащим в некоторой другой файловой системе, мы должны встроить ее в уже существующий ациклический граф файлов. Эта операция – операция над файловой системой – называется монтированием файловой системы (mount).

Для монтирования файловой системы (см. лекцию 12, раздел " Монтирование файловых систем ") в существующем графе должна быть найдена или создана некоторая пустая директорияточка монтирования, к которой и присоединится корень монтируемой файловой системы. При операции монтирования в ядре заводятся структуры данных, описывающие файловую систему, а в vnode для точки монтирования файловой системы помещается специальная информация.

Монтирование файловых систем обычно является прерогативой системного администратора и осуществляется командой операционной системы mount в ручном режиме, либо автоматически при старте операционной системы. Использование этой команды без параметров не требует специальных полномочий и позволяет пользователю получить информацию обо всех смонтированных файловых системах и соответствующих им физических устройствах. Для пользователя также обычно разрешается монтирование файловых систем, расположенных на гибких магнитных дисках. Для первого накопителя на гибких магнитных дисках такая команда в Linux будет выглядеть следующим образом:

mount /dev/fd0 <имя пустой директории>

где <имя пустой директории> описывает точку монтирования, а /dev/fd0 – специальный файл устройства, соответствующего этому накопителю (о специальных файлах устройств будет подробно рассказано в следующем разделе).

Команда mount

Синтаксис команды

mount [-hV]
mount [-rw] [-t fstype] device dir

Описание команды

Настоящее описание не является полным описанием команды mount , а описывает только те ее опции (очень малую часть), которые используются в данном курсе. Для получения полного описания следует обратиться к UNIX Manual.

Команда mount предназначена для выполнения операции монтирования файловой системы и получения информации об уже смонтированных файловых системах.

Опции -h, -V используются при вызове команды без параметров и служат для следующих целей:

  • -h – вывести краткую инструкцию по пользованию командой;
  • -V – вывести информацию о версии команды mount ;

Команда mount без опций и без параметров выводит информацию обо всех уже с монтированных файловых системах.

Команда mount с параметрами служит для выполнения операции монтирования файловой системы.

Параметр device задает имя специального файла для устройства, содержащего файловую систему.

Параметр dir задает имя точки монтирования (имя некоторой уже существующей пустой директории). При монтировании могут использоваться следующие опции:

  • -r — смонтировать файловую систему только для чтения ( read only );
  • -w — смонтировать файловую систему для чтения и для записи ( read/write ). Используется по умолчанию;
  • -t fstype — задать тип монтируемой файловой системы как fstype. Поддерживаемые типы файловых систем в операционной системе Linux: adfs, affs, autofs, coda, coherent, cramfs, devpts, efs, ext, ext2, ext3, hfs, hpfs, iso9660 (для CD), minix, msdos, ncpfs, nfs, ntfs, proc, qnx4, reiserfs, romfs, smbfs, sysv, udf, ufs, umsdos, vfat, xenix, xfs, xiafs. При отсутствии явно заданного типа команда для большинства типов файловых систем способна опознать его автоматически.

Если мы не собираемся использовать смонтированную файловую систему в дальнейшем (например, хотим вынуть ранее смонтированную дискету), нам необходимо выполнить операцию логического разъединения смонтированных файловых систем (umount). Для этой операции, которая тоже, как правило, является привилегией системного администратора, используется команда umount (может выполняться в ручном режиме или автоматически при завершении работы операционной системы). Для пользователя обычно доступна команда отмонтирования файловой системы на дискете в форме

umount <имя точки монтирования>

где <имя точки монтирования> – это <имя пустой директории>, использованное ранее в команде mount , или в форме

umount /dev/fd0

где /dev/fd0 – специальный файл устройства, соответствующего первому накопителю на гибких магнитных дисках.

Заметим, что для последующей корректной работы операционной системы при удалении физического носителя информации обязательно необходимо предварительное логическое разъединение файловых систем, если они перед этим были объединены.

Команда umount

Синтаксис команды

umount [-hV]
umount device
umount dir

Описание команды

Настоящее описание не является полным описанием команды umount , а описывает только те ее опции (очень малую часть), которые используются в данном курсе. Для получения полного описания следует обратиться к UNIX Manual (команда man).

Команда umount предназначена для выполнения операции логического разъединения ранее смонтированных файловых систем.

Опции -h, -V используются при вызове команды без параметров и служат для следующих целей:

  • -h – вывести краткую инструкцию по пользованию командой;
  • -V – вывести информацию о версии команды umount .

Команда umount с параметром служит для выполнения операции логического разъединения файловых систем. В качестве параметра может быть задано либо имя устройства, содержащего файловую систему – device, либо имя точки монтирования файловой системы (т.е. имя директории, которое указывалось в качестве параметра при вызове команды mount ) – dir.

Заметим, что файловая система не может быть отмонтирована до тех пор, пока она находится в использовании (busy) – например, когда в ней существуют открытые файлы, какой-либо процесс имеет в качестве рабочей директории директорию в этой файловой системе и т.д.

лия логовина
лия логовина

организовать двустороннюю поочередную связь процесса-родителя и процесса-ребенка через pipe, используя для синхронизации сигналы sigusr1 и sigusr2.

Макар Оганесов
Макар Оганесов
Сергей Пархоменко
Сергей Пархоменко
Россия, Ростов-на-Дону, ЮФУ (ДГТУ), 2008