Это с нетерпением ожидаемое, переработанное и исправленное издание всемирного бестселлера включает в себя сведения о последних достижениях в области технологий операционных систем. Книга построена на примерах и содержит информацию, необходимую для понимания функционирования современных операционных систем. Благодаря практическому опыту, приобретенному при разработке нескольких операционных систем, и высокому уровню знания предмета Эндрю Таненбаум смог ясно и увлеченно рассказать о сложных вещах. В книге приводится множество важных подробностей, которых нет ни в одном другом издании.
Содержание
Об авторе
Предисловие
Глава 1. Введение
Что такое операционная система?
Операционная система как расширенная машина
Операционная система как менеджер ресурсов
История операционных систем
Первое поколение (1945-55): электронные лампы и коммутационные панели
Второе поколение (1955-65): транзисторы и системы пакетной обработки
Третье поколение (1965-1980): интегральные схемы и многозадачность
Четвертое поколение (с 1980 года по наши дни): персональные компьютеры
Онтогенез повторяет филогенез
Зоопарк операционных систем
Операционные системы мэйнфреймов
Серверные операционные системы
Многопроцессорные операционные системы
Операционные системы для персональных компьютеров
Операционные системы реального времени
Встроенные операционные системы
Операционные системы для смарт-карт
Обзор аппаратного обеспечения компьютера
Процессоры
Память
Устройства ввода-вывода
Шины
Понятия операционной системы
Процессы
Взаимоблокировка
Управление памятью
Ввод-вывод данных
Файлы
Безопасность
Оболочка
Повторное использование идей
Системные вызовы
Системные вызовы для управления процессами
Системные вызовы для управления файлами
Системные вызовы для управления каталогами
Разные системные вызовы
Windows Win32 API
Структура операционной системы
Монолитные системы
Многоуровневые системы
Виртуальные машины
Экзоядро
Модель клиент-сервер
Исследования в области операционных систем
Краткий обзор следующих глав
Единицы измерения
Резюме Вопросы
Глава 2. Процессы и потоки
Процессы
Модель процесса
Создание процесса
Завершение процесса
Иерархия процессов
Состояния процессов
Реализация процессов
Потоки
Модель потока
Использование потоков
Реализация потоков в пространстве пользователя
Реализация потоков в ядре
Смешанная реализация
Активация планировщика
Всплывающие потоки
Как сделать однопоточную программу многопоточной
Межпроцессное взаимодействие
Состояние состязания
Критические области
Взаимное исключение с активным ожиданием
Примитивы межпроцессного взаимодействия
Семафоры
Мьютексы
Мониторы
Передача сообщений
Барьеры
Классические проблемы межпроцессного взаимодействия
Проблема обедающих философов
Проблема читателей и писателей
Проблема спящего брадобрея
Планирование
Введение в планирование
Планирование в системах пакетной обработки данных
Планирование в интерактивных системах
Планирование в системах реального времени
Политика и механизм
Планирование потоков
Изучение процессов и потоков
Резюме
Вопросы
Глава 3. Взаимоблокировка
Ресурсы
Выгружаемые и невыгружаемые ресурсы
Получение ресурса
Введение
Условия взаимоблокировки
Моделирование взаимоблокировок
Страусовый алгоритм
Обнаружение и устранение взаимоблокировок
Обнаружение взаимоблокировки при наличии одного ресурса каждого типа
Обнаружение взаимоблокировок при наличии нескольких ресурсов каждого типа
Выход из взаимоблокировки
Избежание взаимоблокировок
Траектории ресурсов 200
Безопасные и небезопасные состояния
Алгоритм банкира для одного вида ресурсов
Алгоритм банкира для нескольких видов ресурсов
Предотвращение взаимоблокировок
Атака условия взаимного исключения
Атака условия удержания и ожидания
Атака условия отсутствия принудительной выгрузки ресурса
Атака условия циклического ожидания
Сопутствующие вопросы
Двухфазовое блокирование
Тупики без ресурсов
Голодание
Исследования в области взаимоблокировок
Резюме
Вопросы
Глава 4. Управление памятью
Основное управление памятью
Однозадачная система без подкачки на диск
Многозадачность с фиксированными разделами
Моделирование многозадачности
Анализ производительности многозадачных систем
Настройка адресов и защита
Подкачка
Управление памятью с помощью битовых массивов
Управление памятью с помощью связных списков
Виртуальная память
Страничная организация памяти
Таблицы страниц
Буферы быстрого преобразования адреса (TLB)
Инвертированные таблицы страниц
Алгоритмы замещения страниц
Оптимальный алгоритм
Алгоритм NRU - не использовавшаяся в последнее время страница
Алгоритм FIFO - первым прибыл - первым обслужен
Алгоритм "вторая попытка"
Алгоритм "часы"
Алгоритм LRU - страница, не использовавшаяся дольше всего
Программное моделирование алгоритма LRU
Алгоритм "рабочий набор"
Алгоритм WSClock
Алгоритмы замещения страниц, резюме
Моделирование алгоритмов замещения страниц
Аномалия Билэди
Магазинные алгоритмы
Строка расстояний
Прогнозирование частоты страничных прерываний
Вопросы разработки систем со страничной организацией памяти
Политика распределения памяти: локальная и глобальная
Регулирование загрузки
Размер страницы
Отдельные пространства команд и данных
Совместно используемые страницы
Политика очистки страниц
Интерфейс виртуальной памяти
Вопросы реализации
Участие операционной системы в процессе подкачки страниц
Обработка страничного прерывания
Перезапуск прерванной команды процессора
Блокирование страниц в памяти
Хранение страничной памяти на диске
Разделение политики и механизма
Сегментация
Реализация сегментации
Сегментация с использованием страниц: система MULTICS
Сегментация с использованием страниц: Intel Pentium
Исследования в области управления памятью
Резюме
Вопросы
Глава 5. Ввод-вывод
Принципы аппаратуры ввода-вывода
Устройства ввода-вывода
Контроллеры устройств
Отображаемый на адресное пространство памяти ввод-вывод
Прямой доступ к памяти (DMA)
Еще раз о прерываниях
Принципы программного обеспечения ввода-вывода
Задачи программного обеспечения ввода-вывода
Программный ввод-вывод
Управляемый прерываниями ввод-вывод
Ввод-вывод с использованием DMA
Программные уровни ввода-вывода
Обработчики прерываний
Драйверы устройств
Независимое от устройств программное обеспечение ввода-вывода
Программное обеспечение ввода-вывода пространства пользователя
Диски
Аппаратная часть дисков
Форматирование дисков
Алгоритмы планирования перемещения головок
Обработка ошибок
Стабильное запоминающее устройство
Таймеры
Аппаратная часть таймеров
Программное обеспечение таймеров
Алфавитно-цифровые терминалы
Технические средства терминалов с интерфейсом RS-232
Программное обеспечение ввода
Программное обеспечение вывода
Графические интерфейсы пользователя
Аппаратное обеспечение клавиатуры, мыши и дисплея персонального компьютера
Программное обеспечение ввода
Программное обеспечение вывода для Windows
Сетевые терминалы
Система X Window
Сетевой терминал SLIM
Управление режимом энергопотребления
Аппаратный аспект
Аспект операционной системы
Частичное функционирование
Исследования ввода-вывода
Резюме
Вопросы
Глава 6. Файловые системы
Файлы
Именование файлов
Структура файла
Типы файлов
Доступ к файлам
Атрибуты файла
Операции с файлами
Пример программы, использующей файловые системные вызовы
Файлы, отображаемые на адресное пространство памяти
Каталоги
Одноуровневые каталоговые системы
Двухуровневая система каталогов
Иерархические каталоговые системы
Имя пути
Операции с каталогами
Реализация файловой системы
Структура файловой системы
Реализация файлов
Реализация каталогов
Совместно используемые файлы
Организация дискового пространства
Надежность файловой системы
Производительность файловой системы
Файловые системы с журнальной структурой LFS
Примеры файловых систем
Файловые системы CD-ROM
Файловая система CP/M
Файловая система MS-DOS
Файловая система Windows 98
Файловая система UNIX V7
Исследования в области файловых систем
Резюме
Вопросы
Глава 7. Мультимедийные операционные системы
Введение в мультимедиа
Мультимедийные файлы
Кодирование звука
Кодирование изображения
Сжатие видеоинформации
Стандарт JPEG
Стандарт MPEG
Планирование процессов в мультимедийных системах
Планирование однородных процессов
Общее планирование реального времени
Алгоритм планирования RMS
Алгоритм планирования EDF
Парадигмы мультимедийной файловой системы
Функции управления видеомагнитофоном
"Почти видео по заказу"
"Почти видео по заказу" с функциями видеомагнитофона
Размещение файла
Размещение файла на одном диске
Две альтернативные стратегии организации файлов
Размещение файлов для "почти видео по заказу"
Размещение нескольких файлов на одном диске
Размещение файлов на нескольких дисках
Кэширование
Блочное кэширование
Файловое кэширование
Дисковое планирование в мультимедиа
Статическое дисковое планирование
Динамическое дисковое планирование
Исследования в области мультимедиа
Резюме
Вопросы
Глава 8. Многопроцессорные системы
Мультипроцессоры
Мультипроцессорное аппаратное обеспечение
Типы мультипроцессорных операционных систем
Синхронизация в мультипроцессорах
Планирование мультипроцессора
Многомашинные системы
Аппаратное обеспечение многомашинных систем
Коммуникационное программное обеспечение низкого уровня
Коммуникационное программное обеспечение уровня пользователя
Вызов удаленной процедуры
Распределенная память совместного доступа
Планирование многомашинных систем
Балансировка нагрузки
Распределенные системы
Сетевое аппаратное обеспечение
Сетевые службы и протоколы
Промежуточное программное обеспечение, основанное на документе
Промежуточное программное обеспечение, основанное на файловой системе
Промежуточное программное обеспечение, основанное на совместно используемых объектах
Промежуточное программное обеспечение, основанное на координации
Исследования в области многопроцессорных систем
Резюме
Вопросы
Глава 9. Безопасность
Понятие безопасности
Угрозы
Злоумышленники
Случайная потеря данных
Основы криптографии
Шифрование с секретным ключом
Шифрование с открытым ключом
Необратимые функции
Цифровые подписи
Аутентификация пользователей
Аутентификация с использованием паролей
Аутентификация с использованием физического объекта
Аутентификация с использованием биометрических данных
Контрмеры
Атаки изнутри системы
Троянские кони
Фальшивая программа регистрации
Логические бомбы
Потайные двери
Переполнение буфера
Атака системы безопасности
Печально знаменитые дефекты системы безопасности
Атаки системы снаружи
Сценарии нанесения ущерба вирусами
Как работает вирус
Как распространяются вирусы
Антивирусные программы и анти-антивирусная технология
Интернет-черви
Мобильные программы
Безопасность в системе Java
Механизмы защиты
Домены защиты
Списки управления доступом
Перечни возможностей
Надежные системы
Высоконадежная вычислительная база
Формальные модели защищенных систем
Многоуровневая защита
Оранжевая книга безопасности
Тайные каналы
Исследования в области безопасности
Резюме
Вопросы
Глава 10. Рассмотрение конкретных случаев: UNIX и Linux
История UNIX
UNICS
PDP-11 UNIX
Переносимая система UNIX
Berkeley UNIX
Стандартная система UNIX
MINIX
Linux
Обзор системы UNIX
Задачи UNIX
Интерфейсы системы UNIX
Оболочка UNIX
Утилиты UNIX
Структура ядра
Процессы в системе UNIX
Основные понятия
Системные вызовы управления процессами в UNIX
Реализация процессов в UNIX
Загрузка UNIX
Управление памятью в UNIX
Основные понятия
Системные вызовы управления памятью в UNIX
Реализация управления памятью в UNIX
Ввод-вывод в системе UNIX
Основные понятия
Системные вызовы ввода-вывода системы UNIX
Реализация ввода-вывода в системе UNIX
Потоки данных
Файловая система UNIX
Основные понятия
Вызовы файловой системы в UNIX
Реализация файловой системы UNIX
Файловая система NFS
Безопасность в UNIX
Основные понятия
Системные вызовы безопасности в UNIX
Реализация безопасности в UNIX
Резюме
Вопросы
Глава 11. Рассмотрение конкретных случаев: Windows 2000
История Windows 2000
MS-DOS
Windows 95/98/Me
Windows NT
Windows 2000
Программирование в Windows 2000
Программный интерфейс Win32 API
Реестр
Структура системы
Структура операционной системы
Реализация объектов
Подсистемы окружения
Процессы и потоки в Windows 2000
Основные понятия
Вызовы API для управления заданиями, процессами, потоками и волокнами
Реализация процессов и потоков
Эмуляция MS-DOS
Загрузка Windows 2000
Управление памятью
Основные понятия
Системные вызовы управления памятью
Реализация управления памятью
Ввод-вывод в Windows 2000
Основные понятия
Вызовы ввода-вывода API
Реализация ввода-вывода
Драйверы устройств
Файловая система Windows 2000
Основные понятия
Вызовы API файловой системы в Windows 2000
Реализация файловой системы Windows 2000
Безопасность в Windows 2000
Основные понятия
Вызовы API защиты
Реализация защиты
Кэширование в Windows 2000
Резюме
Вопросы
Глава 12. Разработка операционных систем
Природа проблемы проектирования
Цели
Почему так сложно спроектировать операционную систему?
Разработка интерфейса
Руководящие принципы
Парадигмы
Интерфейс системных вызовов
Реализация
Структура системы
Механизм и политика
Ортогональность
Именование
Время связывания
Статические и динамические структуры
Реализация системы сверху вниз и снизу вверх
Полезные методы
Производительность
Почему операционные системы такие медленные?
Что следует оптимизировать?
Выбор между оптимизацией по скорости и по занимаемой памяти
Кэширование
Подсказки
Использование локальности
Оптимизируйте общий случай
Управление проектом
Мифический человеко-месяц
Структура команды
Роль опыта
Панацеи нет
Тенденции в проектировании операционных систем
Операционные системы с большим адресным пространством
Сеть
Параллельные и распределенные системы
Мультимедиа
Компьютеры на батарейках
Встроенные системы
Резюме
Вопросы
Библиография
Литература, рекомендуемая для дальнейшего чтения
Введение и общие труды
Процессы и потоки
Взаимоблокировка
Управление памятью
Ввод-вывод
Файловые системы
Мультимедийные операционные системы
Многопроцессорные системы
Безопасность
UNIX и Linux
Windows 2000
Принципы проектирования
Алфавитный список литературы
Алфавитный указатель
ОТРЫВОК
Глава 1
Введение
Современная компьютерная система состоит из одного или нескольких процессоров, оперативной памяти, дисков, клавиатуры, монитора, принтеров, сетевого интерфейса и других устройств, то есть является сложной комплексной системой. Написание программ, которые следят за всеми компонентами, корректно используют их и при этом работают оптимально, представляет собой крайне трудную задачу. По этой причине компьютеры оснащаются специальным уровнем программного обеспечения, называемым операционной системой. Операционная система отвечает за управление всеми
перечисленными устройствами и обеспечивает пользователя имеющими простой, доступный интерфейс программами для работы с аппаратурой. Эти системы составляют предмет данной книги.
Расположение операционной системы в общей структуре компьютера показано на рис. 1.1. Внизу находится аппаратное обеспечение, которое во многих случаях само состоит из двух или более уровней (или слоев). Самый нижний уровень содержит физические устройства, состоящие из интегральных микросхем, проводников, источников питания, электронно-лучевых трубок и т. п. То, как они устроены и как работают, относится к сфере деятельности инженеров, специалистов по электронике.
Выше расположен микроархитектурный уровень, на котором физические устройства рассматриваются с точки зрения функциональных единиц. Обычно на этом уровне находятся внутренние регистры центрального процессора (CPU - Central Processing Unit) и арифметико-логическое устройство. На каждом такте процессора из регистра выбирается один или два операнда, которые обрабатываются в арифметико-логическом устройстве (например, действием операции сложения или логического И). Результат сохраняется в одном или нескольких регистрах. В некоторых машинах операции над данными кон
тролируются программными приложениями, которые называются микропрограммами. В других компьютерах такой контроль выполняется напрямую аппаратными цепями.
Определенная система команд передается по маршруту передачи данных. Некоторые команды могут быть выполнены за один цикл передачи данных, другие требуют нескольких циклов. Такие команды могут использовать регистры или другие возможности аппаратуры. Команды, видимые для работающего на ассемблере программиста, формируют уровень ISA (Instruction Set Architecture - архитектура системы команд), часто называемый машинным языком.
Обычно машинный язык содержит от 50 до 300 команд, служащих преимущественно для перемещения данных по компьютеру, выполнения арифметических операций и сравнения величин. Управление устройствами на этом уровне осуществляется с помощью загрузки определенных величин в специальные регистры устройств. Например, диску можно дать команду чтения, записав в его регистры адрес места на диске, адрес в основной памяти, число байтов для чтения и направление действия (чтение или запись). На практике нужно передавать большее количество параметров, а статус операции, в
озвращаемый диском, достаточно сложен. Кроме того, при программировании многих устройств ввода-вывода (I/O - Input/Output) очень важную роль играют временные соотношения.
Операционная система предназначена для того, чтобы скрыть от пользователя все эти сложности. Она состоит из уровня программного обеспечения, который частично избавляет от необходимости общения с аппаратурой напрямую, вместо этого предоставляя программисту более удобную систему команд. Действие чтения блока из файла в этом случае представляется намного более простым, чем когда нужно заботиться о перемещении головок диска, ждать, пока они установятся на нужное место и т. д.
Над операционной системой на нашем рисунке расположены остальные системные программы. Здесь находятся интерпретатор команд (оболочка), системы окон, компиляторы, редакторы и т. д. Важно понимать, что подобные программы не являются частью операционной системы, хотя обычно поставщики компьютеров устанавливают их на машины. Это очень важное замечание. Под операционной системой обычно понимается то программное обеспечение, которое запускается в режиме ядра или, как его еще называют, режиме супервизора. Она защищена от вмешательства пользователя с помощь
ю аппаратных средств (мы не рассматриваем в данный момент некоторые старые микропроцессоры, которые вообще не имеют аппаратной защиты). Компиляторы и редакторы запускаются в пользовательском режиме. Если пользователю не нравится какой-либо компилятор, он при желании может написать свой собственный, но он не может написать собственный обработчик прерываний системных часов, являющийся частью операционной системы и обычно защищенный аппаратно от попыток его модифицировать.
Существуют системы, в которых это различие размыто. К ним относятся встроенные системы, они могут не иметь режима ядра, или интерпретируемые системы, подобные основанным на Java операционным системам, в которых для разделения компонентов используется интерпретация, а не оборудование. Но в традиционных компьютерах операционная система представляет собой набор программ, запускающихся в режиме ядра.
Во многих системах есть программы, которые работают в пользовательском режиме, но помогают операционной системе или выполняют специализированные функции. Например, часто встречаются программы, позволяющие пользователям изменять свои пароли. Они не являются частью операционной системы и запускаются не в режиме ядра, но выполняемые ими функции влияют на работу системы, и такие программы должны быть определенным способом защищены от воздействия пользователя.
В некоторых системах части того, что обычно считалось операционной системой (например, файловая система), работают в пространстве пользователя. В таких системах сложно провести четкую границу. Понятно, что все программы, запускающиеся в режиме ядра, является частью операционной системы, но некоторые программы, работающие вне этого режима, могут также относится к операционной системе, или, по крайней мере, тесно с ней связаны.
Наконец, над системными программами расположены прикладные программы. Обычно они покупаются или пишутся пользователем для решения собственных проблем - обработки текста, электронных таблиц, технических расчетов или сохранения информации в базе данных.
Что такое операционная система?
Большинство пользователей компьютеров имеют некоторый опыт общения с операционной системой, но обычно они испытывают затруднения при попытке дать определение операционной системы. В известной степени проблема связана с тем, что операционные системы выполняют две основные, но практически не связанные между собой функции: расширение возможностей машины и управление ее ресурсами. И в зависимости от того, какому пользователю вы зададите вопрос, вы услышите в ответ больше или об одной функции, или о другой. Давайте рассмотрим обе функции.
Операционная система как расширенная машина
Как было упомянуто ранее, архитектура (система команд, организация памяти, ввод-вывод данных и структура шин) большинства компьютеров на уровне машинного языка примитивна и неудобна для работы с программами, особенно в процессе ввода-вывода данных. Чтобы это утверждение не показалось голословным, кратко рассмотрим пример того, как происходит ввод-вывод данных с гибкого диска через совместимые микросхемы контроллера NEC PD765, используемые на большинстве персональных компьютеров с процессором Intel. (В этой книге мы будем использовать и термин "гибкий диск",
и термин "дискета".) Контроллер PD765 имеет 16 команд, каждая задается передачей от 1 до 9 байт в регистр устройства. Это команды для чтения и записи данных, перемещения головки диска и форматирования дорожек, а также для инициализации, распознавания, установки в исходное положение и калибровки контроллера и приводов.
Основными командами являются команды read и write (чтение и запись). Каждая из них требует 13 параметров, упакованных в 9 байт. Эти параметры определяют такие элементы, как адрес блока на диске, который нужно прочитать, количество секторов на дорожке, физический режим записи, расстановку промежутков между секторами. Они же сообщают, что делать с меткой адреса данных, которые были удалены. Если вы не можете сразу это осмыслить, не волнуйтесь - полностью это понятно лишь посвященным. Когда выполнение операции завершается, чип контроллера возвращает упакованные в
7 байт 23 параметра, отражающие наличие и типы ошибок. Но этого не достаточно, и программист при работе с гибким диском должен также постоянно знать, включен двигатель или нет. Если двигатель выключен, его следует включить (с длительным ожиданием запуска) прежде, чем данные будут прочитаны или записаны. Двигатель не может оставаться включенным слишком долго, так как гибкий диск изнашивается. Программист вынужден выбирать между длинными задержками во время загрузки и изнашивающимися гибкими дисками (с вероятностью потери данных на них).
Даже если не вдаваться глубже в подробности этого процесса, становится ясно, что обыкновенный программист вряд ли захочет столкнуться с такими деталями при работе с гибким диском (или жестким диском, работа с ним не менее сложна). Вместо этого программисту нужны простые высокоуровневые абстракции. В случае работы с дисками типичной абстракцией является коллекция именованных файлов, содержащихся на диске. Каждый файл может быть открыт для чтения или записи, прочитан или записан, а потом закрыт. А такие детали, как текущее состояние двигателя или использ
ование при записи модифицированной частотной модуляции, не должны содержаться в абстракции, предстающей перед пользователем.
Программа, скрывающая истину об аппаратном обеспечении и представляющая простой список поименованных файлов, которые можно читать и записывать, и является операционной системой. Операционная система не только устраняет необходимость работы непосредственно с дисками и предоставляет простой, ориентированный на работу с файлами интерфейс, но и скрывает множество неприятной работы с прерываниями, счетчиками времени, организацией памяти и другими элементами низкого уровня. В каждом случае абстракция, предлагаемая операционной системой, намного проще
и удобнее в обращении, чем то, что может предложить нам непосредственно основное оборудование.
С точки зрения пользователя операционная система выполняет функцию расширенной машины или виртуальной машины, в которой проще программировать и легче работать, чем непосредственно с аппаратным обеспечением, составляющим реальный компьютер. То, каким образом операционная система достигает своей цели - долгая история, но мы подробно рассмотрим этот процесс в нашей книге. Подведем итог вышесказанному: операционная система предоставляет нам ряд возможностей, которые могут использовать программы с помощью специальных команд, называемых системными выз
овами. Мы приведем примеры наиболее общих системных вызовов далее в этой главе.
Операционная система как менеджер ресурсов
Концепция, рассматривающая операционную систему прежде всего как удобный интерфейс пользователя, - это взгляд сверху вниз. Альтернативный взгляд, снизу вверх, дает представление об операционной системе как о механизме, присутствующем в устройстве компьютера для управления всеми частями этой сложнейшей машины. Современные компьютеры состоят из процессоров, памяти, датчиков времени, дисков, мыши, сетевого интерфейса, принтеров и огромного количества других устройств. В соответствии со вторым подходом работа операционной системы заключается в обеспеч
ении организованного и контролируемого распределения процессоров, памяти и устройств ввода-вывода между различными программами, состязающимися за право их использовать.
Представьте, что случилось бы, если бы на одном компьютере оказались работающими три программы и все они одновременно попытались бы напечатать свои выходные данные на одном и том же принтере. Возможно, первые несколько строк на листе появились бы от первой программы, следующие несколько - из второй программы, затем бы следовало несколько строк от третьей программы и т. д. В результате получилась бы полная неразбериха. Операционная система наводит порядок в подобных ситуациях, буферизируя на диске все данные, предназначенные для печати. В процессе работы
программы операционная система сохраняет ее выходные данные на диске во временном файле. Затем, по окончании работы этой программы, система отправляет данные на принтер, в то время как другая программа может продолжать формировать свои выходные данные, не обращая внимания на то, что они пока еще фактически не посылаются на печатающее устройство.
Когда компьютером (или сетью) пользуются несколько пользователей, необходимость в управлении памятью, устройствами ввода-вывода, другими ресурсами и их защите сильно возрастает, поскольку пользователи могут обращаться к ним в абсолютно непредсказуемом порядке. К тому же часто приходится распределять между пользователями не только оборудование, но и информацию (файлы, базы данных и т. д.). С этой точки зрения основная задача операционной системы заключается в отслеживании того, кто и какой ресурс использует, в обработке запросов на ресурсы, в подсчете к
оэффициента загрузки и разрешении проблем конфликтующих запросов от различных программ и пользователей.
Управление ресурсами включает в себя их мультиплексирование (распределение) двумя способами: во времени и в пространстве. Когда ресурс распределяется во времени, различные пользователи и программы используют его по очереди. Сначала один из них получает доступ к использованию ресурса, потом другой и т. д. Например, несколько программ хотят обратиться к центральному процессору. В этой ситуации операционная система сначала разрешает доступ к процессору одной программе, затем, после того как она поработала достаточное время, другой программе, затем следу
ющей и, в конце концов, опять первой. Определение того, как долго ресурс будет использоваться во времени, кто будет следующим и на какое время ему предоставляется ресурс - это задача операционной системы. Еще один пример временного мультиплексирования - распределение заданий, посылаемых для печати на принтер. Когда задания выстраиваются в очередь для печати на одном принтере, операционной системе каждый раз нужно принимать решение о том, которое из них будет печататься следующим.
Другой вид распределения - это пространственное мультиплексирование. Вместо поочередной работы каждый клиент получает часть ресурса. Обычно оперативная память разделяется между несколькими работающими программами, так что все они одновременно могут постоянно находиться в памяти (например, используя центральный процессор по очереди). Если предположить, что памяти достаточно для того, чтобы хранить несколько программ, эффективнее разместить в памяти сразу несколько программ, чем выделить всю память одной программе, особенно если ей нужна лишь неболь
шая часть имеющейся памяти. Конечно, при этом возникают проблемы справедливого распределения, защиты памяти и т. д., и для разрешения подобных вопросов существует операционная система. Другой ресурс, распределяемый пространственно, - это диск (жесткий). Во многих системах один диск в одно и то же время может содержать файлы нескольких пользователей. Распределение дискового пространства и отслеживание того, кто какие блоки диска использует, является типичной задачей управления ресурсами, которую также выполняет операционная система.
История операционных систем
История развития операционных систем насчитывает уже много лет. В следующих разделах книги мы кратко рассмотрим некоторые основные моменты этого развития. Так как операционные системы появились и развивались в процессе конструирования компьютеров, то эти события исторически тесно связаны. Поэтому чтобы представить, как выглядели операционные системы, мы обсудим следующие друг за другом поколения компьютеров. Такая схема взаимосвязи поколений операционных систем и компьютеров довольно груба, но она обеспечивает некоторую структуру, без которой ни
чего не было бы понятно.
Первый настоящий цифровой компьютер был изобретен английским математиком Чарльзом Бэббиджем (Charles Babbage, 1792-1871). Хотя большую часть жизни Бэббидж посвятил попыткам создания своей "аналитической машины", он так и не смог заставить ее работать должным образом. Это была чисто механическая машина, а технологии того времени не были достаточно развиты для изготовления многих деталей и механизмов высокой точности. Не стоит и говорить, что его аналитическая машина не имела операционной системы.
Интересный исторический факт: Бэббидж понимал, что для аналитической машины ему необходимо программное обеспечение, поэтому он нанял молодую женщину по имени Ада Лавлейс (Ada Lovelace), дочь знаменитого британского поэта Лорда Байрона. Она и стала первым в мире программистом, а язык программирования Ada® назван в ее честь.
Первое поколение (1945-55): электронные лампы и коммутационные панели
После неудачных попыток Бэббиджа вплоть до Второй мировой войны в конструировании цифровых компьютеров не было практически никакого прогресса. Примерно в середине 1940-х Говард Айкен (Howard Aiken) в Гарварде, Джон фон Нейман (John von Neumann) в Институте углубленного изучения в Принстоне, Дж. Преспер Эккерт (J. Presper Eckert), Вильям Мочли (William Mauchley) в Пенсильванском университете, Конрад Цузе (Konrad Zuse) в Германии и многие другие продолжили работу в направлении создания вычислительных машин. На первых машинах использовались механические реле, но они были очень медлительны, дли
тельность такта составляла несколько секунд. Позже реле заменили электронными лампами. Машины получались громоздкими, заполняющими целые комнаты, с десятками тысяч электронных ламп, но все равно они были в миллионы раз медленнее, чем даже самый дешевый современный персональный компьютер.
В те времена каждую машину и разрабатывала, и строила, и программировала, и эксплуатировала, и поддерживала в рабочем состоянии одна команда. Все программирование выполнялось на абсолютном машинном языке, управления основными функциями машины осуществлялось просто при помощи соединения коммутационных панелей проводами. Тогда еще не были известны языки программирования (даже ассемблера не было). Об операционных системах никто и не слышал. Обычный режим работы программиста был таков: записаться на определенное время на специальном стенде, затем спуст
иться в машинную комнату, вставить свою коммутационную панель в компьютер и провести несколько следующих часов в надежде, что во время работы ни одна из двадцати тысяч электронных ламп не выйдет из строя. Фактически тогда на компьютерах занимались только прямыми числовыми вычислениями, например расчетами таблиц синусов, косинусов и логарифмов.
К началу 50-х, с выпуском перфокарт, установившееся положение несколько улучшилось. Стало возможно вместо использования коммутационных панелей записывать и считывать программы с карт, но во всем остальном процедура вычислений оставалась прежней.
Второе поколение (1955-65): транзисторы и системы пакетной обработки
В середине 50-х изобретение и применение транзисторов радикально изменило всю картину. Компьютеры стали достаточно надежными, появилась высокая вероятность того, что машина будет работать довольно долго, выполняя при этом полезные функции. Впервые сложилось четкое разделение между проектировщиками, сборщиками, операторами, программистами и обслуживающим персоналом.
Машины, теперь называемые мэйнфреймами, располагались в специальных комнатах с кондиционированным воздухом, где ими управлял целый штат профессиональных операторов. Только большие корпорации, правительственные учреждения или университеты могли позволить себе технику, цена которой исчислялась миллионами долларов. Чтобы выполнить задание (то есть программу или комплект программ), программист сначала должен был записать его на бумаге (на Фортране или ассемблере), а затем перенести на перфокарты. После этого - принести колоду перфокарт в комнату ввода
данных, передать одному из операторов и идти пить кофе в ожидании, когда будет готов результат.
Когда компьютер заканчивал выполнение какого-либо из текущих заданий, оператор подходил к принтеру, отрывал лист с полученными данными и относил его в комнату для распечаток, где программист позже мог его забрать. Затем оператор брал одну из колод перфокарт, принесенных из комнаты ввода данных, и считывал их. Если в процессе расчетов был необходим компилятор языка Фортран, то оператору приходилось брать его из картотечного шкафа и загружать в машину отдельно. Из-за одного только хождения операторов по машинному залу впустую терялась масса драгоценного
компьютерного времени.
Если учитывать высокую стоимость оборудования, не удивительно, что люди довольно скоро занялись поиском способа повышения эффективности использования машинного времени. Общепринятым решением стала система пакетной обработки. Первоначально замысел состоял в том, чтобы собрать полный поднос заданий (колод перфокарт) в комнате входных данных и затем переписать их на магнитную ленту, используя небольшой и (относительно) недорогой компьютер, например, IBM 1401, который был очень хорош для считывания карт, копирования лент и печати выходных данных, но не подх
одил для числовых вычислений.
Современные операционные системы. 2-е изд.. / Э. Таненбаум - СПб: Питер, 2002. - 1040 с.
|