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

Хранить в памяти сегменты большого размера целиком так же неудобно, как и хранить процесс непрерывным блоком. Напрашивается идея разбиения сегментов на страницы. При сегментно-страничной организации памяти происходит двухуровневая трансляция виртуального адреса в физический. В этом случае логический адрес состоит из трех полей: номера сегмента логической памяти, номера страницы внутри сегмента и смещения внутри страницы. Соответственно, используются две таблицы отображения – таблица сегментов, связывающая номер сегмента с таблицей страниц, и отдельная таблица страниц для каждого сегмента.

Сегментно-страничная и страничная организация памяти позволяет легко организовать совместное использование одних и тех же данных и программного кода разными задачами. Для этого различные логические блоки памяти разных процессов отображают в один и тот же блок физической памяти, где размещается разделяемый фрагмент кода или данных.

Структуры таблиц при сегментно-страничной организации

Сегменто-страничная организация памяти - student2.ru

Трансляция адресов при сегментно-страничной организации

Сегменто-страничная организация памяти - student2.ru

Кэш-память (Cache Memory)

Электронная память применяется практически во всех подсистемах PC, выступая в качестве оперативной памяти, кэш-памяти, постоянной памяти, полупостоянной памяти, буферной памяти, внешней памяти. Основная, или оперативная, память (Main Memory) компьютера используется для оперативного обмена информацией (командами и данными) между процессором, внешней памятью (например, дисковой) и периферийными подсистемами (графика, ввод-вывод, коммуникации и т. п.). Ее другое название — ОЗУ (оперативное запоминающее устройство) — примерно соответствует английскому термину RAM (Random Access Memory) — память с произвольным доступом.

Произвольность доступа подразумевает возможность операций записи или чтения с любой ячейкой ОЗУ в произвольном порядке. Требования, предъявляемые к основной памяти:

1. большой (для электронной памяти) объем, исчисляемый уже десятками и даже сотнями мегабайт;

2. быстродействие и производительность, позволяющие реализовать вычислительную мощность современных процессоров;

3. высокая надежность хранения данных — ошибка даже в одном бите в принципе может привести к ошибкам вычислений, к искажению и потере данных, причем иногда и на внешних носителях.

Кэш-память (Cache Memory) — сверхоперативная память (СОЗУ), является буфером между ОЗУ и ее «клиентами» — процессором (одним или несколькими) и другими абонентами системной шины. Кэш-память не является самостоятельным хранилищем; информация в ней не адресуема клиентами подсистемы памяти, присутствие кэша для них «прозрачно». Кэш хранит копии блоков данных тех областей ОЗУ, к которым происходили последние обращения, и весьма вероятное последующее обращение к тем же данным будет обслужено кэш-памятью существенно быстрее, чем оперативной памятью. От эффективности алгоритма кэширования зависит вероятность нахождения затребованных данных в кэш-памяти и, следовательно, выигрыш в производительности памяти и компьютера в целом.

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

Организация кэша

Для упрощения взаимодействия с оперативной памятью (и еще по ряду других причин), кэш контроллер оперирует не байтами, а блоками данных, соответствующих размеру пакетного цикла чтения/записи. Программно, кэш память представляет собой совокупность блоков данных фиксированного размера, называемых кэш линейками (cache line) или кэш строками. Каждая кэш строка полностью заполняется (выгружается) за один пакетный цикл чтения и всегда заполняется (выгружается) целиком. Даже если процессор обращается к одному байту памяти, кэш контроллер инициирует полный цикл обращения к основной памяти и запрашивает весь блок целиком. Причем, адрес первого байта кэш-линейки всегда кратен размеру пакетного цикла обмена. Другими словам: начало кэш-линейки всегда совпадает с началом пакетного цикла. Поскольку, объем кэша много меньше объема основной оперативной памяти, каждой кэш-линейке соответствует множество ячеек кэшируемой памяти, а отсюда с неизбежностью следует, что приходится сохранять не только содержимое кэшируемой ячейки, но и ее адрес. Для этой цели каждая кэш линейка имеет специальное поле, называемое тегом. В теге хранится линейный и/или физический адрес первого байта кэш линейки. Т. е. кэш память фактически является ассоциативной памятью (associative memory) по своей природе.

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

Другие же процессоры (например, AMD K5) имеют два набора тегов, для хранения физических и линейных адресов соответственно. К физическим тегам процессор обращается лишь в двух ситуациях: при возникновении кэш промахов (в силу используемой в x86 процессорах схемы адресации одна и та же ячейка может иметь множество линейных адресов и потому несовпадение линейных адресов еще не свидетельство промаха) и при поступлении запроса от внешних устройств (в т. ч. и других процессоров в многопроцессорных системах): имеется ли такая ячейка в кэш памяти или нет (см. "Протокол MESI"). Во всех остальных случаях используются исключительно линейные теги, что предотвращает необходимость постоянного преобразования адресов.

Доступ к ассоциативной памяти, в отличии от привычной нам адресной памяти, осуществляется не по номеру ячейки, а по ее содержанию, поэтому такой тип памяти еще называют content addressed memory. Кэш строки, в отличии от ячеек оперативной памяти, не имеют адресов и могут нумероваться в произвольном порядке, да и то чисто условно. Выражение "кэш контроллер обратился к кэш линейке №69" лишено смысла и правильнее сказать: "кэш контроллер, обратился к кэш линейке (строке) 999", где 999 – содержимое связанного с ней тега.

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

Блокируемая кэш память, как и следует из ее названия, блокирует доступ к кэшу после всякого кэш промаха. Независимо от того, присутствуют ли запрашиваемые данные в сверхоперативной памяти или нет, до тех пор, пока кэш строка, вызвавшая промах не будет целиком загружена (выгружена), кэш не сможет обрабатывать никаких других запросов ("…a read hit or miss after a read miss waits until the prior miss fills the cache"). В настоящее время блокируемая кэш память практически не используется, поскольку при частных кэш промахах, она работает крайне непроизводительно.

Не блокируемая кэш память, напротив, позволяет работать с кэшем параллельно с загрузкой (выгрузкой) кэш строк. То есть, кэш промахи не препятствует Кэш попаданиям. И это – хорошо! Несмотря на то, что не блокируемая кэш память имеет значительно большую аппаратную сложность (а, значит, – и стоимость), в силу своей привлекательности, она широко используется в старших процессорах семейства x86, как, впрочем, и во многих других современных процессорах.

Понятие ассоциативности кэша.

Проследим по шагам как работает кэш. Вот процессор обращается к ячейке памяти с адресом xyz. Кэш контроллер, перехватив это обращение, первым делом пытается выяснить: присутствует ли запрошенные данные в кэш памяти или нет? Вот тут то и начинается самое интересное! Легко показать, что проверка наличия ячейки в кэш памяти фактически сводится к поиску соответствующего диапазона адресов в памяти тегов.

В зависимости от архитектуры кэш контроллера просмотр всех тегов осуществляется либо параллельно, либо последовательно. Параллельный поиск, конечно, чрезвычайно быстр, но и сложен в реализации (а потому – дорог). Последовательный же перебор тегов при большом их количестве крайне непроизводителен. Кстати, а сколько у нас тегов? Правильно – ровно столько, сколько и кэш строк. Так, в частности, в 32 килобайтном кэше насчитывается немногим более тысячи тегов. Стоп! Сколько времени потребует просмотр тысячи тегов?! Даже если несколько тегов будут просматриваться за один такт, поиск нужной нам линейки растянется на сотни тактов, что "съест" весь выигрыш в производительности. Нет уж, какая динамическая память ни тормозная, а к ней обратится побыстрее будет, чем сканировать кэш…

Но ведь кэш все таки работает! Спрашивается: как? Оказывается (и это следовало ожидать), что последовательный перебор – не самый продвинутый алгоритм поиска. Существуют и более элегантные решения. Рассмотрим два наиболее популярные из них.

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

, где N – условный номер кэш линейки, ADDR – адрес ячейки кэшируемой памяти; CACHE.LINE.SIZE – длина кэш линейки в байтах; CACHE.SIZE – размер кэш памяти в байтах; "—" – операция целочисленного деления.

Таким образом, чтобы узнать: присутствует ли искомая ячейка в кэш памяти

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

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

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

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

Количество банков кэша и называют его ассоциативностью (way). Легко видеть, что с увеличением степени ассоциативности, эффективность кэша существенно возрастает.

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

Постоянная память используется для энергонезависимого хранения системной информации — BIOS, таблиц знакогенераторов и т. п. Эта память при обычной работе компьютера только считывается, а запись в нее (часто называемая программированием) осуществляется специальными устройствами — программаторами. Отсюда и ее название — ROM (Read Only Memory — память только для чтения) или ПЗУ (постоянное запоминающее устройство). Требуемый объем памяти этого типа невелик — например, BIOS PC/XT помещалась в 8 Кбайт, = современных компьютерах типовое значение — 128 Кбайт - 2 Мбайт. Быстродействие постоянной памяти обычно ниже, чем оперативной, но этот недостаток может быть исправлен применением теневой памяти.В последние годы постоянную память вытесняет флэш-память, запись в которую возможна в самом компьютере в специальном режиме работы, и другие типы энергонезависимой памяти (БЕРНОМ, FRAM).

Полупостоянная память в основном используется для хранения информация о конфигурации компьютера. Традиционная память конфигурации вместе с часами-календарем (CMOS Memory и CMOS RTC) имеет объем несколько десятков байт, ESCD (Extended Static Configuration Data) — область энергонезависимая памяти, используемая для конфигурирования устройств Plug and Play — объем несколько килобайт. Сохранность данных CMOS-памяти при отключении питания компьютера обеспечивается маломощной внутренней батарейкой или аккумулятором. В качестве полупостоянной применяется и энергонезависимая память — NV RAM (Non-Volatile RAM), которая хранит информацию и при отсутствии питания.

Буферная память различных адаптеров и контроллеров обычно является разделяемой между процессором (точнее абонентами системной шины) и контроллерами устройств. К этой памяти относятся и 16-байтные FIFO-буферы СОМ-портов, и 16-мегабайтные (и кэш-буферы высокопроизводительных SCSI-адаптеров. Специфическим буферной памяти является видеопамять дисплейного адаптера— к ней производятся интенсивные обращения со стороны центрального процессора и графического акселератора одновременно с непрерывным процессом регенерации изображения.

Электронная память применяется и в качестве внешней памяти — накопителях Flash Drive для блокнотных ПК и автономных контроллеров и в других конструктивных исполнениях. Широкому распространению этих сверхбыстродействующих «дисков» препятствует очень высокая на сегодняшний день стоимость хранения информации, а также довольно медленная запись.

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

Быстродействие памяти определяется временем выполнения операций записи и считывания данных. Основными параметрами любых элементов памяти является минимальное время доступа и длительность цикла обращения. Время доступа (access time) определяется как задержка появления действительных данных на выходе памяти относительно начала цикла чтения. Длительность цикла определяется как минимальный период следующих друг за другом обращений к памяти, причем циклы чтения и записи могут требовать различных затрат времени. В цикл обращения кроме активной фазы самого доступа входит и фаза восстановления (возврата памяти к исходному состоянию), которая соизмерима по времени с активной фазой. Временные характеристики самих запоминающих элементов определяются их принципом действия и используемой технологией изготовления.

Производительность памяти можно характеризовать как скорость потока записываемых или считываемых данных и измерять в мегабайтах в секунду. Производительность подсистемы памяти наравне с производительностью процессора существенным образом определяет производительность компьютера. Выполняя определенный фрагмент программы, процессору придется, во-первых, загрузить из памяти соответствующий программный код, а во-вторых, произвести требуемые обмены данными, и чем меньше времени потребуется подсистеме памяти на обеспечение этих операций, тем лучше. Производительность памяти, как основной, так и кэша второго уровня, обычно характеризуют длительностью пакетных циклов чтения (Memory Burst Read Cycle). Пакетный режим обращения является основным для процессоров, использующих кэш (486 и выше); циклы чтения выполняются гораздо чаще, чем циклы записи (хотя бы потому, что процессору приходится все время считывать инструкции из памяти). Эта длительность выражается в числе тактов системной шины, требуемых для передачи очередной порции данных в пакете. Обозначение вида 5-3-3-3 для диаграммы пакетного цикла чтения соответствует пяти тактам на считывание первого элемента в цикле и трем тактам на считывание каждого из трех последующих элементов. Первое число характеризует латентность (latency) памяти — время ожидания данных, последующие — скорость передачи.

При этом, конечно же, оговаривается и частота системной шины. По нынешним меркам хорошим результатом является цикл 5-1-1-1 для частоты шины 100 или 133 МГц. Однако для процессоров Pentium 4, у которых за каждый такт синхронизации системной шины передается по четыре 64-битных слова данных, возможно будет иной способ выражения производительности памяти. Производительность подсистемы памяти зависит от типа и быстродействия применяемых запоминающих элементов, разрядности шины памяти и некоторых «хитростей» архитектуры.

Разрядность шины памяти — это количество байт (или бит), с которыми операция чтения или записи может быть выполнена одновременно. Разрядность основной памяти обычно согласуется с разрядностью внешней шины процессора (1байт - для 8088; 2 байта - для 8086, 80286, 386SX; 4 байта - для 386DX,-486; 8 байт — для Pentium и выше). Вполне очевидно, что при одинаковом быстродействии микросхем или модулей памяти производительность блока с большей разрядностью будет выше, чем у малоразрядного. Именно с целью повышения производительности у 32-битных (по внутренним регистрам) процессоров Pentium и выше внешняя шина, связывающая процессор с памятью, имеет разрядность 64 бита. Желание производителей процессоров и системных плат сэкономить на разрядности памяти всегда приводит к снижению производительности. Банком памяти называют комплект микросхем или модулей (а также их посадочных мест — «кроваток» для микросхем, слотов для SIMM или DIMM), обеспечивающий требуемую для данной системы разрядность хранимых данных. Работоспособным может быть только полностью заполненный банк. Внутри одного банка практически всегда должны применяться одинаковые (по типу и объему) элементы памяти.

В компьютерах на 486-х процессорах банком является один SIMM-72 или четверка SIMM-30. В компьютерах на процессорах 5-6 (а для AMD и 7-го) поколений банком может быть пара SIMM-72 или один модуль DIMM или RIMM (эти модули могут содержать и несколько банков, см. далее). На платы с чипсетом для процессора Pentium4 требуется установка пар RIMM (чтобы обеспечить производительность памяти, достойную новой микроархитектуры). То есть устанавливаемый объем памяти набирается несколькими банками, повышения производительности осуществляется за счет чередования банков. Идея чередования заключается в том, что смежные блоки данных (разрядность такого блока данных соответствует разрядности банка) располагаются поочередно в разных банках. Тогда при весьма вероятном последовательном обращении к данным банки будут работать поочередно, причем активная обращения к одному банку может выполняться во время фазы восстановления другого банка, то есть применительно к обоим банкам не будет простоя во время фазы восстановления. Частота передачи данных в системе с чередованием двух банков может быть удвоенной по отношению к максимальной частоте работы отдельного банка. Для реализации чередования чипсет должен обеспечивать возможность перекоммутации адресных линий памяти в зависимости от установленного количества банков и иметь для них (банков) раздельные линии управляющих сигналов. Чем больше банков участвуют в чередовании, тем выше (теоретически) предельная производительность. Чаще всего используется чередование двух или трех банков (two way interleaving, three way interleaving). В чередовании может участвовать и большее число банков. Из разбиения на мелкие банки можно извлечь и другую выгоду. Поскольку современные процессоры способны параллельно выставлять несколько запросов на транзакции с памятью, скрытые фазы обработки запросов, обусловленные необходимым временем доступа, относящихся к разным банкам, могут выполняться одновременно. Микросхемы памяти SDRAM имеют внутреннюю многобанковую организацию, применительно к этой памяти в данном контексте используют понятие физический банк или ряд (row).

Сбой памяти

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

Отказ ячейки памяти — потеря ее работоспособности, обычно требующая замены элемента памяти. Отказ может быть устойчивым, но возможно и самопроизвольное восстановление работоспособности, например, после повторного включения питания. Часто причиной отказов является неисправность контакта или нарушение условий эксплуатации.

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

После сбоя следующая же запись в ячейку произойдет нормально. В первых моделях PC, когда микросхемы памяти имели существенно худшие характеристики надежности по сравнению с современными, обязательно применялся контроль четности. При его использовании каждый байт памяти сопровождается битом паритета (Parity bit), дополняющим количество единиц в байте до нечетного. Значение бита паритета аппаратно генерируется при записи в память и проверяется при считывании. При обнаружении ошибки паритета схемой контроля вырабатывается немаскируемое прерывание (NMI), и его обработчик обычно выводит на экран сообщение Parity Check Error (Ошибка паритета) с указанием адреса сбойной ячейки и останавливает процессор командой Halt. Команда Halt (останов) останавливает выполнение текущего потока команд процессора. Из состояния останова процессор может выйти только по прерываниям, которые обработчиком ошибки паритета могут и блокироваться. Останов не позволяет процессору «перепахать» всю память (в том числе и внешнюю), что в принципе возможно при возникновении ошибки в памяти. «Сдвинуть с места» процессор, остановленный таким образом, можно нажатием кнопки Reset, выключив и включив питание, а иногда и нажатием клавиш Ctrl+Alt+Del.

Специальными битами конфигурационных регистров (порт 06lh) вырабатывание прерывания NMI от схем контроля памяти можно запретить, также можно изменить процедуру обработки NMI для игнорирования ошибки (в диагностических целях). При выполнении начального тестирования памяти в рамках теста POST выполняется запись во все ячейки ОЗУ, в результате чего формируются правильные биты паритета (при исправной памяти). Со временем качество применяемых микросхем памяти улучшилось, и в целях удешевления модулей памяти от применения контроля четности стали откалываться — сначала предлагали выбор через установку параметра CMOS Setup: проверять или не проверять паритет, а потом появилась масса моделей системных плат, в которых контроля паритета нет вообще. Модули памяти (SIMM, SIPP) стали выпускать как с паритетом, так и без него, а для «ублажения» (точнее — обмана) плат, требующих наличия бита паритета, стали выпускать модули с «подделкой» паритета (fake parity или PG — Parity Generator). В этих модулях вместо дополнительной микросхемы памяти используется генератор паритета — схема сумматора по модулю 2, формирующая всегда «хороший» бит паритета, независимо от наличия ошибок в самой памяти. Его наличие можно распознать визуально — логическая микросхема на модуле заметно отличается от микросхем памяти. В обозначение типа модуля с генератором паритета обычно входят буквосочетания «ВР», «VT», «GSM» или «МР. ЕС». Заметим, что ни программные средства тестирования памяти (Checklt, PCCheck и т. п.) не отличить память с настоящим паритетом от памяти с фиктивным паритетом.

Вопрос о необходимости контроля паритета не имеет однозначного ответа. По мнению автора, лучше иметь остановку машины по ошибке с явным указанием на ее источник, чем искать причины непонятных зависаний и «вылетов», результатом которых в принципе может стать и полная потеря данных на диске. Но контроль паритета не всесилен, он выявляет в пределах каждого байта ошибки только нечетной кратности (искажение 1, 3, 5 или 7 бит), правда, вероятность временного отказа или сбоя двух бит у работающей памяти весьма мала. Многочисленные наблюдения дают основание полагать, что при неполадках в памяти (когда все тесты проходят нормально) возможно обращение по ложным адресам ячеек памяти, что никаким контроль паритета не выявляется. Попутно заметим, что останов по ошибке паритета при программном тестировании памяти компьютера с включенным паритетом может происходить от как в информационных битах, так и в контрольных. В этом случае для обнаружения неисправности отключают бит паритета. Схему контроля паритета тестами проверять можно только косвенно, устанавливая заведомо неисправный модуль памяти.

В компьютерах особо ответственного применения используют память с обнаружением и исправлением ошибок — ЕСС Memory (Error Checking and Correcting). В этом случае для каждого записываемого информационного слова памяти (а не байта, как при контроле паритета) по определенным правилам вычисляется функция свертки, результат которой разрядностью в несколько бит также хранится в памяти. Для 64-битного слова обычно используют 7-8 дополнительных бит. При считывании схема контроля с использованием этих избыточных бит способна обнаруживать ошибки различной кратности и (или) исправлять однократные ошибки. Обнаружение ошибки выполняется «на лету» и само по себе дополнительного времени не требует. Однако для исправления ошибок требуются дополнительные такты для срабатывания аппаратной логики исправления и фиксации скорректированного результата. Даже при отсутствии ошибки нужен по крайней мере один лишний такт для срабатывания схемы контроля, разрешающей использование считанных данных. Таким образом, ЕСС-память будет работать несколько медленнее неконтролируемой, и при наличии исправимых ошибок замедление будет более заметным. Функцию контроля и исправления выполняет чипсет, его реакцию на ошибки обычно можно задать настройками CMOS Setup.

Возможны различные варианты поведения, например:

· автоматически исправлять ошибки, не уведомляя об этом систему;

· исправлять однократные ошибки, уведомляя систему только о многократных;

· не исправлять ошибки, а только уведомлять об их обнаружении (самый достоверный контроль).

В отличие от памяти с контролем паритета, допускающей побайтное обращение, к ЕСС-памяти можно обращаться только полноразрядными словами. Заботу об этом берет на себя чипсет. В современных компьютерах ЕСС широко применяется в кэш-памяти — в процессорах Р6 и выше встроенный вторичный кэш, как правило, имеет ЕСС-контроль, выполняемый схемами процессора. При «разгоне» процессора ЕСС-контроль может подтормаживать кэш, в котором начинают появляться ошибки, но отключение ЕСС-контроля (настройками CMOS Setup) ради ускорения чревато неконтролируемыми ошибками. Достоверность информации, хранимой в постоянной (ROM BIOS) и полупостоянной (CMOS RTC, ESCD) памяти проверяется с помощью контрольной суммы (Checksum) — обычно это байт, дополняющий до нуля сумму по модулю 256 всех байт контролируемой области. Проверка контрольной суммы обычно выполняется

однократно во время теста POST.

Нехватка оперативной памяти

Одной из проблем ОС при работе с большим количеством процессов является нехватка физической оперативной памяти. В качестве диагностики этого процесса можно провести подсчёт запущенных процессов, умножив их на средний размер процесса (4 Мб для Windows XP, 10 Мб для Windows 7, 16 для Windows 8/10). Это довольно грубая оценка.

Наши рекомендации