
Лекция 15
6. Уровень операционной системы
В предыдущих разделах мы рассмотрели более низкие уровни архитектуры современных компьютеров - цифровой логический, микроархитектурный и уровень команд. Следующий по иерархии вверх - уровень операционной системы.
Операционная система (ОС) - это программа, которая с точки зрения архитектуры добавляет ряд команд и особенностей к тем, которые обеспечиваются нижними уровнями. Обычно операционная система реализуется в программном обеспечении, но теоретически возможна ее реализация и в аппаратуре (как микропрограммы).
Состав этого уровня также является условным. Так, если в 70-х годах компиляторы считались составной частью операционной системы, то теперь относятся к обеспечению более высоких уровней. По современной классификации набор команд уровня операционной системы завершает формирование полного набора команд, доступных прикладным программам. Команды уровня ОС часто называются системными вызовами. Они обычно вызывают определенную службу операционной системы. Например, обычный системный вызов считывает данные из файла. Команды уровня ОС всегда интерпретируются.
В данном курсе мы лишь кратко опишем уровень операционной системы, при этом сосредоточившись всего на трех важных особенностях. Первая из них - виртуальная память, которая используется многими операционными системами. Она позволяет создать впечатление, что у машины больше памяти, чем есть фактически. Вторая особенность - файлы ввода-вывода. Третья - параллельная обработка (как несколько процессов могут выполняться, обмениваться информацией и синхронизироваться). Под процессом можно понимать работающую программу и всю информацию о ее состоянии (о памяти, регистрах, счетчике команд, вводе-выводе и т. д.). После обсуждения этих основных понятий мы рассмотрим, как они реализуются в операционных системах двух машин из трех наших примеров: Pentium II (Windows NT) и UltraSPARC II (UNIX). Поскольку picoJava II обычно используется для встроенных систем, у этой машины нет операционной системы.
6.1. Виртуальная память
В первых компьютерах память была мала по объему и дорого стоила. IBM-650, ведущий компьютер конца 50-х годов, содержал 2000 слов памяти. Один из первых компиляторов (ALGOL) был написан для компьютера с размером памяти 1024 слова. На компьютере PDP-1 работала система с разделением времени, при этом общий размер памяти составлял 4096 18-битных слов.
В те времена программы разрабатывались с учетом недостатка памяти, зачастую в ущерб быстродействию. Одним из решений проблемы было использование вспомогательной памяти (например, диска). Программист делил программу на несколько частей (оверлеев), которые поочередно загружались в память для выполнения, и управлял этим процессом сам программист. В 1961 году исследователями из Манчестера был предложен метод автоматического выполнения процесса наложения, при котором программист мог вообще не знать о нем. Этот метод, который сейчас называется виртуальной памятью, освобождал программиста от большого количества нудной работы. К началу 70-х годов виртуальная память появилась в большинстве компьютеров. Современные компьютеры, в том числе Pentium и UltraSPARC, содержат сложные системы виртуальной памяти.
6.1.1. Страничная организация памяти
В основе механизма виртуальной памяти лежит разделение понятий адресного пространства и адресов памяти. Рассмотрим в качестве иллюстрации старый компьютер с 16-битным полем адреса в командах и 4096 словами памяти. Программа на нем теоретически могла обращаться к 65536 словам памяти (адреса 16-битные, 216=65536). Это зависит только от количества разрядов адреса и не связано с числом реально доступных слов. Логическое адресное пространство такого компьютера состоит из чисел 0, 1, 2,..., 65535, однако в действительности (физически) компьютер имеет слов памяти гораздо меньше.
До изобретения виртуальной памяти проводилось жесткое различие между адресами < 4096, и адресами >= 4096. Эти две части рассматривались соответственно как полезное и бесполезное адресные пространства. Никакого различия между адресным пространством и адресами памяти не проводилось, между ними подразумевалось взаимнооднозначное соответствие.
Идея разделения понятий адресного пространства и адресов памяти состоит в неоднозначности этого соответствия. Если всегда можно получить прямой доступ к 4096 физическим словам памяти, то это не значит, что они обязаны соответствовать логическим адресам памяти от 0 до 4095. Например, можно сообщить системе, что при обращении к логическому (виртуальному) адресу 4096 должно использоваться слово из памяти с адресом 0, при обращении к адресу 4097 - слово из памяти с адресом 1 и т. д. Другими словами, определяется отображение адресного пространства в физические адреса памяти. При обращении к адресу из другой группы текущее содержимое физической памяти сохраняется на диске, и в память загружается нужная часть виртуальной памяти (действует другое отображение).
Такая технология автоматического наложения называется страничной организацией памяти, а перемещаемые участки памяти называются страницами. Возможны и более сложные способы отображения адресов из логического адресного пространства в физические адреса памяти. Совокупность адресов, к которым программа теоретически может обращаться, мы будем называть виртуальным адресным пространством, а реальные адреса памяти в аппаратном обеспечении - физическим адресным пространством. Соответствие между виртуальными адресами и физическими хранится в специальной схеме распределения памяти (таблице страниц). Предполагается, что на диске достаточно места для хранения необходимого виртуального адресного пространства.
Программист может разрабатывать программы ничего не зная о виртуальной памяти. Создается впечатление, что объем памяти компьютера достаточно велик. Такой механизм называется прозрачным.