Современные операционные системы - Э. Таненбаум - E-Book

Современные операционные системы E-Book

Э. Таненбаум

0,0

Beschreibung

Эндрю Таненбаум представляет 4-е издание своего всемирного бестселлера, необходимое для понимания функционирования современных операционных систем. Оно существенно отличается от предыдущего и включает в себя сведения о последних достижениях в области информационных технологий. Появился объемный раздел, посвященный операционной системе Android. Был обновлен материал, касающийся Unix и Linux, а также RAID-систем. Гораздо больше внимания уделено мультиядерным и многоядерным системам, важность которых в последние несколько лет постоянно возрастает. Появилась глава о виртуализации и облачных вычислениях. Добавился большой объем нового материала об использовании ошибок кода, о вредоносных программах и соответствующих мерах защиты. В книге в ясной и увлекательной форме приводится множество важных подробностей, которых нет ни в одном другом издании.

Sie lesen das E-Book in den Legimi-Apps auf:

Android
iOS
von Legimi
zertifizierten E-Readern
Kindle™-E-Readern
(für ausgewählte Pakete)

Seitenzahl: 2088

Veröffentlichungsjahr: 2024

Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:

Android
iOS
Bewertungen
0,0
0
0
0
0
0
Mehr Informationen
Mehr Informationen
Legimi prüft nicht, ob Rezensionen von Nutzern stammen, die den betreffenden Titel tatsächlich gekauft oder gelesen/gehört haben. Wir entfernen aber gefälschte Rezensionen.



Э. Таненбаум, Х. Бос

Современные операционные системы. 4-е изд.. — СПб.: Питер, 2024.

ISBN 978-5-4461-1155-8

© ООО Издательство "Питер", 2024

Оглавление

Предисловие
От издательства
Об авторах
Глава 1. Введение
1.1. Что такое операционная система?
1.2. История операционных систем
1.3. Обзор аппаратного обеспечения компьютера
1.4. Зоопарк операционных систем
1.5. Понятия операционной системы
1.6. Системные вызовы
1.7. Структура операционной системы
1.8. Устройство мира согласно языку C
1.9. Исследования в области операционных систем
1.10. Краткое содержание остальных глав этой книги
1.11. Единицы измерения
1.12. Краткие выводы
Вопросы
Глава 2. Процессы и потоки
2.1. Процессы
2.2. Потоки
2.3. Взаимодействие процессов
2.4. Планирование
2.5. Классические задачи взаимодействия процессов
2.6. Исследования, посвященные процессам и потокам
2.7. Краткие выводы
Вопросы
Глава 3. Управление памятью
3.1. Память без использования абстракций
3.2. Абстракция памяти: адресные пространства
3.3. Виртуальная память
3.4. Алгоритмы замещения страниц
3.5. Разработка систем страничной организации памяти
3.6. Проблемы реализации
3.7. Сегментация
3.8. Исследования в области управления памятью
3.9. Краткие выводы
Вопросы
Глава 4. Файловые системы
4.1. Файлы
4.2. Каталоги
4.3. Реализация файловой системы
4.4. Управление файловой системой и ее оптимизация
4.5. Примеры файловых систем
4.6. Исследования в области файловых систем
4.7. Краткие выводы
Вопросы
Глава 5. Ввод и вывод информации
5.1. Основы аппаратного обеспечения ввода-вывода
5.2. Принципы создания программного обеспечения ввода-вывода
5.3. Уровни программного обеспечения ввода-вывода
5.4. Диски
5.5. Часы
5.6. Пользовательский интерфейс: клавиатура, мышь, монитор
5.7. Тонкие клиенты
5.8. Управление энергопотреблением
5.9. Исследования в области ввода-вывода данных
5.10. Краткие выводы
Вопросы
Глава 6. Взаимоблокировка
6.1. Ресурсы
6.2. Введение во взаимоблокировки
6.3. Страусиный алгоритм
6.4. Обнаружение взаимоблокировок и восстановление работоспособности
6.5. Уклонение от взаимоблокировок
6.6. Предотвращение взаимоблокировки
6.7. Другие вопросы
6.8. Исследования в области взаимоблокировок
6.9. Краткие выводы
Вопросы
Глава 7. Виртуализация и облако
7.1. История
7.2. Требования, применяемые к виртуализации
7.3. Гипервизоры первого и второго типа
7.4. Технологии эффективной виртуализации
7.5. Являются ли гипервизоры настоящими микроядрами?
7.6. Виртуализация памяти
7.7. Виртуализация ввода-вывода
7.8. Виртуальные устройства
7.9. Виртуальные машины на мультиядерных центральных процессорах
7.10. Вопросы лицензирования
7.11. Облака
7.12. Изучение конкретных примеров: VMWARE
7.13. Исследования в области виртуализации и облаков
Вопросы
Глава 8. Многопроцессорные системы
8.1. Мультипроцессоры
8.2. Мультикомпьютеры
8.3. Распределенные системы
8.4. Исследования в области многопроцессорных систем
8.5. Краткие выводы
Вопросы
Глава 9. Безопасность
9.1. Внешние условия, требующие принятия дополнительных мер безопасности
9.2. Безопасность операционных систем
9.3. Управление доступом к ресурсам
9.4. Формальные модели систем безопасности
9.5. Основы криптографии
9.6. Аутентификация
9.7. Взлом программного обеспечения
9.8. Инсайдерские атаки
9.9. Вредоносные программы
9.10. Средства защиты
9.11. Исследования в области безопасности
9.12. Краткие выводы
Вопросы
Глава 10. Изучение конкретных примеров: Unix, Linux и Android
10.1. История UNIX и Linux
10.2. Обзор системы Linux
10.3. Процессы в системе Linux
10.4. Управление памятью в Linux
10.5. Ввод-вывод в системе Linux
10.6. Файловая система UNIX
10.7. Безопасность в Linux
10.8. Android
10.9. Краткие выводы
Вопросы
Глава 11. Изучение конкретных примеров: Windows 8
11.1. История Windows вплоть до Windows 8.1
11.2. Программирование в Windows
11.3. Структура системы
11.4. Процессы и потоки в Windows
11.5. Управление памятью
11.6. Кэширование в Windows
11.7. Ввод-вывод в Windows
11.8. Файловая система Windows NT
11.9. Управление электропитанием в Windows
11.10. Безопасность в Windows 8
11.11. Краткие выводы
Вопросы
Глава 12. Разработка операционных систем
12.1. Природа проблемы проектирования
12.2. Разработка интерфейса
12.3. Реализация
12.4. Производительность
12.5. Управление проектом
12.6. Тенденции в проектировании операционных систем
12.7. Краткие выводы
Вопросы
Глава 13. Библиография
13.1. Дополнительная литература
13.2. Алфавитный список литературы

Предисловие

Четвертое издание этой книги во многом отличается от третьего. Поскольку развитие операционных систем не стоит на месте, приведение материала к современному состоянию потребовало внесения большого количества мелких изменений. Глава, посвященная мультимедийным операционным системам, была перемещена в Интернет, главным образом для освобождения места для нового материала и предотвращения разрастания книги до абсолютно неуправляемого размера. Глава, посвященная Windows Vista, удалена, поскольку Vista не оправдала возлагавшихся на нее компанией Microsoft надежд. Также была удалена глава, посвященная Symbian, поскольку эта система сейчас распространена далеко не так широко, как прежде. Материал о Vista был заменен сведениями о Windows 8, а материал о Symbian — информацией об Android. Кроме этого, появилась совершенно новая глава о виртуализации и облачных вычислениях. Далее приводится краткое описание внесенных изменений.

Глава 1 была существенно переработана и обновлена, но за исключением нового раздела о мобильных компьютерах никакие основные разделы не были добавлены или удалены.

Глава 2 обновлена за счет удаления устаревшего и добавления нового материала. К примеру, был добавлен новый примитив синхронизации фьютекс и раздел о том, как полностью избежать блокировки с помощью чтения — копирования — обновления.

Глава 3 стала более сконцентрированной на современном оборудовании и менее направленной на рассмотрение сегментации и MULTICS.

Из главы 4 убраны упоминания о компакт-дисках, поскольку они уже потеряли свою значимость, а их место заняли более современные решения (флеш-носители). Также к разделу, посвященному RAID-системам, добавлено описание RAID-массива уровня 6.

В главу 5 внесено множество изменений. Из нее убраны описания устаревших устройств, таких как ЭЛТ-дисплеи и приводы компакт-дисков, и добавлены устройства, разраюботанные по новым технологиям, такие как сенсорные экраны.

Глава 6 почти не изменилась. Тема взаимоблокировок, за исключением некоторых новых результатов, остается практически неизменной.

Глава 7 совершенно новая. Она посвящена важным темам виртуализации и облачных вычислений. В качестве тематического исследования к ней добавлен раздел о VMware.

Глава 8 представляет собой обновленную версию предыдущего материала по многопроцессорным системам. Теперь в ней больше внимания уделено мультиядерным и многоядерным системам, важность которых в последние несколько лет постоянно возрастает. Теперь здесь поднят ставший в последнее время более острым вопрос о согласованности данных кэша.

Глава 9 подверглась существенному пересмотру и реорганизации с добавлением большого объема нового материала об использовании ошибок кода, о вредоносных программах и соответствующих мерах защиты. Более подробно рассмотрены такие атаки, как разыменование нулевого указателя и переполнение буферов. Теперь дано подробное описание защитных механизмов, NX-бит и рандомизации адресного пространства, а также способов, с помощью которых злоумышленники пытаются их преодолеть.

Глава 10 претерпела значительные изменения. Был обновлен материал, касающийся Unix и Linux, но главным дополнением можно считать новый довольно объемный раздел, посвященный операционной системе Android, которая часто встречается на смартфонах и планшетных компьютерах.

Глава 11 в третьем издании была посвящена Windows Vista. Теперь она заменена главой, посвященной Windows 8, а точнее Windows 8.1. То есть теперь в главе рассматривается самая актуальная версия.

Глава 12 представляет собой пересмотренную версию главы 13 из прошлого издания.

Глава 13 — это существенно обновленный список предлагаемого к изучению материала. Кроме того, список ссылок пополнился 223 новыми ссылками на работы, опубликованные после выхода третьего издания этой книги.

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

Дополнительные материалы для преподавателей (на английском языке) можно найти по адресу www.pearsonhighered.com/tanenbaum. Там есть схемы, выполненные в PowerPoint, программные средства для изучения операционных систем, лабораторные работы для студентов, симуляторы и дополнительные материалы для использования в ходе преподавания курса, посвященного операционным системам. Преподавателям, использующим данную книгу в своем курсе, стоит туда заглянуть.

В работе над четвертым изданием принимали участие множество людей. В первую очередь это профессор Херберт Бос из Свободного университета Амстердама, ставший соавтором книги. Он специалист по безопасности и UNIX и обладает обширными познаниями в области компьютерных систем, поэтому очень хорошо, что он составил мне компанию. Им написано много нового материала, за исключением того, о чем будет упомянуто далее.

Наш редактор Трейси Джонсон (Tracy Johnson) была, как обычно, на высоте, приводя все к общему виду, объединяя материал, сглаживая шероховатости и заставляя выдерживать график работы над проектом. Нам также повезло в том, что к нам вернулась долгое время работавшая с нами ранее литературный редактор Камиль Трентакосте (Camille Trentacoste). Ее обширные познания во многих областях не раз спасали положение. Мы рады снова работать с ней после нескольких лет ее отсутствия. Также замечательно справилась со своей работой по координации усилий привлеченных к работе над книгой людей Кэрол Снайдер (Carole Snyder).

Материал главы 7, касающийся VMware (раздел 7.12), написан Эдуардом Бюньоном (Edouard Bugnion) из Федеральной политехнической школы Лозанны (Швейцария). Эд — один из основателей компании VMware и знаком с этим материалом как никто другой. Мы горячо благодарим его за предоставление нам этого материала.

Ада Гавриловска (Ada Gavrilovska) из Технологического института Джорджии, специалист по внутреннему устройству Linux, обновила главу 10 из третьего издания, которую сама же и написала. Материал по операционной системе Android в главе 10 написан Дианой Хакборн (Dianne Hackborn) из компании Google. Она является одним из ключевых разработчиков Android, ведущей операционной системы для смартфонов, поэтому мы очень благодарны ей за помощь. Теперь материалы главы 10 стали весьма обширными и подробными, и любители UNIX, Linux и Android могут почерпнуть из нее много полезных сведений. Наверное, стоит упомянуть о том, что самая длинная и наиболее технически насыщенная глава книги была написана двумя женщинами. А мы лишь упростили материал.

И конечно же, мы не оставили без внимания Windows. Глава 11 из предыдущего издания книги обновлена Дэйвом Пробертом (Dave Probert) из компании Microsoft. Теперь в ней дается подробное описание операционной системы Windows 8.1. Дэйв очень хорошо разбирается в Windows, и у него достаточно широкий кругозор для того, чтобы показать разницу между теми местами, где специалисты Microsoft все сделали правильно, и теми местами, где они ошиблись. Любителям Windows эта глава, несомненно, понравится.

Вклад всех этих специалистов позволил книге стать значительно лучше. Мы еще раз хотим поблагодарить их за неоценимую помощь.

Нам также повезло с рядом рецензентов, прочитавших подготовленный к печати материал и предложивших новые вопросы для размещения в конце каждой главы. В их числе были Труди Левин (Trudy Levine), Шивакант Мишра (Shivakant Mishra), Кришна Сивалингам (Krishna Sivalingam) и Кен Вонг. Стив Армстронг создал PowerPoint-страницы для преподавателей, использующих в своих учебных курсах материалы книги.

Обычно технические редакторы и корректоры не удостаиваются особых благодарностей, но Боб Ленц (технический редактор) и Джо Раддик (корректор) отнеслись к своей работе с особой тщательностью. В частности, Джо с двадцати метров может заметить разницу между точками прямого и курсивного начертания. И тем не менее авторы несут полную ответственность за любые упущения в данной книге. Читатели, заметившие любые ошибки, могут обратиться к одному из авторов.

И наконец, последними по списку, но не по значимости идут Барбара и Марвин, которые каждый по-своему замечательны. Отличным дополнением нашей семьи стали Даниэль и Матильда, Арон и Натан, замечательные парнишки, и Оливия, просто сокровище. И, разумеется, мне хочется поблагодарить Сюзанну за ее любовь и терпение, не говоря уже о винограде, вишнях, апельсинах и других сельскохозяйственных продуктах.

Эндрю С. Таненбаум (Andrew S. Tanenbaum)

Хотел бы выразить особую благодарность Марике, Дуку и Джипу. Марике — за ее любовь и за то, что она коротала со мной все вечера, проведенные за работой над книгой, а Дуку и Джипу — за то, что они отрывали меня от этой работы и показывали, что в жизни есть дела и поважнее. Вроде игры Minecraft.

Херберт Бос (Herbert Bos)

От издательства

Ваши замечания, предложения, вопросы отправляйте по адресу электронной почты [email protected] (издательство «Питер», компьютерная редакция).

Мы будем рады узнать ваше мнение!

На веб-сайте издательства http://www.piter.com вы найдете подробную информацию о наших книгах.

Об авторах

Эндрю С. Таненбаум получил степень бакалавра в Массачусетском технологическом институте и степень доктора философии в Калифорнийском университете в Беркли. В настоящее время он занимает должность профессора информатики в университете Врийе (Vrije) в Амстердаме (Нидерланды). Прежде он был деканом межуниверситетской аспирантуры по компьютерной обработке данных и изображений (Advanced School for Computing and Imaging), где вел исследования в области передовых параллельных систем, распределенных систем и систем обработки изображений. Он также был профессором Королевской Нидерландской академии искусства и наук (Royal Netherlands Academy of Arts and Sciences), что, собственно, и спасло его от превращения в бюрократа. Кроме того, выиграл престижный грант Европейского совета по научным исследованиям (European Research Council Advanced Grant).

В прошлом он вел исследования в области компиляторов, операционных систем, сетевых технологий и распределенных систем. Сейчас в основном сосредоточился на исследованиях в области надежных и безопасных операционных систем. В результате этих исследований появилось более 175 рецензированных статей, опубликованных в журналах и обнародованных на конференциях. Кроме этого, профессор Таненбаум является автором или соавтором пяти книг, которые переведены на 20 языков, от баскского до тайского, и используются в университетах по всему миру. В целом существует 163 варианта изданий его книг (комбинаций язык + издание).

Профессор также разработал значительный объем программного обеспечения, в частности MINIX, небольшого клона UNIX. Эта программа стала непосредственным вдохновляющим фактором для создания Linux и той платформой, на которой первоначально и разработана операционная система Linux. Текущая версия MINIX, которая носит название MINIX 3, в настоящий момент позиционируется как исключительно надежная и безопасная операционная система. Профессор Таненбаум будет считать свою работу завершенной, как только не останется ни одного пользователя, способного замыслить действия, приводящие к выходу операционной системы из строя. MINIX 3 — это развивающийся проект, находящийся в свободном доступе, и вас также приглашают к сотрудничеству по его развитию. Чтобы загрузить свободную копию и разобраться в ее работе, перейдите по адресу www.minix3.org. Загрузить можно версии как для x86, так и для ARM.

Аспиранты профессора Таненбаума, закончив учебу, добились больших успехов. И он ими очень гордится. В этом смысле он чем-то напоминает курицу-наседку.

Таненбаум является членом Ассоциации вычислительной техники (Association for Computing Machinery — ACM), Института инженеров по электротехнике и электронике (Institute of Electrical and Electronics Engineers — IEEE), Королевской Нидерландской академии искусства и наук. Он удостоен многочисленных научных наград от ACM, IEEE и USENIX. У него имеются две почетные докторские степени. Если вы заинтересовались ученым, зайдите на страницу о нем в «Википедии».

Херберт Бос получил степень магистра в университете Твенте, а степень доктора философии — в компьютерной лаборатории Кембриджского университета (Великобритания). С тех пор он упорно работал над созданием надежных и эффективных архитектур ввода-вывода для операционной системы Linux и проводил исследования систем, основанных на MINIX 3. В настоящее время является профессором кафедры компьютерных наук университета Врийе (Vrije) в Амстердаме (Нидерланды) и занимается вопросами безопасности систем и сетей. Со своими студентами он работает над новыми способами обнаружения и прекращения атак, анализа и расшифровки устройства вредоносных программ, а также фиксации ботов (вредоносных инфраструктур, которыми могут быть охвачены миллионы компьютеров). В 2011 году под свои исследования по расшифровке устройства вредоносных программ он получил начальный грант Европейского совета по научным исследованиям (ERC Starting Grant). Трое из его студентов получили премию имени Роджера Нидхэма (Roger Needham Award) за лучшие кандидатские диссертации по системам.

Глава 1.Введение

Современный компьютер состоит из одного или нескольких процессоров, оперативной памяти, дисков, принтера, клавиатуры, мыши, дисплея, сетевых интерфейсов и других разнообразных устройств ввода-вывода. В итоге получается довольно сложная система. Если каждому программисту, создающему прикладную программу, нужно будет разбираться во всех тонкостях работы всех этих устройств, то он не напишет ни строчки кода. Более того, управление всеми этими компонентами и их оптимальное использование представляет собой очень непростую задачу. По этой причине компьютеры оснащены специальным уровнем программного обеспечения, который называется операционной системой, в чью задачу входит управление пользовательскими программами, а также всеми ранее упомянутыми ресурсами. Именно такие системы и являются предметом рассмотрения данной книги.

Большинство читателей уже имеют некоторый опыт работы с такими операционными системами, как Windows, Linux, FreeBSD или Max OS X, но их внешний облик может быть разным. Программы, с которыми взаимодействуют пользователи, обычно называемые оболочкой, когда они основаны на применении текста, и графическим пользовательским интерфейсом (Graphical User Interface (GUI)), когда в них используются значки, фактически не являются частью операционной системы, хотя задействуют эту систему в своей работе.

Схематично основные рассматриваемые здесь компоненты представлены на рис. 1.1. В нижней части рисунка показано аппаратное обеспечение. Оно состоит из микросхем, плат, дисков, клавиатуры, монитора и других физических объектов. Над аппаратным обеспечением находится программное обеспечение. Большинство компьютеров имеют два режима работы: режим ядра и режим пользователя. Операционная система — наиболее фундаментальная часть программного обеспечения, работающая в режиме ядра (этот режим называют еще режимом супервизора). В этом режиме она имеет полный доступ ко всему аппаратному обеспечению и может задействовать любую инструкцию, которую машина в состоянии выполнить. Вся остальная часть программного обеспечения работает в режиме пользователя, в котором доступно лишь подмножество инструкций машины. В частности, программам, работающим в режиме пользователя, запрещено использование инструкций, управляющих машиной или осуществляющих операции ввода-вывода (Input/Output — I/O). К различиям между режимами ядра и пользователя мы еще не раз вернемся на страницах этой книги. Эти различия оказывают решающее влияние на порядок работы операционной системы.

Программы пользовательского интерфейса — оболочка или GUI — находятся на самом низком уровне программного обеспечения, работающего в режиме пользователя, и позволяют пользователю запускать другие программы, такие как веб-браузер, программа чтения электронной почты или музыкальный плеер. Эти программы также активно пользуются операционной системой.

Рис. 1.1. Место операционной системы в структуре программного обеспечения

Местонахождение операционной системы показано на рис. 1.1. Она работает непосредственно с аппаратным обеспечением и является основой остального программного обеспечения.

Важное отличие операционной системы от обычного (работающего в режиме пользователя) программного обеспечения состоит в следующем: если пользователь недоволен конкретной программой чтения электронной почты, то он может выбрать другую программу или, если захочет, написать собственную программу, но не может написать собственный обработчик прерываний системных часов, являющийся частью операционной системы и защищенный на аппаратном уровне от любых попыток внесения изменений со стороны пользователя. Это различие иногда не столь четко выражено во встроенных системах (которые могут не иметь режима ядра) или интерпретируемых системах (таких, как системы, построенные на основе языка Java, в которых для разделения компонентов используется не аппаратное обеспечение, а интерпретатор).

Во многих системах также есть программы, работающие в режиме пользователя, но помогающие работе операционной системы или выполняющие особые функции. К примеру, довольно часто встречаются программы, позволяющие пользователям изменять их пароли. Они не являются частью операционной системы и не работают в режиме ядра, но всем понятно, что они выполняют важную функцию и должны быть особым образом защищены. В некоторых системах эта идея доведена до крайней формы, и те области, которые традиционно относились к операционной системе (например, файловая система), работают в пространстве пользователя. В таких системах трудно провести четкую границу. Все программы, работающие в режиме ядра, безусловно, являются частью операционной системы, но некоторые программы, работающие вне этого режима, возможно, также являются ее частью или, по крайней мере, имеют с ней тесную связь.

Операционные системы отличаются от пользовательских программ (то есть приложений) не только местоположением. Их особенности — довольно большой объем, сложная структура и длительные сроки использования. Исходный код основы операционной системы типа Linux или Windows занимает порядка 5 млн строк. Чтобы представить себе этот объем, давайте мысленно распечатаем 5 млн строк в книжном формате по 50 строк на странице и по 1000 страниц в каждом томе (что больше этой книги). Чтобы распечатать такое количество кода, понадобится 100 томов, а это практически целая книжная полка. Можете себе представить, что вы получили задание по поддержке операционной системы и в первый же день ваш начальник подвел вас к книжной полке и сказал: «Вот это все нужно выучить». И это касается только той части, которая работает в режиме ядра. При включении необходимых общих библиотек объем Windows превышает 70 млн строк кода (напечатанные на бумаге, они займут 10–20 книжных полок), и это не считая основных прикладных программ (таких, как Windows Explorer, Windows Media Player и т.д.).

Теперь понятно, почему операционные системы живут так долго, — их очень трудно создавать, и, написав одну такую систему, владелец не испытывает желания ее выбросить и приступить к созданию новой. Поэтому операционные системы развиваются в течение долгого периода времени. Семейство Windows 95/98/Me по своей сути представляло одну операционную систему, а семейство Windows NT/2000/XP/Vista/ Windows 7 — другую. Для пользователя они были похожи друг на друга, поскольку Microsoft позаботилась о том, чтобы пользовательский интерфейс Windows 2000/XP/Vista/Windows 7 был очень похож на ту систему, которой он шел на замену, а чаще всего это была Windows 98. Тем не менее у Microsoft были довольно веские причины, чтобы избавиться от Windows 98, и мы еще вернемся к их рассмотрению, когда в главе 11 приступим к подробному изучению системы Windows.

Другим примером, который используется во всей книге, будет операционная система UNIX, ее варианты и клоны. Она также развивалась в течение многих лет, существуя в таких базирующихся на исходной системе версиях, как System V, Solaris и FreeBSD. А вот Linux имеет новую программную основу, хотя ее модель весьма близка к UNIX и она обладает высокой степенью совместимости с этой системой. Примеры, касающиеся UNIX, будут использоваться во всей книге, а Linux подробно рассматривается в главе 10.

В данной главе мы коротко коснемся ряда ключевых аспектов операционных систем, узнаем, что они собой представляют, изучим их историю, все, что происходило вокруг них, рассмотрим некоторые основные понятия операционных систем и их структуру. Многие важные темы будут более подробно рассмотрены в последующих главах.

1.1. Что такое операционная система?

Дать точное определение операционной системы довольно трудно. Можно сказать, что это программное обеспечение, которое работает в режиме ядра, но и это утверждение не всегда будет соответствовать истинному положению вещей. Отчасти проблема здесь в том, что операционные системы осуществляют две значительно отличающиеся друг от друга функции: предоставляют прикладным программистам (и прикладным программам, естественно) вполне понятный абстрактный набор ресурсов взамен неупорядоченного набора аппаратного обеспечения и управляют этими ресурсами. В зависимости от того, кто именно ведет разговор, можно услышать больше о первой или о второй из них. Нам же предстоит рассмотреть обе эти функции.

1.1.1. Операционная система как расширенная машина

Архитектура большинства компьютеров (система команд, организация памяти, ввод-вывод данных и структура шин) на уровне машинного языка слишком примитивна и неудобна для использования в программах, особенно это касается систем ввода-вывода. Чтобы перевести разговор в конкретное русло, рассмотрим современные жесткие диски SATA (Serial ATA), используемые на большинстве компьютеров. Книга, выпущенная издательством Anderson в 2007 году и содержащая описание дискового интерфейса, который программисты должны были изучить для использования диска, содержала свыше 450 страниц. После этого интерфейс многократно пересматривался и стал еще сложнее, чем был в 2007 году. Понятно, что ни один зравомыслящий программист не захочет иметь дела с таким диском на аппаратном уровне. Вместо него оборудованием занимается та часть программного обеспечения, которая называется драйвером диска и предоставляет, не вдаваясь в детали, интерфейс для чтения и ­записи дисковых блоков. Операционные системы содержат множество драйверов для управления устройствами ввода-вывода.

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

Эта абстракция является ключом к управлению сложностью. Хорошая абстракция превращает практически неподъемную задачу в две, решить которые вполне по силам. Первая из этих задач состоит в определении и реализации абстракций, а вторая — в использовании этих абстракций для решения текущей проблемы. Одна из абстракций, понятная практически любому пользователю компьютера, — это уже упомянутый ранее файл. Он представляет собой полезный объем информации, скажем, цифровую фотографию, сохраненное сообщение электронной почты или веб-страницу. Работать с фотографиями, сообщениями электронной почты и веб-страницами намного легче, чем с особенностями SATA-дисков (или других дисковых устройств). Задача операционной системы заключается в создании хорошей абстракции, а затем в реализации абстрактных объектов, создаваемых в рамках этой абстракции, и управлении ими. В этой книге абстракциям будет уделено весьма большое внимание, поскольку они являются одним из ключей к пониманию операционных систем.

Учитывая важность этого положения, стоит изложить его несколько другими словами. При всем уважении к разработчикам Macintosh, следует заметить, что аппаратное обеспечение не отличается особым изяществом. Реально существующие процессоры, блоки памяти, диски и другие компоненты представляют собой слишком сложные устройства, предоставляющие трудные, неудобные, не похожие друг на друга и не обладающие постоянством интерфейсы для тех людей, которым приходится создавать для них программное обеспечение. Иногда такая ситуация объясняется необходимостью поддержки обратной совместимости, а иногда она связана со стремлением к экономии средств, но порой разработчики аппаратного обеспечения просто не понимают (или не хотят понимать), как много проблем они создают для разработчиков программного обеспечения. Одна из главных задач операционной системы — скрыть аппаратное обеспечение и существующие программы (и их разработчиков) под создаваемыми взамен них и приспособленными для нормальной работы красивыми, элегантными, неизменными абстракциями. Операционные системы превращают уродство в красоту (рис. 1.2).

Следует отметить, что реальными «заказчиками» операционных систем являются прикладные программы (разумеется, не без помощи прикладных программистов). Именно они непосредственно работают с операционной системой и ее абстракциями. А конечные пользователи работают с абстракциями, предоставленными пользовательским интерфейсом, — это или командная строка оболочки, или графический интерфейс.  Абстракции пользовательского интерфейса могут быть похожими на абстракции,

Рис. 1.2. Операционная система превращает уродливое аппаратное обеспечение в красивые абстракции

предоставляемые операционной системой, но так бывает не всегда. Чтобы пояснить это положение, рассмотрим обычный рабочий стол Windows и командную строку. И то и другое — программы, работающие под управлением операционной системы Windows и использующие предоставленные этой системой абстракции, но они предлагают существенно отличающиеся друг от друга пользовательские интерфейсы. Точно так же пользователи Linux, работающие в Gnome или KDE, видят совершенно иной интерфейс, чем пользователи Linux, работающие в X Window System, но положенные в основу абстракции операционной системы в обоих случаях одни и те же.

В данной книге мы подробнейшим образом изучим те абстракции, которые предоставляются прикладным программам, но не станем слишком углубляться в пользовательские интерфейсы. Это весьма объемная и важная тема, но с операционными системами она связана слабо.

1.1.2. Операционная система в качестве менеджера ресурсов

Представление о том, что операционная система главным образом предоставляет абстракции для прикладных программ, — это взгляд сверху вниз. Сторонники альтернативного взгляда, снизу вверх, придерживаются того мнения, что операционная система существует для управления всеми частями сложной системы. Современные компьютеры состоят из процессоров, памяти, таймеров, дисков, мышей, сетевых интерфейсов, принтеров и широкого спектра других устройств. Сторонники взгляда снизу вверх считают, что задача операционной системы заключается в обеспечении упорядоченного и управляемого распределения процессоров, памяти и устройств ввода-вывода между различными программами, претендующими на их использование.

Современные операционные системы допускают одновременную работу нескольких программ. Представьте себе, что будет, если все три программы, работающие на одном и том же компьютере, попытаются распечатать свои выходные данные одновременно на одном и том же принтере. Первые несколько строчек распечатки могут быть от программы № 1, следующие несколько строчек — от программы № 2, затем несколько строчек от программы № 3 и т.д. В результате получится полный хаос. Операционная система призвана навести порядок в потенциально возможном хаосе за счет буферизации на диске всех выходных данных, предназначенных для принтера. После того как одна программа закончит свою работу, операционная система сможет скопировать ее выходные данные с файла на диске, где они были сохранены, на принтер, а в то же самое время другая программа может продолжить генерацию данных, не замечая того, что выходные данные фактически (до поры до времени) не попадают на принтер.

Когда с компьютером (или с сетью) работают несколько пользователей, потребности в управлении и защите памяти, устройств ввода-вывода и других ресурсов значительно возрастают, поскольку иначе пользователи будут мешать друг другу работать. Кроме этого, пользователям часто требуется совместно использовать не только аппаратное обеспечение, но и информацию (файлы, базы данных и т.п.). Короче говоря, сторонники этого взгляда на операционную систему считают, что ее первичной задачей является отслеживание того, какой программой какой ресурс используется, чтобы удовлетворять запросы на использование ресурсов, нести ответственность за их использование и принимать решения по конфликтующим запросам от различных программ и пользователей.

Управление ресурсами включает в себя мультиплексирование (распределение) ресурсов двумя различными способами: во времени и в пространстве. Когда ресурс разделяется во времени, различные программы или пользователи используют его по очереди: сначала ресурс получают в пользование одни, потом другие и т.д. К примеру, располагая лишь одним центральным процессором и несколькими программами, стремящимися на нем выполняться, операционная система сначала выделяет центральный процессор одной программе, затем, после того как она уже достаточно поработала, центральный процессор получает в свое распоряжение другая программа, затем еще одна программа, и, наконец, его опять получает в свое распоряжение первая программа. Определение того, как именно ресурс будет разделяться во времени — кто будет следующим потребителем и как долго, — это задача операционной системы. Другим примером мультиплексирования во времени может послужить совместное использование принтера. Когда в очереди для распечатки на одном принтере находятся несколько заданий на печать, нужно принять решение, какое из них будет выполнено следующим.

Другим видом разделения ресурсов является пространственное разделение. Вместо поочередной работы каждый клиент получает какую-то часть разделяемого ресурса. Например, оперативная память обычно делится среди нескольких работающих программ, так что все они одновременно могут постоянно находиться в памяти (например, используя центральный процессор по очереди). При условии, что памяти достаточно для хранения более чем одной программы, эффективнее разместить в памяти сразу несколько программ, чем выделять всю память одной программе, особенно если ей нужна лишь небольшая часть от общего пространства. Разумеется, при этом возникают проблемы равной доступности, обеспечения безопасности и т.д., и их должна решать операционная система. Другим ресурсом с разделяемым пространством является жесткий диск. На многих системах на одном и том же диске могут одновременно храниться файлы, принадлежащие многим пользователям. Распределение дискового пространства и отслеживание того, кто какие дисковые блоки использует, — это типичная задача операционной системы по управлению ресурсами.

1.2. История операционных систем

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

Первый настоящий цифровой компьютер был изобретен английским математиком Чарльзом Бэббиджем (Charles Babbage, 1792–1871). Хотя большую часть жизни Бэббидж посвятил созданию своей аналитической машины, он так и не смог заставить ее работать должным образом. Это была чисто механическая машина, а технологии того времени не были достаточно развиты для изготовления многих деталей и механизмов высокой точности. Не стоит и говорить, что его аналитическая машина не имела операционной системы.

Интересный исторический факт: Бэббидж понимал, что для аналитической машины ему необходимо программное обеспечение, поэтому он нанял молодую женщину по имени Ада Лавлейс (Ada Lovelace), дочь знаменитого британского поэта Джорджа Байрона. Она и стала первым в мире программистом, а язык программирования Ada был назван именно в ее честь.

1.2.1. Первое поколение (1945–1955): электронные лампы

После безуспешных усилий Бэббиджа прогресс в конструировании цифровых компьютеров практически не наблюдался вплоть до Второй мировой войны, которая стимулировала взрывную активизацию работ над ними. Профессор Джон Атанасов (John Atanasoff) и его аспирант Клиффорд Берри (Clifford Berry) создали в университете штата Айовы конструкцию, которая сейчас считается первым действующим цифровым компьютером. В ней использовалось 300 электронных ламп. Примерно в то же время Конрад Цузе (Konrad Zuse) в Берлине построил Z3 — компьютер, основанный на использовании электромеханических реле. В 1944 году группой ученых (включая Алана Тьюринга) в Блетшли Парк (Великобритания) был построен и запрограммирован «Колоссус», в Гарварде Говардом Айкеном (Howard Aiken) построен «Марк I», а в университете штата Пеннсильвания Вильям Мочли (William Mauchley) и его аспирант Джон Преспер Эккерт (J. Presper Eckert) построили «Эниак». Некоторые из этих машин были цифровыми, в других использовались электронные лампы, а работу части из них можно было программировать, но все они были весьма примитивно устроены и тратили многие секунды на производство даже простейших вычислений.

На заре компьютерной эры каждую машину проектировала, создавала, программировала, эксплуатировала и обслуживала одна и та же группа людей (как правило, инженеров). Все программирование велось исключительно на машинном языке или, и того хуже, за счет сборки электрических схем, а для управления основными функциями машины приходилось подключать к коммутационным панелям тысячи проводов. О языках программирования (даже об ассемблере) тогда еще ничего не было известно. Об операционных системах вообще никто ничего не слышал. Режим работы программиста заключался в том, чтобы записаться на определенное машинное время на специальном стенде, затем спуститься в машинный зал, вставить свою коммутационную панель в компьютер и провести следующие несколько часов в надежде, что в процессе работы не выйдет из строя ни одна из примерно 20 тысяч электронных ламп. В сущности, все решаемые задачи сводились к простым математическим и числовым расчетам, таким как уточнение таблиц синусов, косинусов и логарифмов или вычисление траекторий полета артиллерийских снарядов.

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

1.2.2. Второе поколение (1955–1965): транзисторы и системы пакетной обработки

В середине 1950-х годов изобретение и применение транзисторов радикально изменило всю картину. Компьютеры стали достаточно надежными, появилась высокая вероятность того, что машины будут работать довольно долго, выполняя при этом полезные функции. Впервые сложилось четкое разделение между проектировщиками, сборщиками, операторами, программистами и обслуживающим персоналом.

Машины, называемые теперь мэйнфреймами, располагались в специальных больших залах с кондиционированием воздуха, где ими управлял целый штат профессиональных операторов. Только большие корпорации, правительственные учреждения или университеты могли позволить себе технику, цена которой исчислялась миллионами долларов. Чтобы выполнить задание (то есть программу или комплект программ), программист сначала должен был записать его на бумаге (на Фортране или ассемблере), а затем перенести на перфокарты. После этого он должен был принести колоду перфокарт в комнату ввода данных, передать одному из операторов и идти пить кофе в ожидании, когда будет готов результат.

Когда компьютер заканчивал выполнение какого-либо из текущих заданий, оператор подходил к принтеру, отрывал лист с полученными данными и относил его в комнату для распечаток, где программист позже мог его забрать. Затем оператор брал одну из колод перфокарт, принесенных из комнаты ввода данных, и запускал ее на считывание. Если в процессе расчетов был необходим компилятор языка Фортран, то оператору приходилось брать его из картотечного шкафа и загружать в машину отдельно. На одно только хождение операторов по машинному залу терялась впустую масса драгоценного компьютерного времени.

Если учесть высокую стоимость оборудования, неудивительно, что люди довольно скоро занялись поиском способа повышения эффективности использования машинного времени. Общепринятым решением стала система пакетной обработки. Первоначально замысел состоял в том, чтобы собрать полный поднос заданий (колод перфокарт) в комнате входных данных и затем переписать их на магнитную ленту, используя небольшой и (относительно) недорогой компьютер, например IBM 1401, который был очень хорош для считывания карт, копирования лент и печати выходных данных, но не подходил для числовых вычислений.

Другие, более дорогостоящие машины, такие как IBM 7094, использовались для настоящих вычислений. Этот процесс изображен на рис. 1.3.

Примерно после часа сбора пакета карты считывались на магнитную ленту, которую относили в машинный зал, где устанавливали на лентопротяжном устройстве.

Рис. 1.3. Ранняя система пакетной обработки: а — программист приносит карты для IBM 1401; б — IBM 1401 записывает пакет заданий на магнитную ленту; в — оператор переносит входные данные на ленте к IBM 7094; г — IBM 7094 выполняет вычисления; д — оператор переносит ленту с выходными данными на IBM 1401; е — IBM 1401 печатает выходные данные

Затем оператор загружал специальную программу (прообраз сегодняшней операционной системы), которая считывала первое задание с ленты и запускала его. Выходные данные, вместо того чтобы идти на печать, записывались на вторую ленту. Завершив очередное задание, операционная система автоматически считывала с ленты следующее и начинала его обработку. После обработки всего пакета оператор снимал ленты с входной и выходной информацией, ставил новую ленту со следующим заданием, а готовые данные помещал на IBM 1401 для печати в автономном режиме (то есть без связи с главным компьютером). Структура типичного входного задания показана на рис. 1.4. Оно начиналось с карты $JOB, на которой указывались максимальное время выполнения задания в минутах, загружаемый учетный номер и имя программиста. Затем поступала карта $FORTRAN, дающая операционной системе указание загрузить компилятор языка Фортран с системной магнитной ленты.

Рис. 1.4. Структура типичного задания для операционной системы FMS

За этой картой следовала программа, которую нужно было компилировать, а после нее — карта $LOAD, указывающая операционной системе загрузить только что скомпилированную объектную программу. (Скомпилированные программы часто записывались на рабочих лентах, данные с которых могли стираться сразу после использования, и их загрузка должна была выполняться в явном виде.) Следом шла карта $RUN, дающая операционной системе команду на выполнение программы с использованием данных, следующих за ней. Наконец, карта завершения $END отмечала конец задания. Эти примитивные управляющие перфокарты были предшественниками современных оболочек и интерпретаторов командной строки.

Большие компьютеры второго поколения использовались главным образом для научных и технических вычислений, таких как решение дифференциальных уравнений в частных производных, часто встречающихся в физике и инженерных задачах. В основном программы для них составлялись на языке Фортран и ассемблере, а типичными операционными системами были FMS (Fortran Monitor System) и IBSYS (операционная система, созданная корпорацией IBM для компьютера IBM 7094).

1.2.3. Третье поколение (1965–1980): интегральные схемы и многозадачность

К началу 1960-х годов большинство производителей компьютеров имели два различных, не совместимых друг с другом семейства. С одной стороны, это были огромные научные компьютеры с пословной обработкой данных типа IBM 7094, которые использовались для промышленного уровня числовых расчетов в науке и технике, с другой  — коммерческие компьютеры с посимвольной обработкой данных, такие как IBM 1401, широко используемые банками и страховыми компаниями для задач сортировки и распечатки данных.

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

Фирма IBM попыталась решить эти проблемы разом, выпустив серию машин IBM System/360. Это была серия программно-совместимых машин, в которой компьютеры варьировались от машин, сопоставимых по размерам с IBM 1401, до значительно более крупных и мощных машин, чем IBM 7094. Эти компьютеры различались только ценой и производительностью (максимальным объемом памяти, быстродействием процессора, количеством возможных устройств ввода-вывода и т.д.). Так как все машины имели одинаковые структуру и набор команд, программы, написанные для одного компьютера, могли работать на всех других, по крайней мере, в теории. (Но, как любил повторять Йоги Берра (Yogi Berra): «В теории нет разницы между теорией и практикой, но на практике она есть».) Поскольку 360-я серия была разработана для поддержки как научных (то есть численных), так и коммерческих вычислений, одно семейство машин могло удовлетворить нужды всех потребителей. В последующие годы корпорация IBM, используя более современные технологии, выпустила преемников 360-й серии, имеющих с ней обратную совместимость, эти серии известны под номерами 370, 4300, 3080 и 3090. Самыми последними потомками этого семейства стали машины zSeries, хотя они уже значительно отличаются от оригинала.

Семейство компьютеров IBM/360 стало первой основной серией, использующей малые интегральные схемы, дававшие преимущество в цене и качестве по сравнению с машинами второго поколения, собранными на отдельных транзисторах. Корпорация IBM добилась моментального успеха, а идею семейства совместимых компьютеров скоро приняли на вооружение и все остальные основные производители. В компьютерных центрах до сих пор можно встретить потомков этих машин. В настоящее время они часто используются для управления огромными базами данных (например, для систем бронирования и продажи билетов на авиалиниях) или в качестве серверов узлов Интернета, которые должны обрабатывать тысячи запросов в секунду.

Основное преимущество «единого семейства» оказалось одновременно и величайшей его слабостью. По замыслу его создателей, все программное обеспечение, включая операционную систему OS/360, должно было одинаково хорошо работать на всех моделях компьютеров: и в небольших системах, которые часто заменяли машины IBM 1401 и применялись для копирования перфокарт на магнитные ленты, и на огромных системах, заменявших машины IBM 7094 и использовавшихся для расчета прогноза погоды и других сложных вычислений. Операционная система должна была хорошо работать как на машинах с небольшим количеством внешних устройств, так и на системах, применяющих эти устройства в большом количестве. Она должна была работать как в коммерческих, так и в научных областях. Более того, она должна была работать эффективно во всех этих различных сферах применения.

Но ни IBM, ни кому-либо еще так и не удалось создать программное обеспечение, удовлетворяющее всем этим противоречивым требованиям. В результате появилась громоздкая и чрезвычайно сложная операционная система, примерно на два или три порядка превышающая по объему FMS. Она состояла из миллионов строк, написанных на ассемблере тысячами программистов, содержала тысячи и тысячи ошибок, что повлекло за собой непрерывный поток новых версий, в которых предпринимались попытки исправления этих ошибок. В каждой новой версии устранялась только часть ошибок, вместо них появлялись новые, так что общее их количество, скорее всего, оставалось постоянным.

Один из разработчиков OS/360, Фред Брукс (Fred Brooks), впоследствии написал остроумную и язвительную книгу (Brooks, 1995) с описанием своего опыта работы с OS/360. Мы не можем здесь дать полную оценку этой книги, но достаточно будет сказать, что на ее обложке изображено стадо доисторических животных, увязших в яме с битумом.

Несмотря на свой огромный объем и имеющиеся недостатки, OS/360 и подобные ей операционные системы третьего поколения, созданные другими производителями компьютеров, неплохо отвечали запросам большинства клиентов. Они даже сделали популярными несколько ключевых технических приемов, отсутствовавших в операционных системах второго поколения. Самым важным достижением явилась многозадачность. На компьютере IBM 7094, когда текущая работа приостанавливалась в ожидании операций ввода-вывода с магнитной ленты или других устройств, центральный процессор просто бездействовал до окончания операции ввода-вывода. При сложных научных вычислениях устройства ввода-вывода задействовались менее интенсивно, поэтому время, впустую потраченное на ожидание, было не столь существенным. Но при коммерческой обработке данных время ожидания устройства ввода-вывода могло занимать 80 или 90 % всего рабочего времени, поэтому для устранения длительных простоев весьма дорогостоящего процессора нужно было что-то предпринимать.

Решение этой проблемы заключалось в разбиении памяти на несколько частей, называемых разделами, в каждом из которых выполнялось отдельное задание (рис. 1.5). Пока одно задание ожидало завершения работы устройства ввода-вывода, другое могло использовать центральный процессор. Если в оперативной памяти содержалось достаточное количество заданий, центральный процессор мог быть загружен почти на все 100 % времени. Множество одновременно хранящихся в памяти заданий требовало наличия специального оборудования для защиты каждого задания от возможного незаконного присваивания областей памяти и нанесения вреда со стороны других заданий. Для этой цели компьютеры 360-й серии и другие системы третьего поколения были оборудованы специальными аппаратными средствами.

Рис. 1.5. Многозадачная система с тремя заданиями в памяти

Другим важным плюсом операционных систем третьего поколения стала способность считывать задание с перфокарт на диск по мере того, как их приносили в машинный зал. При окончании выполнения каждого текущего задания операционная система могла загружать новое задание с диска в освободившийся раздел памяти и запускать это задание. Этот технический прием называется подкачкой данных, или спулингом (spooling — английское слово, которое произошло от Simultaneous Peripheral Operation On Line, то есть совместная периферийная операция в интерактивном режиме), и его также используют для выдачи полученных данных. С появлением подкачки отпала надобность как в 1401-х машинах, так и в многочисленных переносах магнитных лент.

Хотя операционные системы третьего поколения неплохо справлялись с большинством научных вычислений и крупных коммерческих задач по обработке данных, но по своей сути они были все еще разновидностью систем пакетной обработки. Многие программисты тосковали по первому поколению машин, когда они могли распоряжаться всей машиной в течение нескольких часов и имели возможность быстро производить отладку своих программ. В системах третьего поколения промежуток времени между передачей задания и возвращением результатов часто составлял несколько часов, так что единственная поставленная не в том месте запятая могла стать причиной сбоя при компиляции, и получалось, что программист полдня тратил впустую. Программистам это очень не нравилось.

Желание сократить время ожидания ответа привело к разработке режима разделения времени — варианту многозадачности, при котором у каждого пользователя есть свой диалоговый терминал. Если двадцать пользователей зарегистрированы в системе, работающей в режиме разделения времени, и семнадцать из них думают, беседуют или пьют кофе, то центральный процессор по очереди предоставляется трем пользователям, желающим работать на машине. Так как люди, отлаживая программы, обычно выдают короткие команды (например, компилировать процедуру на пяти страницах) чаще, чем длинные (например, упорядочить файл с миллионами записей), то компьютер может обеспечивать быстрое интерактивное обслуживание нескольких пользователей. При этом он может работать над большими пакетами в фоновом режиме, когда центральный процессор не занят другими заданиями. Первая универсальная система с режимом разделения времени CTSS (Compatible Time Sharing System) была разработана в Массачусетском технологическом институте (M.I.T.) на специально переделанном компьютере IBM 7094 (Corbato et al., 1962). Однако режим разделения времени не стал действительно популярным до тех пор, пока на машинах третьего поколения не получили широкого распространения необходимые технические средства защиты.

После создания успешной системы CTSS Массачусетский технологический институт, исследовательские лаборатории Bell Labs и корпорация General Electric (главный на то время изготовитель компьютеров) решили начать разработку универсальной общей компьютерной системы — машины, которая должна была поддерживать одновременную работу сотен пользователей в режиме разделения времени. За основу была взята система распределения электроэнергии. Когда вам нужна электроэнергия, вы просто вставляете штепсель в розетку и получаете столько энергии, сколько вам нужно. Проектировщики этой системы, известной как MULTICS (MULTiplexed Information and Computing Service — мультиплексная информационная и вычислительная служба), представляли себе одну огромную вычислительную машину, воспользоваться услугами которой мог любой проживающий в окрестностях Бостона человек. Мысль о том, что машины в десять тысяч раз мощнее, чем их мэйнфрейм GEE645, будут продаваться миллионами по 1000 долларов за штуку всего лишь через каких-нибудь 40 лет, показалась бы им чистейшей научной фантастикой. Это было бы сродни мысли о сверхзвуковых трансатлантических подводных поездах для современного человека.

Успех системы MULTICS был весьма неоднозначен. Она разрабатывалась с целью обеспечения сотен пользователей машиной, немногим более мощной, чем персональный компьютер с процессором Intel 386, но имеющей более широкие возможности ввода-вывода данных. По тем временам это была не такая уж безумная идея, поскольку тогда люди умели создавать небольшие эффективные программы, то есть обладали мастерством, которое впоследствии было утрачено. Существовало много причин, по которым система MULTICS не получила глобального распространения. Не последнюю роль здесь сыграл тот факт, что эта система была написана на языке PL/I, а компилятор языка PL/I появился лишь через несколько лет, к тому же первую версию этого компилятора можно было назвать работоспособной лишь с большой натяжкой. Кроме того, система MULTICS была слишком претенциозна для своего времени, что делало ее во многом похожей на аналитическую машину Чарльза Бэббиджа в XIX столетии.

Итак, MULTICS внесла множество оригинальных идей в компьютерную литературу, но превратить ее в серьезный продукт и добиться весомого коммерческого успеха оказалось намного труднее, чем ожидалось. Исследовательские лаборатории Bell Labs вышли из проекта, а компания General Electric вообще ушла с рынка компьютерных технологий. Однако Массачусетский технологический институт проявил упорство и со временем довел систему до работоспособного состояния. В конце концов она была продана компании Honeywell, выкупившей компьютерный бизнес General Electric, и установлена примерно в 80 больших компаниях и университетах по всему миру. Несмотря на свою малочисленность, пользователи MULTICS продемонстрировали приверженность этой системе. Компании General Motors, Ford и Агентство национальной безопасности США отказались от системы MULTICS только в конце 1990-х годов, спустя 30 лет после ее выпуска и после многолетних попыток заставить компанию Honeywell обновить оборудование.

К концу XX века идея создания такого общего компьютера уже выдохлась, но она может возродиться в виде облачных вычислений, когда относительно небольшие компьютеры (включая смартфоны, планшеты и им подобные устройства) подключены к серверам, принадлежащим огромным удаленным центрам обработки данных, где и производятся все вычисления, а локальный компьютер используется просто для обслуживания пользовательского интерфейса. Скорее всего, существование такой системы будет мотивировано тем, что большинство пользователей не захотят заниматься администрированием все более и более сложных и привередливых компьютерных систем и предпочтут доверить эту работу команде профессионалов, работающих на компанию, обслуживающую сервер. Электронная коммерция уже развивается в этом направлении, компании, занимающиеся ею, используют мультипроцессорные серверы, с которыми соединяются простые машины клиентов. Все это очень напоминает замысел системы MULTICS.

Несмотря на коммерческую неудачу, система MULTICS оказала существенное влияние на последующие операционные системы (особенно на UNIX и ее производные, на FreeBSD, Linux, IOS и Android). Этот факт описан во многих статьях и книгах (Corbato et al., 1972; Corbato and Vyssotsky, 1965; Daley end Dennis, 1968; Organick, 1972; Saltzer, 1974). Системе MULTICS также посвящен до сих пор активный веб-сайт www.multicians.org, содержащий большой объем информации о системе, ее проектировщиках и пользователях.

Еще одной важной разработкой времен третьего поколения были мини-компьютеры, невероятный взлет популярности которых начался с выпуска корпорацией DEC машины PDP-1. Компьютеры PDP-1 обладали оперативной памятью, состоящей всего лишь из 4 К 18-битовых слов, но стоили всего 120 тыс. долларов за одну машину (это меньше 5 % от цены IBM 7094) и поэтому расхватывались как горячие пирожки. Некоторые виды нечисловой работы они выполняли так же быстро, как и машины IBM 7094, в результате чего родилась новая отрасль производства. За этой машиной вскоре последовала целая серия компьютеров PDP других моделей (в отличие от семейства IBM, полностью несовместимых), и как кульминация появилась модель PDP-11.

Кен Томпсон (Ken Thompson), один из ведущих специалистов Bell Labs, работавший над проектом MULTICS, чуть позже нашел мини-компьютер PDP-7, которым никто не пользовался, и решил написать упрощенную однопользовательскую версию системы MULTICS. Эта работа позже переросла в операционную систему UNIX, ставшую популярной в академических кругах, правительственных учреждениях и во многих компаниях. История развития UNIX уже многократно описывалась в самых различных книгах (например, Salus, 1994). Часть этой истории будет рассказана в главе 10. А пока достаточно сказать, что из-за широкой доступности исходного кода различные организации создали свои собственные (несовместимые) версии, что привело к полному хаосу. Были разработаны две основные версии: System V корпорации AT&T и BSD (Berkeley Software Distribution) Калифорнийского университета Беркли. У них также были последующие варианты.

Чтобы появилась возможность писать программы, работающие в любой UNIX-системе, Институт инженеров по электротехнике и электронике (IEEE) разработал стандарт системы UNIX, названный POSIX, который в настоящее время поддерживается большинством версий UNIX. Стандарт POSIX определяет минимальный интерфейс системных вызовов, который должны поддерживать совместимые с ним системы UNIX. Фактически на данный момент POSIX-интерфейс поддерживается также рядом других операционных систем.

Между прочим стоит упомянуть, что в 1987 году автор выпустил в образовательных целях небольшой клон системы UNIX, так называемую систему MINIX. Функционально система MINIX очень похожа на UNIX, включая поддержку стандарта POSIX. С тех пор исходная версия превратилась в MINIX 3, систему, обладающую высокой модульностью и ориентированную на достижение очень высокой надежности. Она способна на лету определять и заменять дефектные и даже поврежденные модули (например, драйверы устройств ввода-вывода) без перезагрузки и нарушения хода выполнения запущенных программ. Также доступна книга, в которой описывается ее внутренняя работа, а в приложении приводится исходный код (Tanenbaum and Woodhull, 2006). Система MINIX 3 имеется в свободном доступе (включая весь исходный код) в Интернете по адресу www.minix3.org.

Желание получить свободно распространяемую версию MINIX (в отличие от образовательной) привело к тому, что финский студент Линус Торвальдс (Linus Torvalds) создал систему Linux. Система MINIX стала непосредственным вдохновляющим фактором и основой для этой разработки, которая первоначально поддерживала различные особенности MINIX (например, ее файловую систему). С тех пор система Linux во многом и многими была существенно расширена, но все еще сохраняет исходную структуру, общую для MINIX и UNIX. Читателям, интересующимся подробной историей развития Linux и свободного программного обеспечения, можно порекомендовать прочитать книгу Глина Муди (Moody, 2001).

1.2.4. Четвертое поколение (с 1980 года по наши дни): персональные компьютеры

Следующий период эволюции операционных систем связан с появлением БИС — больших интегральных схем (LSI, Large Scale Integration) — кремниевых микросхем, содержащих тысячи транзисторов на одном квадратном сантиметре. С точки зрения архитектуры персональные компьютеры (первоначально называемые микрокомпьютерами) были во многом похожи на мини-компьютеры класса PDP-11, но, конечно же, отличались по цене. Если появление мини-компьютеров позволило отделам компаний и факультетам университетов иметь собственный компьютер, то с появлением микропроцессоров возможность купить персональный компьютер получил каждый человек.

В 1974 году, когда корпорация Intel выпустила Intel 8080 — первый универсальный 8-разрядный центральный процессор, — для него потребовалась операционная система, с помощью которой можно было бы протестировать новинку. Корпорация Intel привлекла к разработкам и написанию нужной операционной системы одного из своих консультантов Гэри Килдэлла (Gary Kildall). Сначала Килдэлл с другом сконструировали контроллер для 8-дюймового гибкого диска, недавно выпущенного компанией Shugart Associates, и подключили этот диск к процессору Intel 8080. Таким образом появился первый микрокомпьютер с диском. Затем Килдэлл создал дисковую операционную систему, названную CP/M (Control Program for Microcomputers — управляющая программа для микрокомпьютеров). Когда Килдэлл заявил о своих правах на CP/M, корпорация Intel удовлетворила его просьбу, поскольку не думала, что у микрокомпьютеров с диском есть будущее. Позже Килдэлл создал компанию Digital Research для дальнейшего развития и продажи CP/M.

В 1977 году компания Digital Research переработала CP/M, чтобы сделать ее пригодной для работы на микрокомпьютерах с процессорами Intel 8080 или Zilog Z80, а также с другими процессорами. Затем было написано множество прикладных программ, работающих в CP/M, что позволило этой системе занимать высшую позицию в мире микрокомпьютеров целых 5 лет.

В начале 1980-х корпорация IBM разработала IBM PC (Personal Computer — персональный компьютер) и начала искать для него программное обеспечение. Сотрудники IBM связались с Биллом Гейтсом, чтобы получить лицензию на право использования его интерпретатора языка Бейсик. Они также поинтересовались, не знает ли он операционную систему, которая работала бы на IBM PC. Гейтс посоветовал обратиться к Digital Research, тогда главенствующей компании в области операционных систем. Но Килдэлл отказался встречаться с IBM, послав вместо себя своего подчиненного. Что еще хуже, его адвокат даже отказался подписывать соглашение о неразглашении, касающееся еще не выпущенного IBM PC, чем полностью испортил дело. Корпорация IBM снова обратилась к Гейтсу с просьбой обеспечить ее операционной системой. После повторного обращения Гейтс выяснил, что у местного изготовителя компьютеров, Seattle Computer Products, есть подходящая операционная система DOS (Disk Operating System — дисковая операционная система). Он направился в эту компанию с предложением выкупить DOS (предположительно за $50 000), которое компания Seattle Computer Products с готовностью приняла. Затем Гейтс создал пакет программ DOS/BASIC, и пакет был куплен IBM. Когда корпорация IBM захотела внести в операционную систему ряд усовершенствований, Билл Гейтс пригласил для этой работы Тима Патерсона (Tim Paterson), человека, написавшего DOS и ставшего первым служащим Microsoft — еще не оперившейся компании Гейтса. Видоизмененная система была переименована в MS-DOS (MicroSoft Disk Operating System) и быстро заняла доминирующее положение на рынке IBM PC. Самым важным оказалось решение Гейтса (как оказалось, чрезвычайно мудрое) продавать MS-DOS компьютерным компаниям для установки вместе с их оборудованием в отличие от попыток Килдэлла продавать CP/M конечным пользователям (по крайней мере, на начальной стадии).

Когда в 1983 году появился компьютер IBM PC/AT (являющийся дальнейшим развитием семейства IBM PC) с центральным процессором Intel 80286, система MS-DOS уже прочно стояла на ногах, а CP/M доживала последние дни. Позже система MS-DOS широко использовалась на компьютерах с процессорами 80386 и 80486. Хотя первоначальная версия MS-DOS была довольно примитивна, последующие версии системы включали в себя расширенные функции, многие из которых были позаимствованы у UNIX. (Корпорация Microsoft была хорошо знакома с системой UNIX и в первые годы своего существования даже продавала ее микрокомпьютерную версию XENIX.)

CP/M, MS-DOS и другие операционные системы для первых микрокомпьютеров полностью основывались на командах, вводимых пользователем с клавиатуры. Со временем благодаря исследованиям, проведенным в 1960-е годы Дагом Энгельбартом (Doug Engelbart) в научно-исследовательском институте Стэнфорда (Stanford Research Institute), ситуация изменилась. Энгельбарт изобрел графический интерфейс пользователя (GUI, Graphical User Interface) вкупе с окнами, значками, системами меню и мышью. Эту идею переняли исследователи из Xerox PARC и воспользовались ею в создаваемых ими машинах.

Однажды Стив Джобс (Steve Jobs), один из авторов компьютера Apple, созданного в его гараже, посетил PARC, где увидел GUI и сразу понял уровень заложенного в него потенциала, недооцененного руководством компании Xerox. Затем Джобс приступил к созданию компьютера Apple, оснащенного графическим пользовательским интерфейсом. Этот проект привел к созданию компьютера Lisa, который оказался слишком дорогим и не имел коммерческого успеха. Вторая попытка Джобса, компьютер Apple Macintosh, имел огромный успех не только потому, что был значительно дешевле, чем Lisa, но и потому, что обладал более дружественным пользовательским интерфейсом, предназначенным для пользователей, не разбиравшихся в компьютерах и к тому же совершенно не стремившихся чему-то обучаться. Компьютеры Macintosh нашли широкое применение у представителей творческих профессий — художников-дизайнеров, профессиональных цифровых фотографов и профессиональных производителей цифровой видеопродукции, которые приняли их с восторгом. В 1999 году компания Apple позаимствовала ядро, происходящее из микроядра Mach, первоначально разработанного специалистами университета Карнеги — Меллона для замены ядра BSD UNIX. Поэтому Mac OS X является операционной системой, построенной на основе UNIX, хотя и с весьма своеобразным интерфейсом.

Когда корпорация Microsoft решила создать преемника MS-DOS, она была под большим впечатлением от успеха Macintosh. В результате появилась основанная на применении графического интерфейса пользователя система под названием Windows, первоначально являвшаяся надстройкой над MS-DOS (то есть она больше была похожа на оболочку, чем на настоящую операционную систему). На протяжении примерно 10 лет, с 1985 по 1995 год, Windows была просто графической оболочкой, работавшей поверх MS-DOS. Однако в 1995 году была выпущена самостоятельная версия Windows — Windows 95. Она непосредственно выполняла большинство функций операционной системы, используя входящую в ее состав систему MS-DOS только для загрузки, а также для выполнения старых программ, разработанных для MS-DOS. В 1998 году была выпущена слегка модифицированная версия этой системы, получившая название Windows 98. Тем не менее обе эти системы, и Windows 95 и Windows 98, все еще содержали изрядное количество кода, написанного на ассемблере для 16-разрядных процессоров Intel.

Другой операционной системой Microsoft была Windows NT (NT означает New Technology — новая технология), которая на определенном уровне совместима с Windows 95. Однако она была написана заново и представляла собой полноценную 32-разрядную систему. Ведущим разработчиком Windows NT был Дэвид Катлер (David Cutler), который также был одним из разработчиков операционной системы VAX VMS, поэтому некоторые идеи из VMS присутствуют и в NT (причем столько, что владелец VMS, компания DEC, предъявила иск корпорации Microsoft. Конфликт был улажен во внесудебном порядке за приличную сумму). Microsoft ожидала, что первая же версия вытеснит MS-DOS и все другие версии Windows, поскольку она намного превосходила их, но надежды не оправдались. Только операционной системе Windows NT 4.0 наконец-то удалось завоевать высокую популярность, особенно в корпоративных сетях. Пятая версия Windows NT была в начале 1999 года переименована в Windows 2000. Она предназначалась для замены обеих версий — Windows 98 и Windows NT 4.0.

Но полностью этим планам также не суждено было сбыться, поэтому Microsoft выпустила еще одну версию Windows 98 под названием Windows Me (Millennium edition — выпуск тысячелетия). В 2001 году была выпущена слегка обновленная версия Windows 2000, названная Windows XP. Эта версия выпускалась намного дольше, по существу заменяя все предыдущие версии Windows.

Тем не менее выпуск новых версий продолжался. После Windows 2000 Microsoft разбила семейство Windows на клиентскую и серверную линейки. Клиентская линейка базировалась на версии XP и ее последователях, а серверная включала Windows Server 2003 и Windows 2008. Чуть позже появилась и третья линейка, предназначенная для мира встроенных операционных систем. От всех этих версий Windows отделились вариации в виде сервисных пакетов. Этого хватило, чтобы успокоить некоторых администраторов (и писателей учебников по операционным системам).

Затем в январе 2007 года Microsoft выпустила окончательную версию преемника Windows XP под названием Vista. У нее был новый графический интерфейс, усовершенствованная система безопасности и множество новых или обновленных пользовательских программ. Microsoft надеялась, что она полностью заменит Windows XP, но этого так и не произошло. Вместо этого было получено большое количество критических отзывов и статей в прессе, главным образом из-за высоких системных требований, ограничительных условий лицензирования и поддержки технических средств защиты авторских прав (технологии, затрудняющей пользователям копирование защищенных материалов).

С появлением Windows 7, новой и менее требовательной к ресурсам операционной системы, многие решили вообще пропустить Vista. В Windows 7 не было представлено слишком много новых свойств, но она была относительно небольшой по объему и довольно стабильной. Менее чем за три недели Windows 7 получила бо́льшую долю рынка, чем Vista за семь месяцев. В 2012 году Microsoft выпустила ее преемника — Windows 8, операционную систему с совершенно новым внешним видом, предназначенным для сенсорных экранов. Компания надеялась, что новый дизайн сделает эту операционную систему доминирующей для широкого круга устройств: настольных компьютеров, ноутбуков, планшетных компьютеров, телефонов и персональных компьютеров, использующихся в качестве домашних кинотеатров. Но пока проникновение ее на рынок идет намного медленнее по сравнению с Windows 7.

Другим основным конкурентом в мире персональных компьютеров является операционная система UNIX (и различные производные от этой системы). UNIX имеет более сильные позиции на сетевых и промышленных серверах, также она находит все более широкое распространение и на настольных компьютерах, ноутбуках, планшетных компьютерах и смартфонах. На компьютерах с процессором Pentium популярной альтернативой Windows для студентов и постоянно растущего числа корпоративных пользователей становится операционная система Linux.

В данной книге термин x86 будет применяться в отношении всех современных процессоров, основанных на семействе архитектур с набором команд, берущим начало с процессора 8086, созданного в 1970-х годах. Компаниями AMD и Intel было выпущено множество таких процессоров, которые зачастую имели существенные различия: процессоры могли быть 32- или 64-разрядными, с небольшим или большим числом ядер, с конвейерами различной глубины и т.д. Тем не менее для программиста они весьма похожи друг на друга, и на всех них может запускаться код для процессора 8086, написанный 35 лет назад. Там, где различия будут играть важную роль, будут делаться ссылки на конкретные модели, а для индикации 32- и 64-разрядных вариантов будут использоваться термины x86-32 и x86-64.

Операционная система FreeBSD также является популярной производной от UNIX, порожденной проектом BSD в Беркли. Все современные компьютеры Macintosh работают на модифицированной версии FreeBSD (OS X). UNIX также является стандартом на рабочих станциях, оснащенных высокопроизводительными RISC-процессорами. Ее производные нашли широкое применение на мобильных устройствах, которые работают под управлением iOS 7 или Android.

Хотя многие пользователи UNIX, особенно опытные программисты, отдают предпочтение интерфейсу на основе командной строки, практически все UNIX-системы поддерживают систему управления окнами X Window System (или X11), созданную в Массачусетском технологическом институте. Эта система выполняет основные операции по управлению окнами, позволяя пользователям создавать, удалять, перемещать окна и изменять их размеры, используя мышь. Зачастую в качестве надстройки над X11 можно использовать полноценный графический пользовательский интерфейс, например Gnome или KDE, придавая UNIX внешний вид и поведение, чем-то напоминающие Macintosh или Microsoft Windows.

В середине 1980-х годов начало развиваться интересное явление — рост сетей персональных компьютеров, работающих под управлением сетевых операционных систем и распределенных операционных систем (Tanenbaum and Van Steen, 2007). В сетевых операционных системах пользователи знают о существовании множества компьютеров и могут войти в систему удаленной машины и скопировать файлы с одной машины на другую. На каждой машине работает своя локальная операционная система и имеется собственный локальный пользователь (или пользователи).

Сетевые операционные системы не имеют существенных отличий от однопроцессорных операционных систем. Ясно, что им нужен контроллер сетевого интерфейса и определенное низкоуровневое программное обеспечение, чтобы управлять этим контроллером, а также программы для осуществления входа в систему удаленной машины и для удаленного доступа к файлам, но эти дополнения не изменяют основную структуру операционной системы.

В отличие от этого распределенная операционная система представляется своим пользователям как традиционная однопроцессорная система, хотя на самом деле в ее составе работает множество процессоров. Пользователям совершенно не обязательно знать, где именно выполняются их программы или где размещены их файлы, — все это должно автоматически и эффективно управляться самой операционной системой.

Настоящим распределенным операционным системам требуется намного больше изменений, не ограничивающихся простым добавлением незначительного объема кода к однопроцессорной операционной системе, поскольку распределенные и централизованные системы существенно отличаются друг от друга. Например, распределенные системы часто позволяют приложениям работать одновременно на нескольких процессорах, для чего требуются более сложные алгоритмы распределения работы процессоров, чтобы оптимизировать степень параллельной обработки данных. Наличие задержек при передаче данных по сети часто подразумевает, что эти (и другие) алгоритмы должны работать в условиях неполной, устаревшей или даже неверной информации. Такая ситуация в корне отличается от работы однопроцессорной системы, где последняя обладает полной информацией о своем состоянии.

1.2.5. Пятое поколение (с 1990 года по наши дни): мобильные компьютеры

С тех пор как в комиксах 1940-х годов детектив Дик Трейси стал переговариваться с помощью радиостанции, вмонтированной в наручные часы, у людей появилось желание иметь в своем распоряжении устройство связи, которое можно было бы брать с собой в любое место. Первый настоящий мобильный телефон появился в 1946 году, и тогда он весил около 40 кг. Его можно было брать с собой только при наличии автомобиля, в котором его можно было перевозить.

Первый по-настоящему переносной телефон появился в 1970-х годах и при весе приблизительно 1 кг был воспринят весьма позитивно. Его ласково называли «кирпич». Желание иметь такое устройство вскоре стало всеобщим. В настоящее время сотовой связью пользуется почти 90 % населения земного шара. Скоро станет можно звонить не только с мобильных телефонов и наручных часов, но и с очков и других носимых предметов. Кроме того, та часть устройства, которая имеет отношение непосредственно к телефону, уже не представляет какого-либо интереса. Особо не задумываясь над этим, мы получаем электронную почту, просматриваем веб-страницы, отправляем текстовые сообщения друзьям, играем в игры и узнаем о наличии пробок на улицах.

Хотя идея объединения в одном устройстве и телефона и компьютера вынашивалась еще с 1970-х годов, первый настоящий смартфон появился только в середине 1990-х годов, когда Nokia выпустила свой N9000, представлявший собой комбинацию из двух отдельных устройств: телефона и КПК. В 1997 году в компании Ericsson для ее изделия GS88 «Penelope» был придуман термин «смартфон».

Теперь, когда смартфоны получили повсеместное распространение, между различными операционными системами воцарилась жесткая конкуренция, исход которой еще менее ясен, чем в мире персональных компьютеров. На момент написания этих строк доминирующей была операционная система Google Android, а на втором месте находилась Apple iOS, но в следующие несколько лет ситуация может измениться. В мире смартфонов ясно только одно: долгое время оставаться на вершине какой-либо из операционных систем будет очень нелегко.