Статистическая и динамическая память. Модули памяти. Статическая и динамическая оперативная память

Статическая память - SRAM (Static Random Access Memory), как и следует из ее названия, способна хранить информацию в статическом режиме - то есть сколь угодно долго при отсутствии обращений (но при наличии питающего напряжения). Ячейки статической памяти реализуются на триггерах - элементах с двумя устойчивыми состояниями. По сравнению с динамической памятью эти ячейки более сложны и занимают больше места в кристалле, однако они проще в управлении и не требуют регенерации. Быстродействие и энергопотребление статической памяти определяется технологией изготовления и схемотехникой запоминающих ячеек.
Самая экономичная статическая память КМОП (или CMOS Memory) в тоже время и самая медленная память такого типа, имеет время доступа более 100 наносекунд, но зато пригодна для длительного хранения информации при питании от маломощной батареи. Применяется CMOS память в персональных компьютерах для хранения данных о конфигурации и для реализации внутренних часов.
Самая быстродействующая статическая память имеет время доступа в несколько наносекунд, что позволяет ей работать на частоте системной шины процессора, не требуя от него тактов ожидания. Относительно высокая удельная стоимость хранения информации и высокое энергопотребление при низкой плотности упаковки элементов не позволяет использовать SRAM в качестве оперативной памяти компьютеров.
Статические запоминающие устройства (SRAM) имеют перед динамическими то преимущество, что у них время выборки практически равно времени цикла записи или чтения. Выполненная по той же технологии что и процессор, статическая память имеет высокое быстродействие. Главным ограничением в использовании статической памяти является стоимость. При равной емкости с динамической, статическая память примерно в четыре раза дороже. Поэтому данный вид памяти получил распространение в высокопроизводительных системах в качестве внешней (относительно процессора) кэш памяти. Соотношение цена/производительность в этих системах играет не столь существенную роль. Однако, с появлением микросхем статической памяти большой емкости и ее удешевлением произойдет изменение сложившегося стереотипа использования схем памяти и производители компьютеров, возможно, пойдут на замену динамической памяти статической, пока же элементы статической памяти используются в оперативной динамической памяти, как быстрый конвейерный буфер для подготовки данных к выдаче на шину данных каждый такт системной шины.
Структура микросхемы статической памяти
Элементом памяти в статических ОЗУ является триггер, выполненный на транзисторах. Структура микросхемы статической памяти (рис.1.) включает матрицу накопителя содержащую М x N элементов памяти.

□ tдост - время поиска информации на носителе;

□ Vсчит ~~ скорость считывания смежных байтов информации подряд (трансфер). Напомним общепринятые сокращения: с - секунда, мс - миллисекунда, мкс - микросекунда, нc - наносекунда; 1 с = 106мс = 106мкс = 109нс.

Статическая и динамическая оперативная память

Оперативная память может строиться на микросхемах динамического (Dinamic Random Access Memory - DRAM) или статического (Static Random Access Me­mory - SRAM) типа.

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

В динамической памяти ячейки построены на основе полупроводниковых облас­тей с накоплением зарядов (своеобразных конденсаторов), занимающих гораздо меньшую площадь, нежели триггеры, и практически не потребляющих энергии при хранении. Конденсаторы расположены на пересечении вертикальных и горизон­тальных шин матрицы; запись и считывание информации осуществляется подачей электрических импульсов по тем шинам матрицы, которые соединены с элемента­ми, принадлежащими выбранной ячейке памяти. При обращении к микросхеме на ее входы вначале подается адрес строки матрицы, сопровождаемый сигналом RAS (Row Address Strobe - строб адреса строки), затем, через некоторое время - адрес столбца, сопровождаемый сигналом С AS (Column Address Strobe - строб адреса столбца). Поскольку конденсаторы постепенно разряжаются (заряд сохраняется в ячейке в течение нескольких миллисекунд), во избежание потери хранимой ин­формации заряд в них необходимо постоянно регенерировать, отсюда и название памяти - динамическая. На подзаряд тратится и энергия и время, и это снижает производительность системы.

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

DIV_ADBLOCK23">

Микропроцессоры, начиная от МП 80486, имеют свою встроенную в основное ядро МП кэш-память (или кэш-память 1-го уровня - L1), чем, в частности, и обуслов­ливается их высокая производительность. Микропроцессоры Pentium имеют кэш­память отдельно для данных и отдельно для команд: у Pentium емкость этой памя­ти небольшая - по 8 Кбайт, у Pentium MMX - по 16 Кбайт. У Pentium Pro и выше кроме кэш-памяти 1-го уровня есть и встроенная на микропроцессорную плату кэш-память 2-го уровня (L2) емкостью от 128 до 2048 Кбайт. Эта встроенная кэш­память работает либо на полной тактовой частоте МП, либо на его половинной тактовой частоте.

Следует иметь в виду, что для всех МП может использоваться дополнительная кэш-память 2-го (L2) или 3-го (L3) уровня, размещаемая на материнской плате вне МП, емкость которой может достигать нескольких мегабайт (кэш на MB отно­сится к уровню 3, если МП, установленный на этой плате, имеет кэш 2-го уровня). Время обращения к кэш-памяти зависит от тактовой частоты, на которой кэш ра­ботает, и составляет обычно 1-2 такта. Так, для кэш-памяти L1 МП Pentium ха­рактерно время обращения 2-5 не, для кэш-памяти L2 и L3 это время доходит до 10 не. Пропускная способность кэш-памяти зависит и от времени обращения, и от пропускной способности интерфейса и лежит в широких пределах от 300 до 3000 Мбайт/с.

Использование кэш-памяти существенно увеличивает производительность систе­мы. Чем больше размер кэш-памяти, тем выше производительность, но эта зависи­мость нелинейная. Имеет место постепенное уменьшение скорости роста общей

производительности компьютера с ростом размера кэш-памяти. Для современных ПК рост производительности, как правило, практически прекращается после 1 Мбайт кэш-памяти L2. Создается кэш-память на основе микросхем статической памяти.

Примечание------ -

В современных ПК часто применяется и кэш-память между внешними запоминаю­щими устройствами на дисках и оперативной памятью, обычно относящаяся к 3-му уровню, реже, если есть кэш L3 на системной плате, к 4-му. Кэш-память для ВЗУ создается либо в поле оперативной памяти, либо непосредственно в модуле само­го ВЗУ.

DIV_ADBLOCK25">

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

Основная память (ОП) содержит оперативное (RAM - Random Access Memory) и постоянное (ROM - Read Only Memory) запоминающие устройства.

Оперативное запоминающее устройство (ОЗУ) предназначено для хранения ин­формации (программ и данных), непосредственно участвующей в вычислитель­ном процессе в текущий интервал времени. ОЗУ - энергозависимая память: при отключении напряжения питания информация, хранящаяся в ней, теряется. Ос­нову ОЗУ составляют микросхемы динамической памяти DRAM. Это большие интегральные схемы, содержащие матрицы полупроводниковых запоминающих

элементов - полупроводниковых конденсаторов. Наличие заряда в конденсаторе обычно означает «1», отсутствие заряда- «О». Конструктивно элементы опера­тивной памяти выполняются в виде отдельных модулей памяти - небольших плат с напаянными на них одной или, чаще, несколькими микросхемами. Эти модули вставляются в разъемы - слоты на системной плате. На материнской плате может быть несколько групп разъемов (банков) для установки модулей памяти; в один банк можно ставить только блоки одинаковой емкости; блоки разной емкости можно устанавливать в разных банках.

DIV_ADBLOCK26">

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

дулей памяти весьма высокая - среднее время наработки на отказ составляет сот­ни тысяч часов, но тем не менее предпринимаются и дополнительные меры повы­шения надежности. Вопросы обеспечения надежности и достоверности ввиду их важности специально рассмотрены в части 6 учебника. Здесь лишь укажем, что одним из направлений, повышающих надежность функционирования подсисте­мы памяти, является использование специальных схем контроля и избыточного кодирования информации.

Модули памяти бывают с контролем четности (parity) и без контроля четности (nоn parity) хранимых бит данных. Контроль по четности позволяет лишь обнару­жить ошибку и прервать исполнение выполняемой программы. Существуют и бо­лее дорогие модули памяти с автоматической коррекцией ошибок - ЕСС-память, использующие специальные корректирующие коды с исправлением ошибок (см. раздел «Обеспечение достоверности информации» главы 20).

ПРИМЕЧАНИЕ

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

https://pandia.ru/text/78/135/images/image006_129.gif" width="491">микросхемами памяти типа DIP. SIMM бывают двух разных типов: короткие на 30 контактов (длина 75 мм) и длинные на 72 контакта (длина 100 мм). Модули SIMM имеют емкость 256 Кбайт, 1,4, 8, 16, 32 и 64 Мбайт. Модули SIMM выпус­каются с контролем и без контроля по четности и с эмуляцией контроля по четно­сти. SIMM отличаются также быстродействием - обычно они имеют время обраще­ния 60 и 70 нc. Сейчас такое время обращения считается нежелательным, поэтому модули SIMM встречаются только в устаревших ПК.

DIMM (Dual In line Memory Module) - более современные модули, имеющие 168-контактные разъемы (длина модуля 130 мм); могут устанавливаться только на те типы системных плат, которые имеют соответствующие разъемы. Появление DIMM стимулировалось использованием процессоров Pentium, имеющих шину данных 64 бит. Необходимое число модулей памяти для заполнения шины называется бан­ком памяти. В случае 64-разрядной шины для этого требуется два 32-битных 72-контактных модуля SIMM или один 64-битный модуль DIMM, имеющий 168 кон­тактов. Модуль DIMM может иметь разрядность 64 бита (без контроля четности), 72 бита (с контролем четности) и 80 бит (память ЕСС). Емкость модулей DIMM: 16, 32, 64,128, 256 и 512 Мбайт. Время обращения, характерное для современных модулей DIMM, работающих на частоте 100 и 133 МГц (модули РС100, РС133), лежит в пределах 6-10 нc.

RIMM (Rambus In line Memory Module) - новейший тип оперативной памяти. Появление памяти Direct Rambus DRAM потребовало нового конструктива для модулей памяти. Микросхемы Direct RDRAM собираются в модули RIMM, внешне подобные стандартным DIMM, что, кстати, и нашло отражение в названии моду­лей нового конструктива. На плате модуля RIMM может быть до 16 микросхем памяти Direct RDRAM, установленных по восемь штук с каждой стороны платы. Модули RIMM могут быть использованы на системных платах с форм-фактором ATX, BIOS и чипсеты которых рассчитаны на использование данного типа памя­ти. Среди микросхем фирмы Intel это чипсеты i820, i840, i850 и их модификации. На системной плате может быть до четырех разъемов под данные модули. Необхо­димо отметить, что модули RIMM требуют интенсивного охлаждения. Это связа­но со значительным энергопотреблением и, соответственно, тепловыделением, что обусловлено высоким быстродействием данных модулей памяти (время обраще­ния 5 не и ниже). Хотя внешне модули RIMM напоминают модули DIMM, они имеют меньшее число контактов и с обеих сторон закрыты специальными металли­ческими экранами, которые защищают модули RIMM, работающие на больших ча­стотах, экранируя их чувствительные электронные схемы от внешних электромаг­нитных наводок. В настоящее время спецификации определяют три типа модулей, отличающихся рабочими частотами и пропускной способностью. Обозначаются они как RIMM PC800, RIMM PC700, RIMM PC600. Наиболее быстродействующими являются модули RIMM PC800, работающие с чипсетом i850, на внешней такто­вой частоте 400 МГц и имеющие пропускную способность 1,6 Гбайт/с. Модули

RIMM PC600 и RIMM PC700 предназначены для работы на повышенных часто­тах шины памяти, например на частоте 133 МГц, поддерживаемой современными чипсетами.

Типы оперативной памяти

Различают следующие типы оперативной памяти:

□ DRDRAM и. д.т.

FPM DRAM

FPM DRAM (Fast Page Mode DRAM) - динамическая память с быстрым стра­ничным доступом, активно используется с микропроцессорами 80386 и 80486. Память со страничным доступом отличается от обычной динамической памяти тем, что после выбора строки матрицы и удержании RAS допускает многократную ус­тановку адреса столбца, стробируемого CAS. Это позволяет ускорить блочные пе­редачи, когда весь блок данных или его часть находятся внутри одной строки мат­рицы, называемой в этой системе страницей. Существует две разновидности FPM DRAM, отличающиеся временем обращения: 60 и 70 нc. Ввиду своей медлитель­ности они не эффективны в системах с процессорами уровня Pentium II. Модули FPM DRAM в основном выпускались в конструктиве SIMM.

RAM EDO

RAM EDO (EDO - Extended Data Out, расширенное время удержания данных на выходе), фактически представляет собой обычные микросхемы FPM, к которым добавлен набор регистров-«защелок», благодаря чему данные на выходе могут удер­живаться в течение следующего запроса к микросхеме. При страничном обмене такие микросхемы работают в режиме простого конвейера: удерживают на выходе содержимое последней выбранной ячейки, в то время как на их входы уже подает­ся адрес следующей выбираемой ячейки. Это позволяет примерно на 15 % по срав­нению с FPM ускорить процесс считывания последовательных массивов данных. При случайной адресации такая память никакого выигрыша в быстродействии не дает. Память типа RAM EDO имеет минимальное время обращения 45 нc и макси­мальную скорость передачи данных по каналу процессор-память 264 Мбайт/с. Модули RAM EDO выпускались в конструктивах SIMM и DIMM.

BEDO DRAM

BEDO DRAM (Burst Extended Data Output, EDO с блочным доступом). Совре­менные процессоры благодаря внутреннему и внешнему кэшированию команд

и данных обмениваются с основной памятью преимущественно блоками слов мак­симальной длины. Этот вид памяти позволяет читать данные пакетно (блоками), так что данные считываются блоками за один такт. В случае памяти ВЕDО отпа­дает необходимость постоянной подачи последовательных адресов на входы мик­росхем с соблюдением необходимых временных задержек - достаточно строби-ровать переход к очередному слову блока. Этот метод позволяет BEDO DRAM работать очень быстро. Память BEDO DRAM поддерживают некоторые чипсеты фирм VIA Apollo (580VP, 590VP, 680VP) и Intel (i480TX и т. д.) на частоте шины не выше 66 МГц. Активную конкуренцию этому виду памяти составляет память SDRAM, которая постепенно ее и вытесняет. BEDO DRAM представлена модуля­ми и SIMM и DIMM.

SDRAM (Synchronous DRAM - синхронная динамическая память), память с син­хронным доступом, увеличивает производительность системы за счет синхрони­зации скорости работы ОЗУ со скоростью работы шины процессора. SDRAM так­же осуществляет конвейерную обработку информации , выполняется внутреннее разделение массива памяти на два независимых банка, что позволяет совмещать выборку из одного банка с установкой адреса в другом банке. SDRAM также под­держивает блочный обмен. Основная выгода от использования SDRAM состоит в поддержке последовательного доступа в синхронном режиме, где удается исклю­чить дополнительные такты ожидания. Память SDRAM может устойчиво рабо­тать на высоких частотах: выпускаются модули, рассчитанные на работу при час­тотах 100 МГц (спецификация РС100) и 133 МГц (РС133). В начале 2000 года фирма Samsung объявила о выпуске новых чипов SDRAM с рабочей частотой 266 МГц. Время обращения к данным в этой памяти зависит от внутренней такто­вой частоты МП и достигает 5-10 нc, максимальная скорость передачи данных процессор-память при частоте шины 100 МГц составляет 800 Мбайт/с (фактиче­ски равна скорости передачи данных по каналу процессор-кэш). Память SDRAM дает общее увеличение производительности ПК примерно на 25 %. Правда, эта циф­ра относится к работе ПК без кэш-памяти - при наличии мощной кэш выигрыш в производительности может составить всего несколько процентов. SDRAM обыч­но выпускается в 168-контактных модулях типа DIMM. Используется не только в качестве оперативной памяти, но и как память видеоадаптеров, где она полезна при просмотре живого видео и при работе с трехмерной графикой.

DDR SDRAM

DDR SDRAM (Double Data Rate SDRAM - SDRAM 2). Вариант памяти SDRAM, осуществляющий передачу информации по обоим фронтам тактового сигнала. Это позволяет удвоить пропускную способность по сравнению с традиционной памя­тью SDRAM (до 1,6 Гбайт/с при частоте шины 100 МГц). Кроме того, DDR SDRAM может работать на более высокой частоте - в начале 2000 года были выпущены 143, 166 и 183 МГц 64-мегабитные модули DDR SDRAM. Модули DDR DRAM конструктивно совместимы с традиционными 168-контактными DIMM. Исполь-

зуется не только в качестве элементов оперативной памяти, но и в высокопроизво­дительных видеоадаптерах. Сейчас они ориентированы в первую очередь на ры­нок видеоадаптеров.

DRDRAM (Direct Rambus DRAM - динамическая память с прямой шиной для RAM). DRDRAM - перспективный тип оперативной памяти, обеспечивающий зна­чительный рост производительности компьютеров. Высокое быстродействие па­мяти Direct RDRAM достигается рядом особенностей, не встречающихся в других типах. В частности, применением собственной двухбайтовой шины RAM Bus с ча­стотой 800 МГц, обеспечивающей пиковую пропускную способность до 1,6 Гбайт/с. Контроллер памяти Direct RDRAM управляет шиной Rambus и обеспечивает пре­образование ее протокола с частотой 800 МГц в стандартный 64-разрядный интер­фейс с частотой шины до 200 МГц. Фирма Intel выпустила чипсеты i820, i840, i850 с поддержкой. DRDRAM Модули Direct RDRAM - RIMM внешне подобны мо­дулям DIMM. Массовый выпуск памяти DRDRAM и ее интенсивное использова­ние в компьютерах ожидается в ближайшем будущем.

Постоянные запоминающие устройства

Постоянное запоминающее устройство (ПЗУ или ROM - Read Only Memory , па­мять только для чтения) также строится на основе установленных на материн­ской плате модулей (кассет) и используется для хранения неизменяемой инфор­мации: загрузочных программ операционной системы, программ тестирования устройств компьютера и некоторых драйверов базовой системы ввода-вывода (BIOS) и т. д.

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

□ микросхемы, программируемые только при изготовлении - классические или масочные ПЗУ или ROM;

□ микросхемы, программируемые однократно в лабораторных условиях - про­
граммируемые ПЗУ (ППЗУ) или programmable ROM (PROM);

□ микросхемы, программируемые многократно, - перепрограммируемые ПЗУ
или erasable PROM (EPROM). Среди них следует отметить электрически пе­
репрограммируемые микросхемы EEPROM (Electrical Erasable PROM), в том
числе ФЛЭШ-память (FLASH-память).

Устанавливаемые на системной плате ПК модули и кассеты ПЗУ имеют емкость, как правило, не превышающую 128 Кбайт. Быстродействие у постоянной памяти меньшее, нежели у оперативной, поэтому для повышения производительности содержимое ПЗУ копируется в ОЗУ, и при работе непосредственно используется только эта копия, называемая также теневой памятью ПЗУ (Shadow ROM).

В настоящее время в ПК используются полупостоянные, перепрограммируемые запоминающие устройства - FLASH-память. Модули или карты FLASH-памяти могут устанавливаться прямо в разъемы материнской платы и имеют следующие параметры: емкость от 32 Кбайт до 15 Мбайт (в ПЗУ используется до 128 Кбайт), время обращения по считыванию 0,035-0,2 мкс, время записи одного байта 2-10 мкс; FLASH-память - энергонезависимое запоминающее устройство. Примером такой памяти может служить память NVRAM - Non Volatile RAM со скоростью записи 500 Кбайт/с. Обычно для перезаписи информации необходимо подать на специ­альный вход FLASH-памяти напряжение программирования (12 В), что исклю­чает возможность случайного стирания информации. Перепрограммирование FLASH-памяти может выполняться непосредственно с дискеты или с клавиатуры ПК при наличии специального контроллера либо с внешнего программатора, под­ключаемого к ПК. FLASH-память может быть весьма полезной как для создания весьма быстродействующих, компактных, альтернативных НМД запоминающих устройств - «твердотельных дисков», так и для замены ПЗУ, хранящего програм­мы BIOS, позволяя «прямо с дискеты» обновлять и заменять эти программы на более новые версии при модернизации ПК.

Логическая структура основной памяти

Структурно основная память состоит из миллионов отдельных ячеек памяти, емкостью 1 байт каждая. Общая емкость основной памяти современных ПК обычно лежит в пределах от 16 до 512 Мбайт. Емкость ОЗУ на один-два поряд­ка превышает емкость ПЗУ: ПЗУ занимает 128 Кбайт, остальной объем - это ОЗУ. Каждая ячейка памяти имеет свой уникальный (отличный от всех дру­гих) адрес. Основная память имеет для ОЗУ и ПЗУ - единое адресное про­странство.

Адресное пространство определяет максимально возможное количество непо­средственно адресуемых ячеек основной памяти. Адресное пространство зависит от разрядности адресных шин, ибо максимальное количество разных адресов опре­деляется разнообразием двоичных чисел, которые можно отобразить в п разря­дах, то есть адресное пространство равно 2", где п - разрядность адреса. За осно­ву в ПК взят 16-разрядный адресный код, равный по длине размеру машинного слова. При наличии 16-разрядного кода адреса можно непосредственно адресо­вать всего 4 К (К = 1024) ячеек памяти. Вот это 64-килобайтное поле памяти, так называемый сегмент, также является базовым в логической структу­ре ОП. Следует заметить, что в защищенном режиме размер сегмента может быть иным и значительно превышать 64 Кбайта.

Современные ПК (кроме простейших бытовых компьютеров) имеют основную память, емкостью существенно больше 1 Мбайт: память, емкостью 1 Мбайт явля­ется еще одним важным структурным компонентом ОП - назовем ее непосред­ственно адресуемой памятью (справедливо полностью только для реального ре- жима). Для адресации 1 Мбайт = 220= 1 ячеек непосредственно адресуемой памяти необходим 20-разрядный код, получаемый в ПК путем использования спе­циальных приемов структуризации адресов ячеек ОП.

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

Адрес сегмента (АССгм) - это начальный адрес 64-килобайтного поля, внутри кото­рого находится адресуемая ячейка.

Адрес смещения (Аасм) - это относительный 16-разрядный адрес ячейки внутри сегмента.

Асегм должен быть 20-разрядным, но если принять условие, что АсеГм должен быть обязательно кратным параграфу (в последних четырех разрядах должен содержать нули), то однозначно определять этот адрес можно 16-разрядным кодом, увеличен­ным в 16 раз, что равносильно дополнению его справа четырьмя нулями и превра­щению его, таким образом, в 20-разрядный код. То есть условно можно записать:

Аабс = 16 Х Асегм + Аасм.

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

В современных ПК существует режим виртуальной адресации (Virtual - кажу­щийся, воображаемый). Виртуальная адресация используется для увеличения ад­ресного пространства ПК при наличии ОП большой емкости (простая виртуаль­ная адресация) или при организации виртуальной памяти, в которую наряду с ОП включается и часть внешней (обычно дисковой) памяти. При виртуальной адреса­ции вместо начального адреса сегмента Ассгм в формировании абсолютного адреса Аабе принимает участие многоразрядный адресный код, считываемый из специаль­ных таблиц. Принцип простой виртуальной адресации можно пояснить следую­щим образом. В регистре сегмента (обычно регистр DS) содержится не АсеГм, а не­кий селектор, имеющий структуру:

https://pandia.ru/text/78/135/images/image011_103.gif" width="490 height=2" height="2">Здесь СЛ - вспомогательная служебная информация; F - идентификатор, опре­деляющий тип дескрипторной таблицы для формирования АсеГм (дескрипторные таблицы создаются в ОП при виртуальной адресации автоматически):

□ если F = 0, то используется глобальная дескрипторная таблица (GDT), общая
для всех задач, решаемых в ПК при многопрограммном режиме;

□ если F = 1, то используется локальная дескрипторная таблица (LDT), создава­
емая для каждой задачи отдельно;

□ ИНДЕКС - адрес строки в дескрипторной таблице.

В соответствии с индексом и идентификатором из GLT или LDT считывается 64-битовая строка, содержащая, в частности, и адрес сегмента. Разрядность этого ад­реса зависит от размера адресного пространства микропроцессора, точнее равна разрядности его адресной шины. Подобная виртуальная адресация используется при защищенном режиме работы микропроцессора. Для большей плотности раз-

мещения информации в оперативной памяти (уменьшения сегментированности, характерной для многопрограммного режима) часто используется сегментно-стра- ничная адресация, при которой поля памяти выделяются программам внутри сег­ментов страницами, размером от 2 до 4 Кбайт. Формирование сегментно-странич-ной структуры адресов выполняется автоматически операционной системой.

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

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

□ страниц виртуальной памяти;

□ физического размещения страниц,

и устанавливает логические связи между ними (рис. 6.2).

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

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

Таблица страниц физической памяти

Расположена в памяти

№ физической страницы


Рис. 6.2.Таблица страниц

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

Схемы, в которых в качестве запоминающей ячейки используется называются статическим оперативным запоминающим устройством - статическим ОЗУ (RAM - random access memory - память с произвольным доступом), т.к. информация в нем сохраняется все время, пока к микросхеме ОЗУ подключено питание. В отличие от статической ОЗУ в микросхемах постоянно требуется регенерировать их содержимое, иначе информация будет испорчена.

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

Статического ОЗУ приведена на рисунке 1. Вход и выход ОЗУ в этой схеме объединены при помощи . Естественно, что схемы реальных ОЗУ будутотличаться от приведенной на этом рисунке. Тем не менее, приведенная схема позволяет понять как работает реальное ОЗУ. Условно-графическое обозначение ОЗУ на принципиальных схемах приведено на рисунке 2.


Рисунок 1. Структурная схема ОЗУ (RAM)

Рисунок 2. Условно-графическое обозначение ОЗУ (RAM)

Сигнал записи WR позволяет записать логические уровни, присутствующие на информационных входах во внутреннюю ячейку ОЗУ (RAM). Сигнал чтения RD позволяет выдать содержимое внутренней ячейки памяти на информационные выходы микросхемы. В приведенной на рисунке 1 схеме невозможно одновременно производить операцию записи и чтения, но обычно это и не нужно.

Конкретная ячейка ОЗУ выбирается при помощи двоичного кода - адреса ячейки. Объем памяти ОЗУ (RAM) зависит от количества ячеек, содержащихся в ней или, что то же самое, от количества адресных проводов. Количество ячеек в ОЗУ можно определить по количеству адресных проводов, возводя 2 в степень, равную количеству адресных выводов в микросхеме:

Вывод выбора кристалла CS микросхем ОЗУ позволяет объединять несколько микросхем для увеличения объема памяти ОЗУ. Такая схема приведена на рисунке 3.



Рисунок 3. Схема ОЗУ, построенного на нескольких микросхемах памяти

Статические ОЗУ требуют для своего построения большой площади кристалла, поэтому их ёмкость относительно невелика. Статические ОЗУ применяются для построения микроконтроллерных схем из-за простоты построения принципиальной схемы и возможности работать на сколь угодно низких частотах, вплоть до постоянного тока. Кроме того статические ОЗУ применяются для построения КЭШ-памяти в универсальных компьютерах из-за высокого быстродействия статического ОЗУ.

Временные диаграммы чтения из статического ОЗУ совпадают с временными Временные диаграммы записи в статическое ОЗУ и чтения из него приведены на рисунке 4.



Рисунок 4. Временная диаграмма обращения к ОЗУ принятая для схем, совместимых со стандартом фирмы INTEL

На рисунке 4 стрелочками показана последовательность, в которой должны формироваться управляющие сигналы ОЗУ. На этом рисунке RD - это сигнал чтения; WR - сигнал записи; A - сигналы выбора адреса ячейки (так как отдельные биты в шине адреса могут принимать разные значения, то показаны пути перехода как в единичное, так и в нулевое состояние); DI - входная информация, предназначенная для записи в ячейку ОЗУ, расположенную по адресу A1; DO - выходная информация, считанная из ячейки ОЗУ, расположенной по адресу A2.



Рисунок 5. Временная диаграмма обращения к ОЗУ принятая для схем, совместимых со стандартом фирмы MOTOROLA

На рисунке 5 стрелочками показана последовательность, в которой должны формироваться управляющие сигналы. На этом рисунке R/W - это сигнал выбора операции записи или чтения; DS - сигнал стробирования данных; A - сигналы выбора адреса ячейки (так как отдельные биты в шине адреса могут принимать разные значения, то показаны пути перехода как в единичное, так и в нулевое состояние); DI - входная информация, предназначенная для записи в ячейку ОЗУ, расположенную по адресу A1; DO - выходная информация, считанная из ячейки ОЗУ, расположенной по адресу A2.

Литература:

Вместе со статьей "Статические оперативные запоминающие устройства - ОЗУ (RAM)" читают:

Статическая память (SRAM) обычно применяется в качестве кэш-памяти второго уровня для кэширования основного объема ОЗУ. Статическая память выполняется обычно на основе ТТЛ-. КМОП- или БиКМОП-микросхем и по способу доступа к данным может быть как асинхронной, так и синхронной. Асинхронным назы­вается доступ к данным, который можно осуществлять в произволь­ный момент времени. Асинхронная SRAM применялась на мате­ринских платах для третьего - пятого поколений процессоров. Вре­мя доступа к ячейкам такой памяти составляло от 15 (33 МГц) до 8 нс (66 МГц).

Синхронная память обеспечивает доступ к данным не в произ­вольные моменты времени, а синхронно с тактовыми импульсами. В промежутках между ними память может готовить для доступа сле­дующую порцию данных. В большинстве материнских плат пятого поколения используется разновидность синхронной памяти - пакетно-конвейерная SRAM (Pipelined Burst SRAM), для которой ти­пичное время одиночной операции чтения/записи составляет 3 так­та, а групповая операция занимает 3-1-1-1 такта при первом обра­щении и 1-1-1-1 при последующих обращениях, что обеспечивает ускорение доступа более чем на 25 %.

Async SRAM (Асинхронная статическая память). Это кэш-па­мять, которая используется в течение многих лет с тех пор, как поя­вился первый 386-й компьютер с кэш-памятью второго уровня. Об­ращение к ней производится быстрее, чем к DRAM, и могут, в за­висимости от скорости ЦП, использоваться варианты с доступом за 20, 15 или 10 нс (чем меньше время обращения к данным, тем быст­рее память и тем короче может быть пакетный доступ к ней). Тем не менее, как видно из названия, эта память является недостаточно быстрой для синхронного доступа, что означает, что для обращения ЦП все-таки требуется ожидание, хотя и меньшее, чем при исполь­зовании DRAM.

SyncBurst SRAM (Синхронная пакетная статическая память). При частотах шины, не превышающих 66 МГц, синхронная пакет­ная SRAM является наиболее быстрой из существующих видов па­мяти. Причина этого в том, что, если ЦП работает на не слишком большой частоте, синхронная пакетная SRAM может обеспечить полностью синхронную выдачу данных, что означает отсутствие за­держки при пакетном чтении ЦП 2-1-1-1. Когда частота ЦП стано­вится больше 66 МГц, синхронная пакетная SRAM не справляется с нагрузкой и выдает данные пакетами по 3-2-2-2, что существенно медленнее, чем при использовании конвейерной пакетной SRAM. К недостаткам относится и то, что синхронная пакетная SRAM про­изводится меньшим числом компаний и поэтому стоит дороже.

Синхронная пакетная SRAM имеет время адрес/данные от 8,5 до 12 не.

РВ SRAM (Конвейерная пакетная статическая память). Конвей­ер - распараллеливание операций SRAM с использованием вход­ных и выходных регистров. Заполнение регистров требует дополни­тельного начального цикла, но, будучи заполненными, регистры обеспечивают быстрый переход к следующему адресу за то время, пока по текущему адресу считываются данные.

Благодаря этому такая память является наиболее быстрой кэш-памятью для систем с производительностью шины более 75 МГц. РВ SRAM может работать при частоте шины до 133 МГц. Она, кроме того, работает ненамного медленнее, чем синхронная пакетная SRAM при использовании в медленных системах: она вы­дает данные пакетами по 3-1-1-1 все время. Время адрес/данные со­ставляет от 4,5 до 8 нс.

1-Т SRAM. Традиционные конструкции SRAM используют для запоминания одного разряда (ячейки) статический триггер. Для реа­лизации одной такой схемы на плате должно быть размещено от че­тырех до шести транзисторов (4-Т, 6-Т SRAM). Фирма Monolithic System Technology (MoSys) объявила о создании нового типа памя­ти, в которой каждый разряд реализован на одном транзисторе (1-Т SRAM). Фактически здесь применяется технология DRAM, по­скольку приходится осуществлять периодическую регенерацию па­мяти. Однако интерфейс с памятью выполнен в стандарте SRAM, при этом циклы регенерации скрыты от контроллера памяти. Схе­мы 1-Т позволяют снизить размер кремниевого кристалла на 50-80 % по сравнению с аналогичными для SRAM, а потребление электроэнергии - на 75 %.

    Системы видеопамяти

Известны следующие типы видеопамяти (табл. 2.1, здесь отражены также некоторые из вышеперечисленных универсальных сиетем памяти). VRAM (Video RAM - видеоОЗУ) - так называемая двухпортовая DRAM. Этот тип памяти обеспечивает доступ к данным со стороны сразу двух устройств, т. е. есть возможность одновременно писать данные в какую-либо ячейку памяти и одновременно с этим читать данные из какой-нибудь соседней ячейки. За счет этого по­зволяет совмещать во времени вывод изображения на экран и его обработку в видеопамяти, что сокращает задержки при доступе и увеличивает скорость работы.

WRAM (Window RAM) - вариант VRAM, с увеличенной на -25 % пропускной способностью и поддержкой некоторых часто применяемых функций, таких как отображение шрифтов, переме­щение блоков изображения и т. п. Применяется практически только на акселераторах фирм Matrox и Number Nine, поскольку требует специальных методов доступа и обработки данных, наличие всего одного производителя данного типа памяти (Samsung) сильно со­кратило возможности ее использования. Видеоадаптеры, построен­ные с использованием данного типа памяти, не имеют тенденции к падению производительности при установке больших разрешений и частот обновления экрана.

SGRAM (Synchronous Graphics RAM - синхронное графическое ОЗУ) - вариант DRAM с синхронным доступом. В принципе, ра­бота SGRAM полностью аналогична SDRAM, но дополнительно поддерживаются еще некоторые специфические функции, типа бло­ковой и масочной записи. В отличие от VRAM и WRAM, SGRAM является однопортовой, однако может открывать две страницы па­мяти как одну, эмулируя двухпортовость других типов видеопамяти.

MDRAM (Multibank DRAM - многобанковое ОЗУ) - вариант DRAM, разработанный фирмой MoSys, организованный в виде множества независимых банков объемом по 32 Кбайт каждый, ра­ботающих в конвейерном режиме, и использующий распараллели­вание операций доступа к данным между большим количеством банков памяти.

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

Существует два типа статических переменных:

  • глобальные переменные - это переменные, определенные вне функций , в описании которых отсутствует слово static . Обычно описания глобальных переменных, включающие слово extern , выносятся в заголовочные файлы (h-файлы). Слово extern означает, что переменная описывается, но не создается в данной точке программы. Определения глобальных переменных, т.е. описания без слова extern , помещаются в файлы реализации (c-файлы или cpp-файлы). Пример: глобальная переменная maxind описывается дважды:
    • в h-файле с помощью строки

      extern int maxind;

      это описание сообщает о наличии такой переменной, но не создает эту переменную!
    • в cpp-файле с помощью строки

      int maxind = 1000;

      это описание создает переменную maxind и присваивает ей начальное значение 1000 . Заметим, что стандарт языка не требует обязательного присвоения начальных значений глобальным переменным, но, тем не менее, это лучше делать всегда, иначе в переменной будет содержаться непредсказуемое значение (мусор, как говорят программисты). Инициализация всех глобальных переменных при их определении - это правило хорошего стиля.
    Глобальные переменные называются так потому, что они доступны в любой точке программы во всех ее файлах. Поэтому имена глобальных переменных должны быть достаточно длинными, чтобы избежать случайного совпадения имен двух разных переменных. Например, имена x или n для глобальной переменной не подходят;
  • статические переменные - это переменные, в описании которых присутствует слово static . Как правило, статические переменные описываются вне функций . Такие статические переменные во всем подобны глобальным, с одним исключением: область видимости статической переменной ограничена одним файлом, внутри которого она определена, - и, более того, ее можно использовать только после ее описания, т.е. ниже по тексту. По этой причине описания статических переменных обычно выносятся в начало файла. В отличие от глобальных переменных, статические переменные никогда не описываются в h-файлах (модификаторы extern и static конфликтуют между собой). Совет: используйте статические переменные, если нужно, чтобы они были доступны только для функций, описанных внутри одного и того же файла . По возможности не применяйте в таких ситуациях глобальные переменные, это позволит избежать конфликтов имен при реализации больших проектов, состоящих из сотен файлов.
    • Статическую переменную можно описать и внутри функции, хотя обычно так никто не делает. Переменная размещается не в стеке, а в статической памяти, т.е. ее нельзя использовать при рекурсии, а ее значение сохраняется между различными входами в функцию. Область видимости такой переменной ограничена телом функции, в которой она определена. В остальном она подобна статической или глобальной переменной. Заметим, что ключевое слово static в языке Си используется для двух различных целей:
      • как указание типа памяти: переменная располагается в статической памяти, а не в стеке;
      • как способ ограничить область видимости переменной рамками одного файла (в случае описания переменной вне функции).
  • Слово static может присутствовать и в заголовке функции. При этом оно используется только для того, чтобы ограничить область видимости имени функции рамками одного файла. Пример:

    static int gcd(int x, int y); // Прототип ф-ции. . . static int gcd(int x, int y) { // Реализация. . . }

    Совет: используйте модификатор static в заголовке функции, если известно, что функция будет вызываться лишь внутри одного файла. Слово static должно присутствовать как в описании прототипа функции, так и в заголовке функции при ее реализации.

Стековая, или локальная, память

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

Локальные переменные можно использовать при рекурсии, поскольку при повторном входе в функцию в стеке создается новый набор локальных переменных, а предыдущий набор не разрушается. По этой же причине локальные переменные безопасны при использовании нитей в параллельном программировании (см. раздел 2.6.2). Программисты называют такое свойство функции реентерабельностью , от англ. re-enter able - возможность повторного входа. Это очень важное качество с точки зрения надежности и безопасности программы! Программа, работающая со статическими переменными, этим свойством не обладает, поэтому для защиты статических переменных приходится использовать механизмы синхронизации (см. 2.6.2), а логика программы резко усложняется. Всегда следует избегать использования глобальных и статических переменных, если можно обойтись локальными.

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

Динамическая память, или куча

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

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

адрес содержимое памяти

код программы и данные,

защищенные от изменения

...

статические переменные

программы

динамическая память

max. адрес (2 32 -4)

стек

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

В языке Си для захвата и освобождения динамической памяти применяются стандартные функции malloc и free , описания их прототипов содержатся в стандартном заголовочном файле " stdlib.h ". (Имя malloc является сокращением от memory allocate - "захват памяти".) Прототипы этих функций выглядят следующим образом:

void *malloc(size_t n); // Захватить участок памяти // размером в n байт void free(void *p); // Освободить участок // памяти с адресом p

Здесь n - это размер захватываемого участка в байтах, size_t - имя одного из целочисленных типов, определяющих максимальный размер захватываемого участка. Тип size_t задается в стандартном заголовочном файле " stdlib.h " с помощью оператора typedef (см. c. 117). Это обеспечивает независимость текста Си-программы от используемой архитектуры. В 32-разрядной архитектуре тип size_t определяется как беззнаковое целое число:

typedef unsigned int size_t;

Функция malloc возвращает адрес захваченного участка памяти или ноль в случае неудачи (когда нет свободного участка достаточно большого размера). Функция free освобождает участок памяти с заданным адресом. Для задания адреса используется указатель общего типа void* . После вызова функции malloc его необходимо привести к указателю на конкретный тип, используя операцию приведения типа, см. раздел 3.4.11. Например, в следующем примере захватывается участок динамической памяти размером в 4000 байтов, его адрес присваивается указателю на массив из 1000 целых чисел:

int *a; // Указатель на массив целых чисел. . . a = (int *) malloc(1000 * sizeof(int));

Выражение в аргументе функции malloc равно 4000 , поскольку размер целого числа sizeof(int) равен четырем байтам. Для преобразования указателя используется операция приведения типа (int *) от указателя обобщенного типа к указателю на целое число.

Пример: печать n первых простых чисел

Рассмотрим пример, использующий захват динамической памяти. Требуется ввести целое цисло n и напечатать n первых простых чисел. (Простое число - это число, у которого нет нетривиальных делителей.) Используем следующий алгоритм: последовательно проверяем все нечетные числа, начиная с тройки (двойку рассматриваем отдельно). Делим очередное число на все простые числа, найденные на предыдущих шагах алгоритма и не превосходящие квадратного корня из проверяемого числа. Если оно не делится ни на одно из этих простых чисел, то само является простым; оно печатается и добавляется в массив найденных простых.

Поскольку требуемое количество простых чисел n до начала работы программы неизвестно, невозможно создать массив для их хранения в статической памяти. Выход состоит в том, чтобы захватывать пространство под массив в динамической памяти уже после ввода числа n . Вот полный текст программы:

#include #include #include int main() { int n; // Требуемое количество простых чисел int k; // Текущее количество найденных простых чисел int *a; // Указатель на массив найденных простых int p; // Очередное проверяемое число int r; // Целая часть квадратного корня из p int i; // Индекс простого делителя bool prime; // Признак простоты printf("Введите число простых: "); scanf("%d", &n); if (n <= 0) // Некорректное значение => return 1; // завершаем работу с кодом ошибки // Захватываем память под массив простых чисел a = (int *) malloc(n * sizeof(int)); a = 2; k = 1; // Добавляем двойку в массив printf("%d ", a); // и печатаем ее p = 3; while (k < n) { // Проверяем число p на простоту r = (int)(// Целая часть корня sqrt((double) p) + 0.001); i = 0; prime = true; while (i < k && a[i] <= r) { if (p % a[i] == 0) { // p делится на a[i] prime = false; // => p не простое, break; // выходим из цикла } ++i; // К следующему простому делителю } if (prime) { // Если нашли простое число, a[k] = p; // то добавляем его в массив ++k; // Увеличиваем число простых printf("%d ", p); // Печатаем простое число if (k % 5 == 0) { // Переход на новую строку printf("\n"); // после каждых пяти чисел } } p += 2; // К следующему нечетному числу } if (k % 5 != 0) { printf("\n"); // Перевести строку } // Освобождаем динамическую память free(a); return 0; }

Пример работы данной программы:

Введите число простых: 50 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229

Операторы new и delete языка C++

В языке C++ для захвата и освобождения динамической памяти используются операторы new и delete . Они являются частью языка C++ , в отличие от функций malloc и free , входящих в библиотеку стандартных функций Си.

Пусть T - некоторый тип языка Си или C++ , p - указатель на объект типа T . Тогда для захвата памяти размером в один элемент типа T используется оператор new :

T *p; p = new T;

Например, для захвата восьми байтов под вещественное число типа double используется фрагмент

double *p; p = new double;

При использовании new , в отличие от malloc , не нужно приводить указатель от типа void* к нужному типу: оператор new возвращает указатель на тип, записанный после слова new . Сравните два эквивалентных фрагмента на Си и C++ .