- •Глава 2
- •Операционная система как диспетчер ресурсов
- •Возможность развития операционной системы
- •2.2. Эволюция операционных систем
- •Последовательная обработка данных
- •Простые пакетные системы
- •Многозадачные пакетные системы
- •2.3. Основные достижения
- •Процессы
- •Управление памятью
- •Защита информации и безопасность
- •Структура системы
- •2.4. Характеристики современных операционных систем
- •2.5. Обзор операционной системы windows 2000
- •История возникновения
- •2.6. Традиционные системы unix
- •Описание
- •2.7. Современные системы unix
- •2.8. Рекомендуемая литература
- •2.9. Задачи
2.7. Современные системы unix
В процессе развития операционной системы UNIX появилось много ее реализаций, каждая из них обладала своими полезными возможностями. Впоследствии возникла необходимость создать реализацию, в которой были бы унифицированы многие важные нововведения, добавлены возможности других современных операционных систем и которая бы обладала модульной архитектурой. Архитектура типичного современного ядра системы UNIX изображена на рис. 2.17. В этой архитектуре имеется небольшое ядро, которое может работать с различными модулями, предоставляющими различным процессам операционной системы необходимые функции и сервисы. Каждый внешний круг рисунка соответствует различным функциям и интерфейсу, которые можно реализовать самыми различными способами.
А теперь перейдем к рассмотрению некоторых примеров современных систем UNIX.
System V Release 4 (SVR4)
Версия SVR4, разработанная совместно компаниями AT&T и Sun Microsystems, сочетает в себе особенности версий SVR3, 4.3 BSD, Microsoft Xenix System V и SunOS. Ядро System V было почти полностью переписано, в результате чего появилась очищенная от всего лишнего, хотя и сложная реализация. Среди новых возможностей этой версии следует отметить поддержку обработки данных в реальном времени, наличие классов планирования процессов, динамически распределяемые структуры данных, управление виртуальной памятью, наличие виртуальной файловой системы и ядра с вытеснением.
При создании системы SVR4 объединились усилия как коммерческих, так и академических разработчиков; разработка системы велась, чтобы обеспечить унифицированную платформу для коммерческих реализаций операционной системы UNIX. Эта цель была достигнута, a SVR4 на данный момент, по-видимому, является важнейшей версией UNIX. В ней удачно (с точки зрения конкурентоспособности) сочетаются наиболее важные возможности, реализованные во всех предыдущих системах UNIX. Система SVR4 может работать на компьютерах самых разнообразных типов, начиная с машин, в которых установлены 32-разрядные процессоры, и заканчивая суперкомпьютерами; эта система является важнейшей из всех ранее разработанных операционных систем. Именно из нее взяты многие примеры, приведенные в этой книге для иллюстрации работы системы UNIX.
Рис. 2.17. Ядро современной системы UNIX [VAHA96]
Solaris 2.x
Система Solaris — это версия операционной системы UNIX, разработанная фирмой Sun на основе SVR4. На время написания книги последней вышедшей версией Solaris была версия 2.8. Реализации системы Solaris версии 2 обладают всеми возможностями системы SVR4, а также некоторыми дополнительными, такими, как полная вытесняемость, наличие многопоточного ядра, полнофункциональная поддержка SMP и объектно-ориентированный интерфейс файловых систем. Solaris — это наиболее широко применяемая и пользующаяся коммерческим успехом реализация операционной системы UNIX. Некоторые примеры возможностей операционных систем, встречающиеся в этой книге, взяты из Solaris.
4.4BSD
Важную роль в развитии теории устройства операционных систем сыграла серия версий системы UNIX, разработанных в Калифорнийском университете. Серия 4.xBSD широко используется в академических организациях; она послужила основой для создания многих коммерческих продуктов UNIX.
По мнению автора, именно благодаря версиям этой серии UNIX приобрела свою популярность, а многие улучшения этой операционной системы впервые появились в версиях BSD.
Последней версией этой серии, выпущенной в Беркли, является система 4.4BSD. Эта версия является основным обновлением версии 4.3BSD, куда вошли новая система управления виртуальной памятью, ядро с измененной структурой, а также длинный список улучшений других возможностей.
Linux
История возникновения
Система Linux возникла как вариант операционной системы UNIX, предназначенный для персональных компьютеров с IBM-совместимой архитектурой. Первоначальная версия была написана Линусом Торвальдсом (Linus Torvalds), финским студентом, изучающим теорию вычислительных машин. В 1991 году Торвальдс представил в Internet первую версию системы Linux. С тех пор множество людей, сотрудничая посредством Internet, развивают Linux под руководством ее создателя. Благодаря тому что система Linux является бесплатной и можно беспрепятственно получить ее исходный код, она стала первой альтернативой рабочим станциям UNIX, предлагавшимся фирмами Sun Microsystems, Digital Equipment Corp (теперь Compaq) и Silicon Graphics. На сегодняшний день Linux является полнофункциональной системой семейства UNIX, способной работать на всех этих и других платформах.
Залогом успеха системы Linux является то, что она бесплатно распространяется при поддержке Фонда бесплатно распространяемых программ (Free Software Foundation — FSF). Целью этой организации является создание надежного аппаратно-независимого программного обеспечения, которое было бы бесплатным, обладало высоким качеством и пользовалось широкой популярностью среди пользователей. Фонд предоставляет инструменты для разработки программного обеспечения под эгидой общедоступной лицензии GNU (GNU Public License — GPL). Таким образом, система Linux в таком виде, в котором она существует сегодня, является продуктом, появившимся в результате усилий Торвальдса, а затем и многих других его единомышленников во всем мире, и распространяющимся в рамках проекта GNU.
Linux используется не только многими отдельными программистами; она проникла и в корпоративную среду [MANCOO]. В основном это произошло благодаря высокому качеству ядра операционной системы Linux, а не из-за того, что эта система является бесплатной. В эту популярную версию внесли свой вклад многие талантливые программисты, в результате чего появился впечатляющий технический продукт. К достоинствам системы Linux можно отнести то, что она является модульной и легко настраивается. Благодаря этому можно достичь высокой производительности ее работы на самых разнообразных аппаратных платформах. К тому же получая в свое распоряжение исходный код, производители программного обеспечения могут улучшать качество приложений и служебных программ, с тем чтобы они удовлетворяли определенным требованиям. В этой книге изложены подробности внутреннего устройства ядра Linux.
Модульная структура
Ядра большинства версий операционной системы UNIX являются монолитными. Напомним, что монолитное ядро — это ядро, которое виртуально включает в себя все возможности операционной системы в виде одного большого блока кода, который запускается как единый процесс в едином адресном пространстве. Все функциональные компоненты такого ядра имеют доступ ко всем его внутренним структурам данных и ко всем программам. При внесении изменений в любую из частей типичной монолитной операционной системы все ее модули и подпрограммы необходимо повторно компоновать и переустанавливать, а перед тем как изменения вступят в силу, систему нужно будет перезагрузить. В результате все модификации, такие, как добавление драйвера нового устройства или новых функций файловой системы, усложняются. Особенно остро эта проблема стоит в системе Linux, глобальную разработку которой выполняют объединенные на добровольных началах группы независимых программистов.
Для решения этой проблемы система Linux организована в виде набора относительно независимых блоков, которые называются загружаемыми модулями (loadable modules) [GOYE99]. Загружаемые модули Linux имеют две отличительные особенности.
Динамическое связывание. Любой модуль ядра может быть загружен в память и подсоединен к ядру в то время, когда само ядро уже находится в памяти и выполняется. Любой модуль может быть также отсоединен от ядра и удален из памяти в любой момент времени.
Стековая организация. Модули организованы в виде определенной иерархической структуры. Отдельные модули могут выполнять роль библиотек при обращении к ним модулей более высоких уровней в рамках этой структуры; они сами также могут обращаться к модулям на более низких уровнях.
Динамическое связывание [FRAN97] облегчает настройку системы и экономит память, которую занимает ядро. В системе Linux программа пользователя или сам пользователь может загружать или выгружать модули с помощью команд insmod и rmmod. Само ядро управляет работой отдельных функций и по мере надобности загружает нужные модули или выгружает те, нужда в которых уже отпала. Кроме того, стековая организация позволяет задавать зависимости модулей, что дает два основных преимущества.
Код, являющийся общим для набора однотипных модулей (например, драй веры похожих устройств), можно поместить в один модуль, что позволяет сократить количество повторений.
Ядро может проверить наличие в памяти нужных модулей, воздерживаясь от выгрузки модуля, который нужен для работы других, зависимых от него, и загружая вместе с новым требуемым модулем все необходимые дополнительные модули.
На примере, приведенном на рис. 2.18, показаны структуры, которые используются операционной системой Linux для управления модулями. На рисунке приведен список модулей ядра после загрузки модулей FAT и VFAT. Каждый модуль задается двумя таблицами: таблицей модулей и таблицей символов. В таблицу модулей входят перечисленные ниже элементы.
next. Указатель на следующий модуль. Все модули организованы в виде связанного «писка. Этот список начинается псевдомодулем (на рис. 2.18 он не показан).
ref. Список модулей, которые используются данным модулем.
symtab. Указатель на таблицу символов данного модуля.
name. Имя модуля.
size. Размер модуля в страницах памяти.
addr. Начальный адрес модуля.
state. Текущее состояние модуля.
*cleanup(). Указатель на программу, которая запускается при выгрузке данного модуля.
Рис. 2.18. Пример списка модулей ядра операционной системы Linux
Таблица символов определяет символы, контролируемые данным модулем и используемые где-либо еще. В таблицу входят такие элементы.
size. Полный размер таблицы.
n_symbols. Количество символов.
n_refs. Количество ссылок,
symbols. Таблица символов.
references. Список модулей, зависящих от данного.
На рис. 2.18 модуль VFAT загружается после модуля FAT и зависит от него.