Кроме процессоров с многопоточностью, существуют процессоры, содержащие на одном кристалле два, четыре и более полноценных процессоров, или ядер. Например, четырехъядерные процессоры, показанные на рис. 4, фактически имеют в своем составе четыре мини-чипа, каждый из которых представляет собой независимым процессор. (Кэши мы рассмотрим чуть позже.) Несомненно, для использования такого многоядерного процессора потребуется многопроцессорная операционная система.
Рис 4. - Четырехъядерный процессор с общей кэш-памятью второго уровня (L2) (а). Четырехъядерный процессор с отдельными блоками кэш-памяти L2 (б)
Память
Второй основной составляющей любого компьютера является память. В идеале память должна быть максимально быстрой (работать быстрее, чем производится выполнение одной инструкции, чтобы работа центрального процессора не замедлялась обращениями к памяти), достаточно большой и чрезвычайно дешевой. Никакая современная технология не в состоянии удовлетворить все эти требования, поэтому используется другой подход. Система памяти создается в виде иерархии уровней.
Верхние уровни обладают более высоким быстродействием, меньшим объемом и более высокой удельной стоимостью хранения одного бита информации, чем нижние уровни, иногда в миллиарды и более раз.
Верхний уровень состоит из внутренних регистров процессора. Они выполнены по той же технологии, что и сам процессор, и поэтому не уступают ему в быстродействии. Следовательно, к ним нет и задержек доступа. Внутренние регистры обычно предоставляют возможность для хранения 32 х 32 бит для 32-разрядного процессора или 64 х 64 бит для 64-разрядного процессора. В обоих случаях этот объем не превышает одного килобайта. Программы могут сами управлять регистрами (то есть решать, что в них хранить) без вмешательства аппаратуры.
Затем следует кэш-память, которая управляется главным образом аппаратурой.
Оперативная память разделяется на кэш-строки, обычно по 64 байт, с адресами от 0 до 63 в кэш-строке 0, адресами от 64 до 127 в кэш-строке 1, и т. д. Наиболее интенсивно используемые кэш-строки оперативной памяти сохраняются в высокоскоростной кэш-памяти, находящейся внутри процессора или очень близко к нему. Когда программе нужно считать слово из памяти, аппаратура кэша проверяет, нет ли нужной строки в кэш-памяти. Если строка в ней имеется, то происходит результативное обращение к кэш-памяти (кэш-попадание), запрос удовлетворяется за счет кэш-памяти без отправки запроса по шине к оперативной памяти. Обычно результативное обращение к кэшу занимает по времени два такта.
Отсутствие слова в кэш-памяти вынуждает обращаться к оперативной памяти, что приводит к существенной потере времени. Кэш-память из-за своей высокой стоимости ограничена в объеме. Некоторые машины имеют два или даже три уровня кэша, каждый из которых медленнее и объемнее предыдущего.
Кэширование играет существенную роль во многих областях информатики, это относится не только к кэшированию строк оперативной памяти. Достаточно часто к кэшированию для повышения производительности прибегают везде, где есть какой-либо объемный ресурс, который можно поделить на части, часть из которых используется намного интенсивнее всех остальных. Операционные системы используют кэширование повсеместно. Например, большинство операционных систем держат интенсивно используемые файлы (или фрагменты файлов) в оперативной памяти, избегая их многократного считывания с диска.
Применение кэширования оказалось настолько удачным решением, что многие современные процессоры имеют сразу два уровня кэш-памяти. Первый уровень, или кэш L1, всегда является частью самого процессора и обычно подает декодированные команды в процессорный механизм исполнения команд. У многих процессоров есть и второй кэш L1 для тех слов данных, которые используются особенно интенсивно. Обычно каждый из кэшей L1 имеет объем 16 Кбайт. Вдобавок к этому кэшу процессоры часто оснащаются вторым уровнем кэш-памяти, который называется кэш L2 и содержит несколько мегабайт недавно использованных слов памяти. Различия между кэш-памятью L1 и L2 заключаются во временной диаграмме. Доступ к кэшу первого уровня осуществляется без задержек, а доступ к кэшу второго уровня требует задержки в один или два такта.
При разработке многоядерных процессоров конструкторам приходится решать, куда поместить кэш-память. На рис. 4, а показан один кэш L2, совместно использующийся всеми ядрами. Такой подход применяется в многоядерных процессорах корпорации Intel. Для сравнения на рис. 4, б каждое ядро имеет свою собственную кэш-память L2. Именно такой подход применяется компанией AMD. Каждый из подходов имеет свои аргументы «за» и «против». Например, общая кэш-память L2 корпорации Intel требует использования более сложного кэш-контроллера, а избранный AMD путь усложняет поддержание согласованного состояния кэш-памяти L2 разных ядер.
Следующей в иерархии идет оперативная память. Это главная рабочая область системы памяти машины. Оперативную память часто называют ОЗУ (оперативное запоминающее устройство) или памятью с произвольным доступом (RAM, Random Access Memory). В настоящее время блоки памяти имеют объем от сотен мегабайт до нескольких гигабайт, и этот объем стремительно растет. Все запросы процессора, которые не могут быть удовлетворены кэш-памятью, направляются к оперативной памяти.
После оперативной памяти следующим уровнем в нашей иерархии памяти является жесткий диск. Дисковый накопитель в пересчете на бит информации на два порядка дешевле, чем ОЗУ, а его емкость зачастую на два порядка выше. Единственная проблема состоит в том, что время произвольного доступа к данным примерно на три порядка медленнее. Причина низкой скорости доступа к данным заключается в том, что диск является механическим устройством, конструкция которого условно показана на рис. 5.
Жесткий диск состоит из одной или нескольких металлических пластин, вращающихся со скоростью 5400, 7200 или 10 800 оборотов в минуту.
Механический привод поворачивается на определенный угол над пластинами, подобно звукоснимателю старого проигрывателя виниловых пластинок на 33 оборота в минуту.
Информация записывается на диск в виде последовательности концентрических окружностей.
В каждой заданной позиции привода каждая из головок может считывать кольцеобразный участок, называемый дорожкой.
Из совокупности всех дорожек в заданной позиции привода составляется цилиндр.
Каждая дорожка поделена на определенное количество секторов, обычно по 512 байт на сектор. Секторы нумеруются, начиная с 1. На современных дисках внешние цилиндры содержат больше секторов, чем внутренние.
Каждый сектор, кроме данных, содержит различную служебную информацию, необходимую для правильного функционирования контроллера дисковода. В частности эта служебная информация включает такие данные, как номер дорожки и номер сектора. Если на диске имеется место с глубоким нарушением покрытия, то данные здесь не могут сохраниться. Говорят, что на диске появился дефектный сектор.
Самый первый сектор на дорожке 0 поверхности 0 выделяется под стартовый сектор. Он содержит:
· собственно программу, позволяющую считывать данные с диска в оперативную память (загрузочную запись);
· секторов диска в байтах;
· количество секторов на диске;
· количество секторов на дорожке.
Рис. 5. Конструкция жесткого диска
Когда на диск записывается новый файл, ОС обычно не предоставляет точного числа требующихся байтов, а выделяет дисковое пространство целыми секторами. Минимальное число секторов, выделяемое файловой системой для хранения файла, называется кластером. Размер кластера должен быть кратен размеру физического сектора, т. е. 512 байтам в подавляющем большинстве случаев. Размеры кластеров зависят от емкости используемого диска. Для гибких дисков емкостью 1.44 МВ кластеры включают в себя 1 сектор, а на жестких дисках объем кластера зависит от их емкости.
Файлу, записываемому на диск, выделяется целое число кластеров, причем, что существенно, кластеры могут находиться в различных местах диска. В отличие от файлов, хранящихся в непрерывных областях памяти (непрерывные файлы), файлы, хранящиеся в различных кластерах, называются фрагментированными.
Перемещение привода с одного цилиндра на следующий цилиндр занимает около 1 мс.
Перемещение к произвольно выбранному цилиндру обычно занимает от 5 до 10 мс, в зависимости от конкретного накопителя.
Когда привод расположен над нужной дорожкой, накопитель должен выждать, когда нужный сектор попадет под головку. Это приводит к возникновению еще одной задержки от 5 до 10 мс, в зависимости от скорости вращения диска.
После попадания требуемого сектора под головку производится операция чтения или записи со скоростью от 50 Мбайт/с (для низкоскоростных дисков) до 160 Мбайт/с (для высокоскоростных).