Э. Таненбаум - Архитектура компьютера (1127755), страница 119
Текст из файла (страница 119)
Уровень операционной системы всегда интерпретируется. Когда пользовательская программа вызывает команду операционной системы, например чтение данных из файла, операционная система выполняет зту команду шаг за шагом, точно так же, как микропрограмма выполняет команду А00. Однако когда программа вызывает команду уровня архитектуры команд, зта команда выполняется непосредственно уровнем микроархитектуры без участия операционной системы. 476 Глава б. Уровень операционной системы В этой книге мы можем рассказать об уровне операционной системы лишь в общих чертах. Мы сосредоточимся на трех важных особенностях.
Первая особенность — это виртуальная память. Виртуальная память используется многими операционными системами. Она позволяет создать впечатление, будто у машины больше памяти, чем есть на самом деле. Вторая особенность — файловый ввод-вывод. Это понятие более высокого уровня, чем команды ввода-вывода, которые мы рассматривали в предыдущей главе.
Третья особенность — параллельная работа (несколько процессов могут выполняться, обмениваться информацией и синхронизироваться). Понятие процесса является очень важным, и мы подробно рассмотрим его далее в этой главе. Под процессом можно понимать работающую программу и всю информацию о ее состоянии (памяти, регистрах, счетчике команд, вводе-выводе и т. д.). После обсуждения этих основных характеристик мы покажем, как они применяются к операционным системам двух машин из трех наших примеров: Репг1пш 4 ()тт'1пдотчз ХР) и П1ггаЗРАВС П1 (()141Х).
Поскольку процессор 8051 обычно используется для встроенных систем, у этой машины нет операционной системы. Виртуальная память В первых компьютерах память была очень мала по объему и к тому же дорого стоила. 1ВМ-650, ведущий компьютер того времени (конец 50-х годов), содержал всего 2000 слов памяти. Один из первых 60 компиляторов А(.СО(.
был написан для компьютера с объемом памяти всего 1024 слова. Древняя система с разделением времени прекрасно работала на компьютере Р1)Р-1, общий объем памяти которого составлял всего 4096 18-разрядных слов для операционной системы и пользовательских программ. В те времена программисты тратили очень много времени, пытаясь вместить свои программы в крошечную память. Часто приходилось использовать более медленный алгоритм только потому, что более быстрый не удавалось разместить в памяти компьютера.
Традиционным решением проблемы было использование вспомогательной памяти (например, диска). Программист делил программу на несколько частей, так называемых оверлеев, каждый из которых помещался в память. Чтобы выполнить программу, сначала нужно было считать и запустить первый оверлей. Когда он завершался, считывался и запускался второй оверлей и т. д. Программист отвечал за разбиение программы на оверлеи и решал, в каком месте вспомогательной памяти должен храниться кюидый оверлей, контролировал передачу оверлеев между основной и вспомогательной памятью и вообще управлял всем этим процессом без какой-либо помощи со стороны компьютера.
Хотя эта технология широко использовалась на протяжении многих лет, она требовала длительной кропотливой работы, связанной с управлением оверлеями. В 1961 году группа исследователей из Манчестера (Англия) предложила метод автоматического выполнения процесса наложения, при котором программист мог вообще не знать об этом процессе 173]. Этот метод, в основе которого, как сейчас говорят, лежит использование виртуальной памяти, имел очевидное преимущество, поскольку освобождал программиста от массы нудной работы. Виртуальная память 4 г г Впервые этот метод был применен в ряде компьютеров, выпущенных в 60-е годы. К началу 70-х годов виртуальная память была реализована в большинстве компьютеров. В настоящее время даже компьютеры' на одной микросхеме, в том числе Реп1шш 4 и (1!ггаЯРАВС П1, содержат очень сложные системы виртуальной памяти.
Мы рассмотрим их далее в этой главе. Страничная организация памяти Идею о разделении понятий адресного пространства и адресов памяти выдвинула группа ученых из Манчестера. Рассмотрим в качестве примера типичный компьютер того времени с 16-разрядным полем адреса в командах и 4096 словами памяти. Программа, работающая на таком компьютере, могла обращаться к 65 536 словам памяти (поскольку адреса были 16-разрядными, а 2' = 65 536). Обратите внимание, что число адресуемых слов зависит только от числа битов адреса и никак не связано с числом реально доступных слов в памяти.
Адресное пространство такого компьютера состоит из чисел О, 1, 2, ..., 65 535, так как это— набор всех возможных адресов. Однако в действительности компьютер мог иметь гораздо меньше слов в памяти. До изобретения виртуальной памяти приходилось проводить жесткое различие между адресами, меньшими 4096, и адресами, равными или большими 4096. Эти две части рассматривались как полезное адресное пространство и бесполезное адресное пространство соответственно (адреса выше 4095 были бесполезными, поскольку они не соответствовали реальным адресам памяти).
Никакого различия между адресным пространством и адресами памяти не проводилось, поскольку между ними подразумевалось взаимно-однозначное соответствие. Идея разделения понятий адресного пространства и адресов памяти состоит в следующем. В любой момент времени можно получить прямой доступ к 4096 словам памяти, но это не значит, что они непременно должны соответствовать адресам памяти от 0 до 4095. Например, мы могли бы сообщить компьютеру, что при обращении к адресу 4096 нужно использовать слово из памяти с адресом О, при обращении к адресу 4097 — слово из памяти с адресом 1, при обращении к адресу 8191 — слово из памяти с адресом 4095 и т.
д. Другими словами, мы отображаем адресное пространство на действительные адреса памяти (рис. 6.2). Согласно этой схеме отображения адресов адресного пространства на фактические ячейки памяти, в машине с объемом памяти 4 Кбайт (без виртуальной памяти) между адресами от 0 до 4095 и словами памяти числом 4096 существует прямое соответствие. Возникает интересный вопрос: а что произойдет, если программа совершит переход к одному из адресов в диапазоне от 8192 по 12 287? В машине без виртуальной памяти произойдет ошибка, на экран будет выведено сообщение о несуществующем адресе памяти, и выполнение программы прервется.
1 Строго говоря, сверхбольшие интегральные микросхемы, на которых сейчас располагаются микропроцессоры, в том числе н упоминаемый автором процессор Рептшш 4, не являются компьютерами. Компьютер должен содержать, помимо процессора, память и контроллер для управления ею, устройства ввода-вывода и соответствующие контроллеры для управления ими. — Примеч. научи. Ред. 47В Глава 6. Уровень операционной системы Адресное пространство Отображение б г ю памяти 4095 0 8191 — ~- 4096 -~- 0 — я- Рис. 6.2. Виртуальные адреса памяти с 4096 по 8191 отображаются на адреса основной памяти с 0 по 4095 В машине с виртуальной памятью произойдет следующее; 1. Содержимое основной памяти будет сохранено на диске.
2. Слова с 8192 по 12 287 будут сохранены на диске. 3. Слова с 8192 до 12 287 будут загружены в основную память. 4. Отображение адресов изменится: адреса с 8192 по 12 287 будут соответствовать ячейкам памяти с 0 по 4095. 5. Выполнение программы продолжится, как будто ничего необычного не случилось. Такая технология автоматического наложения называется страничной организацией памяти, а фрагменты программы, которые считываются с диска,— страницами.
Есть и другой, более сложный способ отображения адресов адресного пространства программы на реальные адреса памяти. Адреса, к которым программа может обращаться, мы будем называть виртуальным адресным пространством, а реальные адреса памяти, реализованные аппаратно, — физическим адресным пространством. В карте памяти, или таблице страниц, виртуальные адреса соотносятся с физическими. Предполагается, что на диске достаточно места для хранения полного виртуального адресного пространства (или, по крайней мере, той его части, которая используется в данный момент).
Программы пишутся так, как будто в основной памяти хватает места для размещения всего виртуального адресного пространства, даже если это не соответствует действительности. Программы могут загружать слова из виртуального адресного пространства или записывать слова в виртуальное адресное пространство, несмотря на то, что на самом деле физической памяти для этого не хватает.
Программист может писать программы, даже не осознавая, что существует виртуальная память. Просто создается такое впечатление, что объем памяти данного компьютера достаточно велик. Позднее мы сопоставим страничную организацию памяти с процессом сегментации, при котором программисту требуется знать о существовании сегментов. Еще раз подчеркнем, что страничная организация памяти создает иллюзию линейной основной памяти такого же размера, как адресное пространство программы. В действительности основная память может быть меньше (или больше), чем виртуальное адресное пространство. То, что память большого размера про- Виртуальная память 479 сто моделируется путем страничной организации памяти, нельзя определить по программе (только за счет тестирования).