Добавлен: 29.10.2018
Просмотров: 48097
Скачиваний: 190
786
Глава 10. Изучение конкретных примеров: Unix, Linux и Android
10.1.2. PDP-11 UNIX
Работа Томпсона произвела на его коллег из лаборатории Bell Labs столь сильное
впечатление, что вскоре к нему присоединился Деннис Ритчи (Dennis Ritchie), а чуть
позднее и весь его отдел. К этому времени относятся два технологических усовершен-
ствования. Во-первых, система UNIX была перенесена с устаревшей машины PDP-7
на гораздо более современный компьютер PDP-11/20, а позднее на PDP-11/45 и PDP-
11/70. Последние две машины доминировали в мире мини-компьютеров в течение
большей части 1970-х годов. Компьютеры PDP-11/45 и PDP-11/70 представляли
собой мощные по тем временам машины с большой физической памятью (256 Кбайт
и 2 Мбайт соответственно). Кроме того, они обладали аппаратной защитой памяти, что
позволяло поддерживать одновременную работу множества пользователей. Однако
это были 16-разрядные машины, что ограничивало адресное пространство процесса
64 Кбайт для команд и 64 Кбайт для данных (несмотря на то что у этих машин физи-
ческой памяти могло быть значительно больше).
Второе усовершенствование касалось языка, на котором была написана операционная
система UNIX. Уже давно стало очевидно, что необходимость переписывать всю систему
заново для каждой новой машины — занятие отнюдь не веселое, поэтому Томпсон решил
переписать UNIX на языке высокого уровня, который он сам специально разработал и на-
звал языком B. Язык B представлял собой упрощенную форму языка BCPL (который,
в свою очередь, был упрощенным языком CPL, подобно PL/1, никогда не работавшим).
Эта попытка оказалась неудачной из-за слабостей языка B — и в первую очередь из-за
отсутствия в нем структур данных. Тогда Ритчи разработал следующий язык, ставший
преемником языка B, который, естественно, получил название C, и написал для него пре-
красный компилятор. Томпсон и Ритчи совместно переписали UNIX на языке C. Язык C
оказался как раз тем языком, который и был нужен в то время, и с тех пор он сохраняет
лидирующие позиции в области системного программирования.
В 1974 году Ритчи и Томпсон опубликовали ставшую важной вехой статью об опера-
ционной системе UNIX (Ritchie and Thompson, 1974). За описанную в данной статье
работу они позднее получили от Ассоциации по вычислительной технике (ACM)
престижную премию Тьюринга (Ritchie, 1984; Thompson, 1984). Публикация этой
статьи привела к тому, что многие университеты обратились в лабораторию Bell Labs
за копией системы UNIX. Корпорация AT&T, являвшаяся учредителем лаборатории
Bell Labs, была в то время регулируемой монополией и ей не разрешалось заниматься
компьютерным бизнесом, поэтому она не возражала против того, чтобы университеты
за умеренную плату получали лицензии на право использования системы UNIX.
По случайному стечению обстоятельств (которые часто формируют историю) машины
PDP-11 использовались на факультетах вычислительной техники практически каждого
университета, а операционные системы, которые поставлялись с этими компьютерами,
профессора и студенты считали ужасными. Операционная система UNIX быстро за-
полнила этот вакуум — и не в последнюю очередь благодаря тому, что система постав-
лялась с полными исходными кодами, поэтому новые владельцы системы могли без
конца подправлять и совершенствовать ее (и они делали это). Операционной системе
UNIX было посвящено множество научных симпозиумов, на них докладчики рассказы-
вали о тех неизвестных ошибках в ядре, которые им удалось обнаружить и исправить.
Австралийский профессор Джон Лайонс написал комментарий к исходному коду
системы UNIX таким стилем, какой обычно использовался в трактатах о Джеффри
Чосере или Вильяме Шекспире. Книга описывала систему UNIX Version 6, названную
10.1. История UNIX и Linux
787
так потому, что эта версия операционной системы была описана в шестом издании ру-
ководства программиста UNIX Programmer’s Manual. Исходный текст системы состоял
из 8200 строк на языке C и 900 строк кода ассемблера. В результате всех этих событий
новые идеи и усовершенствования системы распространялись с огромной скоростью.
Через несколько лет версию Version 6 сменила версия Version 7, которая стала первой
переносимой версией операционной системы UNIX (она работала как на машинах
PDP-11, так и на Interdata 8/32). Эта версия системы состояла уже из 18 800 строк на
языке C и 2100 строк на ассемблере. На Version 7 выросло целое поколение студентов,
которые, закончив свои учебные заведения и начав работу в промышленности, содей-
ствовали дальнейшему ее распространению. К середине 1980-х годов операционная
система UNIX широко применялась на мини-компьютерах и инженерных рабочих
станциях самых различных производителей. Многие компании даже приобрели ли-
цензии на исходные коды, чтобы производить свои версии системы UNIX. Одной из
таких компаний была небольшая начинающая фирма Microsoft, которая в течение не-
скольких лет продавала Version 7 под именем XENIX, пока ее интересы не изменились.
10.1.3. Переносимая система UNIX
После того как система UNIX была переписана на языке C, задача переноса ее на новые
машины (называемая также портированием) стала значительно проще, чем в преж-
ние времена, когда она была написана на ассемблере. Для переноса системы сначала
требуется написать для новой машины компилятор языка C. Затем нужно написать
драйверы для устройств ввода-вывода новой машины, таких как мониторы, принтеры
и диски. Хотя драйвер и написан на C, его нельзя просто перекомпилировать на новой
машине и запустить на ней, поскольку нет двух одинаково работающих дисков. На-
конец, требуется переписать заново (как правило, на ассемблере) небольшое коли-
чество машинно-зависимого кода, такого как обработчики прерываний и процедуры
управления памятью.
Первым компьютером, на который был выполнен перенос, стал мини-компьютер
Interdata 8/32. При этом была выявлена масса неявных предположений, которые UNIX
делала относительно той машины, на которой она работала, например: целые числа
имеют размерность 16 бит, указатели также имеют размерность 16 бит (в результате
чего максимальный размер программы ограничивался 64 Кбайт) и у компьютера
имеется ровно три регистра для хранения важных переменных. Ни одно из этих пред-
положений не было справедливым для мини-компьютера Interdata 8/32, поэтому для
переноса UNIX пришлось немало потрудиться.
Другая проблема заключалась в том, что хотя компилятор Ритчи был быстрым и вы-
давал хороший объектный код, он мог создавать только объектный код для PDP-11.
Вместо того чтобы писать новый компилятор специально для Interdata 8/32, Стив
Джонсон (Steve Johnson) из лаборатории Bell Labs разработал и реализовал пере-
носимый компилятор языка C
. Этот компилятор можно было настроить на создание
кода практически для любой машины, причем для этого требовался небольшой объем
работы. В течение многих лет почти все компиляторы языка C (не предназначенные
для машин PDP-11) основывались на компиляторе Джонсона, что значительно по-
могло распространению системы UNIX на новые компьютеры.
Процесс переноса на мини-компьютер Interdata 8/32 сначала шел медленно, так как
вся работа должна была выполняться на единственной в лаборатории машине PDP-11,
788
Глава 10. Изучение конкретных примеров: Unix, Linux и Android
на которой работала система UNIX. Случилось так, что компьютер PDP-11 оказался
на пятом этаже лаборатории, тогда как Interdata 8/32 был установлен на первом этаже.
Создание новой версии системы означало ее компиляцию на пятом этаже и запись на
магнитную ленту, которая затем физически переносилась на первый этаж, чтобы посмо-
треть, работает ли она. Через несколько месяцев подобной работы кто-то, оставшийся не-
известным, спросил: «Мы же телефонная компания. Можем мы протянуть провод между
этими двумя машинами?» Так в системе UNIX началась сетевая работа. После переноса
на Interdata система UNIX была перенесена на VAX, а позже и на другие компьютеры.
После того как в 1984 году правительство США разделило корпорацию AT&T, она
получила законную возможность учредить дочернюю компьютерную компанию, что
вскоре и сделала. После этого компания AT&T выпустила на рынок первый коммерче-
ский вариант системы UNIX — System III. Ее выход на рынок был не очень успешным,
поэтому через год она была заменена улучшенной версией, System V. Что случилось
с System IV, до сих пор остается одной из неразгаданных тайн компьютерного мира. Ис-
ходную систему System V впоследствии сменили выпуски 2, 3 и 4 все той же System V,
причем каждый последующий выпуск был более громоздким и сложным, чем пре-
дыдущий. В процессе усовершенствований исходная идея, лежащая в основе UNIX
и заключающаяся в простоте и элегантности системы, была постепенно утрачена. Хотя
группа Ритчи и Томпсона позднее выпустила 8, 9 и 10-ю редакции системы UNIX, они
не получили широкого распространения, так как компания AT&T все свои маркетин-
говые усилия прикладывала к продаже версии System V. Однако некоторые идеи из
8, 9 и 10-й редакций системы в конце концов были включены и в System V. Наконец,
компания AT&T решила, что хочет быть телефонной компанией, а не компьютерной
фирмой, и в 1993 году продала весь свой связанный с системой UNIX бизнес корпора-
ции Novell, которая в 1995 году перепродала его компании Santa Cruz Operation. К тому
времени стало практически не важно, кому принадлежит этот бизнес, так как почти
у всех основных компьютерных компаний уже были лицензии.
10.1.4. Berkeley UNIX
Калифорнийский университет в Беркли был одним из многих университетов, приоб-
ретших UNIX Version 6 на ранней стадии. Поскольку с системой поставлялся полный
комплект исходных кодов, то университет смог существенно модифицировать систему.
При финансовой поддержке Управления перспективного планирования научно-ис-
следовательских работ (Advanced Research Projects Agency (ARPA)) при Министерстве
обороны США университет в Беркли разработал и выпустил улучшенную версию
операционной системы UNIX для мини-компьютера PDP-11, названную 1BSD (First
Berkeley Software Distribution — программное изделие Калифорнийского университета,
1-я версия). Вскоре вслед за этой магнитной лентой появилась 2BSD, также для PDP-11.
Более важным событием был выпуск версии 3BSD и особенно ее преемника — 4BSD
для машины VAX. Несмотря на то что компания AT&T имела собственную версию
для VAX, называвшуюся 32V, по существу это была Version 7. В отличие от нее систе-
ма 4BSD содержала большое количество усовершенствований. Важнейшими из них
были использование виртуальной памяти и подкачка, что позволяло создавать такие
программы, которые были по размеру больше, чем физическая память (подкачивая
их по частям по мере необходимости). Другое изменение заключалось в поддержке
имен файлов длиной более 14 символов. Реализация файловой системы также была
изменена, благодаря чему она стала существенно быстрее. Более надежной стала обра-
10.1. История UNIX и Linux
789
ботка сигналов. Появилась поддержка сетевой работы, в результате чего используемый
в 4BSD протокол TCP/IP стал стандартом де-факто в мире UNIX, а позднее и в Ин-
тернете, в котором преобладают серверы на базе системы UNIX.
Университет в Беркли также добавил в систему UNIX значительное количество утилит,
включая новый редактор vi и новую оболочку csh, компиляторы языков Pascal и Lisp
и многое другое. Все эти усовершенствования привели к тому, что многие произво-
дители компьютеров (Sun Microsystems, DEC и др.) стали основывать свои версии
системы UNIX на Berkeley UNIX, а не на «официальной» версии System V компании
AT&T. В результате Berkeley UNIX получила широкое распространение в академиче-
ских и исследовательских кругах, а также в Министерстве обороны. Дополнительные
сведения о системе Berkeley UNIX смотрите в работе McKusick et al. (1996).
10.1.5. Стандартная система UNIX
К концу 1980-х широкое распространение получили две различные и в чем-то несовме-
стимые версии системы UNIX : 4.3BSD и System V Release 3. Кроме того, практически
каждый производитель добавлял собственные нестандартные усовершенствования.
Этот раскол в мире UNIX вместе с тем фактом, что стандарта на формат двоичных
программ не было, сильно сдерживал коммерческий успех операционной системы
UNIX, поскольку производители программного обеспечения не могли написать пакет
программ для системы UNIX так, чтобы он мог работать на любой системе UNIX (как
это делалось, например, в системе MS-DOS). Вначале все попытки стандартизации
системы UNIX проваливались. Например, корпорация AT&T выпустила стандарт
SVID
(System V Interface Definition — описание интерфейса UNIX System V), в кото-
ром определялись все системные вызовы, форматы файлов и т. д. Этот документ был
попыткой построить в одну шеренгу всех производителей System V, но он не оказал
никакого влияния на вражеский лагерь (BSD), который просто проигнорировал его.
Первая серьезная попытка примирить два варианта системы UNIX была предпринята
при содействии Совета по стандартам при Институте инженеров по электротехнике
и электронике (IEEE Standard Boards), глубокоуважаемой и, что самое важное, ней-
тральной организации. В этой работе приняли участие сотни людей из области про-
мышленности, академических и правительственных организаций. Коллективное на-
звание этого проекта — POSIX . Первые три буквы этого сокращения означали Portable
Operating System — переносимая операционная система. Буквы IX в конце слова были
добавлены, чтобы имя проекта выглядело юниксоподобно.
После большого количества высказанных аргументов и контраргументов, опроверже-
ний и опровергнутых опровержений комитет POSIX выработал стандарт, известный
как 1003.1 . Этот стандарт определяет набор библиотечных процедур, которые должна
обеспечивать каждая соответствующая данному стандарту система UNIX. Большая
часть этих процедур делает системный вызов, но некоторые из них могут быть реали-
зованы вне ядра. Типичными процедурами являются open, read, и fork. Идея стандарта
POSIX заключается в том, что производитель программного обеспечения, который при
написании программы использует только описанные в стандарте 1003.1 процедуры,
может быть уверен, что его программа будет работать на любой системе UNIX, соот-
ветствующей данному стандарту.
Хотя большинство комитетов по стандартам, как правило, создают нечто ужасное,
сплошь состоящее из компромиссов, стандарт 1003.1 заметно отличается от этого
790
Глава 10. Изучение конкретных примеров: Unix, Linux и Android
общего правила в лучшую сторону, особенно если учесть большое количество прини-
мавших участие в его разработке сторон. Вместо того чтобы принять за точку отсчета
объединение множеств функциональных возможностей System V и BSD (как это делает
большинство комитетов по стандартам), комитет IEEE взял за основу пересечение
этих двух множеств. То есть дело обстояло примерно так: если какое-либо свойство
присутствовало как в System V, так и в BSD, то оно включалось в стандарт, в против-
ном случае это свойство в стандарт не включалось. В результате применения такого
алгоритма стандарт 1003.1 сильно напоминает прямого общего предка систем System V
и BSD, а именно Version 7. Документ 1003.1 был написан так, чтобы как разработчики
операционной системы, так и создатели программного обеспечения были способны его
понять, что также было ново в мире стандартов, хотя в настоящее время уже ведется
работа по исправлению этого нестандартного для стандартов свойства.
Несмотря на то что стандарт 1003.1 описывает только системные вызовы, принят также
ряд сопутствующих документов, которые стандартизируют потоки, утилиты, сетевое
программное обеспечение и многие другие функции системы UNIX. Кроме того, язык C
также был стандартизирован Национальным институтом стандартизации США (ANSI)
и Международной организацией по стандартизации ISO.
10.1.6. MINIX
У всех современных UNIX-систем есть общее свойство: все они большие и сложные,
что в определенном смысле противоречит лежавшей в основе системы UNIX ориги-
нальной идее. Даже если бы все исходные коды систем были свободно доступны (что
в большинстве случаев уже давно не так), все равно одному человеку уже просто не
под силу понять их. Эта ситуация привела к тому, что один из авторов этой книги на-
писал новую юниксоподобную систему, которая была достаточно небольшой для того,
чтобы ее можно было понять, предоставлялась с полным исходным кодом и могла
быть использована в учебных целях. Эта система состояла из 11 800 строк на языке C
и 800 строк кода на ассемблере. Она была выпущена в 1987 году и функционально поч-
ти эквивалентна системе Version 7 UNIX, бывшей оплотом большинства факультетов
вычислительной техники в эпоху машин PDP-11.
Система MINIX была одной из первых юниксоподобных систем, основанной на микро-
ядре. Идея микроядра заключается в том, чтобы реализовать в ядре как можно меньше
функций и сделать его надежным и эффективным. Соответственно управление памя-
тью и файловая система были перенесены в процессы пользователя. Ядро обрабатывало
передачу сообщений между процессами, не занимаясь почти ничем другим. Ядро со-
стояло из 1600 строк на языке C и 800 ассемблерных строк. По техническим причинам,
связанным с архитектурой процессора Intel 8088, драйверы устройств ввода-вывода
(еще 2900 дополнительных строк на языке C) также были размещены в ядре. Файловая
система (5100 строк на языке C) и диспетчер памяти (2200 строк на языке C) работали
как два отдельных пользовательских процесса.
Преимущество системы с микроядром перед монолитной системой заключается в том,
что систему с микроядром легко понять и поддерживать (благодаря ее высокой модуль-
ности). Кроме того, перемещение кода из ядра в пользовательский режим обеспечивает
системе высокую надежность, так как сбой работающего в режиме пользователя процесса
не способен нанести такой ущерб, какой может нанести сбой компонента в режиме ядра.
Основной недостаток такой системы состоит в несколько меньшей производительности,