10.7.7. Операционная система unix
Операционная система UNIX представляет собой многозадачную, многопользовательскую операционную систему и является в настоящее время одной из наиболее распространенных в мире. Она была первоначально разработана в 1970-е годы в AT&T Bell Laboratories. Особое внимание к переносимости, интерфейс пользователя, построенный на немногих базовых принципах, и возможность объединения различных UNIX-систем в сети независимо от аппаратной платформы очевидным образом способствовали успеху и распространению UNIX.
С момента своего появления система UNIX непрерывно развивалась и в настоящее время существует в нескольких модификациях. Основными ее распространителями являются компании AT&T Bell Laboratories и Berkeley Software Distribution. Почти все производители вычислительной техники предлагают UNIX либо как коммерческий продукт третьих фирм, либо как специально адаптированную версию для собственной аппаратной платформы. Некоторые специальные предложения отличаются скорее особенностями лицензирования, а не различием в выполняемых ими функциями. Кроме того, для сохранения совместимости и переносимости версии UNIX разных производителей не могут слишком сильно отличаться друг от друга.
В UNIX были введены средства, которые впоследствии были позаимствованы другими операционными системами. На базе UNIX была разработана операционная система OSF/1 (раздел 10.7.8), а многие функции были включены в Windows NT (раздел 10.7.9). UNIX также явилась основной базой для разработки важных коммуникационных интерфейсов, в частности протокола TCP/IP (раздел 9.4.9) и протокола пользовательского терминала X Window (раздел 11.6).
UNIX состоит из небольшого ядра, управляющего системными ресурсами (процессор, память и ввод/вывод), а остальная часть процедур операционной системы, и в частности управление файловой системой, работают как пользовательские процессы. Типичная операционная система UNIX содержит 10 000-20 000 строк на языке С и 1000-2000 строк машинно-ориентированных программ на ассемблере, которые разрабатываются отдельно для каждой аппаратной платформы. Ядро представляет собой единую резидентную программу размером от 100 Кбайт до 1 Мбайт в зависимости от платформы и выполняемых функций. При переносе системы UNIX на конкретную платформу требуется, вообще говоря, переписать заново только машинно-зависимую часть ядра. Это означает, что UNIX может работать на многих аппаратных платформах с идентичным системным интерфейсом.
Ядро UNIX имеет недостаточно продуманную структуру. Это следствие ее быстрого успеха и распространения, поскольку каждая новая версия должна была быть совместима с предыдущими. Первоначально система UNIX была разработана как многопользовательская, а не для приложений реального времени. Из-за того что подпрограммы операционной системы работают как пользовательские процессы, но с наивысшим приоритетом, назначенным системой, невозможно прерывать также те системные вызовы, выполнение которых занимает много времени, что увеличивает время реакции системы. Это является существенным недостатком для задач реального времени, особенно управляемых прерываниями. В UNIX используется довольно сложное описание контекста, что увеличивает время переключения процессов. Из-за того что в UNIX все операции с каналом построены на основе переключения процессов, применение этого механизма для связи между процессами в приложениях реального времени может приводить к задержкам.
Стандартно процессы в UNIX протекают с разделением времени. Для того чтобы дать всем процессам возможность исполняться, применяется динамическое распределение приоритетов. Процессу, готовому для исполнения, сначала присваивается его номинальный приоритет. Во время исполнения значение этого приоритета уменьшается до тех пор, пока он не становится меньше приоритета следующего из ожидающих процессов, который после этого выбирается для исполнения. В результате процессы с более высоким начальным приоритетом получают большую долю процессорного времени, и при этом все процессы периодически исполняются. Системные обращения синхронизированы с вызывающим процессом — он должен ждать, пока запрошенная операция не выполнится и ему не будет возвращено управление.
Важной особенностью, реализованной в UNIX, является одинаковая трактовка всех устройств. Внешние устройства ввода/вывода рассматриваются как файлы. Это существенно упрощает программы, требующие определенной гибкости, так как можно осуществить перенаправление ввода/вывода между файлами или внешними устройствами, такими как локальный или удаленный терминал или принтер, без изменения кода программы. Это также важно и с точки зрения машинной независимости программ.
Общим и вызывающим критику недостатком UNIX является его недружественный пользовательский интерфейс. Действительно, все еще в ходу старые и непонятные команды, а если и есть заменяющие их, то с именами или сокращениями, которые столь же неестественны, как и предыдущие. В некоторых системах пользовательские оконные интерфейсы и меню способны в основном "транслировать" выбранные действия в стандартные команды UNIX. Положительной особенностью команд UNIX является то, что благодаря стандартизации ввода/вывода и механизму каналов несколько команд можно объединить в одной строке, причем выход одной команды является входом следующей. Такая техника позволяет для выполнения сложных операций вместо длинных командных файлов использовать всего несколько строк.
Хотя в начале UNIX была многозадачной операционной системой, не предназначенной для работы в реальном времени, из-за широкого распространения в научной и технической среде стала очевидной необходимость ее адаптации и к задачам реального времени. Поэтому новые версии поддерживают такие функциональные элементы систем реального времени, как семафоры, разделяемую память, обмен сигналами между процессами, приоритетное управление задачами и прямой доступ к внешним устройствам.
POSIX представляет собой машинно-независимый интерфейс операционной системы, базирующийся на UNIX, определенный стандартом IEEE 1003.1-1988.