Без компьютера ПО работать не может. Для понимания того, как разработать хорошую программу, необходимо понимать, как устроено "железо", на котором эта программа работает. В этой лекции рассмотрим необходимые нам основы устройства аппаратуры, детализируя элементы рисунка, ранее уже показанного:
(рис 1.1) Компоненты компьютерной системы
Начнем с рассмотрения феномена роста характеристик компьютера: объема информации, представленной данными компьютера, скорости доступа к этим данным, скорости выполняемых операций над данными.
Мы сознательно ограничимся лишь теми свойствами, которые необходимы программистам и важны для понимания тем, изучаемых в этом курсе. В какой-то момент вы наверняка прослушаете курс, такой как "Введение в архитектуру компьютеров", который даст вам более глубокие знания по устройству компьютеров.
Данные, хранимые в памяти компьютера, представляют информацию самой разной природы: анкеты работников, фотографии, музыкальные произведения, книги с их разнообразием форматирования, ну и, наконец, численные данные, результаты научных расчетов. Не забудем и о программах, хранимых в памяти. Необходим некоторый общий прием, позволяющий сохранять информацию и должным образом интерпретировать соответствующие данные.
Двоичная система счисления сделала возможным компьютерную революцию, поскольку открыла простой и общий способ представления информации.
В основе двоичной системы лежат два значения (отсюда "двоичная"). Сами значения не несут особого смысла и их можно называть по-разному: Белые и Черные, Чук и Гек или Изида и Озирис. Имеет значение лишь то, что они различны. Фактически мы будем называть их 0 и 1.
Термин "бит" означает математическую переменную, чьи возможные значения как раз и есть 0 и 1. Он придуман инженерами в конце 1940-го года как сокращение двух слов "
(рис 1.2) Бит (техническая версия)
Бит также обозначает техническое устройство с двумя возможными состояниями, следовательно, способное быть представленным математическим битом, стоит только договориться, что есть 0, а что 1. Флажок на кабинете доктора, который может находиться в одном из состояний: "доктор свободен" и "доктор занят" – является битом. Для компьютерной индустрии важную роль играют "электронные" биты, где два состояния соответствуют двум разным напряжениям или намагниченным и размагниченным участкам, как на магнитной ленте или диске.
Причина, по которой двоичная система так хорошо себя зарекомендовала в том, что электроника сделала возможным:
Эти свойства обеспечили успех двоичной системе. Некоторые первые компьютеры использовали десятичную систему. Тогда компьютеры рассматривались как машины для вычислений, и казалось естественным для вычислений применять привычную для людей десятичную систему, пришедшую еще с тех давних времен, когда для счета использовались пальцы рук, а пальцев было 10, а не 8, и не 16 (само слово digit – "цифра" – произошло от латинского слова
Как это касается нас, программистов? В большей степени, чем вы могли подумать. Действительно, программы мы пишем на приятном для нас языке программирования, где попрежнему используем привычную нотацию для записи чисел, например, 3.1415926524. Но, как только приходится рассматривать, как данные хранятся в памяти, сразу же приходится учитывать, что только двоичная система является родной для компьютеров, даже если запись числа выглядит непривычной для людей. Давайте познакомимся с некоторыми свойствами двоичной системы
Если информация, с которой вам приходится иметь дело, – нечто большее, чем результаты игры в "орёл или решка", то двух значений явно маловато. Базисные комбинации, которыми кодируются конечное множество данных любого размера, являются:
Сколько различных значений может задавать последовательность битов? Один бит позволяет задавать два значения: 0 и 1. С двумя битами возможностей становится уже четыре:
В общем случае, последовательность из n битов для любого целого n > 0 задает $$2^n$$ значений.
Для базисных единиц:
Если, например, мы хотим хранить текст, то можно использовать один байт для хранения каждого символа текста. Может показаться, что 256 различных символов избыточно много для представления текста, но фактически это как раз то, что нужно, поскольку помимо 26 строчных и 26 заглавных букв латиницы необходимы цифры, специальные символы клавиатуры компьютера (такие как ~, !, @ и другие ), акцентированные символы для букв западных языков ($$\acute e$$, $$\ddot A$$) и так далее. Стандартное кодирование всех этих символов 8-битовым представлением известно как расширенный код ASCII (American Standard Code for Information Interchange). Оригинальный код ASCII использовал только 7 битов (128 значений) и не поддерживал акцентированные буквы.
Расширенный ASCII код имеет несколько вариантов, наиболее популярный известен как стандарт ISO 8859-1, покрывающий символы наиболее распространенных европейских языков.
Для кириллицы или иероглифов китайского языка расширенного ASCII недостаточно. Стандартом является код Unicode, использующий 4 байта для представления одного символа, что вполне достаточно для всех наиболее важных письменных языков.
Для представления символьных сущностей в CHARACTER_8 для расширенного ASCII или CHARACTER_32 для Unicode. Общим решением является применение типа CHARACTER, который приводится к тому или другому типу в зависимости от конфигурационных установок. С этим мы встретимся в примерах, включающих символьные типы.
Для численной информации общеупотребительной практикой является использование слова для хранения целых значений. Математическое множество целых бесконечно, но INTEGER. Целые характеризует и тип CHARACTER. В установках конфигурации целочисленный тип может быть определен как INTEGER_32 или INTEGER_64. Доступны в программах и типы INTEGER_8 и INTEGER_16. Если приходится иметь дело только с неотрицательными целыми, то можно использовать тип NATURAL с его вариантами от NATURAL_8 до NATURAL_64.
Для представления чисел, отличных от целых, – рациональных, таких как 3/2, или иррациональных (вещественных), таких как π, используются типы REAL_32, REAL_64. Опять-таки можно использовать общий настраиваемый тип REAL. В отличие от целых чисел для представления вещественных значений обычно $$2^{32}$$ значений недостаточно, поэтому чаще для представления вещественных чисел задействуется тип REAL_64.
Адресом элемента данных называется его позиция в пронумерованной памяти компьютера. Примеры типов данных: CHARACTER_8, INTEGER_32 и REAL_64 показывают, что элементы данных могут быть различных размеров (1, 4 или 8 байтов). Для обеспечения унификации в адресации памяти за единицу памяти принимается байт, а начальный адрес равен нулю. Так, если память начинается с размещения 1000 значений типа INTEGER_64 на компьютере с 8-байтными словами, то первый свободный элемент памяти имеет адрес 8000.
Уже по одной той причине, что n битов могут хранить $$2^n$$ значений, степени двойки важны для двоичной системы. Ниже перечислены некоторые элементы этой последовательности.
Программистам следует помнить первые 10 элементов, порядок и величину других, а также используемые аббревиатуры (кило и другие).
В обычном, десятичном способе счета, аббревиатура "кило" представляет степень 10, точнее, $$10^3$$, которая служит естественной мерой вещей. На рынке мы покупаем один килограмм вишен, равный тысяче – $$10^3$$ – грамм, за один миллион – $$10^6$$ – долларов вы едва ли купите приличный дом в Южной Калифорнии, один миллиард – $$10^9$$ – долларов может продлить на несколько часов существование банка, падающего во время кризиса.
| n | $$2^n$$ | Аппроксимация степенями 10 | Общепринятое имя (аббревиатура) | Официальное название (аббревиатура) |
|---|---|---|---|---|
| 0 | 0 | |||
| 1 | 1 | |||
| 2 | 4 | |||
| 3 | 8 | |||
| 4 | 16 | |||
| 5 | 32 | |||
| 6 | 64 | |||
| 7 | 128 | |||
| 8 | 256 | |||
| 9 | 512 | |||
| 10 | 1024 | 103 (тысяча) | Kilo (K) Кило | |
| 16 | 65536 | |||
| 20 | 1 048 576 | 106 (миллион) | Mega (M) Мега | |
| 30 | 1 073 741 824 | 109 (миллиард) | Giga (G) Гига | |
| 32 | 4 294 967 296 | 4*109 (4 миллиарда) | ||
| 40 | 1 099 511 627 776 | 1012(триллион) | ||
| 50 | 1 125 899 906 842 624 | 1015 | ||
| 64 | 18 446 744 073 709 551 616 | 1.8 x 1019 |
Эти единицы применимы и к другим измерениям, связанным с компьютерами, не только по отношению к памяти.
Компьютерные инженеры предпочитают использовать степени двойки для выражения размеров памяти. Здесь и начинается путаница. Точнее, она началась, когда некто (имя его не сохранилось в истории) заметил, что два в десятой степени равно 1024, что примерно равно $$10^3$$ – тысяче, и как следствие принял блестящее решение использовать десятичные аббревиатуры – кило для почти-тысячи ($$2^{10}$$), мега для почти-миллиона ($$2^{20}$$), гига для почти-миллиарда ($$2^{30}$$). С ростом степеней аппроксимация становится все хуже, как видно из таблицы.
Двоичная интерпретация тысячи наряду с традиционной иногда приводит к неразберихе, особенно если обе интерпретации применяются совместно. На вышедших уже из употребления флоппи-дисках их емкость указывалась как 1.44 МВ, но означало это 1440 (десятичная интерпретация) раз по 1024 (двоичная интерпретация) байтов.
Чтобы покончить с беспорядком, соответствующая организация, занимающаяся стандартами, предписала применять десятичные аббревиатуры – кило и другие – для степеней 10, а для степеней двойки применять другие аббревиатуры – киби, меби, гиби, приведенные в последнем столбце таблицы. Эти имена не получили широкого распространения.
Во избежание недоразумений помните, что двоичная интерпретация применяется только для измерения памяти, в остальных случаях применяется десятичная. Так что 1-
Представление целых чисел в компьютере хорошо тем, что оно точно. Действия над целыми выполняются точно так же, как это принято в математике. Плохо лишь то, что целые в компьютере составляют конечное подмножество, в отличие от математики. Для 64-битного компьютера множество целых определяется диапазоном: $$(-2^{63}, +2^{63} -1)$$.
Для допустимых значений целых точным является не только их представление – результаты операций над целыми дают те же значения, что и их математические двойники, за исключением тех случаев, когда значения результатов выходят за пределы, допустимые для целых. Написав a + b для целых a и b, получим корректный результат, если он не больше максимального или не меньше минимального значения. Выход результата за допустимые пределы известен как "арифметическое переполнение".
Представление вещественных чисел – REAL-тип, как он называется в
Эти свойства отражаются в программе тремя способами.
Об этом непрестанно приходится заботиться в "численных расчетах", используемых не только в научных или инженерных проектах, но и, например, в финансовом моделировании, где также применяются вещественные числа и численные алгоритмы. Ошибка в каждой операции незначительна и может быть совсем не страшной для результата. Плохо, когда эта ошибка накапливается в процессе выполнения миллионов и миллиардов операций, что в конечном итоге может привести к серьезным ошибочным следствиям и искажению результатов.
Численное программирование требует особых подходов, позволяющих избегать подобных неприятностей. Рассмотрим простой пример – в одной из последующих лекций мы встретимся с методом интегрирования, приближенно вычисляющим значение определенного интеграла:
$$\int\limits_{low}^{high}f(x)dx\approx\sum\limits_{i=0}^{n-1}f(low+i^*step)^*step,\qquad\text{где\;}n=\frac{high-low}{step}$$
(рис 1.3) Вычисление интеграла методом прямоугольников (конечная аппроксимация)
Алгоритм может быть реализован циклом. Покажем сейчас фрагмент алгоритма, а его полная версия появится позже. Во фрагменте используется локальная переменная x типа REAL:
from x := low until x >= high loop
Result := Result + f.item ([x]) — f.item ([x])дает значение f(x).
x:=x+step
end
В принципе, все работает, но обратите внимание на то, как x обновляется на каждой итерации. На каждом шаге добавляется переменная step, что приводит к появлению незначительной ошибки, но от итерации к итерации эта ошибка накапливается и может стать причиной существенного отклонения в процессе общего вычисления.
Некоторые программисты используют форму вычислений, подобную [1.1], полагая, что исключение умножения ускорит вычисление. Это, может быть, и справедливо, но эффект от накопления погрешности опасен. Разумная реализация вышеприведенной формулы использует умножение:
from x := low until x >= high loop
Result := Result + f.item ([x]) — f.item ([x]) дает значение f(x).
i := i + 1 ; x := low + (i * step) - [2]
end
Прямое вычисление x на каждом шаге позволяет избежать накопления погрешности. В худшем случае мы получаем ошибку, возникающую в результате выполнения одного сложения и одного умножения. Вот общий принцип:
При разработке ПО, включающего действия с вещественными числами, учитывайте приближенный характер вычислений. При проектировании алгоритма избегайте накопления вычислительных погрешностей.
В краткой форме этот совет звучит так: изучайте вычислительную математику – часть прикладной математики, имеющей дело с численными вычислениями в противоположность символьным вычислениям. В этом курсе подробно рассматриваются свойства и ограничения представления чисел и операций, выполняемых на компьютере.
В ненадежной стране численного программирования существует надежное место: стандартизация. Ранее каждая компьютерная система имела собственную систему представления чисел и операций, из-за чего нельзя было гарантировать, что математически корректный алгоритм будет корректно работать на компьютере. Ситуация исправилась с введением стандарта IEEE на архитектуру арифметики с плавающей точкой. Этот стандарт определяет единые рамки для системы чисел компьютеров как с 32-битной, так и с 64-битной архитектурой. Большинство современных компьютеров соответствуют этому стандарту. Так что, если нужно проверить, что алгоритм не является причиной появления неприемлемых вычислительных погрешностей, то такую работу нужно проделать только однажды, полагаясь на стандарт.
В памяти мы храним данные и извлекаем их по мере необходимости. На нижнем уровне представления в памяти хранятся символы, но для наших программ память представляется хранилищем, в которое можно помещать и получать объекты. Давайте разберемся, что память может делать в наших интересах.
На первом рисунке этой лекции для изображения памяти используются два различных символа, отражающие два вида памяти с различными требованиями.
Зачем нужна кратковременная память? Не было бы проще, чтобы все данные хранились вечно по умолчанию? Есть две причины, по которым это не делается, – технологическая и экономическая. Память, доступная процессорам во время выполнения, должна быть очень быстрой и, как следствие, является дорогой.
Слова: приемлемая или медленная скорость, большие или малые объемы, дорогая и дешевая – нельзя рассматривать вне контекста. Вот некоторые оценки (на момент написания оригинала курса).
Как видите, время доступа к оперативной и постоянной памяти существенно различается, что непосредственно значимо для программиста. Программы, которые обрабатывают большие объемы данных, не могут игнорировать проблемы распределения и обмена данными между постоянной и оперативной памятью. Следует тщательно управлять временем передачи данных, чтобы сохранить приемлемое время выполнения приложения.
Как отмечалось, операции процессора получают доступ к оперативной памяти. Этот ключевой компонент вычислений имеет несколько имен:
На ниже представленной фотографии показана главная память – чип (микросхема), на два GB, изготовленная по технологии "DDR2_800", обеспечивающая время цикла в 5 наносекунд с пиковой
(рис 1.4) Микросхема с оперативной памятью
Существует два вида постоянной памяти.
Наиболее общей формой вторичной памяти является диск. Более корректный термин – дисковод или дисковое устройство, включающее несколько дисков на одном стержне, вращающихся в процессе работы со скоростью от 4000 до 12000 оборотов за секунду. Данные считываются или записываются специальными головками, которые могут перемещаться над рабочей поверхностью вращающихся дисков. Значение считываемых или записываемых битов зависит от намагничивания небольших областей диска. Если выключить энергию, то диск вращаться не будет и операции записи и чтения становятся невозможными, но намагничивание остается, что и гарантирует сохранность данных на диске.
(рис 1.5) Дисковод
Устройство, показанное на рисунке, имеет два диска, хотя вы видите только один. Оно может хранить 8 гигабайт (если это вас не впечатляет, то скажу, что это модель 1999 года, но я пока не намерен разобрать свой новейший дисковод, чтобы показать вам его фотографию. В магазине на момент написания этого текста нетрудно приобрести диск на несколько сот гигабайт стоимостью в 50$, терабайтные диски также вполне доступны). Дисковод на рисунке обеспечивал скорость вращения 5400 оборотов в секунду со временем доступа в 9 миллисекунд и максимальной скоростью передачи данных в 33 мегабайта за секунду. Время доступа и передачи указаны приблизительно, поскольку важной характеристикой является
Пока еще диски остаются доминирующим видом постоянной памяти, но уже появился серьезный конкурент в виде
Недостатком флеш-памяти является то, что она поддерживает только ограниченное число перезаписываний, хотя уже есть способы, позволяющие справиться с этим ограничением. Уже к концу 2008 года
Портативный компьютер – лэптоп, MIT Media Lab's XO
(рис 1.6) Лэптор OLPC работающий с EiffelStudio
Следуя традициям бумажных лент, упомянутых ранее, некоторые устройства памяти являются съемными. Среди наиболее популярных являются USB-устройства, называемые так потому, что они связаны со стандартизованной последовательной шиной для передачи данных (Universal
(рис 1.7) "Флэшка" и USB-диск
Операциям, таким как сложение, требуются операнды, которые чаще всего должны находиться в специальных элементах памяти, называемых регистрами. Большинство архитектур имеют не более нескольких десятков регистров. Для выполнения операции над операндами, хранимыми в обычной оперативной памяти, например, для a и b в присваивании
a := a + b
необходимо выполнить следующие действия: прочесть значения a и b из оперативной памяти и записать их в соответствующие регистры, выполнить операцию над ними, в данном случае сложение, из регистра результата записать в оперативную память в область, отведенную для a.
Как результат, базисная
Типичный порядок времени записи к моменту написания этого текста составлял: 0,5 наносекунды, 50 наносекунд и 5 миллисекунд. Цифры могут со временем изменяться довольно быстро, но порядок отношения обычно остается. Рассмотрим в частности отношение между двумя последними видами памяти, примерно равное 100000. Спроецируем эти отношения на человеческий
Для компьютера все цифры нужно делить на 20 000 000, но соотношение остается тем же самым. Политика управления памятью – что хранить в оперативной памяти, что на диске – существенно влияет на производительность.
На практике различие между главной памятью и дисковой затушевывается ввиду доступности виртуальной памяти, предоставляемой операционной системой. В результате можно считать, что основной памяти значительно больше той реальной памяти, за которую мы заплатили.
Виртуальная память предоставляет программисту адресное пространство, значительно превосходящее физическое адресное пространство. Система управления памятью, стоящая за сценой, обеспечивает подкачку нужных данных с диска, когда они требуются, но не находятся в первичной памяти. Технически вся память разделяется на единицы, называемые страницами, каждая обычно размером в несколько килобайт. Фактический доступ к данным требует, чтобы они были в ядре, если это не так, то возникает ошибка доступа к странице, система виртуальной памяти в этом случае загружает соответствующую страницу из диска – эта операция называется "загрузка страницы" (page in). При загрузке страницы может возникнуть ситуация, когда
Причина, по которой эта политика может быть эффективной, состоит в том, что в периоды интенсивной работы, обрабатывая циклы, программа использует небольшое подмножество – рабочее подмножество – из всего адресного пространства. Только в экстремальных ситуациях такая стратегия приводит к
Виртуальная память также облегчает режим разделения времени, когда компьютер выполняет одновременно несколько программ. Каждая программа в этом случае полагает, что у нее собственное адресное пространство, которое в реальности отображается на множество страниц, не пересекающихся в ядре, и на диске с адресными пространствами других программ.
Все это, конечно, затрудняет оценку производительности наших программ, так как реально не известно, в какой момент может возникнуть ситуация ошибки доступа к странице. Это похоже на ситуацию с нашим мифическим рабочим, который, обратившись в хранилище за заготовкой, вдруг обнаруживает, что оно пусто и требуются сутки, чтобы доставить деталь. Однако в большинстве практических случаев эти соображения можно игнорировать и полагать, что у вас реально есть, скажем, 20 GB, когда физически их только 4.
В обычных ситуациях командами, с которыми имеет дело программист, являются операторы языка программирования. Полезно, однако, понимать, в какие фактические команды компьютера транслируются операторы языка программирования – те команды, которые только и может выполнять компьютер.
Типичная команда компьютера хранится в слове памяти, иногда в нескольких словах. Она содержит код команды, определяющий ее тип – операцию, выполняемую командой, а также ноль или более требуемых аргументов, которые могут быть адресами или значениями. Для примера рассмотрим команду компьютера с архитектурой 32-битного Power PC. Команда занимает слово (32 бита) с нумерацией битов, начинающейся с нуля:
Код команды является комбинацией первичного кода 31 (двоичное 11111), заданного битами от 0 до 5, и вторичного кода 266 (двоичное 100001010) в битах от 22 до 31. Результат помещается в регистр 5 (двоичный код 101), а операнды читаются из регистров 3 и 4.
Компьютеры обладают командами трех разных типов.
Каждая команда имеет свой код, такой, как 31 в примере. Более удобно ссылаться на код команды, используя мнемонику. Для Power PC мнемоника команды сложения с кодом 31 – add. Представление программы в машинных командах не является удобной формой для общения с человеком. Язык ассемблера обеспечивает приемлемую, доступную для восприятия человеком форму представления таких программ. На языке ассемблера Power PC рассмотренная нами команда может быть записана так:
add r5, r3, r4
Язык ассемблера заимствовал у языка программирования возможность применения символических имен: имя регистра, такое как r5, имя команды, такое как add, – так же как использование идентификаторов для адресов и констант. Ответственность за трансляцию ассемблерного кода в машинный код ложится на программную систему, называемую ассемблером, которая представляет простейший вид компилятора. Трансляция облегчается тем, что для языка ассемблера выполняется соответствие "один в один" – одна команда ассемблера, как правило, транслируется в одну машинную команду компьютера. Операторы языка программирования задают куда более высокий уровень абстракции. Еще одна особенность ассемблера состоит в том, что для каждой архитектуры компьютера есть свой язык ассемблера, связанный с этой архитектурой. Современные языки программирования являются переносимыми (независимыми от платформы).
Не будучи в полном смысле этого термина языком программирования, язык ассемблера позволяет преодолеть наиболее утомительные моменты, связанные с написанием и чтением программ в машинном коде.
Что должно остаться в памяти после всех этих обсуждений? Тот провал между командами, которые может выполнять компьютер, и теми задачами, которые мы хотим решать с помощью компьютера. Это доказывает важность языков программирования и объясняет сложность разработки ПО.
При рассмотрении влияния производительности аппаратуры на программирование нельзя не учитывать ось времени. Чрезвычайные успехи информационных технологий идут рука об руку с прогрессом в разработке аппаратуры. В 1965 году появилась статья Гордона Е. Мура (Gordon Moore), сооснователя корпорации Intel, в которой он в чрезвычайно яркой форме описал этот феномен. Наибольшую известность получил так называемый "закон Мура", формулируемый следующим образом: "Число компонентов, размещаемых на интегральной схеме при сохранении постоянной стоимости, удваивается каждые 18 месяцев" (заметим, что сам Мур говорил о двух годах, но потом эта константа была уменьшена по результатам наблюдений до полутора лет). Есть несколько вариантов этого закона, но все они говорят об экспоненциальном росте. Эти утверждения не являются в полном смысле этого слова "законами", такими, как законы, открытые Максвеллом, Ньютоном или Эйнштейном. Это наблюдения о прогрессе индустрии в течение нескольких десятилетий – наблюдения, которые оказались пророческими и до сих пор продолжают быть применимыми. Удивительно, что нет никакой другой области человеческой деятельности, хоть сколько-либо напоминающей столь удивительную скорость роста. Автомобили сегодня не в тысячу раз быстрее, чем 20 лет назад.
В то время как закон, сформулированный Муром, говорил о плотности размещения элементов на интегральной схеме, а тем самым, и о скорости обработки, варианты этого закона говорили о том же феномене, справедливом и для многих других аспектов, – размере памяти, скорости доступа, стоимости различных устройств. Я помню, что был поражен (немногим более десятилетия назад), когда стоимость мегабайта дисковой памяти опустилась ниже одного доллара. Сегодня не многие готовы платить доллар за гигабайт.
Основной закон Мура не может быть беспредельно устойчивым, поскольку размещение все большего числа элементов в ограниченном пространстве приводит к росту излучаемого тепла, а кроме того, есть чисто физические пределы скорости распространения сигнала. В результате, как говорят некоторые компьютерные архитекторы: "число людей, объявляющих, что закон Мура перестал действовать, удваивается каждые полтора года". Фактически, закон продолжает действовать, но на новом уровне. Решение дают параллельные вычисления. Не нужно создавать процессор, работающий еще быстрее. Можно создать несколько процессоров, работающих параллельно. Многоядерная архитектура компьютеров становится общепризнанной. Проблема в том, что пока нет удовлетворительного решения, позволяющего программистам использовать все преимущества параллельной архитектуры. Но ни слова больше на эту тему. Эта проблема требует отдельного курса.
Стандарт IEEE для арифметики с плавающей точкой, доступный по адресу: ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=4610935
John Markoff: .
John L. Hennessy and David Patterson; Computer Architecture, Fourth Edition: A Quantitative
(рис 1.8) Дэвид Паттерсон (2007)
| Address | Адрес | Bit | Бит |
| Byte | Байт | Core | Ядро (Первичная память) |
| Disk | Диск | Flash memory | Флеш-память |
| Giga | Гига | Hexadecimal | Шестнадцатеричный |
| Kilo | Кило | Mega | Мега |
| Moore's law | Закон Мура | Multicore (and manycore) | Многоядерный |
| Octal | Восьмеричный | Persistent | Живучий (сохраняемый) |
| RAM | RAM-память прямого доступа | Read | Чтение |
| Register | Регистр | Removable memory | Сменная память |
| Primary memory | Первичная (оперативная) память | Secondary memory | Вторичная память |
| Storage | Хранилище | Transient | Кратковременный |
| Word | Слово | Write | Запись |
Дайте точные определения терминам словаря.
Добавьте новые термины в карту концепций, построенную в предыдущих лекциях.
Сколько байтов в:
Каталог рекламирует лэптоп с 1,3 GB памяти.
Необходимо передать 128 MB данных, используя 128 Mb модем, работающий с максимальной скоростью. Сколько секунд это займет?
Восьмеричная арифметика использует систему с основанием 8 и цифрами от 0 до 7.
Шестнадцатеричная арифметика использует систему с основанием 16 и цифрами от 0 до 9 и A до F.
Без компьютера ПО работать не может. Для понимания того, как разработать хорошую программу, необходимо понимать, как устроено "железо", на котором эта программа работает. В этой лекции рассмотрим необходимые нам основы устройства аппаратуры, детализируя элементы рисунка, ранее уже показанного:
(рис 1.1) Компоненты компьютерной системы
Начнем с рассмотрения феномена роста характеристик компьютера: объема информации, представленной данными компьютера, скорости доступа к этим данным, скорости выполняемых операций над данными.
Мы сознательно ограничимся лишь теми свойствами, которые необходимы программистам и важны для понимания тем, изучаемых в этом курсе. В какой-то момент вы наверняка прослушаете курс, такой как "Введение в архитектуру компьютеров", который даст вам более глубокие знания по устройству компьютеров.
Данные, хранимые в памяти компьютера, представляют информацию самой разной природы: анкеты работников, фотографии, музыкальные произведения, книги с их разнообразием форматирования, ну и, наконец, численные данные, результаты научных расчетов. Не забудем и о программах, хранимых в памяти. Необходим некоторый общий прием, позволяющий сохранять информацию и должным образом интерпретировать соответствующие данные.
Двоичная система счисления сделала возможным компьютерную революцию, поскольку открыла простой и общий способ представления информации.
В основе двоичной системы лежат два значения (отсюда "двоичная"). Сами значения не несут особого смысла и их можно называть по-разному: Белые и Черные, Чук и Гек или Изида и Озирис. Имеет значение лишь то, что они различны. Фактически мы будем называть их 0 и 1.
Термин "бит" означает математическую переменную, чьи возможные значения как раз и есть 0 и 1. Он придуман инженерами в конце 1940-го года как сокращение двух слов "
(рис 1.2) Бит (техническая версия)
Бит также обозначает техническое устройство с двумя возможными состояниями, следовательно, способное быть представленным математическим битом, стоит только договориться, что есть 0, а что 1. Флажок на кабинете доктора, который может находиться в одном из состояний: "доктор свободен" и "доктор занят" – является битом. Для компьютерной индустрии важную роль играют "электронные" биты, где два состояния соответствуют двум разным напряжениям или намагниченным и размагниченным участкам, как на магнитной ленте или диске.
Причина, по которой двоичная система так хорошо себя зарекомендовала в том, что электроника сделала возможным:
Эти свойства обеспечили успех двоичной системе. Некоторые первые компьютеры использовали десятичную систему. Тогда компьютеры рассматривались как машины для вычислений, и казалось естественным для вычислений применять привычную для людей десятичную систему, пришедшую еще с тех давних времен, когда для счета использовались пальцы рук, а пальцев было 10, а не 8, и не 16 (само слово digit – "цифра" – произошло от латинского слова
Как это касается нас, программистов? В большей степени, чем вы могли подумать. Действительно, программы мы пишем на приятном для нас языке программирования, где попрежнему используем привычную нотацию для записи чисел, например, 3.1415926524. Но, как только приходится рассматривать, как данные хранятся в памяти, сразу же приходится учитывать, что только двоичная система является родной для компьютеров, даже если запись числа выглядит непривычной для людей. Давайте познакомимся с некоторыми свойствами двоичной системы
Если информация, с которой вам приходится иметь дело, – нечто большее, чем результаты игры в "орёл или решка", то двух значений явно маловато. Базисные комбинации, которыми кодируются конечное множество данных любого размера, являются:
Сколько различных значений может задавать последовательность битов? Один бит позволяет задавать два значения: 0 и 1. С двумя битами возможностей становится уже четыре:
В общем случае, последовательность из n битов для любого целого n > 0 задает $$2^n$$ значений.
Для базисных единиц:
Если, например, мы хотим хранить текст, то можно использовать один байт для хранения каждого символа текста. Может показаться, что 256 различных символов избыточно много для представления текста, но фактически это как раз то, что нужно, поскольку помимо 26 строчных и 26 заглавных букв латиницы необходимы цифры, специальные символы клавиатуры компьютера (такие как ~, !, @ и другие ), акцентированные символы для букв западных языков ($$\acute e$$, $$\ddot A$$) и так далее. Стандартное кодирование всех этих символов 8-битовым представлением известно как расширенный код ASCII (American Standard Code for Information Interchange). Оригинальный код ASCII использовал только 7 битов (128 значений) и не поддерживал акцентированные буквы.
Расширенный ASCII код имеет несколько вариантов, наиболее популярный известен как стандарт ISO 8859-1, покрывающий символы наиболее распространенных европейских языков.
Для кириллицы или иероглифов китайского языка расширенного ASCII недостаточно. Стандартом является код Unicode, использующий 4 байта для представления одного символа, что вполне достаточно для всех наиболее важных письменных языков.
Для представления символьных сущностей в CHARACTER_8 для расширенного ASCII или CHARACTER_32 для Unicode. Общим решением является применение типа CHARACTER, который приводится к тому или другому типу в зависимости от конфигурационных установок. С этим мы встретимся в примерах, включающих символьные типы.
Для численной информации общеупотребительной практикой является использование слова для хранения целых значений. Математическое множество целых бесконечно, но INTEGER. Целые характеризует и тип CHARACTER. В установках конфигурации целочисленный тип может быть определен как INTEGER_32 или INTEGER_64. Доступны в программах и типы INTEGER_8 и INTEGER_16. Если приходится иметь дело только с неотрицательными целыми, то можно использовать тип NATURAL с его вариантами от NATURAL_8 до NATURAL_64.
Для представления чисел, отличных от целых, – рациональных, таких как 3/2, или иррациональных (вещественных), таких как π, используются типы REAL_32, REAL_64. Опять-таки можно использовать общий настраиваемый тип REAL. В отличие от целых чисел для представления вещественных значений обычно $$2^{32}$$ значений недостаточно, поэтому чаще для представления вещественных чисел задействуется тип REAL_64.
Адресом элемента данных называется его позиция в пронумерованной памяти компьютера. Примеры типов данных: CHARACTER_8, INTEGER_32 и REAL_64 показывают, что элементы данных могут быть различных размеров (1, 4 или 8 байтов). Для обеспечения унификации в адресации памяти за единицу памяти принимается байт, а начальный адрес равен нулю. Так, если память начинается с размещения 1000 значений типа INTEGER_64 на компьютере с 8-байтными словами, то первый свободный элемент памяти имеет адрес 8000.
Уже по одной той причине, что n битов могут хранить $$2^n$$ значений, степени двойки важны для двоичной системы. Ниже перечислены некоторые элементы этой последовательности.
Программистам следует помнить первые 10 элементов, порядок и величину других, а также используемые аббревиатуры (кило и другие).
В обычном, десятичном способе счета, аббревиатура "кило" представляет степень 10, точнее, $$10^3$$, которая служит естественной мерой вещей. На рынке мы покупаем один килограмм вишен, равный тысяче – $$10^3$$ – грамм, за один миллион – $$10^6$$ – долларов вы едва ли купите приличный дом в Южной Калифорнии, один миллиард – $$10^9$$ – долларов может продлить на несколько часов существование банка, падающего во время кризиса.
| n | $$2^n$$ | Аппроксимация степенями 10 | Общепринятое имя (аббревиатура) | Официальное название (аббревиатура) |
|---|---|---|---|---|
| 0 | 0 | |||
| 1 | 1 | |||
| 2 | 4 | |||
| 3 | 8 | |||
| 4 | 16 | |||
| 5 | 32 | |||
| 6 | 64 | |||
| 7 | 128 | |||
| 8 | 256 | |||
| 9 | 512 | |||
| 10 | 1024 | 103 (тысяча) | Kilo (K) Кило | |
| 16 | 65536 | |||
| 20 | 1 048 576 | 106 (миллион) | Mega (M) Мега | |
| 30 | 1 073 741 824 | 109 (миллиард) | Giga (G) Гига | |
| 32 | 4 294 967 296 | 4*109 (4 миллиарда) | ||
| 40 | 1 099 511 627 776 | 1012(триллион) | ||
| 50 | 1 125 899 906 842 624 | 1015 | ||
| 64 | 18 446 744 073 709 551 616 | 1.8 x 1019 |
Эти единицы применимы и к другим измерениям, связанным с компьютерами, не только по отношению к памяти.
Компьютерные инженеры предпочитают использовать степени двойки для выражения размеров памяти. Здесь и начинается путаница. Точнее, она началась, когда некто (имя его не сохранилось в истории) заметил, что два в десятой степени равно 1024, что примерно равно $$10^3$$ – тысяче, и как следствие принял блестящее решение использовать десятичные аббревиатуры – кило для почти-тысячи ($$2^{10}$$), мега для почти-миллиона ($$2^{20}$$), гига для почти-миллиарда ($$2^{30}$$). С ростом степеней аппроксимация становится все хуже, как видно из таблицы.
Двоичная интерпретация тысячи наряду с традиционной иногда приводит к неразберихе, особенно если обе интерпретации применяются совместно. На вышедших уже из употребления флоппи-дисках их емкость указывалась как 1.44 МВ, но означало это 1440 (десятичная интерпретация) раз по 1024 (двоичная интерпретация) байтов.
Чтобы покончить с беспорядком, соответствующая организация, занимающаяся стандартами, предписала применять десятичные аббревиатуры – кило и другие – для степеней 10, а для степеней двойки применять другие аббревиатуры – киби, меби, гиби, приведенные в последнем столбце таблицы. Эти имена не получили широкого распространения.
Во избежание недоразумений помните, что двоичная интерпретация применяется только для измерения памяти, в остальных случаях применяется десятичная. Так что 1-
Представление целых чисел в компьютере хорошо тем, что оно точно. Действия над целыми выполняются точно так же, как это принято в математике. Плохо лишь то, что целые в компьютере составляют конечное подмножество, в отличие от математики. Для 64-битного компьютера множество целых определяется диапазоном: $$(-2^{63}, +2^{63} -1)$$.
Для допустимых значений целых точным является не только их представление – результаты операций над целыми дают те же значения, что и их математические двойники, за исключением тех случаев, когда значения результатов выходят за пределы, допустимые для целых. Написав a + b для целых a и b, получим корректный результат, если он не больше максимального или не меньше минимального значения. Выход результата за допустимые пределы известен как "арифметическое переполнение".
Представление вещественных чисел – REAL-тип, как он называется в
Эти свойства отражаются в программе тремя способами.
Об этом непрестанно приходится заботиться в "численных расчетах", используемых не только в научных или инженерных проектах, но и, например, в финансовом моделировании, где также применяются вещественные числа и численные алгоритмы. Ошибка в каждой операции незначительна и может быть совсем не страшной для результата. Плохо, когда эта ошибка накапливается в процессе выполнения миллионов и миллиардов операций, что в конечном итоге может привести к серьезным ошибочным следствиям и искажению результатов.
Численное программирование требует особых подходов, позволяющих избегать подобных неприятностей. Рассмотрим простой пример – в одной из последующих лекций мы встретимся с методом интегрирования, приближенно вычисляющим значение определенного интеграла:
$$\int\limits_{low}^{high}f(x)dx\approx\sum\limits_{i=0}^{n-1}f(low+i^*step)^*step,\qquad\text{где\;}n=\frac{high-low}{step}$$
(рис 1.3) Вычисление интеграла методом прямоугольников (конечная аппроксимация)
Алгоритм может быть реализован циклом. Покажем сейчас фрагмент алгоритма, а его полная версия появится позже. Во фрагменте используется локальная переменная x типа REAL:
from x := low until x >= high loop
Result := Result + f.item ([x]) — f.item ([x])дает значение f(x).
x:=x+step
end
В принципе, все работает, но обратите внимание на то, как x обновляется на каждой итерации. На каждом шаге добавляется переменная step, что приводит к появлению незначительной ошибки, но от итерации к итерации эта ошибка накапливается и может стать причиной существенного отклонения в процессе общего вычисления.
Некоторые программисты используют форму вычислений, подобную [1.1], полагая, что исключение умножения ускорит вычисление. Это, может быть, и справедливо, но эффект от накопления погрешности опасен. Разумная реализация вышеприведенной формулы использует умножение:
from x := low until x >= high loop
Result := Result + f.item ([x]) — f.item ([x]) дает значение f(x).
i := i + 1 ; x := low + (i * step) - [2]
end
Прямое вычисление x на каждом шаге позволяет избежать накопления погрешности. В худшем случае мы получаем ошибку, возникающую в результате выполнения одного сложения и одного умножения. Вот общий принцип:
При разработке ПО, включающего действия с вещественными числами, учитывайте приближенный характер вычислений. При проектировании алгоритма избегайте накопления вычислительных погрешностей.
В краткой форме этот совет звучит так: изучайте вычислительную математику – часть прикладной математики, имеющей дело с численными вычислениями в противоположность символьным вычислениям. В этом курсе подробно рассматриваются свойства и ограничения представления чисел и операций, выполняемых на компьютере.
В ненадежной стране численного программирования существует надежное место: стандартизация. Ранее каждая компьютерная система имела собственную систему представления чисел и операций, из-за чего нельзя было гарантировать, что математически корректный алгоритм будет корректно работать на компьютере. Ситуация исправилась с введением стандарта IEEE на архитектуру арифметики с плавающей точкой. Этот стандарт определяет единые рамки для системы чисел компьютеров как с 32-битной, так и с 64-битной архитектурой. Большинство современных компьютеров соответствуют этому стандарту. Так что, если нужно проверить, что алгоритм не является причиной появления неприемлемых вычислительных погрешностей, то такую работу нужно проделать только однажды, полагаясь на стандарт.
В памяти мы храним данные и извлекаем их по мере необходимости. На нижнем уровне представления в памяти хранятся символы, но для наших программ память представляется хранилищем, в которое можно помещать и получать объекты. Давайте разберемся, что память может делать в наших интересах.
На первом рисунке этой лекции для изображения памяти используются два различных символа, отражающие два вида памяти с различными требованиями.
Зачем нужна кратковременная память? Не было бы проще, чтобы все данные хранились вечно по умолчанию? Есть две причины, по которым это не делается, – технологическая и экономическая. Память, доступная процессорам во время выполнения, должна быть очень быстрой и, как следствие, является дорогой.
Слова: приемлемая или медленная скорость, большие или малые объемы, дорогая и дешевая – нельзя рассматривать вне контекста. Вот некоторые оценки (на момент написания оригинала курса).
Как видите, время доступа к оперативной и постоянной памяти существенно различается, что непосредственно значимо для программиста. Программы, которые обрабатывают большие объемы данных, не могут игнорировать проблемы распределения и обмена данными между постоянной и оперативной памятью. Следует тщательно управлять временем передачи данных, чтобы сохранить приемлемое время выполнения приложения.
Как отмечалось, операции процессора получают доступ к оперативной памяти. Этот ключевой компонент вычислений имеет несколько имен:
На ниже представленной фотографии показана главная память – чип (микросхема), на два GB, изготовленная по технологии "DDR2_800", обеспечивающая время цикла в 5 наносекунд с пиковой
(рис 1.4) Микросхема с оперативной памятью
Существует два вида постоянной памяти.
Наиболее общей формой вторичной памяти является диск. Более корректный термин – дисковод или дисковое устройство, включающее несколько дисков на одном стержне, вращающихся в процессе работы со скоростью от 4000 до 12000 оборотов за секунду. Данные считываются или записываются специальными головками, которые могут перемещаться над рабочей поверхностью вращающихся дисков. Значение считываемых или записываемых битов зависит от намагничивания небольших областей диска. Если выключить энергию, то диск вращаться не будет и операции записи и чтения становятся невозможными, но намагничивание остается, что и гарантирует сохранность данных на диске.
(рис 1.5) Дисковод
Устройство, показанное на рисунке, имеет два диска, хотя вы видите только один. Оно может хранить 8 гигабайт (если это вас не впечатляет, то скажу, что это модель 1999 года, но я пока не намерен разобрать свой новейший дисковод, чтобы показать вам его фотографию. В магазине на момент написания этого текста нетрудно приобрести диск на несколько сот гигабайт стоимостью в 50$, терабайтные диски также вполне доступны). Дисковод на рисунке обеспечивал скорость вращения 5400 оборотов в секунду со временем доступа в 9 миллисекунд и максимальной скоростью передачи данных в 33 мегабайта за секунду. Время доступа и передачи указаны приблизительно, поскольку важной характеристикой является
Пока еще диски остаются доминирующим видом постоянной памяти, но уже появился серьезный конкурент в виде
Недостатком флеш-памяти является то, что она поддерживает только ограниченное число перезаписываний, хотя уже есть способы, позволяющие справиться с этим ограничением. Уже к концу 2008 года
Портативный компьютер – лэптоп, MIT Media Lab's XO
(рис 1.6) Лэптор OLPC работающий с EiffelStudio
Следуя традициям бумажных лент, упомянутых ранее, некоторые устройства памяти являются съемными. Среди наиболее популярных являются USB-устройства, называемые так потому, что они связаны со стандартизованной последовательной шиной для передачи данных (Universal
(рис 1.7) "Флэшка" и USB-диск
Операциям, таким как сложение, требуются операнды, которые чаще всего должны находиться в специальных элементах памяти, называемых регистрами. Большинство архитектур имеют не более нескольких десятков регистров. Для выполнения операции над операндами, хранимыми в обычной оперативной памяти, например, для a и b в присваивании
a := a + b
необходимо выполнить следующие действия: прочесть значения a и b из оперативной памяти и записать их в соответствующие регистры, выполнить операцию над ними, в данном случае сложение, из регистра результата записать в оперативную память в область, отведенную для a.
Как результат, базисная
Типичный порядок времени записи к моменту написания этого текста составлял: 0,5 наносекунды, 50 наносекунд и 5 миллисекунд. Цифры могут со временем изменяться довольно быстро, но порядок отношения обычно остается. Рассмотрим в частности отношение между двумя последними видами памяти, примерно равное 100000. Спроецируем эти отношения на человеческий
Для компьютера все цифры нужно делить на 20 000 000, но соотношение остается тем же самым. Политика управления памятью – что хранить в оперативной памяти, что на диске – существенно влияет на производительность.
На практике различие между главной памятью и дисковой затушевывается ввиду доступности виртуальной памяти, предоставляемой операционной системой. В результате можно считать, что основной памяти значительно больше той реальной памяти, за которую мы заплатили.
Виртуальная память предоставляет программисту адресное пространство, значительно превосходящее физическое адресное пространство. Система управления памятью, стоящая за сценой, обеспечивает подкачку нужных данных с диска, когда они требуются, но не находятся в первичной памяти. Технически вся память разделяется на единицы, называемые страницами, каждая обычно размером в несколько килобайт. Фактический доступ к данным требует, чтобы они были в ядре, если это не так, то возникает ошибка доступа к странице, система виртуальной памяти в этом случае загружает соответствующую страницу из диска – эта операция называется "загрузка страницы" (page in). При загрузке страницы может возникнуть ситуация, когда
Причина, по которой эта политика может быть эффективной, состоит в том, что в периоды интенсивной работы, обрабатывая циклы, программа использует небольшое подмножество – рабочее подмножество – из всего адресного пространства. Только в экстремальных ситуациях такая стратегия приводит к
Виртуальная память также облегчает режим разделения времени, когда компьютер выполняет одновременно несколько программ. Каждая программа в этом случае полагает, что у нее собственное адресное пространство, которое в реальности отображается на множество страниц, не пересекающихся в ядре, и на диске с адресными пространствами других программ.
Все это, конечно, затрудняет оценку производительности наших программ, так как реально не известно, в какой момент может возникнуть ситуация ошибки доступа к странице. Это похоже на ситуацию с нашим мифическим рабочим, который, обратившись в хранилище за заготовкой, вдруг обнаруживает, что оно пусто и требуются сутки, чтобы доставить деталь. Однако в большинстве практических случаев эти соображения можно игнорировать и полагать, что у вас реально есть, скажем, 20 GB, когда физически их только 4.
В обычных ситуациях командами, с которыми имеет дело программист, являются операторы языка программирования. Полезно, однако, понимать, в какие фактические команды компьютера транслируются операторы языка программирования – те команды, которые только и может выполнять компьютер.
Типичная команда компьютера хранится в слове памяти, иногда в нескольких словах. Она содержит код команды, определяющий ее тип – операцию, выполняемую командой, а также ноль или более требуемых аргументов, которые могут быть адресами или значениями. Для примера рассмотрим команду компьютера с архитектурой 32-битного Power PC. Команда занимает слово (32 бита) с нумерацией битов, начинающейся с нуля:
Код команды является комбинацией первичного кода 31 (двоичное 11111), заданного битами от 0 до 5, и вторичного кода 266 (двоичное 100001010) в битах от 22 до 31. Результат помещается в регистр 5 (двоичный код 101), а операнды читаются из регистров 3 и 4.
Компьютеры обладают командами трех разных типов.
Каждая команда имеет свой код, такой, как 31 в примере. Более удобно ссылаться на код команды, используя мнемонику. Для Power PC мнемоника команды сложения с кодом 31 – add. Представление программы в машинных командах не является удобной формой для общения с человеком. Язык ассемблера обеспечивает приемлемую, доступную для восприятия человеком форму представления таких программ. На языке ассемблера Power PC рассмотренная нами команда может быть записана так:
add r5, r3, r4
Язык ассемблера заимствовал у языка программирования возможность применения символических имен: имя регистра, такое как r5, имя команды, такое как add, – так же как использование идентификаторов для адресов и констант. Ответственность за трансляцию ассемблерного кода в машинный код ложится на программную систему, называемую ассемблером, которая представляет простейший вид компилятора. Трансляция облегчается тем, что для языка ассемблера выполняется соответствие "один в один" – одна команда ассемблера, как правило, транслируется в одну машинную команду компьютера. Операторы языка программирования задают куда более высокий уровень абстракции. Еще одна особенность ассемблера состоит в том, что для каждой архитектуры компьютера есть свой язык ассемблера, связанный с этой архитектурой. Современные языки программирования являются переносимыми (независимыми от платформы).
Не будучи в полном смысле этого термина языком программирования, язык ассемблера позволяет преодолеть наиболее утомительные моменты, связанные с написанием и чтением программ в машинном коде.
Что должно остаться в памяти после всех этих обсуждений? Тот провал между командами, которые может выполнять компьютер, и теми задачами, которые мы хотим решать с помощью компьютера. Это доказывает важность языков программирования и объясняет сложность разработки ПО.
При рассмотрении влияния производительности аппаратуры на программирование нельзя не учитывать ось времени. Чрезвычайные успехи информационных технологий идут рука об руку с прогрессом в разработке аппаратуры. В 1965 году появилась статья Гордона Е. Мура (Gordon Moore), сооснователя корпорации Intel, в которой он в чрезвычайно яркой форме описал этот феномен. Наибольшую известность получил так называемый "закон Мура", формулируемый следующим образом: "Число компонентов, размещаемых на интегральной схеме при сохранении постоянной стоимости, удваивается каждые 18 месяцев" (заметим, что сам Мур говорил о двух годах, но потом эта константа была уменьшена по результатам наблюдений до полутора лет). Есть несколько вариантов этого закона, но все они говорят об экспоненциальном росте. Эти утверждения не являются в полном смысле этого слова "законами", такими, как законы, открытые Максвеллом, Ньютоном или Эйнштейном. Это наблюдения о прогрессе индустрии в течение нескольких десятилетий – наблюдения, которые оказались пророческими и до сих пор продолжают быть применимыми. Удивительно, что нет никакой другой области человеческой деятельности, хоть сколько-либо напоминающей столь удивительную скорость роста. Автомобили сегодня не в тысячу раз быстрее, чем 20 лет назад.
В то время как закон, сформулированный Муром, говорил о плотности размещения элементов на интегральной схеме, а тем самым, и о скорости обработки, варианты этого закона говорили о том же феномене, справедливом и для многих других аспектов, – размере памяти, скорости доступа, стоимости различных устройств. Я помню, что был поражен (немногим более десятилетия назад), когда стоимость мегабайта дисковой памяти опустилась ниже одного доллара. Сегодня не многие готовы платить доллар за гигабайт.
Основной закон Мура не может быть беспредельно устойчивым, поскольку размещение все большего числа элементов в ограниченном пространстве приводит к росту излучаемого тепла, а кроме того, есть чисто физические пределы скорости распространения сигнала. В результате, как говорят некоторые компьютерные архитекторы: "число людей, объявляющих, что закон Мура перестал действовать, удваивается каждые полтора года". Фактически, закон продолжает действовать, но на новом уровне. Решение дают параллельные вычисления. Не нужно создавать процессор, работающий еще быстрее. Можно создать несколько процессоров, работающих параллельно. Многоядерная архитектура компьютеров становится общепризнанной. Проблема в том, что пока нет удовлетворительного решения, позволяющего программистам использовать все преимущества параллельной архитектуры. Но ни слова больше на эту тему. Эта проблема требует отдельного курса.
Стандарт IEEE для арифметики с плавающей точкой, доступный по адресу: ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=4610935
John Markoff: .
John L. Hennessy and David Patterson; Computer Architecture, Fourth Edition: A Quantitative
(рис 1.8) Дэвид Паттерсон (2007)
| Address | Адрес | Bit | Бит |
| Byte | Байт | Core | Ядро (Первичная память) |
| Disk | Диск | Flash memory | Флеш-память |
| Giga | Гига | Hexadecimal | Шестнадцатеричный |
| Kilo | Кило | Mega | Мега |
| Moore's law | Закон Мура | Multicore (and manycore) | Многоядерный |
| Octal | Восьмеричный | Persistent | Живучий (сохраняемый) |
| RAM | RAM-память прямого доступа | Read | Чтение |
| Register | Регистр | Removable memory | Сменная память |
| Primary memory | Первичная (оперативная) память | Secondary memory | Вторичная память |
| Storage | Хранилище | Transient | Кратковременный |
| Word | Слово | Write | Запись |
Дайте точные определения терминам словаря.
Добавьте новые термины в карту концепций, построенную в предыдущих лекциях.
Сколько байтов в:
Каталог рекламирует лэптоп с 1,3 GB памяти.
Необходимо передать 128 MB данных, используя 128 Mb модем, работающий с максимальной скоростью. Сколько секунд это займет?
Восьмеричная арифметика использует систему с основанием 8 и цифрами от 0 до 7.
Шестнадцатеричная арифметика использует систему с основанием 16 и цифрами от 0 до 9 и A до F.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.