Скачиваний:
97
Добавлен:
03.06.2014
Размер:
5.64 Mб
Скачать

Вопросы и задания

4 3 3

SUB М

MUL М

DIV М

+двухадресные: MOV (X=Y)

ADD (X=X+Y) SUB (X=X-Y) MUL (X=X*Y) DIV (X=X/Y)

• трехадресные: MOV (X=Y)

ADD (X=Y+Z)

SUB (X=Y-Z)

MUL (X=Y*Z)

DIV (X=Y/Z).

8.M — это 16-битный адрес памяти, а X, Y и Z — это или 16-битные адреса, или 4-битные регистры. Безадресная машина использует стек, одноадресная машина использует регистр-аккумулятор, а оставшиеся две имеют 16 регистров и команды, которые оперируют со всеми комбинациями ячеек памяти и регистров. КомандаSUB X,YвычитаетYизX,акомандаSUB X,Y,Z вычитаетZ из Y и помещает результат в X. Если длина кодов операций равна 8 битам,

аразмеры команд кратны 4 битам, сколько битов нужно каждой машине для вычисления X?

9.Придумайте такой механизм адресации, который позволяет определять в 6-битном поле произвольный набор из 64 адресов, не обязательно смежных.

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

11.Переделайте следующие формулы из инфикснойзаписи в обратную польскую запись:

A+B+C+D+E

(А+В) х (C+D)+E

(AxB)+(CxD)+E

(А-В) х (((C-DxE)/F)/G) xH

12.Переделайте следующие формулы из обратной польской записи в инфиксную запись:

AB+ C+ Dx

AB/CD/ +

ABCDE+xx/

ABCDExF/+G-H/x+

4 3 4 Глава 5. Уровень архитектуры команд

13.Какие из следующих пар формул в обратной польской записи математически эквивалентны?

АВ + С + иАВС++

А В - С - и А В С - -

АВхС+иАВС+х

14.Напишите три формулы в обратной польской записи, которые нельзя переделать в инфиксную запись.

15.Переделайте следующие инфиксные логические формулы в обратной польскойзаписи.

(А И В) ИЛИ С

(А ИЛИ В) И (А ИЛИ С)

(А И В) ИЛИ (С И D)

16.Переделайте следующую инфиксную формулу в обратную польскую запись

инапишите код JVM, чтобы выполнить ее.

(2хЗ+4)-(4/2+1)

17.Команда языка ассемблера MOVREG.ADDR

означает загрузку регистра из памяти компьютера Pentium II. Однако для UltraSPARC II для загрузки регистра из памяти нужно написать

LOAD ADDR, REG

Почему порядок операндов разный?

18.Сколько регистров содержится в машине, форматы команд которой даны на рис. 5.16?

19.В форматах команд на рис. 5.16 бит 23 используется для различения формата 1 и формата 2. Однако для определения формата 3 никакого специального бита не предусмотрено. Как аппаратное обеспечение узнает, что нужно использовать формат 3?

20.Обычно программа определяет местонахождение переменной X в пределах интервала от А до В. Если бы имелась трехадресная команда с операндами А, В и X, сколько битов кода условия было бы установлено этой командой?

21.Pentium II содержит бит кода условия, который следит за переносом бита 3 после выполнения арифметической операции. Зачем это нужно?

22.В UltraSPARC II нет такой команды, которая загружает в регистр 32-бит- ное число. Вместо нее обычно используется последовательность из двух команд: SETHI и ADD. Существуют ли еще какие-нибудь способы загрузки 32-битного числа в регистр? Аргументируйте.

23.Один из ваших друзей стучится к вам в комнату в 3 часа ночи и радостно сообщает, что у него появилась замечательная идея: команда с двумя кодами операций. Что вы сделаете в этой ситуации: отправите своего друга получать патент или пошлете его обратно к чертежной доске?

Вопросы и задания

435

24.В программировании очень распространены следующие формы проверки:

if (n==0) if O>J). if (k<4).

Предложите команду, которая будет проверять эти условия эффективно. Какие поля имеются в вашей команде?

25.Покажите для 16-битного двоичного числа 1001 0101 1100 0011: + Сдвиг вправо на 4 бита с заполнением нулями.

Сдвиг вправо на 4 бита с расширением по знаку.

Сдвиг влево на 4 бита.

Циклический сдвиг влево на 4 бита.

Циклический сдвиг вправо на 4 бита.

26.Как можно в машине, в которой нет команды CLR, очистить слово памяти?

27.Вычислите логическое выражение (А И В) ИЛИ С для:

А-1101 0000 1010 1101

В—1111 11110000 1111

С=0000 0000 0010 0000

28.Придумайте, как поменять местами две переменные А и В, не используя при этом третью переменную или регистр. Подсказка: подумайте о команде ИСКЛЮЧАЮЩЕЕИЛИ.

29.На некотором компьютере можно перемещать число из одного регистра в другой, сдвигать каждый из них влево на разное количество байтов и складывать полученные результаты за меньшее время, чем потребовалось бы для выполнения умножения. При каком условии эта последовательность команд будет полезна для вычисления произведения «константа х переменная»?

30.Разные машины имеют разную плотность команд (то есть разное число байтов, которое требуется для выполнения определенного вычисления). Транслируйте следующие три фрагмента программы на языке Java на ассемблер для Pentium II, UltraSPARC II и JVM. Затем посчитайте, сколько байтов требуется для выполнения каждого выражения для каждой машины (предполагается, что i и j — это локальные переменные памяти):

i-3;

i-j;

i-j-1;

31.В этой главе рассматривались команды цикла для работы с циклами for. Разработайте команду для обращения с циклами while.

32.Предположим, что ханойские монахи могут перемещать один диск за 1 минуту (они не торопятся закончить работу, поскольку в Ханое очень мало вакансий для людей с подобными навыками). Сколько времени им потребуется, чтобы решить задачу (то есть переместить все 64 диска)? Ответ дайте в годах.

4 3 6 Глава 5. Уровень архитектуры команд

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

34.Компьютер для считывания информации с диска использует канал прямого доступа к памяти. Диск содержит 64 сектора по 512 байтов на дорожке. Время оборота диска 16 мс. Ширина шины 16 битов. Каждая передача шины занимает 500 не. В среднем для одной команды процессора требуется два цикла шины. Насколько скорость работы процессора замедляется из-за прямого доступа к памяти?

35.Почему программам обработки прерываний приписываются определенные приоритеты, а обычные процедуры приоритетов не имеют?

36.Архитектура IA-64 содержит необычайно большое число регистров (64). Связано ли столь большое количество регистров с использованием предикации? Если да, то каким образом? Если нет, то зачем тогда их так много?

37.В пятой главе обсуждалось понятие спекулятивной загрузки. Но о командах спекулятивного сохранения мы не упоминали. Почему? Может быть, они просто аналогичны спекулятивным загрузкам, или существует какая-то другая причина, по которой мы не стали о них говорить?

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

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

40.Напишите подпрограмму наязыке ассемблерадля превращения целого двоичного числа со знаком в код ASCII.

41.Напишите подпрограмму на языке ассемблера для превращения инфиксной формулы в обратную польскую запись.

42.«Ханойская башня» — это не единственная рекурсивная процедура, любимая многими компьютерщиками. Есть еще одна очень популярная рекурсивная процедурап!, где n!=n(n-l)! Подчиняется ограничивающемуусловию 01=1. Напишите навашемлюбимомязыке ассемблерапроцедурудля вычисления п!.

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

Глава6

Уровень операционной системы

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

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

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

Уровень 3 Уровень операционной системы

Операционная система

Уровень 2 Уровень архитектуры команд

Микропрограмма или аппаратное обеспечение

Уровень 1 Микроархитектурный уровень

Рис. 6 . 1 . Расположение уровня операционной системы

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

4 3 8 Глава 6. Уровень операционной системы

так же, как микропрограмма выполняет команду ADD. Однако когда программа выполняет команду уровня архитектуры команд, эта команда выполняется непосредственно микроархитектурным уровнем без участия операционной системы.

В этой книге мы можем лишь очень кратко в общих чертах рассказать вам об уровне операционной системы. Мы сосредоточимся на трех важных особенностях. Первая особенность — это виртуальная память. Виртуальная память используется многими операционными системами. Она позволяет создать впечатление, что у машины больше памяти, чем есть на самом деле. Вторая особенность — файл ввода-вывода. Это понятие более высокого уровня, чем команды ввода-вывода, которые мы рассматривали в предыдущей главе. Третья особенность — параллельная обработка (как несколько процессов могут выполняться, обмениваться информацией и синхронизироваться). Понятие процесса является очень важным, и мы подробно рассмотрим его ниже в этой главе. Под процессом можно понимать работающую программу и всю информацию об ее состоянии (о памяти, регистрах, счетчике команд, вводе-выводе и т. д.). После обсуждения этих основных характеристик мы покажем, как они применяются к операционным системам двух машин из трех наших примеров: Pentium II (Windows NT) и UltraSPARC II (UNIX). Поскольку picojava II обычно используется для встроенных систем, у этой машины нет операционной системы.

Виртуальная память

В первых компьютерах память была очнь мала по объему и к тому же дорого стоила. IBM-650, ведущий компьютер того времени (конец 50-х годов), содержал всего 2000 слов памяти. Один из первых 60 компиляторов, ALGOL, был написан для компьютера с размером памяти всего 1024 слова. Древняя система с разделением времени прекрасно работала на компьютере PDP-1, общий размер памяти которого составлял всего 4096 18-битных слов для операционной системы и пользовательских программ. В те времена программисты тратили очень много времени на то, чтобы впихнуть свои программы в крошечную память. Часто приходилось использовать алгоритм, который работает намного медленнее другого алгоритма, поскольку лучший алгоритм был слишком большим по размеру и программа, в которой использовался этот лучший алгоритм, могла не поместиться в память компьютера.

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

Виртуальная память

439

Хотя эта технология широко использовалась на протяжении многих лет, она требовала длительной кропотливой работы, связанной с управлением оверлеями. В 1961 году группа исследователей из Манчестера (Англия) предложила метод автоматического выполнения процесса наложения, при котором программист мог вообще не знать об этом процессе [42]. Этот метод, который сейчас называется виртуальнойпамятью,имелочевидноепреимущество,посколькуосвобождалпрограммиста от огромного количества нудной работы. Впервые этот метод был использован в ряде компьютеров, выпущенных в 60-е годы. К началу 70-х годов виртуальная память появилась в большинстве компьютеров. В настоящее время даже компьютеры1 на одной микросхеме, в том числе Pentium II и UltraSPARC II, содержат очень сложные системы виртуальной памяти. Мы рассмотрим их ниже в этой главе.

Страничная организация памяти

Группа ученых из Манчестера выдвинула идею о разделении понятий адресного пространства и адресов памяти. Рассмотрим в качестве примера типичный компьютер того времени с 16-битным полем адреса в командах и 4096 словами памяти. Программа, работающая на таком компьютере, могла обращаться к 65536 словам памяти (поскольку адреса были 16-битными, а 216=65536). Обратите внимание, что число адресуемых слов зависит только от числа битов адреса и никак не связано с числом реально доступных слов в памяти. Адресное пространство такого компьютера состоит из чисел 0, 1, 2,..., 65535, так как это набор всех возможных адресов. Однако в действительности компьютер мог иметь гораздо меньше слов в памяти.

До изобретения виртуальной памяти приходилось проводить жесткое различие между теми адресами, которые меньше 4096, и теми, которые равны или больше 4096. Эти две части рассматривались как полезное адресное пространство и бесполезное адресное пространство соответственно (адреса выше 4095 были бесполезными, поскольку они не соответствовали реальным адресам памяти). Никакого различия между адресным пространством и адресами памяти не проводилось, поскольку между ними подразумевалось взаимно-однозначное соответствие.

Идеяразделения понятий адресного пространстваиадресов памятисостоитв следующем. В любой момент времени можно получить прямой доступ к 4096 словам памяти, но это не значит, что они непременно должны соответствовать адресам памяти от 0 до 4095. Например, мы могли бы сообщить компьютеру, что при обращении к адресу 4096 должно использоваться слово из памяти с адресом 0, при обращении к адресу4097 — слово из памяти с адресом 1, при обращении кадресу8191 слово из памяти с адресом 4095 и т. д. Другими словами, мы определили отображение из адресного пространства в действительные адреса памяти (рис. 6.2).

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

440 Глава 6. Уровень операционной системы

 

Адресное

 

пространство

Адрес

X

8191

^Отображение 4 К основной

памяти

4096

-4095

0

-0

Рис. 6.2. Виртуальные адреса памяти с 4096 по 8191 отображаются в адреса основной памяти с 0 по 4095

Возникает интересный вопрос: а что произойдет, если программа совершит переход в один из адресов с 8192 по 12287? В машине без виртуальной памяти произойдет ошибка, на экране появится фраза «Несуществующий адрес памяти» и выполнение программы остановится. В машине с виртуальной памятью будет иметь место следующая последовательность шагов:

1.Слова с 4096 до 8191 будут размещены на диске.

2.Слова с 8192 до 12287 будут загружены в основную память.

3.Отображение адресов изменится: теперь адреса с 8192 до 12287 соответствуют ячейкам памяти с 0 по 4095.

4.Выполнение программы будет продолжаться, как будто ничего ужасного не случилось.

Такая технология автоматического наложения называется страничной организациейпамяти,акускипрограммы,которыесчитываютсясдиска,называютсястра-

ницами.

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

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

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

Виртуальная память

4 4 1

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

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

Реализация страничной организации памяти

Для виртуальной памяти требуется диск для хранения полной программы и всех данных. Естественно, при изменении копии должен меняться и оригинал.

Виртуальное адресное пространство разбивается на ряд страниц равного размера, обычно от 512 до 64 Кбайт, хотя иногда встречается 4 Мбайт. Размер страницы всегдадолжен быть степенью двойки. Физическое адресное пространство тоже разбивается на части равного размера таким образом, чтобы каждая такая часть основной памяти вмещала ровно одну страницу. Эти части основной памяти называются страничными кадрами. На рисунке 6.2 основная память содержит только один страничный кадр. На практике обычно имеется несколько тысяч страничных кадров.

Нарисунке 6.3, а показан один из возможныхвариантов разделения первых 64 К виртуального адресного пространства на страницы по 4 К (отметим, что сейчас мы говорим о 64 К и 4 К адресов). Адрес может быть байтом, но может быть словом в компьютере, в котором последовательно расположенные слова имеют последовательные адреса. Виртуальную память, изображенную на рис. 6.3, можно реализовать посредством таблицы страниц, в которой количество элементов равно количеству страниц в виртуальном адресном пространстве. Здесь для простоты мы показали только первые 16 элементов. Когда программа пытается обратиться к слову из первых 64 К виртуальной памяти, чтобы вызвать команду или данные или чтобы сохранить данные, сначала она порождает виртуальный адрес от 0 до 65532 (предполагается, что адреса слов должны делиться на 4). Для порождения этого адреса могут использоваться любые стандартные способы адресации, в том числе индексирование и косвенная адресация.

4 4 2 Глава6.Уровеньоперационнойсистемы

Страница Виртуальный адрес

15

61440 Р 65535

 

 

14

57344 Р 61439

 

 

13

53248

Р 57343

 

 

12

49152 Р53247

Нижние 32 К адресов

11

45056 Р49151

 

основнойпамяти

10

 

 

 

40960 Р 45055

Страничный

Физические

9

36864 Р 40959

кадр

адреса

8

32768 Р 36863

 

 

7

28672 Р 32767

7

28672 Р 32767

6

24576 Р 28671

6

24576 Р 28671

5

20480 Р 24575

5

20480 Р 24575

4

16384 Р 20479

4

16384 Р 20479

3

12288Р16383

3

12288Р16383

2

8192 Р12287

2

8192 Р12287

1

4096 Р 8191

1

4096Р 8191

0

0 Р 4095

0

0 Р 4095

Рис. 6.3. Первые 64 К виртуального адресного пространства разделены на 16 страниц по 4 К каждая (а); 32 К основной памяти разделены на 8 страничных кадров по 4 К каждый (б)

На рис. 6.3, бизображена физическая память, состоящая из восьми страничных кадров по 4 К. Эту память можно ограничить до 32 К, поскольку: 1) это вся память машины (для процессора, встроенного в стиральную машину или микроволновую печь, этого достаточно), или 2) оставшаяся часть памяти занята другими программами.

А теперь рассмотрим, как можно 32-битный виртуальный адрес отобразить на физический адрес основной памяти. В конце концов, память воспринимаеттолько реальные адреса и не воспринимает виртуальные, поэтому такое отображениедолжно быть сделано. Каждый компьютер с виртуальной памятью содержит устройство для осуществления отображения виртуальных адресов на физические. Это устройство называется контроллером управления памятью (MMU - Memory Management Unit). Он может находиться намикросхеме процессора или на отдельной микросхеме рядом с процессором. В нашем примере контроллер управления памятью отображает 32-битный виртуальный адрес в 15-битный физический адрес, поэтому ему требуется 32-битный входной регистр и 15-битный выходной регистр.

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

Сначала контроллер управления памятью проверяет, находится ли нужная страница в текущий момент в памяти. Поскольку у нас есть 220 виртуальных страниц и