- •1.1. Информация
- •2. Технические средство реализации информационных процессов
- •3. Информатика
- •4. Информагика
- •3. Системное программное обеспечение
- •5. Информатика
- •Тема 1лпих поставляется вместе с лицензией, разработанной Ричардом Столманом, основателем Фонда бесплатно распространяемых программ.
- •4. Прикладное программное обеспечение
- •7. Информатика
- •8. Информатика
- •5. Модели решения функциональный и Вычислительный
- •9. Информатика _ _ _
- •10. Информатика
- •6. Основы алгоритмизации
- •11Икл с постуслоВием
- •7. Компьютерные сети
- •13. Информатика
- •8. Основы и методы дошиты информации
- •Содержание
- •1. Информация, информатика, информационные технологии 9
- •2. Технические средства реализации информационных процессов .. 62
- •3. Системное программное обеспечение 117
- •4. Прикладное программное обеспечение 182
- •5. Модели решения функциональных и вычислительных задач.... 257
- •8. Основы и методы защиты информации 397
- •344082, Г. Ростов-на-Дону, пер. Халтуринский, 80.
5. Информатика
В модели процесса все функционирующее на компьютере ПО организовано в виде набора последовательных процессов, или просто процессов. Процессом является выполняемая программа вместе с текущими значениями счетчика команд, регистров и переменных. С позиций этой абстрактной модели у каждого процесса есть собственный центральный виртуальный процессор. На самом деле центральный процессор переключается с процесса на процесс, но для лучшего понимания системы проще рассматривать набор процессов, идущих параллельно, чем представлять процессор, переключающийся от программы к программе. Это переключение и называется многозадачностью или мультипрограммированием.
Операционной системе нужен способ создания и прерывания процессов по мере необходимости. Обычно при загрузке ОС создаются несколько процессов. Некоторые из них обеспечивают взаимодействие с пользователем и выполняют заданную работу. Остальные процессы являются фоновыми. Они не связаны с конкретными пользователями, но выполняют особые функции. Например, один фоновый процесс может обеспечивать вывод на печать, другой может обрабатывать запросы к теЪ-страницам.
Процессы могут создаваться не только в момент загрузки системы. Так, текущий процесс может создать один или несколько новых процессов, при этом текущий процесс выполняет системный запрос на создание нового процесса. Создание новых процессов особенно полезно в тех случаях, когда выполняемую задачу проще всего сформировать как набор связанных, но независимо взаимодействующих процессов. Если необходимо организовать выборку большого количества данных из сети для дальнейшей обработки, удобно создать один процесс для выборки данных и размещения их в буфере, другой - для считывания и обработки данных из буфера. Такая схема даже ускорит обработку данных, если каждый процесс запустить на отдельном процессоре в случае многопроцессорной системы.
Как правило, процессы завершаются по мере выполнения своей работы. Так, после окончания компиляции программы компилятор выполняет системный запрос, чтобы сообщить ОС об окончании работы. В текстовых редакторах, браузерах и других программах такого типа есть кнопка или пункт меню, с помощью которых можно завершить процесс.
Процесс является независимым объектом со своим счетчиком
130
команд и внутренним состоянием, однако существует необходимость взаимодействия с другими процессами. Например, выходные данные одного процесса могут служить входными данными для другого процесса.
Модель процессов упрощает представление о внутреннем поведении системы. Некоторые процессы запускают программы, выполняющие команды, введенные с клавиатуры пользователем. Другие процессы являются частью системы и обрабатывают такие задачи, как выполнение запросов файловой службы, управление запуском диска или магнитного накопителя.
Рассмотренный подход описывается моделью, представленной на рис. 3.4. Нижний уровень ОС — это планировщик — небольшая программа. На верхних уровнях расположены процессы. Обработка прерываний и процедуры, связанные с остановкой и запуском процессов, выполняются планировщиком. Вся остальная часть ОС структурирована в виде набора процессов.
Процессы
0 |
1 |
• • • |
п-2 |
п-1 |
Планировщик |
Рис. 3.4. Нижний уровень ОС, отвечающий за прерывание и планирование
Реализация модели процессов базируется на таблице процессов с одним элементом для каждого процесса. Элемент таблицы содержит информацию о состоянии процесса, счетчике команд, распределении памяти, состоянии открытых файлов, об указателе стека, использовании и распределении ресурсов, а также всю остальную информацию, которую необходимо сохранять при переключении в состояние готовности или блокировки для последующего запуска процесса, как если бы он не останавливался.
Потоки
В обычных ОС процесс определяется соответствующим адресным пространством и одиночным управляющим потоком. Но часто встречаются ситуации, когда в одном адресном пространстве предпочти-
131
тельно иметь несколько квазипараллельных управляющих процессов.
Модель процесса базируется на двух независимых концепциях: группировании ресурсов и выполнении программы. Когда их разделяют, появляется понятие потока.
С одной стороны, процесс можно рассматривать как способ объединения родственных ресурсов в одну группу У процесса есть адресное пространство, содержащее программу, данные и другие ресурсы. Ресурсами являются открытые файлы, дочерние процессы, аварийные необработанные сообщения, обработчики сигналов, учетная информация и многое другое. Гораздо проще управлять ресурсами, объединив их в форме процесса.
С другой стороны, процесс можно рассматривать как поток исполняемых команд. У потока есть счетчик команд, отслеживающий порядок выполнения действий. У него есть регистры, в которых хранятся текущие переменные. У него есть стек, содержащий протокол выполнения процесса, где на каждую вызванную процедуру отведена отдельная структура. Хотя поток протекает внутри процесса, следует различать концепции потока и процесса. Процессы используются для группирования ресурсов, а потоки являются объектами, поочередно исполняющимися на ЦП.
Концепция потоков добавляет к модели процесса возможность одновременного выполнения в одной и той же среде процесса нескольких достаточно независимых программ. Несколько потоков, работающих параллельно в одном процессе, аналогичны нескольким процессам, идущим параллельно на одном компьютере. В первом случае потоки разделяют адресное пространство, открытые файлы и другие ресурсы. Во втором — процессы совместно пользуются физической памятью, дисками, принтерами и другими ресурсами. Потоки обладают некоторыми свойствами процессов, поэтому их иногда называют упрощенными процессами. Термин многопотонность также используется для описания использования нескольких потоков в одном процессе.
При запуске многопоточного процесса в системе с одним процессором потоки работают поочередно. Процессор быстро переключается между потоками, создавая впечатление параллельной работы потоков, даже не на очень быстром процессоре. Например, в случае трех потоков в одном процессе все потоки будут работать параллельно. Каждому потоку будет соответствовать виртуальный процессор с
132
быстродействием, равным одной трети быстродействия реального процессора.
Почему же потоки так необходимы? Основной причиной является выполнение большинством приложений большого количества действий, некоторые из них могут время от времени блокироваться. Схему программы можно существенно упростить, если разбить приложение на несколько последовательных потоков, запущенных в квазипараллельном режиме.
При использовании потоков имеется также возможность совместного применения параллельными объектами одного адресного пространства и всех содержащихся в нем данных. Для некоторых приложений эта возможность является существенной. В таких случаях схема параллельных процессов с разными адресными пространствами не подходит.
В пользу потоков работает еще один аргумент — легкость их создания и уничтожения, так как с потоком не связаны никакие ресурсы. В большинстве систем на создание потока уходит примерно в 100 раз меньше времени, чем на создание процесса. Это свойство особенно полезно при необходимости динамического и быстрого изменения числа потоков.
Третьим аргументом является производительность. Концепция потоков не дает увеличения производительности, если они ограничены возможностями процессора. Но когда имеется одновременная потребность в выполнении большого объема вычислений и операций ввода-вывода, наличие потоков позволяет совмещать эти процедуры во времени, увеличивая, тем самым, общую скорость работы приложения.
Концепция потоков полезна также в системах с несколькими процессорами, где возможен настоящий параллелизм.
Необходимость потоков проще продемонстрировать на конкретном примере. Рассмотрим текстовый процессор, который выводит на экран монитора текст в том виде, в котором он будет напечатан. Допустим, что пользователь пишет книгу. С точки зрения автора проще хранить книгу в одном файле, чтобы легче было искать отдельные фрагменты, редактировать и т.п.
Представим, что пользователь удалил предложение на первой странице, а затем исправил предложение на 350-й странице документа, в котором 400 страниц. Он дает команду программе перейти на
133
страницу с номером 350. Текстовому процессору придется переформатировать весь документ вплоть до 350-й страницы, поскольку он не знает, где начинается эта страница. Это может занять довольно много времени и вряд ли обрадует пользователя.
В данном случае помогут потоки. Пусть текстовый процессор написан в виде двухпоточной программы. Один поток взаимодействует с пользователем, а второй переформатирует документ в фоновом режиме. Как только предложение на первой странице было удалено, интерактивный поток дает команду фоновому потоку переформатировать весь документ. В то время как первый поток продолжает выполнять команды с клавиатуры или мыши, второй поток быстро переформатирует документ. Может случиться, что форматирование будет закончено раньше, чем пользователь захочет перейти к 350-й странице, и тогда команда будет выполнена мгновенно. Можно добавить третий поток. Большинство текстовых процессоров автоматически сохраняет редактируемый текст один раз в несколько минут (время устанавливается пользователем), чтобы в случае аварийного завершения программы, отказа системы или перебоев с питанием пользователь не лишился результатов своей работы. Этим может заниматься третий поток, не отвлекая два оставшихся.
3,2.5. Управление памятью
Память представляет собой важный ресурс, требующий тщательного управления, поскольку программы увеличиваются в размерах быстрее, чем память.
Память в компьютере имеет иерархическую структуру. Небольшая ее часть представляет собой очень быструю энергозависимую (теряющую информацию при выключении питания) кэш-память. Компьютеры обладают также десятками мегабайт энергозависимой оперативной памяти ОЗУ (КАМ, Капйот Асс姧 Метогу — память с произвольным доступом) и десятками или сотнями гигабайт медленного энергонезависимого пространства на жестком диске. Одной из задач ОС является координация использования всех этих составляющих памяти.
Часть операционной системы, отвечающая за управление памятью, называется модулем управления памятью или менеджером памяти. Менеджер следит за тем, какая часть памяти используется в данный
134
момент, выделяет память процессам и по их завершении освобождает ресурсы, управляет обменом данных между ОЗУ и диском.
Системы управления памятью делят на два класса. К первому классу относятся системы, перемещающие процессы между оперативной памятью и диском во время их выполнения, т.е. осуществляющие подкачку процессов целиком (§\уаррт§) или постранично (ра§т§). Обычный и постраничный варианты подкачки являются искусственными процессами, вызванными отсутствием достаточного количества оперативной памяти для одновременного хранения всех программ. Ко второму — те, которые этого не делают. Второй класс систем проще. Поскольку ПО растет еще быстрее, чем память, то, вероятно, потребность в эффективном управлении памятью будет существовать всегда. В 80-е гг. использовали системы разделения времени для работы десятков пользователей на машинах УАХ с объемом памяти 4 Мбайт. Сейчас рекомендуется для индивидуальной работы в системе \Утс1о>У5 2000 устанавливать на компьютер не менее 64 Мбайт оперативной памяти. Дальнейшее развитие в сторону мультимедийных систем накладывает еще большие требования на размер оперативной памяти.
Самая простая схема управления памятью — однозадачная система без подкачки на диск — заключается в том, что в каждый момент времени работает только одна программа, и память разделяется между программами и операционной системой. Когда система организована таким образом, в каждый конкретный момент времени может работать только один процесс. Как только пользователь набирает команду, ОС копирует запрашиваемую программу с диска в память и выполняет ее, а после окончания процесса выводит на экран символ приглашения и ждет новой команды. Получив команду, она загружает новую программу в память, записывая ее поверх предыдущей. Так работают компьютеры с операционной системой М8-ОО8.
Большинство современных систем позволяет одновременный запуск нескольких процессов. Наличие нескольких процессов, работающих в один и тот же момент времени, означает, что когда один процесс приостановлен в ожидании завершения операции ввода-вывода, другой может использовать центральный процессор. Таким образом, многозадачность увеличивает загрузку процессора. На сетевых серверах всегда одновременно работают несколько процессов (для разных клиентов), но и большинство клиентских машин в наши дни
135
также имеют эту возможность. Самый простой способ достижения многозадачности состоит в разбиении памяти на л, возможно, не равных, разделов. Когда задание поступает в память, оно располагается во входной очереди к наименьшему разделу, достаточно большому для того, чтобы вместить это задание. Так как размер разделов неизменен, то все неиспользуемое работающим процессом пространство в разделе пропадает. Недостаток этого способа заключается в том, что к большому разделу очереди почти не бывает, а к маленьким разделам выстраивается довольно много задач. Небольшие задания должны ждать своей очереди, чтобы попасть в память, несмотря на то, что свободна основная часть памяти. Усовершенствованный способ заключается в организации одной общей очереди для всех разделов. Как только раздел освобождается, задачу, находящуюся ближе к началу очереди и подходящую для выполнения в этом разделе, можно загрузить в него и начать ее обработку. С другой стороны, нежелательно тратить большие разделы на маленькие задачи, поэтому существует другая стратегия. Она заключается в том, что каждый раз после освобождения раздела происходит поиск в очереди наибольшего для этого раздела задания, и именно оно выбирается для обработки. Однако этот алгоритм отстраняет от обработки небольшие задачи, хотя необходимо предоставить для мелких задач лучшее обслуживание. Выходом из положения служит создание хотя бы одного маленького раздела, который позволит выполнять мелкие задания без долгого ожидания освобождения больших разделов. Другой подход предусматривает следующий алгоритм: задачу, которая имеет право быть выбранной для обработки, можно пропустить не более 1с раз. Когда задача пропускается, к счетчику добавляется единица. Если значение счетчика стало равным 1с, игнорировать задачу больше нельзя.
При использовании многозадачности повышается эффективность загрузки ЦП. Если средний процесс выполняет вычисления только 20 % от времени, которое он находится в памяти, то при обработке пяти процессов ЦП должен быть загружен полностью. Реальная же ситуация предполагает, что все пять процессов никогда не ожидают завершения операции ввода-вывода одновременно.
Организация памяти в виде фиксированных разделов проста и эффективна для работы с пакетными системами. До тех пор, пока в памяти может храниться достаточное количество задач для обеспе-
136
чения постоянной занятости ЦП, причин для усложнения алгоритма нет.
Однако совсем другая ситуация складывается с системами разделения времени или компьютерами, ориентированными на работу с графикой. Оперативной памяти иногда оказывается недостаточно для того, чтобы разместить все активные процессы, и тогда избыток процессов приходится хранить на диске, а для обработки переносить их в память.
Существуют два основных способа управления памятью, зависящие частично от доступного аппаратного обеспечения. Самая простая стратегия, называемая свопингом (здуарршё) или подкачкой, состоит в том, что каждый процесс полностью переносится в память, работает некоторое время и затем целиком возвращается на диск. Другая стратегия, носящая название виртуальной памяти, позволяет программам работать даже тогда, когда они только частично находятся в оперативной памяти.
Работа системы свопинга заключается в следующем. Пусть имеются 4 процесса — А, В, С, О. На начальной стадии в памяти находится только процесс А. Затем с течением времени создаются или загружаются с диска последовательно процессы В и С. В следующий момент процесс А выгружается на диск. Затем появляется процесс В, а процесс В завершается. Наконец, процесс А снова возвращается в память. Распределение памяти изменяется по мере того, как процессы поступают в память и покидают ее. Так как теперь процесс А имеет другое размещение в памяти, его адреса должны быть перенастроены или программно во время загрузки в память, или ап-паратно во время выполнения программы.
Основная разница между фиксированными и изменяющимися разделами состоит в том, что во втором случае количество, размещение и размер разделов изменяются динамически по мере поступления и завершения процессов. Здесь нет ограничений, связанных с количеством разделов и их объемом. Это улучшает использование памяти, но значительно усложняет операции размещения процессов, освобождения памяти и отслеживание происходящих изменений.
Основная идея виртуальной памяти заключается в том, что объединенный размер программы, данных и стека может превысить количество доступной физической памяти. ОС хранит части программы, использующиеся в настоящий момент в оперативной памяти,
137
остальные — на диске. Например, программа размером 16 Мбайт сможет работать на машине с 4 Мбайт памяти, если тщательно продумать, какие 4 Мбайт должны храниться в памяти в каждый момент времени. При этом части программы, находящиеся на диске и в памяти, будут меняться местами по мере необходимости.
Виртуальная память может также работать в многозадачной системе при одновременно находящихся в памяти частях многих программ. Когда программа ждет перемещения в память очередной своей части, она находится в состоянии ввода-вывода и не может работать, поэтому ЦП может быть отдан другому процессу.
3.2.6. ВВоЭ-ВыВоЭ
Одной из важнейших функций ОС является управление устройствами ввода-вывода компьютера. Операционная система дает этим устройствам команды, перехватывает прерывания и обрабатывает ошибки. Она должна обеспечить простой и удобный интерфейс между устройствами и остальной частью системы. Интерфейс должен быть одинаковым для всех устройств с целью достижения независимости от применяемой аппаратуры. Программное обеспечение ввода-вывода составляет существенную часть операционной системы.
Устройства ввода-вывода можно разделить на две категории: блочные устройства и символьные устройства. Блочные устройства хранят информацию в виде блоков фиксированного размера, причем у каждого блока имеется свой адрес. Размеры блоков колеблются от 521 до 32 768 байт. Важное свойство блочного устройства состоит в том, что каждый его блок может быть прочитан независимо от остальных блоков. Наиболее распространенными блочными устройствами являются диски.
Другой тип устройств ввода-вывода — символьные устройства. Символьное устройство принимает или предоставляет поток неструктурированных символов. Оно не является адресуемым и не выполняет операцию поиска. Принтеры, сетевые адаптеры, мыши и большинство других устройств, не похожих на диски, можно считать символьными устройствами.
Такая классификация является условной. Некоторые устройства не попадают ни в одну из категорий. Например, часы не являются
138
блок-адресуемыми. Они не формируют и не принимают символьных потоков. Вся их работа заключается в инициировании прерываний в строго определенные моменты времени. И все же модель блочных и символьных устройств является настолько общей, что может служить основой для достижения независимости программного обеспечения ОС от устройств ввода-вывода. Например, файловая система имеет дело с абстрактными блочными устройствами, а зависимую от устройств часть оставляет программному обеспечению низкого уровня.
Устройства ввода-вывода обычно состоят из механической и электронной частей. Механический компонент находится в самом устройстве. Электронный компонент устройства называется контроллером или адаптером. В современных компьютерах контроллеры встраиваются в материнскую плату или располагаются на самом устройстве ввода-вывода. Многие контроллеры способны управлять несколькими идентичными устройствами. Если интерфейс между контроллером и устройством является официальным стандартом АК81, ШЕЕ или 18О либо фактическим стандартом, то различные производители могут выпускать отдельно устройства и контроллеры, удовлетворяющие данному интерфейсу. Так производятся жесткие диски, соответствующие интерфейсу ШЕ (1п1е§га1ес1 Впуе Е1ес1гошс8 — встроенный интерфейс накопителей) или 8С81 (8та11 Сотри1ег 8уз1ет 1п1егГасе — системный интерфейс малых компьютеров).
Часто интерфейс между устройством и контроллером является интерфейсом низкого уровня. С диска в контроллер поступает последовательный поток битов, начинающийся с заголовка сектора (преамбулы), за которым следует 4096 бит в секторе, и контрольная сумма, называемая кодом исправления ошибок ЕСС (Еггог СоггесИщ* Соде). Заголовок сектора записывается на диск во время форматирования. Он содержит номера цилиндра и сектора, размер сектора, коды синхронизации и другую служебную информацию.
Работа контроллера заключается в конвертировании последовательного потока битов в блок байтов и коррекцию ошибок. Обычно байтовый блок накапливается в буфере контроллера. Затем проверяется контрольная сумма блока, и если она совпадает с указанной в заголовке сектора, то блок считается принятым без ошибок. После этого блок копируется в оперативную память.
Контроллер монитора (видеоадаптер) работает на таком же низ-
139
ком уровне. Он считывает из памяти байты, содержащие символы, которые следует отобразить, и формирует сигналы, используемые для модуляции луча электронной трубки, заставляющие ее выводить изображение на экран. Видеоадаптер формирует сигналы, управляющие горизонтальным и вертикальным возвратом луча. Операционная система только инициализирует контроллер, задавая небольшое количество параметров, таких, как количество пикселов в строке и число строк на экране, а всю работу по управлению передвижениями луча по экрану выполняет контроллер.
Ключевая концепция разработки ПО ввода-вывода формулируется как независимость от устройств. Эта концепция означает возможность написания программ, способных получать доступ к любому устройству ввода-вывода без предварительного указания конкретного устройства. Например, программа, читающая данные из входного файла, должна одинаково успешно работать с файлом на дискете, жестком диске или компакт-диске. При этом не должны требоваться какие-либо изменения в программе. В качестве выходного устройства также может быть указан экран, файл на любом диске или принтер. Все проблемы, связанные с отличиями этих устройств, снимает операционная система.
Тесно связан с концепцией независимости от устройств принцип единообразного именования. Имя файла или устройства должно быть просто текстовой строкой или целым числом. Оно никак не должно зависеть от физического устройства.
Другим важным аспектом ПО ввода-вывода является обработка ошибок. Ошибки должны обрабатываться как можно ближе к аппаратуре. Если контроллер обнаружил ошибку чтения, он должен по возможности исправить эту ошибку сам. Если он не может это сделать, то ошибку должен обработать драйвер устройства. Многие ошибки бывают временными, например ошибки чтения, вызванные пылинками на читающих головках. Такие ошибки исчезают при повторном чтении блока. Только если нижний уровень не может сам справиться с проблемой, о ней следует информировать верхний уровень. Во многих случаях восстановление может осуществляться на нижнем уровне, так, что верхние уровни даже не будут знать о наличии ошибок.
Одним из ключевых вопросов является способ переноса дан-
140
ных — синхронный (блокирующий) или асинхронный (управляемый прерываниями). Большинство операций ввода-вывода на физическом уровне являются асинхронными — ЦП запускает перенос данных и переключается на другой процесс, пока не придет прерывание.
Еще одним аспектом ПО ввода-вывода является буферизация. Часто данные, поступающие с устройства, не могут быть сохранены там, куда они направлены. Например, когда пакет приходит по сети, ОС не знает, куда его поместить, пока не будет проанализировано его содержимое. Буферизация предполагает копирование данных в больших количествах, что часто является основным фактором снижения производительности операций ввода-вывода.
И последним понятием, которое связано с вводом-выводом, является понятие выделенных устройств и устройств коллективного использования. С некоторыми устройствами, такими как диски, может одновременно работать большое количество пользователей. При этом не должно возникать проблем при одновременном открытии на одном и том же диске нескольких файлов. Другие устройства, такие как накопители на магнитной ленте, предоставляются в монопольное пользование. Пока не завершит свою работу один пользователь накопитель не может быть предоставлен другому пользователю. ОС должна уметь управлять как устройствами общего доступа, так и выделенными устройствами.
Существуют три различных способа осуществления операций ввода-вывода. Простейший вид ввода-вывода состоит в том, что всю работу выполняет центральный процессор. Этот метод называется программным вводом-выводом. ЦП вводит или выводит каждый байт или слово, находясь в цикле ожидания готовности устройства ввода-вывода. Второй способ представляет собой управляемый прерываниями ввод-вывод, при котором ЦП начинает передачу ввода-вывода для символа или слова, после чего переключается на другой процесс, пока прерывание от устройства не сообщит ему об окончании операции ввода-вывода. Третий способ заключается в использовании прямого доступа к памяти (ВМА — О1гес1 Метогу Ассе88), при котором отдельная микросхема управляет переносом целого блока данных и инициирует прерывание только после окончания операции переноса блока.
141
3.2,7, ПройВеры устройств
У контроллера каждого устройства есть набор регистров, используемых для того, чтобы давать управляемому устройству команды и считывать состояние устройства. Число таких регистров и выдаваемые команды зависят от конкретного устройства. Например, программа управления мышью должна получать от мыши информацию о том, насколько далеко она продвинулась по горизонтали и вертикали, а также о нажатых кнопках мыши. Программа управления диском должна знать о секторах, дорожках, цилиндрах, головках, их перемещении и времени установки, двигателях и тому подобных вещах, необходимых для правильной работы диска. Очевидно, что эти программы управления будут сильно различаться. Такая программа управления каждым устройством ввода-вывода, подключенным к компьютеру, называется драйвером устройства. Она обычно пишется производителем и распространяется вместе с устройством. Поскольку для каждой ОС требуются специальные драйверы, производители устройств обычно поставляют драйверы для нескольких наиболее популярных операционных систем.
Каждый драйвер устройства поддерживает один тип устройства или, максимум, класс близких устройств. Например, драйвер дисков может поддерживать различные диски, отличающиеся размерами и скоростями. Однако мышь и джойстик отличаются настолько сильно, что обычно требуют использования различных драйверов.
Чтобы получить доступ к аппаратной части устройства, т.е. к регистрам контроллера, драйвер устройства должен быть частью ядра операционной системы. Но возможно создать и драйвер, работающий в пространстве пользователя. Это позволило бы изолировать ядро от драйверов, а драйверы друг от друга. При этом была бы устранена основная причина крушения операционных систем: драйверы, содержащие ошибки, сталкивающиеся с ядром тем или иным образом. Но поскольку современные операционные системы предполагают работу драйверов в ядре, рассмотрим именно такую модель.
Так как в ОС будут устанавливаться драйверы, выпускаемые другими производителями, необходима архитектура, допускающая подобную установку. Это означает, что должна быть выработана строго определенная модель функций драйвера и его взаимодействия с остальной операционной системой. Драйверы устройств обычно рас-
142
|
|
| |||||||||
Остальная часть операционной системы | |||||||||||
1 |
|
I |
1 |
|
| ||||||
Драйвер принтера |
Драйвер видеокарты |
Драйвер СВ-КОМ |
| ||||||||
I |
I |
1 |
| ||||||||
* |
|
1 |
1 |
| |||||||
|
Контроллер принтера |
Контроллер видеоадаптера |
Контроллер СО-ЯОМ |
|
|
Пространство пользователя
Пространство ядра
Аппаратура
Принтер
Видеоадаптер |
|
СО-КОМ |
Устройства
Рис. 3.5. Логическое расположение драйверов устройств
полагаются под остальной частью ОС (рис. 3.5).
Операционная система обычно классифицирует драйверы по нескольким категориям в соответствии с типами обслуживаемых ими устройств. К наиболее общим категориям относятся блочные устройства, например, диски, содержащие блоки данных, к которым возможна независимая адресация, и символьные устройства, такие как клавиатуры и принтеры, формирующие или принимающие поток символов.
В большинстве операционных систем определены два стандартных интерфейса, один из которых должны поддерживать все блочные драйверы, а второй — все символьные драйверы. Эти интерфейсы включают наборы процедур, которые могут вызываться остальной операционной системой для обращения к драйверу. К этим процедурам относятся, например, процедуры чтения блока или записи символьной строки.
Некоторые ОС представляют собой двоичную программу, содержащую в себе все необходимые драйверы. Такая схема в течение многих лет была нормой для ОС 1Ж1Х, так как они предназнача-
143
лись для работы в компьютерных центрах, где устройства ввода-вывода менялись редко. При добавлении нового устройства системный администратор просто перекомпилировал ядро с новым драйвером, получая новый двоичный модуль.
С появлением персональных компьютеров с их огромным разнообразием устройств ввода-вывода такая модель перестала работать. Далеко не все пользователи могли самостоятельно перекомпилировать и собрать ядро даже при наличии исходных текстов или объектных модулей. Поэтому операционные системы, начиная с М5-ВО8, перешли к модели динамической подгрузки драйверов. Различные системы выполняют эту процедуру по-разному.
Драйвер устройства выполняет несколько функций:
обработку абстрактных запросов чтения и записи независи мого от устройств и расположенного над ними программного обес печения;
инициализацию устройства;
управление энергопотреблением устройства и регистрацией событий;
проверку входных параметров. Если они не удовлетворяют оп ределенным критериям, драйвер возвращает ошибку В противном случае драйвер преобразует абстрактные термины в конкретные. На пример, дисковый драйвер может преобразовывать линейный номер блока в номера головки, дорожки и секторы;
проверку использования устройства в данный момент. Если ус тройство занято, запрос может быть поставлен в очередь. Если уст ройство свободно, проверяется его состояние. Возможно, требуется включить устройство или запустить двигатель, прежде чем начнется перенос данных. Как только устройство готово, может начинаться собственно управление устройством.
Управление устройством подразумевает выдачу ему серии команд. Именно в драйвере и определяется последовательность команд в зависимости от того, что должно быть сделано. Определившись с командами, драйвер начинает записывать их в регистры контроллера устройства. Некоторые контроллеры способны принимать связные списки команд, находящихся в памяти. Они сами считывают и выполняют их без дальнейшей помощи операционной системы.
После того как драйвер передал все команды контроллеру, ситуация может развиваться по двум сценариям. Во многих случаях драй-
144
вер устройства должен ждать, пока контроллер не выполнит для него определенную работу, поэтому он блокируется до тех пор, пока прерывание от устройства его не разблокирует. В других случаях операция завершается без задержек и драйверу не нужно блокироваться. Например, для скроллинга экрана в символьном режиме нужно записать лишь несколько байтов в регистры контроллера. Вся операция занимает несколько наносекунд.
По завершении выполнения операции драйвер должен проверить, завершилась ли операция без ошибок. Если все в порядке, драйверу, возможно, придется передать данные (например, прочитанный блок) независимому от устройств программному обеспечению. Затем драйвер возвращает некоторую информацию вызывающей программе о завершении операции. Если в очереди находились другие запросы, один из них теперь может быть выбран и запущен, в противном случае драйвер блокируется в ожидании следующего запроса.
Драйверам не разрешается обращаться к системным вызовам, но им часто бывает необходимо взаимодействовать с остальным ядром. Для этого драйверам можно вызывать некоторые системные процедуры, например, для выделения им аппаратно фиксированных страниц памяти в качестве буферов, а также для возвращения этих страниц обратно ядру. Кроме того, драйверы пользуются вызовами, управляющими диспетчером памяти, таймерами, контроллером ВМА, контроллером прерываний и т. п.
Как сделать так, чтобы все устройства ввода-вывода и драйверы выглядели примерно одинаково? Если диски, принтеры, клавиатуры и т. д. требуют различных интерфейсов, то при появлении нового устройства будет требоваться переделка операционной системы, что очень неудобно. Этот вопрос связан с интерфейсом между драйверами устройств и операционной системой. Функции драйверов, доступные системе, отличаются от драйвера к драйверу. Это означает, что функции ядра, необходимые для драйвера, тоже различаются, поэтому взаимодействие с каждым новым драйвером требует больших усилий программистов.
Существует принципиально другой подход, при котором у всех драйверов один и тот же интерфейс. При этом значительно легче установить новый драйвер, при условии, что он соответствует стандартному интерфейсу. Программисты, занимающиеся разработкой
145
драйверов, знают, какие функции они должны реализовать и к каким функциям ядра они могут обращаться. На практике же не все устройства являются абсолютно идентичными, но обычно имеется небольшое число типов устройств, достаточно похожих друг на друга. Например, даже у блочных и символьных устройств есть много общих функций.
3,2.8. Файловые системы
Всем компьютерным приложениям нужно хранить и получать информацию. Наиболее удобной для доступа к долговременным устройствам хранения информации оказалась система, при которой пользователь назначает для той или иной совокупности данных некоторое имя. Определенный участок диска, занятый информацией, имеющей собственное имя, называется файлом. Часть ОС, работающая с файлами и обеспечивающая хранение данных на дисках и доступ к ним, называется файловой системой (ФС).
С точки зрения пользователя наиболее важным аспектом файловой системы является ее внешнее представление, т.е. именование и защита файлов, операции с файлами и т.д. Компьютеру безразлично, какое имя имеет любая программа или документ, так как он получает от ОС инструкцию подобно такой: «прочитай столько-то байт с такого-то места на диске». При этом пользователь не обязан знать, в каком физическом порядке и где именно находятся его данные. Ему достаточно потребовать от ОС прочитать документ или загрузить необходимую программу.
Одной из важнейших характеристик ОС, помимо управления памятью, ресурсами компьютера и задачами, является поддержка файловой системы — основного хранилища системной и пользовательской информации.
Файлы относятся к абстрактному механизму. Они предоставляют способ сохранить информацию на диске и считывать ее снова по мере необходимости. Пользователю не нужны такие подробности, как способ и место хранения информации, детали работы дисков. Важной характеристикой любого механизма абстракции являются принципы именования управляемых объектов, поэтому вкратце рассмотрим правила именования файлов,
146
Точные правила именования файлов варьируются от системы к системе, но все современные операционные системы поддерживают использование в качестве имен файлов 8-символьные текстовые строки. Так, книга, страница, карандаш являются допустимыми именами файлов. Часто в именах файлов также разрешается использование цифр и специальных символов, поэтому могут применяться и такие имена файлов, как 2 (лучше _2), срочный! и Рис.2-14. Многие файловые системы поддерживают имена файлов длиной до 255 символов.
В некоторых ФС различаются прописные и строчные символы, в других, таких как М8-ОО8, нет. Операционные системы \Ушс1о^8 95 и ХУтдоте 98 используют файловую систему М8-ВО8 и наследуют многие ее свойства, включая именование файлов. Операционные системы \Ут<1о\У5 МТ и \Утс1о\У8 2000 также поддерживают файловую систему М8-ОО8 и наследуют ее свойства. Однако у них имеется своя файловая система КТР8, обладающая отличными свойствами.
Во многих ОС имя файла может состоять из двух частей, разделенных точкой, например рго§г.ехе. Часть имени файла после точки называется расширением файла и обычно означает тип файла. Так, в М8-ОО8 имя файла может содержать от 1 до 8 символов плюс через точку расширение от 0 до 3 символов. В некоторых ОС, например в 1Ж1Х, расширения файлов являются просто соглашениями, и ОС не заставляет пользователя их строго придерживаться. Так, файл Ше.М может быть текстовым файлом, но это скорее памятка пользователю, а не руководство к действию для операционной системы. Система ДУшс1о\У8, напротив, знает о расширениях файлов и назначает каждому расширению определенное значение. Пользователи или процессы могут регистрировать расширения в ОС, указывая программу, создающую данное расширение. При двойном щелчке мышью на имени файла запускается программа, назначенная этому расширению, с именем файла в качестве параметра. Например, двойной щелчок мышью на имени Ше.с1ос запускает М8 ^огс1, который открывает файл Ше.дос.
Обычно пользователям бывает необходимо логически группировать свои файлы, поэтому требуется некий гибкий способ, позволяющий объединять файлы в группы. Следовательно, нужна некая общая иерархия, т.е. дерево каталогов (см. рис. 3.3). При таком подходе каждый пользователь может сам создать себе столько каталогов и
147
подкаталогов, сколько ему нужно, группируя свои файлы естественным образом. В корневом каталоге могут быть также созданы каталоги и подкаталоги, принадлежащие различным пользователям. Возможность создавать произвольное количество подкаталогов является мощным структурирующим инструментом, позволяющим пользователям организовать свою работу. По этой причине почти все современные файловые системы организованы подобным образом.
При организации ФС в виде дерева каталогов требуется некоторый способ указания файла. Для этого обычно используются два различных метода. В первом случае каждому файлу дается абсолютное имя пути, состоящее из имен всех каталогов от корневого до того, в котором содержится файл, и имени самого файла. Например, путь \и8ег\аЪс\туШе.с!ос означает, что корневой каталог содержит каталог шег, который, в свою очередь, содержит подкаталог аЪс, где находится файл туШе.ёос. Абсолютные имена путей всегда начинаются от корневого каталога и являются уникальными. Если первым символом имени пути является разделитель, это означает, что путь абсолютный. Применяется и относительное имя пути. Оно используется вместе с понятием текущего каталога. Пользователь может назначить один из каталогов текущим рабочим каталогом. В этом случае все имена путей, не начинающиеся с символа разделителя, считаются относительными и отсчитываются относительно текущего каталога. Например, если текущим каталогом является \шег\аЪс, тогда к файлу с абсолютным путем \шег\аЪс\туШе.с1ос можно обратиться просто как к туШе.с!ос.
Итак, любая файловая система предназначена для хранения информации о физическом размещении частей файла. В ФС существует минимальная единица информации — кластер, размер которого является нижним пределом размера записываемой на носитель информации в рамках ФС. Не следует путать понятие кластера с понятием сектора, который является минимальной единицей информации со стороны аппаратного обеспечения. От ФС требуется четкое выполнение следующих действий:
определение физического расположения частей файла;
определение наличия свободного места и выделение его для вновь создаваемых файлов.
Скорость выполнения этих операций напрямую зависит от самой ФС. Разные файловые системы используют различные механиз-
148
мы для реализации указанных задач и имеют свои преимущества и недостатки. ФС типа ГАТ (РПе А11оса1юп ТаЫе) представляют собой образ носителя в миниатюре, где детализация ведется до кластерного уровня. Поэтому операция поиска физических координат файла при его большой фрагментации будет затруднительна. ФС РАТ16 занимает объем 128 Кб. И это позволяет легко кэшировать ее информацию. Для РАТ32 эта величина для больших дисков составит ~ 1 Мб, что еще более затрудняет поиск физических координат фрагменти-рованного файла. Еще хуже обстоит дело с поиском свободного места для больших файлов. Приходится просматривать практически всю таблицу. Быстродействие падает. МТР8 (№\у ТесЪгю1о&у РПе 8у8*ет) использует более компактную форму записи, что ускоряет поиск файла. Операции с выделением места проходят быстрее. Ключевое преимущество МТР8 — возможность ограничения доступа к файлам и папкам.
Важный параметр — размер кластера. Больший размер кластера гарантирует более высокую производительность за счет уменьшения самой ФС. Для МТР8 увеличение кластера — болезненная процедура из-за невозможности выполнить дефрагментацию, поскольку большинство таких программ не работает с кластерами, отличными от штатных 4 Кб.
ФойлоВые системы ГГНсго/оРЬ ЧПпс)ош/
Рассмотрим основные файловые системы, поддерживаемые ^тйоте - РАТ16, РАТ32, МТР8, а также системы СОР8 и УОР Каждая файловая система имеет свои достоинства и недостатки.
Файловая система РАТ16 начала свое существование еще во времена, предшествующие М8-ОО8. Она поддерживается всеми ОС Мюгозой для обеспечения совместимости. Ее название РПе АИосаиоп ТаЫе (таблица расположения файлов) отлично отражает физическую организацию файловой системы, к основным характеристикам которой можно отнести то, что максимальный размер поддерживаемого тома НОВ или его раздела не превышает 4095 Мбайт. Во времена М8-ОО8 4-гига'байтные НОВ казались несбыточной мечтой (роскошью были диски 20—40 Мбайт), поэтому такой запас был вполне оправдан.
Том, отформатированный для использования РАТ16, разделяется на кластеры. Размер кластера по умолчанию зависит от размера
149
тома и может колебаться от 512 б до 64 Кб. Размер кластера может отличаться от значения по умолчанию, но должен иметь одно из значений, предписанных для этой ФС.
Не рекомендуется использовать файловую систему РАТ16 на томах больше 511 Мб, так как для небольших файлов дисковое пространство будет использоваться крайне неэффективно: файл размером 1 байт будет занимать 16, 32 или 64 Кб. Независимо от размера кластера файловая система РАТ16 не поддерживается для томов больше 4 Гбайт.
На рис. 3.6 показано, как организован том при использовании файловой системы РАТ16.
РАТ1 (оригинал)
РАТ2 (копия)
Корневой каталог
Каталоги
и файлы
.'> 'Ч
Рис. 3.6. Организация тома в файловой системе РАТ16
Единственным отличием корневого каталога от других каталогов является то, что он располагается в определенном месте и имеет фиксированное число вхождений. Так, если число фиксированных вхождений для корневого каталога равно 512 и создано 100 подкаталогов, то в корневом каталоге можно создать не более 412 файлов.
Начиная с \Ушс1ош8 95 О8К2, появилась поддержка 32-битной РАТ. Для систем на базе ХЭДпёоте 1ЯТ эта файловая система впервые стала поддерживаться в ЛУтёоте 2000. Если РАТ 16 может поддерживать тома объемом до 4 Гб, то РАТ32 способна обслуживать тома объемом до 2 Тб. Размер кластера в РАТ32 может изменяться от 1 (512 б) до 64 секторов (32 Кб). Для хранения значений кластеров РАТ32 требуется 4 б (32 бит, а не 16, как в РАТ16). Это означает, в частности, что некоторые файловые утилиты, рассчитанные на РАТ16, не могут работать с РАТ32.
Основным отличием РАТ32 от РАТ16 является то, что изменился размер логического диска. РАТ32 поддерживает тома до 127 Гб. При этом, если при использовании РАТ16 с 2-гигабайтными дисками требовался кластер размером в 32 Кб, то в РАТ32 кластер размером р 4 Кб подходит для дисков объемом от 512 Мб до 8 Гб.
150
Это приводит к более эффективному использованию дискового пространства — чем меньше кластер, тем меньше места требуется для хранения файла и, как следствие, диск реже становится фрагменти-рованным.
При применении РАТ32 максимальный размер файла может достигать 4 Гб минус 2 байта. Если при использовании РАТ16 максимальное число вхождений в корневой каталог ограничивалось 512, то РАТ32 позволяет увеличить это число до 65535.
При создании файла с длинным именем \Утс1ош8 создает соответствующее имя в формате 8.3 и одно или более вхождений в каталог для хранения длинного имени (по 13 символов из длинного имени файла на каждое вхождение). Каждое последующее вхождение хранит соответствующую часть имени файла в формате итсоёе. Такие вхождения имеют атрибуты идентификатор тома, только чтение, системный и скрытый — набор, который игнорируется М8-ВО8.
В состав ХУтёоте 2000 входит поддержка новой версии файловой системы МТР8, которая, в частности, обеспечивает средства защиты информации, контроль над доступом и ряд других возможностей.
Как и при использовании РАТ, основной информационной единицей в МТР8 является кластер. При формировании файловой системы МТР8 программа форматирования создает файл МаМег РИе ТаЫе (МТР) и другие области для хранения метаданных. Метаданные используются МТР8 для реализации файловой структуры. Первые 16 записей в МТР зарезервированы самой МТР8. Местоположение файлов метаданных записано в загрузочном секторе диска. Если первая запись в МТР повреждена, МТР8 считывает вторую запись для нахождения копии первой. Полная копия загрузочного сектора располагается в конце тома. В МТР хранятся метаданные, такие как копия первых четырех записей (гарантирует доступ к МТР в случае, если первый сектор поврежден). МТР содержит информацию о томе — метку и номер версии. В МТР находится таблица имен атрибутов и описания, корневой каталог и др. Остальные строки МТР содержат записи для каждого файла и каталога, расположенных на данном томе.
Обычно один файл использует одну запись в МТР, но если у файла большой набор атрибутов или он становится слишком фраг-ментированным, то для хранения информации о нем могут потребоваться дополнительные записи. В этом случае первая запись о фай-
151
ле, называемая базовой записью, хранит местоположение других записей. Данные о файлах и каталогах небольшого размера (до 1500 байт) полностью содержатся в первой записи.
В \Ут<1о^5 2000 обеспечивается поддержка файловой системы СВР8, отвечающей стандарту 18О 9660, описывающему расположение информации на СВ-КОМ. Поддерживаются длинные имена файлов в соответствии с 18О 9660.
Поддержка файловой системы 11ОР является одним из новшеств \\^пс1о^8 2000. 1}туег5а1 ^^& Рогта1 — это файловая система, отвечающая стандарту 18О 13346 и используемая для обмена данными с накопителями СО-КОМ и ВУВ.
Сравнение срайлоВын систем ГПгсго/оРЬ Ш!пс1ош/
Под управлением М8 \Ут2000 возможно использование файловых систем РАТ16, РАТ32, МТР8 или их комбинаций. Цифры в названии файловых систем — РАТ16 и РАТ32 — указывают на число бит, необходимых для хранения информации о номерах кластеров, используемых файлом. Так, в РАТ16 применяется 16-битная адресация и, соответственно, возможно использование до 216 адресов. В ЛУтёоте 2000 первые четыре бита таблицы расположения файлов РАТ32 необходимы для собственных нужд, поэтому в РАТ32 число адресов достигает 228.
Среди преимуществ РАТ16 можно отметить следующие:
файловая система поддерживается ОС М8-ВО8, \Утс1ош8 95, \УтсЗоте 98, Щпёоте N7, \Утс1о>У8 2000, а также некоторыми ОС ЦК1Х;
существует большое число программ, позволяющих исправлять ошибки в этой файловой системе и восстанавливать данные;
при возникновении проблем с загрузкой с НОВ система может быть загружена с системной дискеты;
файловая система достаточно эффективна для томов объемом менее 256 Мб.
К недостаткам РАТ16 можно отнести:
не поддерживается резервная копия загрузочного сектора;
в РАТ16 не поддерживается встроенная защита файлов и их сжа тие.
152
Среди преимуществ РАТ32 важно отметить следующие:
выделение дискового пространства выполняется более эффектив но, особенно для дисков большого объема;
корневой каталог в РАТ32 представляет собой обычную цепочку кластеров и может находиться в любом месте диска, благодаря этому РАТ32 не накладывает никаких ограничений на число эле ментов в корневом каталоге;
за счет использования кластеров меньшего размера занятое дис ковое пространство на 10—15 % меньше, чем под РАТ 16.
РАТ32 является более надежной файловой системой, в частно сти, она поддерживает возможность перемещения корневого ка талога и использование резервной копии РАТ.
Основные недостатки РАТ32:
размер тома под \Уш2000 ограничен 32 Гб;
тома недоступны из других ОС — только из \Ут95 О8К2 и ДУш98;
не поддерживается резервная копия загрузочного сектора;
не поддерживается встроенная защита файлов и их сжатие.
При работе в \Ут<Зоте 2000 рекомендуется отформатировать все разделы НВО под ЫТР8, за исключением тех конфигураций, когда используется несколько ОС (кроме ДУтёоте 2000 и \Утс1о\У8 МТ). Применение №ГР8 вместо РАТ позволяет использовать функции, доступные в НТР8. К ним, в частности, относятся:
возможность восстановления. Эта возможность встроена в фай ловую систему МТР8 и гарантирует сохранность данных за счет того, что используются протокол и некоторые алгоритмы восста новления информации;
сжатие информации. Для томов МТР8 ДУтйо^з 2000 поддержи вает сжатие отдельных файлов. Такие сжатые файлы могут ис пользоваться \Утс1о>У8-приложениями без предварительной рас паковки, которая происходит автоматически при чтении из файла. При закрытии и сохранении файл снова упаковывается;
защита файлов и каталогов. Только на томах МТР8 возможно задание атрибутов доступа к файлам и папкам;
файловая система поддерживает резервную копию загрузочного сектора — она располагается в конце тома;
1ЧТР8 поддерживает систему шифрования Епсгур1ей РПе ЗуМет (ЕР8), обеспечивающую защиту от неавторизованного доступа к содержимому файлов.
153
К недостаткам МТР8 относятся:
№Т5-тома недоступны в М5-ОО8, \Уш95 и \Ут98;
для томов небольшого объема, содержащих много файлов не большого размера, возможно снижение производительности по сравнению с РАТ.
3,2.9. Рассмотрение
конкретный опероиионнын систем
В предыдущих разделах были рассмотрены общие принципы операционных систем. В этом разделе мы познакомимся с системами ПШХ, Ыпих и Шпс1оу?5, чтобы увидеть, как эти принципы работают на практике. Начнем рассмотрение примеров с операционной системы 1Ж1Х, так как она используется на различных типах компьютеров чаще, чем любая другая ОС. Система 1Ж1Х доминирует на рабочих станциях старших моделей и серверах, но она также используется и в ноутбуках и суперкомпьютерах. Система 1ЖК иллюстрирует множество важных принципов построения ОС, многие из которых были позаимствованы другими операционными системами. Общий обзор системы особенно важен для пользователей, знакомых только с системой ХУтёоте, скрывающей от них практически все детали системы. Хотя графические интерфейсы очень удобны, но они не обладают достаточной гибкостью и не дают представление о том, как работает система.
Существует множество клонов и версий системы 11К1Х, но фундаментальные принципы и системные вызовы практически для всех этих систем во многом совпадают. Сходными являются также общие стратегии реализации, алгоритмы и структуры данных.
УП1Н и Ыпин
История 1Ж1Х начиналась в 60-е гг. прошлого столетия, когда сотрудник лаборатории Ве11 ЬаЪз крупнейшей телекоммуникационной компании в мире АТ&Т Кен Томпсон написал на ассемблере операционную систему, которая в шутку была названа ^NIС8 (1Ж1р1ехес1 ГпГогтайоп апй Сотри1т§ 8егасе — примитивная информационная и вычислительная служба). Впоследствии написание этого слова стало короче, превратившись в ^NIX. Однако переписывать
154
всю систему на ассемблере заново для каждой новой машины дело трудное, поэтому Томпсон решил переписать 1Ж1Х на языке высокого уровня, который он сам специально разработал и назвал языком В. Но язык В оказался слабым, в первую очередь, из-за отсутствия в нем структур данных. Тогда коллега Томпсона Ритчи разработал следующий язык, явившийся преемником языка В, который, естественно, получил название С. Вместе Томпсон и Ритчи переписали 11К1Х на С. Язык С оказался как раз тем языком, который и был нужен в то время, и он сохраняет лидирующие позиции в области системного программирования до сих пор. За работу по созданию ОС 1Ж1Х Ритчи и Томпсону ассоциацией по вычислительной технике АСМ была присуждена престижная премия Тьюринга. Многие университеты старались получить копию системы 1Ж1Х.
Операционная система 1Ж1Х поставлялась с полным комплектом исходных текстов, поэтому владельцы системы могли совершенствовать ее. Новые идеи и усовершенствования системы распространялись быстро.
Уегзюп 7 (по номеру издания руководства программиста) стала первой переносимой на другие платформы версией операционной системы 11МХ. На Уешоп 7 выросло целое поколение студентов, которые содействовали распространению 11М1Х. К середине 80-х гг. ОС 1Ж1Х широко применялась на мини-компьютерах и рабочих станциях различных производителей. Многие компании даже приобрели лицензии на исходные тексты, чтобы производить свои версии системы 1Ж1Х. Одной из таких компаний была небольшая начинающая фирма Мюгозой, в течение нескольких лет продававшая Уегзюп 7 под именем ХЕМХ, пока ее интересы не повернулись в другую сторону.
Для того, чтобы система 11М1Х могла быть гарантированно запущена на любой машине, к концу 80-х при содействии Совета по стандартам 81апс1агс1 Воагёз при Институте инженеров по электротехнике и электронике ШЕЕ была предпринята попытка объединить варианты системы. В этой работе приняли участие сотни людей из промышленных, академических и правительственных организаций. Коллективное название проекта — РО81Х. Первые три буквы этого сокращения означали РоЛаЫе Орега(1п§ 8у81ет — переносимая операционная система. Буквы IX были добавлены, чтобы имя проекта выглядело юниксообразно. Комитет РО81Х выработал стандарт, известный как 1003Л. Этот стандарт определяет набор библиотечных
155
процедур, которые должна предоставлять каждая соответствующая данному стандарту система 11Ы1Х, таким образом, гарантируя, что эта программа будет работать на любой версии системы, поддерживающей данный стандарт.
В 1991 г. финский студент Линус Торвальдс написал еще один клон системы 11МХ, который назвал Ыпих. Это должна была быть полноценная операционная система, со многими функциями, отсутствующими в системе МШ1Х. Она заимствовала некоторые идеи системы МШ1Х, начиная со структуры дерева исходных текстов и кончая структурой файловой системы. Однако, в отличие от микроядерной системы МШ1Х, Ыпих была монолитной системой, т.е. вся ОС помещалась в ядре. Размер исходного текста приблизительно совпадал с версией МШ1Х. Функционально первая версия Ыпих также практически почти не отличалась от МШ1Х.
Операционная система Ыпих быстро росла в размерах и впоследствии развилась в полноценный клон 1Ж1Х с виртуальной памятью, более сложной файловой системой и многими другими добавленными функциями. Она была перенесена на другие платформы и теперь работает на широком спектре машин, как и 11К1Х.
Следующим выпуском системы Ыпих была версия 1.0, появившаяся в 1994 г. Она включала новую файловую систему, отображение файлов на адресное пространство памяти и совместимое с 1Ж1Х сетевое программное обеспечение. Данная версия также включала многие новые драйверы устройств.
К этому времени ОС Ыпих стала достаточно совместимой с 1Ж1Х, поэтому в нее было перенесено большое количество программного обеспечения 1ЖЕХ, что значительно увеличило полезность этой системы. Кроме того, операционная система Ыпих привлекла большое количество людей, которые начали работу над ее совершенствованием и расширением.
Следующая версия — 2.0, вышла в 1996 г. Она включала в себя поддержку 64-разрядной архитектуры, симметричной многозадачности, новых сетевых протоколов и прочих многочисленных функций. Система также содержала внушительную коллекцию различных драйверов устройств.
Необычной особенностью Ыпих является ее бизнес-модель: это свободно распространяющееся программное обеспечение. Ее можно скачать с различных 1п(егпе1-сайтов, например \у\у\\Жегпе1.ог§. Сис-
156