Операционная система Unix
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ
ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ АГЕНСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
ТАГАНРОГСКИЙ ГОСУДАРСТВЕННЫЙ РАДИОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Дисциплина «Информатика»
РЕФЕРАТ
по теме:
«Операционная система UNIX»
Выполнила: Орда-Жигулина Д.В., гр. Э-25
Проверил: Вишневецкий В.Ю.
Таганрог 2006
СОДЕРЖАНИЕ
Введение
Что такое Unix 3
Где взять бесплатный Unix 7
Основная часть. (Описание Unix)
1. Основные понятия Unix 8
2. Файловая система 9
2.1 Типы файлов 9
3. Командный интерпретатор 11
4. Ядро ОС UNIX 12
4.1 Общая организация традиционного ядра ОС UNIX 13
4.2 Основные функции ядра 14
4.3 Принципы взаимодействия с ядром 15
4.4 Принципы обработки прерываний 17
5. Управление вводом/выводом 18
5. 1 Принципы системной буферизации ввода/вывода 19
5. 2 Системные вызовы для управления вводом/выводом 21
6. Интерфейсы и входные точки драйверов 23
6. 1 Блочные драйверы 23
6. 2 Символьные драйверы 24
6. 3 Потоковые драйверы 25
7. Команды и утилиты 25
7. 1 Организация команды в ОС UNIX 26
7. 2 Перенаправление ввода/вывода и организация конвейера 26
7. 3 Встроенные, библиотечные и пользовательские команды 26
7. 4 Программирование на командном языке 27
8. Средства графического интерфейса пользователей 27
8.1 Идентификаторы пользователя и группы пользователей 30
8.2 Защита файлов 32
8.3 Перспективные ОС, поддерживающие среду ОС UNIX 33
Заключение
Основные отличия Unix от других OS 36
Области применения Unix 37
Введение
Что такое Unix
Термин Unix и не вполне эквивалентный ему UNIX используется в разных значениях. Начнем со второго из терминов, как более простого. В двух словах, UNIX (именно в такой форме) - зарегистрированная торговая марка, первоначально принадлежавшая корпорации AT&T, сменившая за свою долгую жизнь много хозяев и ныне являющаяся собственностью организации под названием Open Group. Право на использование имени UNIX достигается путем своего рода "проверки на вшивость" - прохождения тестов соответствия спецификациям некоей эталонной ОС (Single Unix Standard - что в данном случае можно перевести как Единственный Стандарт на Unix). Процедура эта не только сложна, но и очень недешева, и потому ей подверглись лишь несколько оперционок из ныне здравствующих, и все они являются проприетарными, то есть представляют собой собственность неких корпораций.
В числе корпораций, заслуживших право на имя UNIX потом разработчиков/тестировщиков и кровью (точнее, долларом) владельцев, можно назвать следующие:
Sun с ее SunOS (более известной в миру под именем Solaris);
IBM, разработавшая систему AIX;
Hewlett-Packard - владелец системы HP-UX;
IRIX - операционка компании SGI.
Кроме этого, собственно имя UNIX применяется к системам:
True64 Unix, разработанная фирмой DEC, с ликвидацией коей перешедшая к Compaq, а ныне, вместе с последней, ставшая собственностью той же Hewlett-Packard;
UnixWare - собственность компании SCO (продукту слияния фирм Caldera и Santa Cruz Operation).
Будучи проприетарными, все эти системы продаются за немалые (даже по американским масштабам) деньги. Однако это - не главное препятствие к распространению собственно UNIX'ов. Ибо общей их особенностью является привязка к определенным аппаратным платформам: AIX работает на серверах и рабочих станциях IBM с процессорами Power, HP-UX - на собственных машинах HP-PA (Precission Architecture), IRIX - на графических станциях от SGI, несущих процессоры MIPS,True64 Unix - предназначена для процессоров Alpha (к сожалению, в бозе почивших). Лишь UnixWare ориентирована на "демократическую" платформу PC, а Solaris существует в вариантах для двух архитектур - собственной, Sparc, и все той же PC. Что, однако, не сильно поспособствовало их распространенности - вследствие относительно слабой поддержки новой PC-периферии.
Таким образом, UNIX - это понятие в первую очередь юридическое. А вот за термином Unix закрепилась технологическая трактовка. Так в обиходе IT-индустрии называют все семейство операционных систем, либо происходящих от "первозданной" UNIX компании AT&T, либо воспроизводящих ее функции "с чистого листа", в том числе свободные ОС, такие, как Linux, FreeBSD и другие BSD, никакой проверке на соответствие Single Unix Standard никогда не подвергавшиеся. И потому их часто называют Unix-подобными.
Широко распространен также близкий по смыслу термин "POSIX-совместимые системы", которым объединяется семейство ОС, соответствующих одноименному набору стандартов. Сами по себе стандарты POSIX (Portable Operation System Interface based on uniX) разрабатывались на основе практики, принятой в Unix-системах, и потому последние все являются по определению POSIX-совместимыми. Однако это - не вполне синонимы: на совместимость со стандартами POSIX, претендуют операционки, связанные с Unix лишь косвенно (QNX, Syllable), или несвязанные вообще (вплоть до Windows NT/2000/XP).
Чтобы прояснить вопрос взаимоотношений UNIX, Unix и POSIX, придется немного углубиться в историю. Собственно, история этого вопроса подробно рассмотрена в соответствующей главе книги "Свободный Unix: Linux, FreeBSD и другие" (в ближайшее время выходит в издательстве БХВ-Петербург) и в статьях по истории Linux и BSD-систем.
Операционная система Unix (точнее, ее первый вариант) была разработана сотрудниками Bell Labs (подразделения компании AT&T) в 1969-1971 годах. Первые ее авторы - Кен Томпсон и Деннис Ричи, - делали это исключительно для собственных целей, в частности, для того, чтобы можно было развлекаться любимой игрой StarTravel. И по ряду юридических причин сама компания не могла использовать ее как коммерческий продукт. Однако практическое применение Unix нашлось довольно быстро. Во-первых, она использовалась в Bell Labs для подготовки разного рода технической (в том числе патентной) документации. А во-вторых, на Unix базировалась коммуникационная система UUCP (Unix to Unix Copy Programm - программа копирования из Unix в Unix).
Другая сфера применения Unix в 70-х - начале 80-х годов прошлого века, оказалась совсем необычной. А именно, в исходных текстах она распространялась среди научных учреждений, ведущих работы в области Computer Science. Целью такого распространения (оно не было вполне свободным в нынешнем понимании, но фактически оказывалось весьма либеральным) были: образование и исследования в вышеуказанной области знаний.
Наибольшую известность получила система BSD Unix, созданная в Университете Беркли, Калифорния. Которая, постепенно освобождаясь от проприетарного кода первозданной Unix, в конце концов, после драматических перипетий (подробно описанных здесь), дала начало современным свободным BSD-системам - FreeBSD, NetBSD и другим.
Одним из наиболее важных результатов работы университетских хакеров оказалось (1983 год) внедрение в Unix поддержки протокола TCP/IP, на котором основывалась тогдашняя сеть ARPANET (и который стал основой основ современного Интернета). Это стало препосылкой к доминированию Unix во всех сферах, связанных со Всемирной Сетью. И это оказалось следующим практическим применением этого семейства операционок - к тому времени о единой Unix говорить уже не приходилось. Потому что она, как было сказано ранее, обособились две ее ветки - происходящая от первозданной UNIX (со временем она получила имя System V) и система берклианского происхождения. С другой же стороны, System V легла в основу тех разнообразных проприетарных UNIX'ов, которые, собственно, и имели юридическое право претендовать на это имя.
Последнее обстоятельство - разветвление некогда единой ОС на несколько линий, постепенно утрачивающих совместимость, - вошло в противоречие с одним из краеугольных камней Unix-идеологии: переносимости системы между разными платформами, и ее приложений - из одной Unix-системы в другую. Что вызвало к жизни деятельность разного рода стандартизирующих организаций, завершившуюся в конце концов созданием набора стандартов POSIX, о котором говорилось ранее.
Именно на стандарты POSIX опирался Линус Торвальдс, создавая "с нуля" (то есть не используя ранее существовавшего кода) свою операционную систему - Linux. А та, быстро и успешно освоив традиционные сферы применения Unix-систем (разработка софта, коммуникации, Интернет), со временем открыла для них и новую - настольные пользовательские платформы общего назначения. Что и обеспечило ее популярность в народе - популярность, превосходящую таковую всех прочих Unix-систем, вместе взятых, как проприетарных, так и свободных.
Далее речь пойдет о работе в Unix-системах в самом широком смысле этого слова, без учета всякого рода торговых марок и прочих юридических заморочек. Хотя основные примеры, относящиеся к приемам работы, будут взяты из области свободных их реализаций - Linux, в меньшей степени FreeBSD, и еще в меньшей - из прочих BSD-систем.
Где взять бесплатный Unix?
FreeBSD База - www.freebsd.org;
Обратиться можно на www.sco.com
Основная часть. (Описание Unix)
1. Основные понятия Unix
Unix базируется на двух основных понятиях: "процесс" и "файл". Процессы являют собой динамическую сторону системы, это субьекты; а файлы - статическую, это обьекты действия процессов. Почти весь интерфейс взаимодействия процессов с ядром и друг с другом выглядит как запись/чтение файлов. Хотя надо добавить такие вещи, как сигналы, разделяемая память и семафоры.
Процессы можно весьма условно разделить на два типа - задачи и демоны. Задача - это процесс, который выполняет свою работу, стремясь побыстрее закончить ее и завершиться. Демон ждет событий, которые он должен обработать, обрабатывает произошедшие события и снова ждет; завершается он как правило по приказу другого процесса, чаще всего его убивает пользователь, дав команду "kill номер_процесса". В этом смысле получается, что интерактивная задача, обрабатывающая ввод пользователя, скорее похожа на демона, чем на задачу.
2. Файловая система
В старых Unix'ах отводилось 14 букв на имя, в новых это ограничение снято. В директории кроме имени файла находится его идентефикатор inode - целое число, определяющее номер блока, в котором записаны атрибуты файла. Среди них: номер пользователя - хозяина файла; номер группы; количество ссылок на файл (см.далее) даты и время создания, последней модификации и последнего обращения к файлу; атрибуты доступа. Атрибуты доступа содержат тип файла (см.далее), атрибуты смены прав при запуске (см.далее) и права доступа к нему для хозяина, одногрупника и остальных на чтение, запись и выполнение. Право на стирание файла определяется правом записи в вышележащую директорию.
Каждый файл (но не директория) может быть известен под несколькими именами, но обязательно лежащими на одном разделе. Все ссылки на файл равноправны; файл стирается, когда удаляется последняя ссылка на файл. Если файл открыт (для чтения и/или записи), то число ссылок на него увеличивается еще на единицу; так многие программы, открывающие временный файл, сразу удаляют его, чтобы при аварийном завершении, когда операционная система закрывает открытые процессом файлы, этот временный файл был удален операционной системой.
Есть еще одна интересная особенность файловой системы: если после создания файла запись в него шла не подряд, а с большими интервалами, то для этих интервалов место на диске не выделяется. Таким образом суммарный обьем файлов в разделе может быть больше обьема раздела, а при удалении такого файла освобождается меньше места, чем его размер.
2.1 Типы файлов
Файлы бывают следующих типов:
обычный файл прямого доступа;
директория (файл, содержащий имена и идентефикаторы других файлов);
символьный линк (строка с именем другого файла);
блочное устройство (диск или магнитная лента);
последовательное устройство (терминалы, последовательные и параллельные порты; диски и магнитные ленты тоже имеют интерфейс последовательного устройства)
поименованный канал.
Специальные файлы, предназначенные для работы с устройствами как правило сосредоточены в директории "/dev". Вот некоторые из них (в номинации FreeBSD):
tty* - терминалы, в т.ч.: ttyv<цифра> - виртуальная консоль;
ttyd<цифра> - DialIn терминал (обычно последовательный порт);
cuaa<цифра> - DialOut линия
ttyp<цифра> - сетевой псевдо-терминал;
tty - терминал, с которым ассоциирована задача;
wd* - жесткие диски и их подразделы, в т.ч.: wd<цифра> - жесткий диск;
wd<цифра>s<цифра> - партиция этого диска (именуемая здесь "slice");
wd<цифра>s<цифра><буква> - раздел партиции;
fd<цифра>[<буква>] - floppy-диск;
rwd*, rfd* - то же самое, что wd* и fd*, но с последовательным доступом;
Иногда требуется, чтобы программа, запущенная пользователем, имела не права запустившего ее пользователя, а какие-то другие. В этом случае устанавливается атрибут смены прав на права пользователя - хозяина программы. (В качестве примера приведу программу, которая читает файл с вопросами и ответами и на основании прочитанного тестирует запустившего эту программу студента. Программа должна иметь право читать файл с ответами, а запустивший ее студент - нет.) Так, например, работает программа passwd, с помощью которой юзер может изменить свой пароль. Юзер может запустить программу passwd, она может произвести изменения в системной базе данных - а пользователь не может.
В отличие от DOS, в котором полное имя файла выглядит как "диск:\путь\имя", и RISC-OS, в которой оно выглядит "-файловая_система-диск:$.путь.имя" (что вообще говоря имеет свои преимущества), Unix использует прозрачную нотацию в виде "/путь/имя". Корень отсчитывается от раздела, с которого было загружено ядро Unix. Если необходимо использовать другой раздел (а на загрузочном разделе как правило находится только самое необходимое для загрузки), используется команда `mount /dev/файл_раздела директория`. При этом файлы и поддиректории, ранее находившиеся в этой директории, становятся недоступными, пока раздел не будет размонтирован (естественно, все нормальные люди используют для монтирования разделов пустые директории). Производить монтирование и размонтирование имеет право только супервизор.
При запуске каждый процесс может расчитывать, что для него уже открыты три файла, которые ему известны как стандартный ввод stdin по дескриптору 0; стандартный вывод stdout по дескриптору 1; и стандартный вывод stderr по дескриптору 2. При регистрации в системе, когда пользователь вводит имя и пароль, а ему запускается shell, все трое направлены на /dev/tty; позже любой из них может быть перенаправлен в любой файл.
3. Командный интерпретатор
В Unix практически всегда входят два командных интерпретатора - sh (shell) и csh (C-подобный shell). Кроме них еще бывают bash (Bourne), ksh (Korn), и другие. Не вдаваясь в подробности, приведу общие принципы:
Все команды, кроме изменения текущей директории, установки переменных окружения (environment) и операторов структурного программирования - внешние программы. Программы эти как правило располагаются в каталогах /bin и /usr/bin. Программы системного администрирования - в каталогах /sbin и /usr/sbin.
Команда состоит из имени запускаемой программы и аргументов. Аргументы отделяются от имени команды и друг от друга пробелаим и табуляциями. Некоторые спецсимволы интерпретируются самим shell'ом. Спецсимволами являются " ' ` \ ! $ ^ * ? < > | & ; (еще какие?).
В одной командной строке можно дать несколько команд. Команды могут быть разделены ; (последовательное выполнение команд), & (асинхронное одновременное выполнение команд), | (синхронное выполнение, стандартный вывод stdout первой команды будет подан на стандартный ввод stdin второй).
Кроме того, можно брать стандартный ввод из файла, включив в качестве одного из аргументов "<файл" (без кавычек); можно направить стандартный вывод в файл, используя ">файл" (файл будет обнулен) или ">>файл" (запись будет произведена в конец файла).
Если надо получить информацию по какой-либо команде, дайте команду "man имя_команды". На экран это будет выдаваться через программу "more" - посмотрите, как с ней управляться на вашем Unix'е командой `man more`.
4. Ядро ОС UNIX
Как и в любой другой многопользовательской операционной системе, обеспечивающей защиту пользователей друг от друга и защиту системных данных от любого непривилегированного пользователя, в ОС UNIX имеется защищенное ядро, которое управляет ресурсами компьютера и предоставляет пользователям базовый набор услуг.
Удобство и эффективность современных вариантов ОС UNIX не означает, что вся система, включая ядро, спроектирована и структуризована наилучшим образом. ОС UNIX развивалась на протяжении многих лет (это первая в истории операционная система, которая продолжает завоевывать популярность в таком зрелом возрасте - уже больше 25 лет). Естественно, наращивались возможности системы, и, как это часто бывает в больших системах, качественные улучшения структуры ОС UNIX не поспевали за ростом ее возможностей.
В результате, ядро большинства современных коммерческих вариантов ОС UNIX представляет собой не очень четко структуризованный монолит большого размера. По этой причине программирование на уровне ядра ОС UNIX продолжает оставаться искусством (если не считать отработанной и понятной технологии разработки драйверов внешних устройств). Эта недостаточная технологичность организации ядра ОС UNIX многих не удовлетворяет. Отсюда стремление к полному воспроизведению среды ОС UNIX при полностью иной организации системы.
По причине наибольшей распространенности часто обсуждается ядро UNIX System V (можно считать его традиционным).
4.1 Общая организация традиционного ядра ОС UNIX
Одно из основных достижений ОС UNIX состоит в том, что система обладает свойством высокой мобильности. Смысл этого качества состоит в том, что вся операционная система, включая ее ядро, сравнительно просто переносится на различные аппаратные платформы. Все части системы, не считая ядра, являются полностью машинно-независимыми. Эти компоненты аккуратно написаны на языке Си, и для их переноса на новую платформу (по крайней мере, в классе 32-разрядных компьютеров) требуется только перекомпиляция исходных текстов в коды целевого компьютера.
Конечно, наибольшие проблемы связаны с ядром системы, которое полностью скрывает специфику используемого компьютера, но само зависит от этой специфики. В результате продуманного разделения машинно-зависимых и машинно-независимых компонентов ядра (видимо, с точки зрения разработчиков операционных систем, в этом состоит наивысшее достижение разработчиков традиционного ядра ОС UNIX) удалось добиться того, что основная часть ядра не зависит от архитектурных особенностей целевой платформы, написана полностью на языке Си и для переноса на новую платформу нуждается только в перекомпиляции.
Однако сравнительно небольшая часть ядра является машинно-зависимой и написана на смеси языка Си и языка ассемблера целевого процессора. При переносе системы на новую платформу требуется переписывание этой части ядра с использованием языка ассемблера и учетом специфических черт целевой аппаратуры. Машинно-зависимые части ядра хорошо изолированы от основной машинно-независимой части, и при хорошем понимании назначения каждого машинно-зависимого компонента переписывание машинно-зависимой части является в основном технической задачей (хотя и требует высокой программистской квалификации).
Машинно-зависимая часть традиционного ядра ОС UNIX включает следующие компоненты:
раскрутка и инициализация системы на низком уровне (пока это зависит от особенностей аппаратуры);
первичная обработка внутренних и внешних прерываний;
управление памятью (в той части, которая относится к особенностям аппаратной поддержки виртуальной памяти);
переключение контекста процессов между режимами пользователя и ядра;
связанные с особенностями целевой платформы части драйверов устройств.
4.2 Основные функции ядра
К основным функциям ядра ОС UNIX принято относить следующие:
(a) Инициализация системы - функция запуска и раскрутки. Ядро системы обеспечивает средство раскрутки (bootstrap), которое обеспечивает загрузку полного ядра в память компьютера и запускает ядро.
(b) Управление процессами и нитями - функция создания, завершения и отслеживания существующих процессов и нитей ("процессов", выполняемых на общей виртуальной памяти). Поскольку ОС UNIX является мультипроцессной операционной системой, ядро обеспечивает разделение между запущенными процессами времени процессора (или процессоров в мультипроцессорных системах) и других ресурсов компьютера для создания внешнего ощущения того, что процессы реально выполняются в параллель.
(c) Управление памятью - функция отображения практически неограниченной виртуальной памяти процессов в физическую оперативную память компьютера, которая имеет ограниченные размеры. Соответствующий компонент ядра обеспечивает разделяемое использование одних и тех же областей оперативной памяти несколькими процессами с использованием внешней памяти.
(d) Управление файлами - функция, реализующая абстракцию файловой системы, - иерархии каталогов и файлов. Файловые системы ОС UNIX поддерживают несколько типов файлов. Некоторые файлы могут содержать данные в формате ASCII, другие будут соответствовать внешним устройствам. В файловой системе хранятся объектные файлы, выполняемые файлы и т.д. Файлы обычно хранятся на устройствах внешней памяти; доступ к ним обеспечивается средствами ядра. В мире UNIX существует несколько типов организации файловых систем. Современные варианты ОС UNIX одновременно поддерживают большинство типов файловых систем.
(e) Коммуникационные средства - функция, обеспечивающая возможности обмена данными между процессами, выполняющимися внутри одного компьютера (IPC - Inter-Process Communications), между процессами, выполняющимися в разных узлах локальной или глобальной сети передачи данных, а также между процессами и драйверами внешних устройств.
(f) Программный интерфейс - функция, обеспечивающая доступ к возможностям ядра со стороны пользовательских процессов на основе механизма системных вызовов, оформленных в виде библиотеки функций.
4.3 Принципы взаимодействия с ядром
В любой операционной системе поддерживается некоторый механизм, который позволяет пользовательским программам обращаться за услугами ядра ОС. В операционных системах наиболее известной советской вычислительной машины БЭСМ-6 соответствующие средства общения с ядром назывались экстракодами, в операционных системах IBM они назывались системными макрокомандами и т.д. В ОС UNIX такие средства называются системными вызовами.
Название не изменяет смысл, который состоит в том, что для обращения к функциям ядра ОС используются "специальные команды" процессора, при выполнении которых возникает особого рода внутреннее прерывание процессора, переводящее его в режим ядра (в большинстве современных ОС этот вид прерываний называется trap - ловушка). При обработке таких прерываний (дешифрации) ядро ОС распознает, что на самом деле прерывание является запросом к ядру со стороны пользовательской программы на выполнение определенных действий, выбирает параметры обращения и обрабатывает его, после чего выполняет "возврат из прерывания", возобновляя нормальное выполнение пользовательской программы.
Понятно, что конкретные механизмы возбуждения внутренних прерываний по инициативе пользовательской программы различаются в разных аппаратных архитектурах. Поскольку ОС UNIX стремится обеспечить среду, в которой пользовательские программы могли бы быть полностью мобильны, потребовался дополнительный уровень, скрывающий особенности конкретного механизма возбуждения внутренних прерываний. Этот механизм обеспечивается так называемой библиотекой системных вызовов.
Для пользователя библиотека системных вызовов представляет собой обычную библиотеку заранее реализованных функций системы программирования языка Си. При программировании на языке Си использование любой функции из библиотеки системных вызовов ничем не отличается от использования любой собственной или библиотечной Си-функции. Однако внутри любой функции конкретной библиотеки системных вызовов содержится код, являющийся, вообще говоря, специфичным для данной аппаратной платформы.
4.4 Принципы обработки прерываний
Конечно, применяемый в операционных системах механизм обработки внутренних и внешних прерываний в основном зависит от того, какая аппаратная поддержка обработки прерываний обеспечивается конкретной аппаратной платформой. К счастью, к настоящему моменту (и уже довольно давно) основные производители компьютеров де-факто пришли к соглашению о базовых механизмах прерываний.
Если говорить не очень точно и конкретно, суть принятого на сегодня механизма состоит в том, что каждому возможному прерыванию процессора (будь то внутреннее или внешнее прерывание) соответствует некоторый фиксированный адрес физической оперативной памяти. В тот момент, когда процессору разрешается прерваться по причине наличия внутренней или внешней заявки на прерывание, происходит аппаратная передача управления на ячейку физической оперативной памяти с соответствующим адресом - обычно адрес этой ячейки называется "вектором прерывания" (как правило, заявки на внутреннее прерывание, т.е. заявки, поступающие непосредственно от процессора, удовлетворяются немедленно).
Дело операционной системы - разместить в соответствующих ячейках оперативной памяти программный код, обеспечивающий начальную обработку прерывания и инициирующий полную обработку.
В основном, ОС UNIX придерживается общего подхода. В векторе прерывания, соответствующем внешнему прерыванию, т.е. прерыванию от некоторого внешнего устройства, содержатся команды, устанавливающие уровень выполнения процессора (уровень выполнения определяет, на какие внешние прерывания процессор должен реагировать незамедлительно) и осуществляющие переход на программу полной обработки прерывания в соответствующем драйвере устройства. Для внутреннего прерывания (например, прерывания по инициативе программы пользователя при отсутствии в основной памяти нужной страницы виртуальной памяти, при возникновении исключительной ситуации в программе пользователя и т.д.) или прерывания от таймера в векторе прерывания содержится переход на соответствующую программу ядра ОС UNIX.
5. Управление вводом/выводом
Традиционно в ОС UNIX выделяются три типа организации ввода/вывода и, соответственно, три типа драйверов. Блочный ввод/вывод главным образом предназначен для работы с каталогами и обычными файлами файловой системы, которые на базовом уровне имеют блочную структуру. На пользовательском уровне теперь возможно работать с файлами, прямо отображая их в сегменты виртуальной памяти. Эта возможность рассматривается как верхний уровень блочного ввода/вывода. На нижнем уровне блочный ввод/вывод поддерживается блочными драйверами. Блочный ввод/вывод, кроме того, поддерживается системной буферизацией.
Символьный ввод/вывод служит для прямого (без буферизации) выполнения обменов между адресным пространством пользователя и соответствующим устройством. Общей для всех символьных драйверов поддержкой ядра является обеспечение функций пересылки данных между пользовательскими и ядерным адресными пространствами.
Наконец, потоковый ввод/вывод похож на символьный ввод/вывод, но по причине наличия возможности включения в поток промежуточных обрабатывающих модулей обладает существенно большей гибкостью.
5. 1 Принципы системной буферизации ввода/вывода
Традиционным способом снижения накладных расходов при выполнении обменов с устройствами внешней памяти, имеющими блочную структуру, является буферизация блочного ввода/вывода. Это означает, что любой блок устройства внешней памяти считывается прежде всего в некоторый буфер области основной памяти, называемой в ОС UNIX системным кэшем, и уже оттуда полностью или частично (в зависимости от вида обмена) копируется в соответствующее пользовательское пространство.
Принципами организации традиционного механизма буферизации является, во-первых, то, что копия содержимого блока удерживается в системном буфере до тех пор, пока не возникнет необходимость ее замещения по причине нехватки буферов (для организации политики замещения используется разновидность алгоритма LRU). Во-вторых, при выполнении записи любого блока устройства внешней памяти реально выполняется лишь обновление (или образование и наполнение) буфера кэша. Действительный обмен с устройством выполняется либо при выталкивании буфера вследствие замещения его содержимого, либо при выполнении специального системного вызова sync (или fsync), поддерживаемого специально для насильственного выталкивания во внешнюю память обновленных буферов кэша.
Эта традиционная схема буферизации вошла в противоречие с развитыми в современных вариантах ОС UNIX средствами управления виртуальной памятью и в особенности с механизмом отображения файлов в сегменты виртуальной памяти. Поэтому в System V Release 4 появилась новая схема буферизации, пока используемая параллельно со старой схемой.
Суть новой схемы состоит в том, что на уровне ядра фактически воспроизводится механизм отображения файлов в сегменты виртуальной памяти. Во-первых, напомним о том, что ядро ОС UNIX действительно работает в собственной виртуальной памяти. Эта память имеет более сложную, но принципиально такую же структуру, что и пользовательская виртуальная память. Другими словами, виртуальная память ядра является сегментно-страничной, и наравне с виртуальной памятью пользовательских процессов поддерживается общей подсистемой управления виртуальной памятью. Из этого следует, во-вторых, что практически любая функция, обеспечиваемая ядром для пользователей, может быть обеспечена одними компонентами ядра для других его компонентов. В частности, это относится и к возможностям отображения файлов в сегменты виртуальной памяти.
Новая схема буферизации в ядре ОС UNIX главным образом основывается на том, что для организации буферизации можно не делать почти ничего специального. Когда один из пользовательских процессов открывает не открытый до этого времени файл, ядро образует новый сегмент и подключает к этому сегменту открываемый файл. После этого (независимо от того, будет ли пользовательский процесс работать с файлом в традиционном режиме с использованием системных вызовов read и write или подключит файл к сегменту своей виртуальной памяти) на уровне ядра работа будет производиться с тем ядерным сегментом, к которому подключен файл на уровне ядра. Основная идея нового подхода состоит в том, что устраняется разрыв между управлением виртуальной памятью и общесистемной буферизацией (это нужно было бы сделать давно, поскольку очевидно, что основную буферизацию в операционной системе должен производить компонент управления виртуальной памятью).
Почему же нельзя отказаться от старого механизма буферизации? Все дело в том, что новая схема предполагает наличие некоторой непрерывной адресации внутри объекта внешней памяти (должен существовать изоморфизм между отображаемым и отображенным объектами). Однако, при организации файловых систем ОС UNIX достаточно сложно распределяет внешнюю память, что в особенности относится к i-узлам. Поэтому некоторые блоки внешней памяти приходится считать изолированными, и для них оказывается выгоднее использовать старую схему буферизации (хотя, возможно, в завтрашних вариантах UNIX и удастся полностью перейти к унифицированной новой схеме).
5. 2 Системные вызовы для управления вводом/выводом
Для доступа (т.е. для получения возможности последующего выполнения операций ввода/вывода) к файлу любого вида (включая специальные файлы) пользовательский процесс должен выполнить предварительное подключение к файлу с помощью одного из системных вызовов open, creat, dup или pipe.
Последовательность действий системного вызова open (pathname, mode) следующая:
анализируется непротиворечивость входных параметров (главным образом, относящихся к флагам режима доступа к файлу);
выделяется или находится пространство для описателя файла в системной области данных процесса (u-области);
в общесистемной области выделяется или находится существующее пространство для размещения системного описателя файла (структуры file);
производится поиск в архиве файловой системы объекта с именем "pathname" и образуется или обнаруживается описатель файла уровня файловой системы (vnode в терминах UNIX V System 4);
выполняется связывание vnode с ранее образованной структурой file.
Системные вызовы open и creat (почти) функционально эквивалентны. Любой существующий файл можно открыть с помощью системного вызова creat, и любой новый файл можно создать с помощью системного вызова open. Однако, применительно к системному вызову creat важно подчеркнуть, что в случае своего естественного применения (для создания файла) этот системный вызов создает новый элемент соответствующего каталога (в соответствии с заданным значением pathname), а также создает и соответствующим образом инициализирует новый i-узел.
Наконец, системный вызов dup (duplicate - скопировать) приводит к образованию нового дескриптора уже открытого файла. Этот специфический для ОС UNIX системный вызов служит исключительно для целей перенаправления ввода/вывода). Его выполнение состоит в том, что в u-области системного пространства пользовательского процесса образуется новый описатель открытого файла, содержащий вновь образованный дескриптор файла (целое число), но ссылающийся на уже существующую общесистемную структуру file и содержащий те же самые признаки и флаги, которые соответствуют открытому файлу-образцу.
Другими важными системными вызовами являются системные вызовы read и write. Системный вызов read выполняется следующим образом:
в общесистемной таблице файлов находится дескриптор указанного файла, и определяется, законно ли обращение от данного процесса к данному файлу в указанном режиме;
на некоторое (короткое) время устанавливается синхронизационная блокировка на vnode данного файла (содержимое описателя не должно изменяться в критические моменты операции чтения);
выполняется собственно чтение с использованием старого или нового механизма буферизации, после чего данные копируются, чтобы стать доступными в пользовательском адресном пространстве.
Операция записи выполняется аналогичным образом, но меняет содержимое буфера буферного пула.
Системный вызов close приводит к тому, что драйвер обрывает связь с соответствующим пользовательским процессом и (в случае последнего по времени закрытия устройства) устанавливает общесистемный флаг "драйвер свободен".
Наконец, для специальных файлов поддерживается еще один "специальный" системный вызов ioctl. Это единственный системный вызов, который обеспечивается для специальных файлов и не обеспечивается для остальных разновидностей файлов. Фактически, системный вызов ioctl позволяет произвольным образом расширить интерфейс любого драйвера. Параметры ioctl включают код операции и указатель на некоторую область памяти пользовательского процесса. Всю интерпретацию кода операции и соответствующих специфических параметров проводит драйвер.
Естественно, что поскольку драйверы главным образом предназначены для управления внешними устройствами, программный код драйвера должен содержать соответствующие средства для обработки прерываний от устройства. Вызов индивидуальной программы обработки прерываний в драйвере происходит из ядра операционной системы. Подобным же образом в драйвере может быть объявлен вход "timeout", к которому обращается ядро при истечении ранее заказанного драйвером времени (такой временной контроль является необходимым при управлении не слишком интеллектуальными устройствами).
Общая схема интерфейсной организации драйверов показана на рисунке 3.5. Как показывает этот рисунок, с точки зрения интерфейсов и общесистемного управления различаются два вида драйверов - символьные и блочные. С точки зрения внутренней организации выделяется еще один вид драйверов - потоковые (stream) драйверы. Однако по своему внешнему интерфейсу потоковые драйверы не отличаются от символьных.
6. Интерфейсы и входные точки драйверов
6. 1 Блочные драйверы
Блочные драйверы предназначаются для обслуживания внешних устройств с блочной структурой (магнитных дисков, лент и т.д.) и отличаются от прочих тем, что они разрабатываются и выполняются с использованием системной буферизации. Другими словами, такие драйверы всегда работают через системный буферный пул. Как видно на рисунке 3.5, любое обращение к блочному драйверу для чтения или записи всегда проходит через предварительную обработку, которая заключается в попытке найти копию нужного блока в буферном пуле.
В случае, если копия требуемого блока не находится в буферном пуле или если по какой-либо причине требуется заменить содержимое некоторого обновленного буфера, ядро ОС UNIX обращается к процедуре strategy соответствующего блочного драйвера. Strategy обеспечивает стандартный интерфейс между ядром и драйвером. С использованием библиотечных подпрограмм, предназначенных для написания драйверов, процедура strategy может организовывать очереди обменов с устройством, например, с целью оптимизации движения магнитных головок на диске. Все обмены, выполняемые блочным драйвером, выполняются с буферной памятью. Перепись нужной информации в память соответствующего пользовательского процесса производится программами ядра, заведующими управлением буферами
6. 2 Символьные драйверы
Символьные драйверы главным образом предназначены для обслуживания устройств, обмены с которыми выполняются посимвольно, либо строками символов переменного размера. Типичным примером символьного устройства является простой принтер, принимающий один символ за один обмен.
Символьные драйверы не используют системную буферизацию. Они напрямую копируют данные из памяти пользовательского процесса при выполнении операций записи или в память пользовательского процесса при выполнении операций чтения, используя собственные буфера.
Следует отметить, что имеется возможность обеспечить символьный интерфейс для блочного устройства. В этом случае блочный драйвер использует дополнительные возможности процедуры strategy, позволяющие выполнять обмен без применения системной буферизации. Для драйвера, обладающего одновременно блочным и символьным интерфейсами, в файловой системе заводится два специальных файла, блочный и символьный. При каждом обращении драйвер получает информацию о том, в каком режиме он используется.
6. 3 Потоковые драйверы
Основным назначением механизма потоков (streams) является повышение уровня модульности и гибкости драйверов со сложной внутренней логикой (более всего это относится к драйверам, реализующим развитые сетевые протоколы). Спецификой таких драйверов является то, что большая часть программного кода не зависит от особенностей аппаратного устройства. Более того, часто оказывается выгодно по-разному комбинировать части программного кода.
Все это привело к появлению потоковой архитектуры драйверов, которые представляют собой двунаправленный конвейер обрабатывающих модулей. В начале конвейера (ближе всего к пользовательскому процессу) находится заголовок потока, к которому прежде всего поступают обращения по инициативе пользователя. В конце конвейера (ближе всего к устройству) находится обычный драйвер устройства. В промежутке может располагаться произвольное число обрабатывающих модулей, каждый из которых оформляется в соответствии с обязательным потоковым интерфейсом.
7. Команды и утилиты
При интерактивной работе в среде ОС UNIX пользуются разнообразными утилитами или внешними командами языка shell. Многие из этих утилит являются не менее сложными программами, чем сам командный интерпретатор (и между прочим, командный интерпретатор языка shell сам является одной из утилит, которую можно вызвать из командной строки).
7. 1 Организация команды в ОС UNIX
Для создания новой команды нужно просто следовать правилам программирования на языке Си. Каждая правильно оформленная Си-программа начинает свое выполнение с функции main. Эта "полусистемная" функция обладает стандартным интерфейсом, являющимся основой организации команд, которые можно вызывать в среде shell. Внешние команды выполняются интерпретатором shell с помощью связки системных вызовов fork и одного из вариантов exec. В число параметров системного вызова exec входит набор текстовых строк. Этот набор текстовых строк передается на вход функции main запускаемой программы.
Более точно, функция main получает два параметра - argc (число передаваемых текстовых строк) и argv (указатель на массив указателей на текстовые строки). Программа, претендующая на ее использование в качестве команды shell, должна обладать точно определенным внешним интерфейсом (параметры обычно вводятся с терминала) и должна контролировать и правильно разбирать входные параметры.
Кроме того, чтобы соответствовать стилю shell, такая программа не должна сама переопределять файлы, соответствующие стандартному вводу, стандартному выводу и стандартному выводу ошибок. Тогда команде может обычным образом перенаправляться ввод/вывод, и она может включаться в конвейеры.
7. 2 Перенаправление ввода/вывода и организация конвейера
Как видно из последнего предложения предыдущего пункта, для обеспечения возможностей перенаправления ввода/вывода и организации конвейера при программировании команд не требуется делать ничего специального. Достаточно просто не трогать три начальные дескриптора файлов и правильно работать с этими файлами, а именно, производить вывод в файл с дескриптором stdout, вводить данные из файла stdin и выводить сообщения об ошибках в файл stderror.
7. 3 Встроенные, библиотечные и пользовательские команды
Встроенные команды представляют собой часть программного кода командного интерпретатора. Они выполняются как подпрограммы интерпретатора, и их невозможно заменить или переопределить. Синтаксис и семантика встроенных команд определены в соответствующем командном языке.
Библиотечные команды составляют часть системного программного обеспечения. Это набор выполняемых программ (утилит), поставляемых вместе с операционной системой. Большинство этих программ (таких как vi, emacs, grep, find, make и т.д.) исключительно полезно на практике, но их рассмотрение находится за пределами этого курса (по поводу редакторов vi и emacs и утилиты поддержки целостности программных файлов make существуют отдельные толстые книги).
Пользовательской командой является любая выполняемая программа, организованная в соответствии с требованиями, изложенными в Таким образом, любой пользователь ОС UNIX может неограниченно расширять репертуар внешних команд своего командного языка (например, можно написать собственный командный интерпретатор).
7. 4 Программирование на командном языке
Любой из упоминавшихся вариантов языка shell в принципе можно использовать как язык программирования. Среди пользователей ОС UNIX существует много людей, которые пишут на shell вполне серьезные программы. Для программирования лучше использовать языки программирования (Си, Си++, Паскаль и т.д.), а не командные языки.
8. Средства графического интерфейса пользователей
Хотя многие профессиональные программисты, работающие в среде ОС UNIX, и сегодня предпочитают пользоваться традиционными строчными средствами взаимодействия с системой, широкое распространение относительно недорогих цветных графических терминалов с высоким качеством разрешения привело к тому, что во всех современных вариантах ОС UNIX поддерживаются графические интерфейсы пользователя с системой, а пользователям предоставляются инструментальные средства для разработки графических интерфейсов с разрабатываемыми ими программами. С точки зрения конечного пользователя средства графического интерфейса, поддерживаемого в разных вариантах ОС UNIX, да и в других системах (например, MS Windows или Windows NT), примерно одинаковы по своему стилю.
Во-первых, во всех случаях поддерживается многооконный режим работы с экраном терминала. В любой момент времени пользователь может образовать новое окно и связать его с нужной программой, которая работает с этим окном как с отдельным терминалом. Окна можно перемещать, изменять их размер, временно закрывать и т.д.
Во-вторых, во всех современных разновидностях графического интерфейса поддерживается управление мышью. В случае ОС UNIX часто оказывается, что обычной клавиатурой терминала пользуются только при переходе к традиционному строчному интерфейсу (хотя в большинстве случаев по крайней мере в одном окне терминала работает один из командных интерпретаторов семейства shell).
В-третьих, такое распространение "мышиного" стиля работы оказывается возможным за счет использования интерфейсных средств, основанных на пиктограммах (icons) и меню. В большинстве случаев, программа, работающая в некотором окне, предлагает пользователю выбрать какую-либо выполняемую ей функцию либо путем отображения в окне набора символических образов возможных функций (пиктограмм), либо посредством предложения многоуровневого меню. В любом случае для дальнейшего выбора оказывается достаточным управления курсором соответствующего окна с помощью мыши.
Наконец, современные графические интерфейсы обладают "дружественностью по отношению к пользователю", обеспечивая возможность немедленного получения интерактивной подсказки по любому поводу. (Наверное, правильнее было бы сказать, что хорошим стилем программирования с использованием графических интерфейсов является стиль, при котором такие подсказки реально обеспечиваются.)
После перечисления всех этих общих свойств современных средств графического интерфейса может возникнуть естественный вопрос: Если в области графических интерфейсов существует такое единообразие, что особенное может быть сказано по поводу графических интерфейсов в среде ОС UNIX? Ответ достаточно прост. Да, конечный пользователь действительно в любой сегодняшней системе имеет дело примерно с одним и тем же набором интерфейсных возможностей, но в разных системах эти возможности достигаются по-разному. Как обычно, преимуществом ОС UNIX является наличие стандартизованных технологий, позволяющих создавать мобильные приложения с графическими интерфейсами.
8. Принципы защиты
Поскольку ОС UNIX с самого своего зарождения задумывалась как многопользовательская операционная система, в ней всегда была актуальна проблема авторизации доступа различных пользователей к файлам файловой системы. Под авторизацией доступа понимаются действия системы, которые допускают или не допускают доступ данного пользователя к данному файлу в зависимости от прав доступа пользователя и ограничений доступа, установленных для файла. Схема авторизации доступа, примененная в ОС UNIX, настолько проста и удобна и одновременно настолько мощна, что стала фактическим стандартом современных операционных систем (не претендующих на качества систем с многоуровневой защитой).
8.1 Идентификаторы пользователя и группы пользователей
С каждым выполняемым процессом в ОС UNIX связываются реальный идентификатор пользователя (real user ID), действующий идентификатор пользователя (effective user ID) и сохраненный идентификатор пользователя (saved user ID). Все эти идентификаторы устанавливаются с помощью системного вызова setuid, который можно выполнять только в режиме суперпользователя. Аналогично, с каждым процессом связываются три идентификатора группы пользователей - real group ID, effective group ID и saved group ID. Эти идентификаторы устанавливаются привилегированным системным вызовом setgid.
При входе пользователя в систему программа login проверяет, что пользователь зарегистрирован в системе и знает правильный пароль (если он установлен), образует новый процесс и запускает в нем требуемый для данного пользователя shell. Но перед этим login устанавливает для вновь созданного процесса идентификаторы пользователя и группы, используя для этого информацию, хранящуюся в файлах /etc/passwd и /etc/group. После того, как с процессом связаны идентификаторы пользователя и группы, для этого процесса начинают действовать ограничения для доступа к файлам. Процесс может получить доступ к файлу или выполнить его (если файл содержит выполняемую программу) только в том случае, если хранящиеся при файле ограничения доступа позволяют это сделать. Связанные с процессом идентификаторы передаются создаваемым им процессам, распространяя на них те же ограничения. Однако в некоторых случаях процесс может изменить свои права с помощью системных вызовов setuid и setgid, а иногда система может изменить права доступа процесса автоматически.
Рассмотрим, например, следующую ситуацию. В файл /etc/passwd запрещена запись всем, кроме суперпользователя (суперпользователь может писать в любой файл). Этот файл, помимо прочего, содержит пароли пользователей и каждому пользователю разрешается изменять свой пароль. Имеется специальная программа /bin/passwd, изменяющая пароли. Однако пользователь не может сделать это даже с помощью этой программы, поскольку запись в файл /etc/passwd запрещена. В системе UNIX эта проблема разрешается следующим образом. При выполняемом файле может быть указано, что при его запуске должны устанавливаться идентификаторы пользователя и/или группы. Если пользователь запрашивает выполнение такой программы (с помощью системного вызова exec), то для соответствующего процесса устанавливаются идентификатор пользователя, соответствующий идентификатору владельца выполняемого файла и/или идентификатор группы этого владельца. В частности, при запуске программы /bin/passwd процесс получит идентификатор суперпользователя, и программа сможет произвести запись в файл /etc/passwd.
И для идентификатора пользователя, и для идентификатора группы реальный ID является истинным идентификатором, а действующий ID - идентификатором текущего выполнения. Если текущий идентификатор пользователя соответствует суперпользователю, то этот идентификатор и идентификатор группы могут быть переустановлены в любое значение системными вызовами setuid и setgid. Если же текущий идентификатор пользователя отличается от идентификатора суперпользователя, то выполнение системных вызовов setuid и setgid приводит к замене текущего идентификатора истинным идентификатором (пользователя или группы соответственно).
8.2 Защита файлов
Как и принято в многопользовательской операционной системе, в UNIX поддерживается единообразный механизм контроля доступа к файлам и справочникам файловой системы. Любой процесс может получить доступ к некоторому файлу в том и только в том случае, если права доступа, описанные при файле, соответствуют возможностям данного процесса.
Защита файлов от несанкционированного доступа в ОС UNIX основывается на трех фактах. Во-первых, с любым процессом, создающим файл (или справочник), ассоциирован некоторый уникальный в системе идентификатор пользователя (UID - User Identifier), который в дальнейшем можно трактовать как идентификатор владельца вновь созданного файла. Во-вторых, с каждый процессом, пытающимся получить некоторый доступ к файлу, связана пара идентификаторов - текущие идентификаторы пользователя и его группы. В-третьих, каждому файлу однозначно соответствует его описатель - i-узел.
Любому используемому в файловой системе i-узлу всегда однозначно соответствует один и только один файл. I-узел содержит достаточно много разнообразной информации (большая ее часть доступна пользователям через системные вызовы stat и fstat), и среди этой информации находится часть, позволяющая файловой системе оценить правомощность доступа данного процесса к данному файлу в требуемом режиме.
Общие принципы защиты одинаковы для всех существующих вариантов системы: Информация i-узла включает UID и GID текущего владельца файла (немедленно после создания файла идентификаторы его текущего владельца устанавливаются соответствующими действующим идентификатором процесса-создателя, но в дальнейшем могут быть изменены системными вызовами chown и chgrp). Кроме того, в i-узле файла хранится шкала, в которой отмечено, что может делать с файлом пользователь - его владелец, что могут делать с файлом пользователи, входящие в ту же группу пользователей, что и владелец, и что могут делать с файлом остальные пользователи. Мелкие детали реализации в разных вариантах системы различаются.
8.3 Перспективные ОС, поддерживающие среду ОС UNIX
Микроядро - это минимальная стержневая часть операционной системы, служащая основой модульных и переносимых расширений. По-видимому, большинство операционных систем следующего поколения будут обладать микроядрами. Однако имеется масса разных мнений по поводу того, как следует организовывать службы операционной системы по отношению к микроядру: как проектировать драйверы устройств, чтобы добиться наибольшей эффективности, но сохранить функции драйверов максимально независимыми от аппаратуры; следует ли выполнять операции, не относящиеся к ядру, в пространстве ядра или в пространстве пользователя; стоит ли сохранять программы имеющихся подсистем (например, UNIX) или лучше отбросить все и начать с нуля.
В широкий обиход понятие микроядра ввела компания Next, в операционной системе которой использовалось микроядро Mach. Небольшое привилегированное ядро этой ОС, вокруг которого располагались подсистемы, выполняемые в режиме пользователя, теоретически должно было обеспечить небывалую гибкость и модульность системы. Но на практике это преимущество было несколько обесценено наличием монолитного сервера, реализующего операционную систему UNIX BSD 4.3, которую компания Next выбрала в качестве оболочки микроядра Mach. Однако опора на Mach дала возможность включить в систему средства передачи сообщений и ряд объектно-ориентированных сервисных функций, на основе которых удалось создать элегантный интерфейс конечного пользователя с графическими средствами конфигурирования сети, системного администрирования и разработки программного обеспечения.
Следующей микроядерной операционной системой была Windows NT компании Microsoft, в которой ключевым преимуществом использования микроядра должна была стать не только модульность, но и переносимость. (Заметим, что отсутствует единодушное мнение по поводу того, следует ли на самом деле относить NT к микроядерным ОС.) ОС NT была построена таким образом, чтобы ее можно было применять в одно- и мультипроцессорных системах, основанных на процессорах Intel, Mips и Alpha (и тех, которые придут вслед за ними). Поскольку в среде NT должны были выполняться программы, написанные для DOS, Windows, OS/2 и систем, совместимых со стандартами Posix, компания Microsoft использовала присущую микроядерному подходу модульность для создания общей структуры NT, не повторяющей ни одну из существующих операционных систем. Каждая операционная система эмулируется в виде отдельного модуля или подсистемы.
Позднее микроядерные архитектуры операционных систем были объявлены компаниями Novell/USL, Open Software Foundation (OSF), IBM, Apple и другими. Одним из основных конкурентов NT в области микроядерных ОС является Mach 3.0, система, созданная в университете Карнеги-Меллон, которую как IBM, так и OSF взялись довести до коммерческого вида. (Компания Next в качестве основы для NextStep пока использует Mach 2.5, но тоже внимательно присматривается к Mach 3.0.) Другим конкурентом является микроядро Chorus 3.0 компании Chorus Systems, выбранное USL в качестве основы новых реализаций ОС UNIX. Некоторое микроядро будет использоваться в SpringOS фирмы Sun, объектно-ориентированном преемнике ОС Solaris (если, конечно, Sun доведет работу над SpringOS до конца). Очевидна тенденция к переходу от монолитных к микроядерным системам (этот процесс не является прямолинейным: компания IBM сделала шаг назад и отказалась от перехода к микроядерной технологии). Кстати, это совсем не новость для компаний QNX Software Systems и Unisys, которые уже в течение нескольких лет выпускают пользующиеся успехом микроядерные операционные системы. ОС QNX пользуется спросом на рынке систем реального времени, а CTOS фирмы Unisys популярна в области банковского дела. В обеих системах успешно использована модульность, присущая микроядерным ОС.
Заключение
Основные отличия Unix от других OS
Unix состоит из ядра с включенными в него драйверами и из утилит (внешних по отношению к ядру программ). Если надо изменить конфигурацию (добавить устройство, изменить порт или прерывание), то ядро пересобирают (перелинковывают) из обьектных модулей или (напр., во FreeBSD) из исходников. Это не совсем верно. Некоторые параметры пожно поправить без пересборки. Существуют также loadable kernel modules.
В противоположность Unix'у Windows (если не уточняется, какая, то имеются в виду 3.11, 95 и NT) и OS/2 при загрузке фактически на ходу прилинковывают драйверы. При этом компактность собранного ядра и повторное использование общего кода на порядок ниже, чем у Unix. Кроме того, при неизменной конфигурации системы ядро Unix без переделки (потребуется изменить только стартовую часть BIOS) может быть записан в ПЗУ и выполняться _не_загружаясь_ в ОЗУ. Компактность кода особенно важна, т.к. ядро и драйверы никогда не покидают физическую оперативную память, не свопятся на диск.
Unix - самая многоплатформенная OS. WindowsNT пытается подражать ему, но пока это плохо удается - после отказа от MIPS и POWER-PC, W'NT остались всего на двух платформы - традиционная i*86 и DEC Alpha. Переносимость программ с одной версии Unix на другую ограничена. Неаккуратно написанная программа, не учитывающая различий в реализациях Unix, делающая необоснованные предположения типа 'переменная integer должна занимать четыре байта' может потребовать серьезной переделки. Но все равно это на много порядков легче, чем например пернести с OS/2 на NT.
Области применения Unix
Unix используется как в качестве как сервера, так и рабочей станции. В номинации серверов с ним конкурируют MS WindowsNT, Novell Netware, IBM OS/2 Warp Connect, DEC VMS и операционные системы мэйнфреймов. Каждая система имеет свою область применения, в которой она лучше других.
WindowsNT - для администраторов, которые предпочитают удобный интерфейс экономному расходованию ресурсов и высокой производительности.
Netware - для сетей, где нужна высокая производительность файлового и принтерного сервиса и не столь важны остальные сервисы. Главный недостаток - на сервере Netware трудно запускать приложения.
OS/2 хороша там, где нужен "легкий" сервер приложений. Ресурсов требует меньше чем NT, в управлении гибче (хотя в настройке может и сложнее), а многозадачность очень хорошая. Авторизация и разграничение прав доступа не реализованы на уровне ОС, что с лихвой окупается реализацией на уровне приложений-серверов. (Впрочем, зачастую остальные OS делают то же самое). Многие станции FIDOnet и BBS сделаны на базе OS/2.
VMS - мощный, ничем не уступающий Unix'ам (а во многом и превосходящий его) сервер приложений, но только для платформ VAX и Alpha фирмы DEC.
Мэйнфреймы - для обслуживания очень большого количества пользователей (порядка нескольких тысяч). Но работа этих пользователей как правило организована в виде не клиент-серверного взаимодействия, а в виде хост-терминального. Терминал же в этой паре скорее не клиент, а сервер (Мир Internet, N3 за 1996-й год). К преимуществам мэйнфреймов надо отнести более высокую защищенность и устойчивость к сбоям, а к недостаткам - соответствующую этим качествам цену.
Unix хорош для квалифицированного (или желающего стать таковым) администратора, т.к. требует знания принципов функционирования происходящих в нем процессов. Реальная многозадачность и жесткое разделение памяти обеспечивают высокую надежность функционирования системы, хотя в производительности файл- и принт-сервисов Unix'ы уступают Netware.
Недостаточная гибкость предоставления прав доступа пользователей к файлам по сравнению с WindowsNT затрудняет организацию _на_уровне_файловой_системы_ группового доступа к данным (точнее, к файлам), что на мой взгляд компенсируется простотой реализации, а значит меньшими требованиями к аппаратуре. Впрочем, такие приложения, как SQL-сервер решают проблему группового доступа к данным своими силами, так что отсутствующая в Unix возможность запретить доступ к _файлу_ конкретному пользователю на мой взгляд является явно избыточной.
Практически все протоколы, на которых основан Internet, были разработаны под Unix, в частности стек протоколов TCP/IP придуман в университете Berkeley.
Защищенность Unix при правильном администрировании (а когда это не так?) ни в чем не уступает ни Novell, ни WindowsNT.
Важным свойством Unix, которое приближает его к мэйнфреймам, является его многотерминальность, много пользователей могут одновременно запускать программы на одной Unix-машине. Если не требуется использовать графику, можно обойтись дешевыми текстовыми терминалами (специализированными или на базе дешевых PC), подключенными по медленным линиям. В этом с ним конкурирует только VMS. Можно использовать и графические X-терминалы, когда на одном экране присутствуют окна процессов, выполняющихся на разных машинах.
В номинации рабочих станций с Unix конкурируют MS Windows*, IBM OS/2, Macintosh и Acorn RISC-OS.
Windows - для тех, кто ценит совместимость больше эффективности; для тех, кто готов купить большое количество памяти, дискового пространства и мегагерц; для тех, кто любит не вникая в суть, щелкать мышкой по кнопочкам в окошке. Правда, рано или поздно все равно придется изучить принципы работы системы и протоколов, но тогда уже будет поздно - выбор сделан. Немаловажным преимуществом Windows надо признать также возможность украсть кучу программного обеспечения.
OS/2 - для любителей OS/2. :-) Хотя по некоторым сведениям OS/2 лучше других взаимодействует с мэйнфреймами и сетями IBM.
Macintosh - для графических, издательских и музыкальных работ, а также для тех, кто любит понятный, красивый интерфейс и не хочет (не может) разбираться в подробностях функционирования системы.
RISC-OS, прошитая в ПЗУ, позволяет не тратить время на инсталляцию операционной системы и восстановление ее после сбоев. Кроме того, практически все программы под ней очень экономно расходуют ресурсы, благодаря чему не нуждаются в свопинге и работают очень быстро.
Unix функционирует как на PC, так и на мощных рабочих станциях с RISC-процессорами, под Unix написаны действительно мощные САПР и геоинформационные системы. Своей масштабируемостью Unix из-за его многоплатформенности на порядок превосходит любую другую операционную систему, по мнению некоторых авторов.
Список литературы
1. Учебное пособие Кузнецова С.Д. ”Операционная система UNIX ”2003г.;
2. Поляков А.Д. “UNIX 5-th Edition на x86, или не забывайте историю”;
3. Карпов Д.Ю. “UNIX” 2005 г.;
4. Федорчук А.В. «Мастерство работы в Unix», 2006 г.
5. Материалы сайта http://www.citforum.ru/operating_systems/1-16;