Добавлен: 29.10.2018
Просмотров: 47974
Скачиваний: 190
1.2. История операционных систем
41
зованные системы существенно отличаются друг от друга. Например, распределен-
ные системы часто позволяют приложениям работать одновременно на нескольких
процессорах, для чего требуются более сложные алгоритмы распределения работы
процессоров, чтобы оптимизировать степень параллельной обработки данных. На-
личие задержек при передаче данных по сети часто подразумевает, что эти (и другие)
алгоритмы должны работать в условиях неполной, устаревшей или даже неверной
информации. Такая ситуация в корне отличается от работы однопроцессорной системы,
где последняя обладает полной информацией о своем состоянии.
1.2.5. Пятое поколение (с 1990 года по наши дни):
мобильные компьютеры
С тех пор как в комиксах 1940-х годов детектив Дик Трейси стал переговариваться с по-
мощью радиостанции, вмонтированной в наручные часы, у людей появилось желание
иметь в своем распоряжении устройство связи, которое можно было бы брать с собой
в любое место. Первый настоящий мобильный телефон появился в 1946 году, и тогда
он весил около 40 кг. Его можно было брать с собой только при наличии автомобиля,
в котором его можно было перевозить.
Первый по-настоящему переносной телефон появился в 1970-х годах и при весе при-
близительно 1 кг был воспринят весьма позитивно. Его ласково называли «кирпич».
Желание иметь такое устройство вскоре стало всеобщим. В настоящее время сотовой
связью пользуется почти 90 % населения земного шара. Скоро станет можно звонить
не только с мобильных телефонов и наручных часов, но и с очков и других носимых
предметов. Кроме того, та часть устройства, которая имеет отношение непосредственно
к телефону, уже не представляет какого-либо интереса. Особо не задумываясь над этим,
мы получаем электронную почту, просматриваем веб-страницы, отправляем текстовые
сообщения друзьям, играем в игры и узнаем о наличии пробок на улицах.
Хотя идея объединения в одном устройстве и телефона и компьютера вынашивалась
еще с 1970-х годов, первый настоящий смартфон появился только в середине 1990-х го-
дов, когда Nokia выпустила свой N9000, представлявший собой комбинацию из двух
отдельных устройств: телефона и КПК. В 1997 году в компании Ericsson для ее изделия
GS88 «Penelope» был придуман термин «смартфон».
Теперь, когда смартфоны получили повсеместное распространение, между различны-
ми операционными системами воцарилась жесткая конкуренция, исход которой еще
менее ясен, чем в мире персональных компьютеров. На момент написания этих строк
доминирующей была операционная система Google Android, а на втором месте нахо-
дилась Apple iOS, но в следующие несколько лет ситуация может измениться. В мире
смартфонов ясно только одно: долгое время оставаться на вершине какой-либо из
операционных систем будет очень нелегко.
В первое десятилетие после своего появления большинство смартфонов работало под
управлением Symbian OS. Эту операционную систему выбрали такие популярные
бренды, как Samsung, Sony Ericsson, Motorola и Nokia. Но долю рынка Symbian начали
отбирать другие операционные системы, например RIM Blackberry OS (выпущенная
для смартфонов в 2002 году) и Apple iOS (выпущенная для первого iPhone в 2007 году).
Многие ожидали, что RIM будет доминировать на рынке бизнес-устройств, а iOS за-
воюет рынок потребительских устройств. Для рынка популярность Symbian упала.
В 2011 году Nokia отказалась от Symbian и объявила о своем намерении в качестве
42
Глава 1. Введение
основной платформы сосредоточиться на Windows Phone. Некоторое время опера-
ционные системы от Apple и RIM всех устраивали (хотя и не приобрели таких же
доминирующих позиций, какие были в свое время у Symbian), но вскоре всех своих
соперников обогнала основанная на ядре Linux операционная система Android, вы-
пущенная компанией Google в 2008 году.
Для производителей телефонов Android обладала тем преимуществом, что имела от-
крытый исходный код и была доступна по разрешительной лицензии. В результате
компании получили возможность без особого труда подстраивать ее под свое соб-
ственное оборудование. Кроме того, у этой операционной системы имеется огромное
сообщество разработчиков, создающих приложения в основном на общеизвестном
языке программирования Java. Но при всем этом последние годы показали, что такое
доминирование может и не продлиться долго и конкуренты Android постараются от-
воевать часть ее доли на рынке. Более подробно операционная система Android будет
рассмотрена в разделе 10.8.
1.3. Обзор аппаратного обеспечения компьютера
Операционная система тесно связана с аппаратным обеспечением компьютера, на кото-
ром она работает. Она расширяет набор команд компьютера и управляет его ресурсами.
Чтобы операционная система заработала, нужны глубокие познания в компьютерном
оборудовании, по крайней мере нужно представлять, в каком виде оно предстает
перед программистом. Поэтому давайте кратко рассмотрим аппаратное обеспечение,
входящее в состав современного персонального компьютера. После этого мы сможем
приступить к подробному изучению того, чем занимаются операционные системы
и как они работают.
Концептуально простой персональный компьютер можно представить в виде модели,
аналогичной изображенной на рис. 1.6. Центральный процессор, память и устройства
ввода-вывода соединены системной шиной, по которой они обмениваются информа-
цией друг с другом. Современные персональные компьютеры имеют более сложную
структуру и используют несколько шин, которые мы рассмотрим чуть позже. Для
Рис. 1.6. Некоторые компоненты простого персонального компьютера
1.3. Обзор аппаратного обеспечения компьютера
43
начала нас вполне устроит и эта модель. В следующих разделах будет дан краткий обзор
отдельных компонентов и рассмотрены некоторые аспекты аппаратного обеспечения,
представляющие интерес для разработчиков операционных систем. Наверное, излишне
упоминать о том, что это будет очень краткое изложение. Компьютерному оборудо-
ванию и его организации посвящено множество книг. Можно порекомендовать две
довольно известные книги (Tanenbaum, 2012; Patterson and Hennessy, 2013).
1.3.1. Процессоры
Центральный процессор — это «мозг» компьютера. Он выбирает команды из памяти
и выполняет их. Обычный цикл работы центрального процессора выглядит так: выбор-
ка из памяти первой команды, ее декодирование для определения ее типа и операндов,
выполнение этой команды, а затем выборка, декодирование и выполнение последую-
щих команд. Этот цикл повторяется до тех пор, пока не закончится программа. Таким
образом программы выполняются.
Для каждого типа центрального процессора существует определенный набор команд,
которые он может выполнять. Поэтому x86 не может выполнять программы, написан-
ные для ARM-процессоров, а те, в свою очередь, не в состоянии выполнять программы,
написанные для x86. Поскольку доступ к памяти для получения команды или данных
занимает намного больше времени, чем выполнение команды, у всех центральных про-
цессоров есть несколько собственных регистров для хранения основных переменных
и промежуточных результатов. Соответственно набор команд содержит, как правило,
команды на загрузку слова из памяти в регистр и на запоминание слова из регистра
в память. Другие команды объединяют два операнда из регистров, памяти или обоих
этих мест для получения результата — например, складывают два слова и сохраняют
результат в регистре или в памяти.
В дополнение к регистрам общего назначения, которые обычно применяются для
хранения переменных и промежуточных результатов, у многих процессоров есть ряд
специальных регистров, доступных программисту. Один из этих регистров, называ-
емый счетчиком команд, содержит адрес ячейки памяти со следующей выбираемой
командой. После выборки этой команды счетчик команд обновляется, переставляя
указатель на следующую команду.
Другой специальный регистр, называемый указателем стека, ссылается на вершину те-
кущего стека в памяти. Стек содержит по одному фрейму (области данных) для каждой
процедуры, в которую уже вошла, но из которой еще не вышла программа. В стековом
фрейме процедуры хранятся ее входные параметры, а также локальные и временные
переменные, не содержащиеся в регистрах.
Еще один регистр содержит слово состояния программы — PSW (Program Status
Word). В этом регистре содержатся биты кода условия, устанавливаемые инструкциями
сравнения, а также биты управления приоритетом центрального процессора, режимом
(пользовательским или ядра) и другие служебные биты. Обычно пользовательские
программы могут считывать весь регистр PSW целиком, но записывать — только
в некоторые из его полей. Регистр PSW играет важную роль в системных вызовах
и операциях ввода-вывода.
Операционная система должна все знать о состоянии всех регистров. При временном
мультиплексировании центрального процессора операционная система может часто
44
Глава 1. Введение
останавливать работающую программу, чтобы запустить или возобновить работу дру-
гой программы. При каждой остановке работающей программы операционная система
должна сохранять состояние всех регистров, чтобы восстановить его при последующем
возобновлении работы этой программы.
Для повышения производительности процессоров их разработчики давно отказались
от простой модели извлечения, декодирования и выполнения одной команды за один
цикл. Многие современные процессоры способны одновременно выполнять более
одной команды. Например, у процессора могут быть отдельные блоки для выборки,
декодирования и выполнения команд, тогда во время выполнения команды n он смо-
жет декодировать команду n + 1 и осуществлять выборку команды n + 2. Подобная
организация работы называется конвейером. На рис. 1.7, а показан конвейер с тремя
стадиями обработки. Обычно используются более длинные конвейеры. В большинстве
конструкций конвейеров, как только команда выбрана и помещена в конвейер, она
должна быть выполнена, даже если предыдущая выбранная команда была условным
ветвлением. Для разработчиков компиляторов и операционных систем конвейеры —
это сплошная головная боль, обнажающая перед ними все сложности исходной маши-
ны и заставляющая справляться с возникающими проблемами.
Рис. 1.7. Процессор: а — с конвейером с тремя стадиями; б — суперскалярный
Более совершенной конструкцией по сравнению с конвейерной обладает суперскаляр-
ный
процессор, показанный на рис. 1.7, б. Он имеет несколько исполнительных блоков,
например: один — для целочисленной арифметики, другой — для арифметики чисел
с плавающей точкой, третий — для логических операций. Одновременно выбираются
две и более команды, которые декодируются и помещаются в буфер хранения, в ко-
тором ожидают возможности своего выполнения. Как только исполнительный блок
становится доступен, он обращается к буферу хранения за командой, которую может
1.3. Обзор аппаратного обеспечения компьютера
45
выполнить, и если такая команда имеется, извлекает ее из буфера, а затем выполняет.
В результате команды программы часто выполняются не в порядке их следования. При
этом обеспечение совпадения конечного результата с тем, который получился бы при
последовательном выполнении команд, возлагается в основном на аппаратуру. Однако,
как мы увидим в дальнейшем, при этом подходе неприятные усложнения коснулись
и операционной системы.
Как уже упоминалось, большинство центральных процессоров, за исключением самых
простых, используемых во встраиваемых системах, имеют два режима работы: режим
ядра и пользовательский режим (режим пользователя). Обычно режимом управляет
специальный бит в слове состояния программы — PSW. При работе в режиме ядра
процессор может выполнять любые команды из своего набора и использовать лю-
бые возможности аппаратуры. На настольных и серверных машинах операционная
система обычно работает в режиме ядра, что дает ей доступ ко всему оборудованию.
На большинстве встроенных систем в режиме ядра работает только небольшая часть
операционной системы, а вся остальная ее часть — в режиме пользователя.
Пользовательские программы всегда работают в режиме пользователя, который допу-
скает выполнение только подмножества команд и дает доступ к определенному подмно-
жеству возможностей аппаратуры. Как правило, в пользовательском режиме запрещены
все команды, касающиеся операций ввода-вывода и защиты памяти. Также, разумеется,
запрещена установка режима ядра за счет изменения значения бита режима PSW.
Для получения услуг от операционной системы пользовательская программа должна
осуществить системный вызов, который перехватывается внутри ядра и вызывает
операционную систему. Инструкция перехвата TRAP осуществляет переключение из
пользовательского режима в режим ядра и запускает операционную систему. Когда
обработка вызова будет завершена, управление возвращается пользовательской про-
грамме и выполняется команда, которая следует за системным вызовом. Подробности
механизма системного вызова будут рассмотрены в этой главе чуть позже, а сейчас
его следует считать специальной разновидностью инструкции вызова процедуры,
у которой есть дополнительное свойство переключения из пользовательского режима
в режим ядра. В дальнейшем для выделения в тексте системных вызовов будет ис-
пользоваться такой же шрифт, как в этом слове: read.
Конечно, компьютеры имеют и другие системные прерывания, не предназначенные
для перехвата инструкции выполнения системного вызова. Но большинство других
системных прерываний вызываются аппаратно для предупреждения о возникновении
исключительных ситуаций, например попыток деления на нуль или исчезновении
порядка при операции с плавающей точкой. Во всех случаях управление переходит
к операционной системе, которая и должна решать, что делать дальше. Иногда работа
программы должна быть прервана сообщением об ошибке. В других случаях ошибка
может быть проигнорирована (например, при исчезновении порядка числа оно может
быть принято равным нулю). Наконец, когда программа заранее объявила, что с некото-
рыми из возможных ситуаций она собирается справляться самостоятельно, управление
должно быть возвращено программе, чтобы она сама разрешила возникшую проблему.
1.3.2. Многопоточные и многоядерные микропроцессоры
Закон Мура гласит, что количество транзисторов на одном кристалле удваивается
каждые 18 месяцев. Этот «закон», в отличие от закона сохранения импульса, не имеет