Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
учебник информатики соболь.docx
Скачиваний:
32
Добавлен:
03.06.2015
Размер:
12.95 Mб
Скачать

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с, игнорировать задачу больше нельзя.

При использовании многозадачности повышается эффективность загрузки ЦП. Если средний процесс выполняет вычисления только 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, перешли к модели динамической подгрузки драйверов. Различные системы выполняют эту процедуру по-разному.

Драйвер устройства выполняет несколько функций:

  1. обработку абстрактных запросов чтения и записи независи­ мого от устройств и расположенного над ними программного обес­ печения;

  2. инициализацию устройства;

  3. управление энергопотреблением устройства и регистрацией событий;

  4. проверку входных параметров. Если они не удовлетворяют оп­ ределенным критериям, драйвер возвращает ошибку В противном случае драйвер преобразует абстрактные термины в конкретные. На­ пример, дисковый драйвер может преобразовывать линейный номер блока в номера головки, дорожки и секторы;

  5. проверку использования устройства в данный момент. Если ус­ тройство занято, запрос может быть поставлен в очередь. Если уст­ ройство свободно, проверяется его состояние. Возможно, требуется включить устройство или запустить двигатель, прежде чем начнется перенос данных. Как только устройство готово, может начинаться собственно управление устройством.

Управление устройством подразумевает выдачу ему серии ко­манд. Именно в драйвере и определяется последовательность команд в зависимости от того, что должно быть сделано. Определившись с командами, драйвер начинает записывать их в регистры контролле­ра устройства. Некоторые контроллеры способны принимать связные списки команд, находящихся в памяти. Они сами считывают и вы­полняют их без дальнейшей помощи операционной системы.

После того как драйвер передал все команды контроллеру, ситу­ация может развиваться по двум сценариям. Во многих случаях драй-

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