Операционная система UNIX - Страница 15
$ kill -9 pid
Однако возможны ситуации, когда процесс не исчезает и в этом случае. Это может произойти для следующих процессов:
□ Процессы-зомби. Фактически процесса как такового не существует, осталась лишь запись в системной таблице процессов, поэтому удалить его можно только перезапуском операционной системы. Зомби в небольших количествах не представляют опасности, однако если их много, это может привести к переполнению таблицы процессов.
□ Процессы, ожидающие недоступные ресурсы NFS (Network File System), например, записывающие данные в файл файловой системы удаленного компьютера, отключившегося от сети. Эту ситуацию можно преодолеть, послав процессу сигнал
SIGINT
SIGQUIT
□ Процессы, ожидающие завершения операции с устройством, например, перемотки магнитной ленты.
Сигналы могут не только использоваться для завершения выполнения но и иметь специфическое для приложения (обычно для системных демонов) значение (естественно, это не относится к сигналам
SIGKILL
SIGSTOP
SIGHUP
Более подробно сигналы мы рассмотрим в главах 2 и 3.
Устройства
Как уже отмечалось, UNIX "изолирует" приложения (а значит и пользователя) от аппаратной части вычислительной системы. Например, в имени файла отсутствует указатель диска, на котором этот файл расположен, а большая часть взаимодействия с периферийными устройствами неотличима от операций с обычными файлами.
UNIX предоставляет единый интерфейс различных устройств системы в виде специальных файлов устройств. Специальный файл устройства связывает прикладное приложение с драйвером устройства. Каждый специальный файл соответствует какому-либо физическому устройству (например, диску, накопителю на магнитной ленте, принтеру или терминалу) или т.н. псевдоустройству (например, сетевому интерфейсу, пустому устройству, сокету или памяти). Вся работа приложения с устройством происходит через специальный файл, а соответствующий ему драйвер обеспечивает выполнение операций ввода/вывода в соответствии с конкретным протоколом обмена данными с устройством.
Существует два типа специальных файлов устройств:
□ Файлы блочных устройств
□ Файлы символьных устройств
Файлы блочных устройств
Файлы блочных устройств служат интерфейсом к устройствам, обмен данными с которыми происходит большими фрагментами, называемыми блоками. При этом ядро операционной системы обеспечивает необходимую буферизацию. Примером физических устройств, соответствующих этому типу файлов, являются жесткие диски. Приведем фрагмент подробного списка файлов каталога /dev системы Digital UNIX, отражающий файлы для доступа к первому и второму разделам первого диска SCSI:
brw------- 1 root system 8, 1 Apr 18 11:03 /dev/rz0a
brw------- 1 root system 8, 1 Apr 18 13:15 /dev/rz0b
Файлы символьных устройств
Файлы символьных устройств используются для доступа к устройствам, драйверы которых обеспечивают собственную буферизацию и побайтную передачу данных. В качестве примера устройств с символьным интерфейсом можно привести терминалы, принтеры и накопители на магнитной ленте. Заметим, что одно и то же физическое устройство может иметь как блочный, так и символьный интерфейсы. Для блочных устройств такой интерфейс также называют интерфейсом доступа низкого уровня (raw interface). Так, для побайтного доступа к разделам диска, приведенным в предыдущем примере, используются соответствующие файлы:
crw------- 1 root system 8, 1 Apr 18 11:04 /dev/rrz0a
crw------- 1 root system 8, 1 Apr 18 13:15 /dev/rrz0b
crw-r----- 1 root system 13,1 Apr 18 18:08 /dev/kmem
crw-rw-rw- 1 root system 7, 0 Apr 18 15:30 /dev/ptyp0
crw-rw-rw- 1 root system 7, 1 Apr 18 15:20 /dev/ptyp1
crw-rw-rw- 1 bill terminal 3, 2 Apr 18 16:10 /dev/tty02
crw-rw-rw- 1 bin terminal 3, 3 Apr 18 16:10 /dev/tty03
Последние три строки списка представляют интерфейс доступа к виртуальной памяти ядра и двум псевдотерминалам.
В поле размера файла (пятая колонка вывода команды ls(1)) у специальных файлов устройств выводятся два числа. Это так называемые старшее (major) и младшее (minor) числа. Часто драйвер обслуживает более одного устройства. При этом старшее число указывает ядру на конкретный драйвер (например, драйвер псевдо-терминалов), а младшее передается драйверу и указывает на конкретное устройство (например, конкретный псевдотерминал).
Интерфейс файловой системы для взаимодействия с устройством схематически представлен на рис. 1.7.
Рис. 1.7. Взаимодействие с устройством
Мнемоника названий специальных файлов устройств в файловой системе UNIX
Названия специальных файлов устройств в большой степени зависят от конкретной версии UNIX. Тем не менее в этих названиях присутствует общая логика, позволяющая даже в незнакомой системе определить, какие файлы отвечают за конкретные устройства. Например, имена файлов доступа к дисковым устройствам обычно содержат указание на тип диска, номер контроллера, логический номер устройства, раздел диска и т.д. По названию также легко определить, какой вид доступа предоставляет данный интерфейс (блочный или символьный).
В качестве примера рассмотрим специальный файл устройства для доступа к разделу диска в операционной системе Solaris:
/dev/dsk/c0t4d0s2
Данный файл предоставляет блочный интерфейс, а соответствующий ему символьный (или необработанный) файл имеет имя:
/dev/rdsk/c0t4d0s2
Файлы доступа к дисковым устройствам располагаются в специальных подкаталогах — /dev/dsk (для блочных устройств) и /dev/rdsk (для символьных устройств). Такая структура хранения специальных файлов характерна для систем UNIX версии System V.
Имя файла, характерное для систем версии SVR4, можно представить в общем виде:
cktldmsn
где k — номер контроллера, l — номер устройства (для устройств SCSI это идентификатор устройства ID), m — номер раздела, а n — логический номер устройства (LUN) SCSI.
Таким образом файл устройства /dev/rdsk/c0t4d0s2 обеспечивает доступ к первому разделу (нумерация разделов начинается с 0) диска с ID=4, LUN=2 первого контроллера.
Такой формат имен файлов в версии SVR4 применяется для всех дисковых устройств и накопителей на магнитной ленте. Иногда для этих стандартных имен в файловой системе имеются символические связи с более простыми названиями. Например, в Solaris имя /dev/sd0a может использоваться вместо /dev/dsk/c0t3d0s, также обеспечивая доступ к устройству:
lrwxrwxrwx 1 root root 12 Oct 31 17:48 /dev/sd0a ->dsk/c0t3d0s