- •Э. Таненбаум
- •Глава 2. Организация компьютерных систем 56
- •Глава 3. Цифровой логический уровень 139
- •Глава 4. Микроархитектурный уровень 230
- •Глава 5. Уровень архитектуры команд 334
- •Глава 6. Уровень операционной системы 437
- •Глава 7. Уровень языка ассемблера 517
- •Глава 8. Архитектуры компьютеров параллельного
- •Глава 9. Библиография 647
- •Глава 8 (архитектура компьютеров параллельного действия) полностью изменена. В ней подробно описываются мультипроцессоры (uma, numa и сома) и мультикомпьютеры (мрр и cow).
- •Глава 1
- •Глава 2 знакомит читателей с основными компонентами компьютера: процессорами, памятью, устройствами ввода-вывода. В ней дается краткое описание системной архитектуры и введение к следующим главам.
- •Глава 2
- •Центральный процессор Центральный процессор
- •12 Битов б
- •24 Входные линии
- •50 Входных линий
- •Глава 4
- •Старший бит
- •Блок выборки команд
- •Сигналы управления
- •Глава 5
- •Intel ia-64
- •Глава 6
- •Глава 7
- •3. Сведения о том, можно ли получить доступ к символу извне процедуры.
- •Глава 8
- •64 Элемента на каждый регистр
- •Intel/Sandia Option Red
- •00 Процессор 2
- •Глава 9
- •4. Mazidi and Mazidi, The 80x86ibm pc and Compatible Computers, 2nd ed.
- •5. McKee et al., Smarter Memory: ImprovingBandwidthforStreamed References.
- •4. McKusick et al., Design and Implementation ofthe 4.4bsd Operating System.
- •3. Hill, Multiprocessors Should Support Simple Memory-Consistency Models.
- •Ieee Scalable Coherent Interface Working Group, ieee, 1989.
- •Ieee Micro Magazine, vol. 18, p. 60-75, July/Aug. 1998b.
- •3Rd ed., Reading, ma: Addison-Wesley, 1998.
- •1988 Int'l. Conf. On Parallel Proc. (Vol. 11), ieee, p. 94-101, 1988.
- •Implementation of the 4.4 bsd Operating System», Reading, ma: Addison-Wesley, 1996.
- •In Shared Memory Multiprocessing», ieee Computer Magazine, vol. 30, p. 4450, Dec. 1997.
- •78Jan.-March 1999.
- •0 123456789Abcdef
- •I и Ijmii him
- •Э. Таненбаум
0 123456789Abcdef
Двоичный разряд (то есть 1 или 0) обычно называют битом. На рис. А.2 десятичное число 2001 представлено в двоичной, восьмеричной и шестнадцатеричной
системе. Число 7В9 очевидно шестнадцатеричное, поскольку символ В встречается только в шестнадцатеричньгх числах. А число 111 может быть в любой из четырех систем счисления. Чтобы избежать двусмысленности, нужно использовать индекс для указания основания системы счисления.
g 1 1 111010001
о
I
X
Q§ О
2 з-
| 1 х 2 10 + 1 х 29 + 1 х 2 8 + 1 х 2 7 + 1 х 26 + 0 х 2 5 + 1 х 2 4 + 0 х 23 + 0 х 2 2 + 0 х 21 + 1 х 2° (8*4 0 24 +51 2 +256 +128 +64 +0 +16 +0 +0 +0 +1
3 7 2 1
m
Зх83 + 7х82 + 2Х81 + 1х8° 1536 + 448 + 16 +1
8 2 0 0 1
| g 2х103нР 0 х 102 + 0 Х101 + 1 х10° н у 2000 •*• 0 + 0 + 1
• о
§. 7 D 1
й § 7х162нИЗ Х161 + 1 х16°
^ х 1792 ч- 208 +1
ш
3
Рис. А.2. Число 2001 в двоичной, восьмеричной и шестнадцатеричнои системе
В таблице АЛ ряд неотрицательных целых чисел представлен в каждой из четырех систем счисления.
Преобразование чисел из одной системы счисления в другую 669
Десятичное |
Двоичное |
Восьмеричное |
Шестнадцатеричное |
14 |
1110 |
16 |
Е |
15 |
1111 |
17 |
F |
16 |
10000 |
20 |
10 |
20 |
10100 |
24 |
14 |
30 |
11110 |
36 |
1Е |
40 |
101000 |
50 |
28 |
50 |
110010 |
62 |
32 |
60 |
111100 |
74 |
ЗС |
70 |
1000110 |
106 |
46 |
80 |
1010000 |
120 |
50 |
90 |
1011010 |
132 |
5А |
100 |
11001000 |
144 |
64 |
1000 |
1111101000 |
1750 |
ЗЕ8 |
2989 |
101110101101 |
5655 |
BAD |
Преобразование чисел из одной системы счисления в другую
Преобразовывать числа из восьмеричной в шестнадцатеричную или двоичную систему и обратно легко. Чтобы преобразовать двоичное число в восьмеричное, нужно разделить его на группы по три бита, причем три бита непосредственно слева от двоичной запятой формируют одну группу, следующие три бита слева от этой группы формируют вторую группу и т. д. Каждую группу по три бита можно
преобразовать в один восьмеричный разряд со значением от 0 до 7 (см. первые
строки табл. А.1). Чтобы дополнить группу до трех битов, нужно спереди приписать один или два нуля. Преобразование из восьмеричной системы в двоичную
тоже тривиально. Каждый восьмеричный разряд просто заменяется эквивалентным 3-битным числом. Преобразование из 16-ричной в двоичную систему, по
сути, сходно с преобразованием из 8-ричной в двоичную систему, только каждый
16-ричный разряд соответствует группе из четырех битов, а не из трех. На рис. А.З приведены примеры преобразований из одной системы в другую.
Преобразование десятичных чисел в двоичные можно совершать двумя разными способами. Первый способ непосредственно вытекает из определения двоичных чисел. Самая большая степень двойки, меньшая, чем число, вычитается из этого числа. Та же операция проделывается с полученной разностью. Когда число разложено по степеням двойки, двоичное число может быть получено следующим образом. Единички ставятся в тех позициях, которые соответствуют полученным степеням двойки, а нули — во всех остальных позициях.
Второй способ — деление числа на 2. Частное записывается непосредственно под исходным числом, а остаток (0 или 1) записывается рядом с частным. То же
проделывается с полученным частным. Процесс повторяется до тех пор, пока не останется 0. В результате должны получиться две колонки чисел — частных и остатков. Двоичное число можно считать из колонки остатков снизу вверх. На рисунке А.4 показано, как происходит преобразование из десятичной в двоичную систему.
Пример 1
Шестнадцатеричное число Двоичное число
Восьмеричное число
В
fi
1
9
4
ft
0001100101001000 .101101100 1 4 5 1 0.5 5 4
Пример 2
Шестнадцатеричное число ^_7_^ ^_В_^ ^_А^ ^_3^ . ^_С_^ ^_4_^
Двоичное число 0111101110100011 .101111000100
Восьмеричное число 75 64 3.5 704
Рис. А.З. Примеры преобразования из 8-ричной системы счисления в двоичную ииз16-ричнойв двоичную
Двоичные числа можно преобразовывать в десятичные двумя способами. Первый способ — суммирование степеней двойки, которые соответствуют биту 1 в двоичном числе. Например:
10110=24+22+2=16 +4+2=22
Второй способ. Двоичное число записывается вертикально по одному биту
в строке, крайний левый бит находится внизу. Самая нижняя строка — это строка 1, затем идет строка 2 и т. д. Десятичное число строится напротив этой колонки. Сначала обозначим строку 1. Элемент строки п состоит из удвоенного элемента строки и-1 плюс бит строки п (0 или 1). Элемент, полученный в самой верхней строке, и будет ответом. Метод проиллюстрирован на рис. А.5.
Преобразование из десятичной в восьмеричную или 16-ричную систему можно выполнить либо путем преобразования сначала в двоичную, а затем в нужную нам систему, либо путем вычитания степеней 8 или 16.
Отрицательные двоичные числа
На протяжении всей истории цифровых компьютеров для репрезентации отрицательных чисел использовались 4 различные системы. Первая из них называется системой со знаком. В такой системе крайний левый бит — это знаковый бит (0 — это «+», а 1 — это «-»), а оставшиеся биты показывают абсолютное значение числа.
Частное
Остаток
1 492 |
|
746 |
0 |
373 |
0 |
1 86 |
1 |
93 |
0 |
46 |
1 |
23 |
0 |
1 1 |
1 |
5 |
1 |
2 |
1 |
1 |
0 |
О |
1 |
10111010100= 1492,.
Рис. А.4. Преобразование десятичного числа 1492 в двоичное путем последовательного деления (сверху вниз). Например, 93 делится на 2, получается 46 и остаток 1. Остаток записывается в строку внизу
1 + 2 х 1499 = 2999 -* Результат
\
—»- 1 +2 х 749 = 1499 \
—»- 1 + 2 х 374 = 749 \
—#- 0 + 2 х 187 = 374 \
—»- 1 +2 х 93 = 187 \
—*- 1 + 2 х 46> = 93
—»- 0 + 2 х 23 = 46 \
--»- 1 +2 х '11 =23 \
-»- 1 +2 х5 = '11 \
~Л1 + 2х 2 = 5 \
-->- 0 + 2 х 1 =2
ч
--»- 1 + 2 х 0 = 1 -< Начинать
101110110111
нужно отсюда
Рис. А.5. Преобразование двоичного числа 101110110111 в десятичное путем последовательного удваивания снизу вверх. В каждой следующей строке удваивается значение предыдущей строки и прибавляется соответствующий бит. Например, 374 умножается на 2 и прибавляется бит соответствующей строки (в данном случае 1). В результате получается 749
Во второй системе, которая называется дополнением до единицы, тоже присутствует знаковый бит (0 — это плюс, а 1 — это минус). Чтобы сделать число отрицательным, нужно заменить каждую 1 на 0 и каждый 0 на 1. Это относится и к знаковому биту. Система дополнения до единицы уже устарела.
Третья система, дополнение до двух, содержит знаковый бит (0 — это «+», а 1 — это «-»). Отрицание числа происходит в два этапа. Сначала каждая единица меняется на 0, а каждый 0 — на 1 (как и в системе дополнения до единицы). Затем к полученному результату прибавляется 1. Двоичное сложение происходит точно так же, как и десятичное, только перенос совершается в том случае, если сумма больше 1, а не больше 9. Например, рассмотрим преобразование числа 6 в форму с дополнением до двух:
00000110 (+6);
11111001 (-6 в системе с дополнением до единицы);
11111010 (-6 в системе с дополнением до двух).
Если нужно совершить перенос из крайнего левого бита, он просто отбрасывается.
В четвертой системе, которая для ти-битных чисел называется excess 2m~', число представляется как сумма этого числа и 2~К Например, для 8-битного числа (те=8) система называется excess 128, а число сохраняется в виде суммы исходного числа и 128. Следовательно, -3 превращается в -3+128=125, и это число (-3) представляется 8-битным двоичным числом 125 (01111101). Числа от -128 до +127 выражаются числами от 0 до 255 (все их можно записать в виде 8-битного положительного числа). Отметим, что эта система соответствует системе с дополнением до двух с обращенным знаковым битом. В таблице А.2 представлены примеры отрицательных чисел во всех четырех системах.
В системах со знаком и с дополнением до единицы есть два представления нуля: +0 и -0. Такая ситуация нежелательна. В системе с дополнением до двух такой проблемы нет, поскольку здесь плюс нуль это всегда плюс нуль. Но зато в этой системе есть другая особенность. Набор битов, состоящий из 1, за которой следуют все нули, является дополнением самого себя. В результате ряд положительных и отрицательных чисел несимметричен — существует одно отрицательное число без соответствующего ему положительного.
Мы считаем это проблемами, поскольку хотим иметь систему кодировки, в которой:
Существует только одно представление нуля.
Количество положительных чисел равно количеству отрицательных.
Дело в том, что любой ряд чисел с равным количеством положительных и отрицательных чисел и только одним нулем содержит нечетное число членов, тогда как т битов предполагают четное число битовых комбинаций. В любом случае будет либо одна лишняя битовая комбинация, либо одной комбинации не будет доставать. Лишнюю битовую комбинацию можно использовать для обозначения числа -0, для большого отрицательного числа или для чего-нибудь еще, но она всегда будет создавать неудобства.
Двоичная арифметика
Ниже приведена таблица сложения для двоичных чисел (рис. А.6).
Первое слогаемое 0 0 11
Второе слогаемое _±Р_ _t l _±2 _±1
Сумма 0 110
Перенос 0 0 0 1
Рис. А.6. Таблица сложения для двоичных чисел
Сложение двух двоичных чисел начинается с крайнего правого бита. Суммируются соответствующие биты в первом и втором слагаемом. Перенос совершается на одну позицию влево, как и в десятичной арифметике. В арифметике с дополнением до единицы перенос от сложения крайних левых битов прибавляется к крайнему правому биту. Этот процесс называется циклическим переносом. В арифметике с дополнением до двух перенос, полученный в результате сложения крайних левых битов, просто отбрасывается. Примеры арифметических действий над двоичными числами показаны на рис. А.7.
Если первое и второе слагаемые имеют противоположные знаки, ошибки переполнения не произойдет. Если они имеют одинаковые знаки, а результат — противоположный знак, значит, произошла ошибка переполнения и результат неверен. И в арифметике с дополнением до единицы, и в арифметике с дополнением до двух переполнение происходит тогда и только тогда, когда перенос в знаковый бит отличается от переноса из знакового бита. В большинстве компьютеров перенос из знакового бита сохраняется, но перенос в знаковый бит не виден из ответа, поэтому обычно вводится специальный бит переполнения.
Десятичные Дополнение Дополнение
числа до единицы ДОдвух
10 00001010 00001010
+ (-3) 11111100 11111101
+7
1 00000110 1 00000111
Перенос 1 Отбрасывается
00000111
Рис. А.7. Сложение в системах с дополнением до единицы и с дополнением до двух
Вопросы и задания
Преобразуйте следующие числа в двоичные: 1984, 4000, 8192.
Преобразуйте двоичное число 1001101001 в десятичную, восьмеричную и шестнадцатеричную системы.
Какие из следующих цепочек символов являются шестнадцатеричными числами? BED, CAB, DEAD, DECADE, ACCEDED, BAG, DAD.
Выразите десятичное число 100 в системах счисления с основаниями от 2 до 9.
Сколько различных положительных целых чисел можно выразить в к разрядах, используя числа с основанием системы счисления г?
Большинство людей с помощью пальцев на руках могут сосчитать до 10. Однако компьютерщики способны на большее. Представим, что каждый палец соответствует одному двоичному разряду. Пусть вытянутый палец означает 1, а загнутый — 0. До скольки мы можем сосчитать, используя пальцы обеих рук? А если рассматривать пальцы на руках и на ногах? Представим, что большой палец левой ноги — это знаковый бит для чисел с дополнением до двух. Сколько чисел можно выразить таким способом?
Выполните следующие вычисления над 8-битными числами с дополнением до двух:
00101101 11111111 00000000 11110111 +01101111 +11111111 -11111111 -11110111
Выполните те же вычисления в системе с дополнением до единицы.
Ниже приведены задачи на сложение 3-битных двоичных чисел в системе с дополнением до двух. Для каждой суммы установите:
а. Равен ли знаковый бит результата 1.
б. Равны ли младшие три бита 0.
в. Не произошло ли переполнения.
000 000 111 100 100 +001 +111 +110 +111 +100
Десятичные числа со знаком, состоящие из п разрядов, можно представить в га+1 разрядах без знака. Положительные числа содержат 0 в крайнем левом разряде. Отрицательные числа получаются путем вычитания каждого разряда из 9. Например, отрицательным числом от 014725 будет 985274. Такие числа называются числами с дополнением до девяти. Они аналогичны двоичным числам с дополнением до единицы. Выразите следующие числа в виде 3-разрядных чисел в системе с дополнением до девяти: 6, -2, 100, -14, -1, 0.
Сформулируйте правило для сложения чисел с дополнением до девяти, а затем выполните следующие вычисления:
0001 0001 9997 9241
+9999 +9998 +9996 +0802
Система с дополнением до десяти аналогична системе с дополнением до двух. Отрицательное число в системе с дополнением до десяти получается путем прибавления 1 к соответствующему числу с дополнением до девяти без учета переноса. По какому правилу происходит сложение в системе с дополнением до десяти?
Составьте таблицы умножения для чисел системы счисления с основанием 3.
Перемножьте двоичные числа 0111 и ООН.
Напишите программу, которая на входе получает десятичное число со знаком в виде цепочки ASCII, а на выходе выводит представление этого числа в восьмеричной, шестнадцатеричной и двоичной системе с дополнением до двух.
Напишите программу, которая на входе получает 2 цепочки из 32 символов ASCII, содержащие нули и единицы. Каждая цепочка представляет 32-битное двоичное число в системе с дополнением до двух. На выходе программа должна выдавать их сумму в виде цепочки из 32 символов ASCII, содержащей нули и единицы.
Приложение Б
Числа с плавающей точкой
Диапазон чисел, используемых при различных вычислениях, очень велик. Например, в астрономические вычисления может включаться масса электрона (9x1028 граммов) и масса Солнца (2x1033 граммов). Диапазон чисел здесь превышает 1060. Эти числа можно представить следующим образом:
0000000000000000000000000000000000.0000000000000000000000000009 2000000000000000000000000000000000.0000000000000000000000000000
При всех вычислениях должны сохраняться 34 разряда слева от десятичной запятой и 28 разрядов справа от нее. Это даст 62 значимых разряда в результатах. На бинарном компьютере можно использовать арифметику с многократно увеличенной точностью, чтобы обеспечить достаточную значимость. Однако мы не можем определить массу Солнца с точностью даже до пяти значимых разрядов, не говоря уже о 62. В действительности практически невозможно выполнить какие-либо измерения с точностью до 62 знаков. Можно было бы хранить все промежуточные результаты с точностью до 62 значимых разрядов, а перед выводом окончательных результатов отбрасывать 50 или 60 разрядов, но процессор и память тратили бы на это слишком много времени.
Нам нужна такая система для представления чисел, в которой диапазон выражаемых чисел не зависит от числа значимых разрядов. В этом приложении мы расскажем о такой системе. В ее основе лежит экспоненциальное представление чисел, которое применяется в физике, химии и машиностроении.
Принципы представления с плавающей точкой
Числа можно выражать в следующей общепринятой экспоненциальной форме: и=/хЮе
где / называется дробью, или мантиссой, а е (это положительное или отрицательное целое число) называется экспонентой. Компьютерная версия такого представления называется представлением с плавающей точкой. Ниже приведены примеры чисел в такой записи.
3,14 =0,314хЮ1=3,14х10° 0,000001 =0,1хЮ-5=1,0х10-6 1941 = 0,1941х104=1,941х103
Область значений определятся по числу разрядов в экспоненте, а точность определяется по числу разрядов в мантиссе. Существует несколько способов представления того или иного числа, поэтому одна форма выбирается в качестве стандартной. Чтобы изучить свойства такого способа представления, рассмотрим представление R с трехразрядной мантиссой со знаком в диапазоне 0,K|fj<l и двухразрядной экспонентой со знаком. Эти числа находятся в диапазоне от +0,100x10"" до +0,999x10+", то есть простираются почти на 199 значимых разрядов, хотя для записи числа требуется всего 5 разрядов и 2 знака.
Числа с плавающей точкой можно использовать для моделирования системы действительных чисел в математике, хотя здесь есть несколько существенных различий. На рис. Б.1 представлена ось действительных чисел. Она разбита на 7 областей:
Отрицательные числа меньше -0,999x10".
Отрицательные числа от -0,999x10" до -0,100x10"".
Отрицательные числа от -0,1 ООх 10"" до нуля.
Нуль.
Положительные числа от 0 до 0,1 ОСх 10"".
Положительные числа от 0,100x10"" до 0,999x10".
Положительные числа больше 0,999x10".
3 5
(Отрицательная Положительная 1 2П0теря значимости 4 потеря значимости g у
/ Положительная
Отрицательное Выражаемые переполнение отрицательные ч\ \
■ * Л 1 "-Чтултг*—1 / выраЖаемые --потеря--
1 -\ 1 JB—
1
отрицательные
числа
^Значимости
-10" -10'100 0 1 0"100 10"
Рис. Б. 1. Ось действительных чисел разбита на 7 областей
Первое отличие действительных чисел от чисел с плавающей точкой, которые
записываются тремя разрядами в мантиссе и двумя разрядами в экспоненте, состоит в том, что последние нельзя использовать для записи чисел из областей 1,3, 5 и 7. Если в результате арифметической операции получится число из области 1 или 7 (например, 1060х1060=10120), то произойдет ошибка переполнения и результат будет неверным. Причина — ограничение области значений чисел в данном представлении. Точно так же нельзя выразить результат из области 3 или 5. Такая ситуация называется ошибкой из-за потери значимости. Эта ошибка менее серьезна, чем ошибка переполнения, поскольку часто нуль является вполне удовлетворительным приближением для чисел из областей 3 или 5. Остаток счета в банке на 10"102 не сильно отличается от остатка счета 0.
Второе важное отличие чисел с плавающей запятой от действительных чисел — это их плотность. Между любыми двумя действительными числами хну существует другое действительное число независимо от того, насколько близко к у расположен х. Это свойство вытекает из того, что между любыми различными действительными числами хну существует действительное число z=(x+y)/2. Действительные числа формируют континуум.
Числа с плавающей точкой континуума не формируют. В двухзнаковой пятиразрядной системе можно выразить ровно 179100 положительных чисел, 179100 отрицательных чисел и 0 (который можно выразить разными способами), то есть всего 358201 чисел. Из бесконечного числа действительных чисел в диапазоне от -10+10° до +0,999x10" в этой системе можно выразить только 358201 число. На рис. Б.1 эти числа показаны точками. Результат вычислений может быть и другим числом, даже если он находится в области 2 или 6. Например, результат деления числа +0,100x103 на 3 нельзя выразить точно в нашей системе представления. Если полученное число нельзя выразить в используемой системе представления, нужно брать ближайшее число, которое представимо в этой системе. Такой процесс называется округлением.
Промежутки между смежными числами, которые можно выразить в представлении с плавающей запятой, во второй и шестой областях не постоянны. Промежуток между числами +0,998x10" и +0,999x10" гораздо больше промежутка между числами +0,998x10° и +0,999x10°. Однако если промежутки между числом и его соседом выразить как процентное отношение от этого числа, большой разницы в промежутках не будет. Другими словами, относительная погрешность, полученная при округлении, приблизительно равна и для малых, и для больших чисел.
Выводы, сделанные для системы представления с трехразрядной мантиссой
и двухразрядной экспонентой, справедливы и для других систем представления чисел. При изменении числа разрядов в мантиссе или экспоненте просто сдвигаются границы второй и шестой областей и меняется число представляемых единиц в этих областях. С увеличением числа разрядов в мантиссе увеличивается плотность элементов и, следовательно, точность приближений. С увеличением количества разрядов в экспоненте размер областей 2 и 6 увеличивается за счет уменьшения областей 1, 3, 5 и 7. В табл. Б.1 показаны приблизительные границы области 6 для десятичных чисел с плавающей точкой с различным количеством разрядов в мантиссе и экспоненте.
Вариант такого представления применяется в компьютерах. Основа возведения в степень — 2,4,8 или 16, но не 10. В этом случае мантисса состоит из цепочки двоичных, четверичных, восьмеричных и шеслнадцатеричных разрядов. Если крайний левый разряд равен 0, все разряды можно сместить на один влево, а экспоненту уменьшить на 1, не меняя при этом значения числа (исключение составляет ситуация потери значимости). Мантисса с ненулевым крайним левым разрядом называется нормализованной.
Нормализованные числа обычно предпочитаются ненормализованным, поскольку существует только одна нормализованная форма, а ненормализованных форм может быть много. Примеры нормализованных чисел с плавающей точкой даны на рис. Б.2. для двух основ возведения в степень. В этих примерах показана 16-битная мантисса (включая знаковый бит) и 7-битная экспонента. Запятая находится слева от крайнего левого бита мантиссы и справа от экспоненты.
Пример 1: Основа возведения в степень 2
К 2"2 2~* 2"6 2"8 2"10 2'12 2'14 2"16