Разное

Память динамическая это: Динамическая память — Студопедия

Содержание

Динамическая память в системах жёсткого реального времени / Хабр

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

(КДПВ – см. аннотацию к диаграмме в конце)

Неочевидность свойств алгоритмов динамического распределения памяти породила настораживающую тенденцию к лёгкому искажению действительности в документации некоторых ОСРВ, причём не последнего пошиба. Например, раздел об управлении памятью FreeRTOS обходит стороною класс аллокаторов постоянной вычислительной сложности O(1), заставляя неискушённого коллегу принять, что O(n) есть теоретический потолок. Аналогичные артефакты находятся в документации к ChibiOS (1, 2). Мы, разумеется, не станем подозревать разработчиков столь выдающихся продуктов в незнании матчасти; скорее, спишем это на свойственный людям банальный недосмотр. Приложения реального времени редко полагаются на динамическое распределение во время выполнения, так что множество затронутых здесь невелико.

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

Порядком вычислительной сложности дело не ограничивается. Ресурсный потолок по памяти, очевидно, имеет критическое значение для встраиваемых систем, где количество доступных мегабайт можно пересчитать пальцами одной руки. Поставщики же ОСРВ имеют наклонности к заимствованию оптимизированных на средний случай алгоритмов из продуктов, не рассчитанных на реальное время и встраиваемые приложения. Подтверждающим примером будет реализация аллокатора в NuttX, где используется стратегия поиска наилучшего совпадения (best fit), чья пониженная склонность к фрагментации в общем случае даётся ценою крайне пессимистичного её прогноза для худшего случая. Аналогичные замечания можно сделать в адрес упомянутых ранее конкурентов.

Недостаток внимания со стороны вендоров ОСРВ к теоретической стороне вопроса порождает положительную обратную связь, где неточности в документации и технически неоптимальные реализации действительно вынуждают пользователей отказываться от их использования, что снижает интерес, и, как следствие, оставляет осложнения без внимания.

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

// Список фрагментов на блочном аллокаторе:
struct FragmentedBuffer
{
    struct FragmentedBuffer* next;
    uint8_t data[];
};

// ...превращается в:
uint8_t* data;

На второй день углубления в релевантные материалы, черенок моего сознания наткнулся на анализ алгоритмов Buddy Allocator, Half-Fit, и Two-Level Segregated Fit (TLSF). Все они представляют собою детерминированные аллокаторы постоянной вычислительной сложности O(1) (для Buddy Allocator мы делаем допущение, что объём памяти постоянен, в противном случае оценка будет иной). Почтенные господа J. Herter и J. Robson подвергают оба ресурсных вопроса – как времени, так и памяти – детальному рассмотрению в диссертации “Timing-Predictable Memory Allocation In Hard Real-Time Systems” и статье “Worst case fragmentation of first fit and best fit storage allocation strategies”, соответственно.

Даже малознакомый с теорией динамического распределения памяти читатель найдёт обоснование постоянства вычислительной сложности приведённых алгоритмов тривиальным. Гораздо больший интерес здесь представляет фрагментация. Насколько я могу видеть, многие мои коллеги ошибочно подозревают, что динамические аллокаторы неизбежно приходят в состояние катастрофической фрагментации (где выделение памяти невозможно из-за высокого дробления свободных участков) за конечное время. Подробный разбор вопроса с доказательством обратного можно найти на страницах 26–33 диссертации многоуважаемого Хертера, здесь же я лишь оставлю финальный вывод, что предел размера кучи H, при котором катастрофическая фрагментация недостижима, для лучших из приведённых алгоритмов определён как:

Где M – пиковая потребность приложения в динамической памяти, n – размер наибольшей аллокации.

Здесь уместно вернуться к началу и бросить ещё камней в огород поставщиков ОСРВ. Как я упомянул, в некоторых продуктах встречаются реализации алгоритмов управления памятью, чья стратегия размещения предусматривает выбор свободного фрагмента минимально возможного размера. Эта стратегия хорошо показывает себя в среднем случае, но в особых условиях деградирует до теоретического предела H = M (n — 2), уничтожая надежду на её уместность во встраиваемых системах.

Для меня было очевидным, что множество задач реального времени, где разумное применение хорошо охарактеризованных (предсказуемых) алгоритмов выделения памяти является оправданным, не исчерпывается моим стеком. Контраст между этим осознанием и недостаточным вниманием сообщества разработчиков встраиваемых систем к детерминированным аллокаторам, усугублённый также сомнительными дискуссиями на StackOverflow, побудил меня спасать дело самостоятельно, и я сделал свой собственный аллокатор. Он чрезвычайно компактен (500 строк на C99/C11), его процедуры выделения и освобождения памяти имеют постоянную вычислительную сложность, и предельный уровень фрагментации хорошо охарактеризован.

Вот он: https://github.com/pavel-kirienko/o1heap.

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

  • Левая диаграмма: размер кучи H [KiB] от пиковой потребности приложения в памяти M [KiB] и наибольшей аллокации n [KiB] при минимальном размере аллокации 16 байт.
  • Правая диаграмма: аналогично, но единицы измерения MiB.

Если величины H кажутся чрезмерными, это неспроста, ведь понятия верхнего предела и худшего случая не эквивалентны. Задача поиска огибающей худшего случая включает в себя минимизацию разрыва между теоретическим пределом и практически достижимым наихудшим состоянием. В нашем случае это конкретизируется в минимизацию разрыва между значением H, предсказанным нашей моделью, и реальным пиковым случаем фрагментации, который система может встретить на практике. Я надеялся подобраться к проблеме уменьшения H при сохранении гарантированных свойств алгоритма при помощи симуляций с систематическим перебором возможных состояний, но был вынужден отложить эту затею по причине отсутствия времени. Однако, вовлечённый в тему человек понимает высокую практическую значимость этой доработки. Если среди читателей найдутся достаточно мотивированные коллеги (Embox?), я бы с готовностью ввязался в коллаборацию по этому вопросу.

Другой важный вопрос заключается в исправлении текущего положения дел в открытых системах. Я вяло потыкал метафорической палочкой одного из разработчиков NuttX по этому поводу, и почерпнул, что вопрос имеет низкий приоритет: «I considered porting TLSF at one point, but overall it’s low on my list of NuttX improvements I’d explore if I actually had time». Есть куда стремиться.

Компьютеры и Интернет

Динамическая память случайного доступа или DRAM – самый распространенный тип памяти ПК. Она особенно полезная для ПК, поскольку она может хранить в небольшом физическом пространстве большое количество данных. Тем не менее, она обычно не сохраняет данные, когда отключено питание, что означает, что она не подходит для постоянного хранения данных. Память произвольного доступа просто относится к памяти, в которой можно получить доступ к любой части данных почти мгновенно. «Динамический» элемент DRAM состоит в том, что его источник питания должен постоянно обновляться, чтобы он работал. Это её отличие от статической памяти произвольного доступа или SRAM.
Оба типа памяти SRAM и DRAM работают, сохраняя информацию в двоичном формате, что означает, что она разбита на 1 и 0. В статической памяти с произвольным доступом это осуществляется через электрический ток, который можно переключить на два разных направления. В динамической памяти с произвольным доступом это делается сериями ячеек, которые либо заполнены электронами, либо пустые. Тем не менее, все ячейки автоматически очищаются почти мгновенно, и поэтому их необходимо постоянно заполнять.

Большинство компьютеров используют оба типа памяти вместе. Обычно динамическая память с произвольным доступом используется в больших ёмкостях, поскольку она намного более экономична и, следовательно, дешевле. Статическая память произвольного доступа, к которой можно быстрее получать доступ, но она менее эффективна по площади, и обычно используется для кэширования. Это связано с хранением данных, которые, скорее всего, понадобятся компьютеру во время работы, уменьшая количество раз, когда компьютер должен получить доступ к более медленной DRAM.

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

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

Динамическая память — это… Что такое Динамическая память?



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

Категория:

  • Многозначные термины

Wikimedia Foundation.
2010.

  • Мудьюг
  • Неукен (провинция)

Смотреть что такое «Динамическая память» в других словарях:

  • динамическая память — Память, образуемая миниатюрными периодически подзаряжаемыми конденсаторами. Характерной особенностью динамической памяти является способность хранить данные только короткое время. Для его увеличения необходимо периодически повторять подачу в нее… …   Справочник технического переводчика

  • динамическая память — dinaminė atmintis statusas T sritis automatika atitikmenys: angl. cyclic memory; cyclic storage; circulating memory; dynamic memory; dynamic storage; recirculating storage vok. Dauerumlaufspeicher, m; dynamischer Speicher, m; Umlaufspeicher, m… …   Automatikos terminų žodynas

  • динамическая память с произвольным (адресуемым) доступом — Тип компьютерной памяти, использующей электрические заряды для сохранения информации о состоянии битов. Такая память требует постоянного обновления ячеек (refreshing).  [http://www.lexikon.ru/dict/net/index.html] Тематики сети вычислительные EN… …   Справочник технического переводчика

  • Динамическая память с произвольным доступом — типы DRAM памяти FPM RAM EDO RAM Burst EDO RAM DDR SDRAM DDR2 SDRAM DDR3 SDRAM QDR SDRAM WRAM SGRAM GDDR3 GDDR5 DRAM (Dynamic Random Access Memory)  один из видов компьютерной памяти с произвольным доступом (RAM), наиболее широко используемый в… …   Википедия

  • модульная динамическая память — Память для видеоадаптера, в которой обеспечивается возможность одновременного независимого обращения к различным ее областям. Такая память состоит из набора модулей DRAM, ассортимент которых обычно настолько широк, что можно набрать требуемый… …   Справочник технического переводчика

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

  • динамическая оперативная память — динамическая память с произвольным доступом — [Л.Г.Суменко. Англо русский словарь по информационным технологиям. М.: ГП ЦНИИС, 2003.] Тематики информационные технологии в целом Синонимы динамическая память с произвольным доступом EN dynamic …   Справочник технического переводчика

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

  • динамическая переменная — Переменная, память для которой выделяется во время исполнения программы. [http://www.morepc.ru/dict/] Тематики информационные технологии в целом EN dynamic variable …   Справочник технического переводчика

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

Динамическая память с произвольным доступом

DRAM (Dynamic Random Access Memory) — один из видов компьютерной памяти с произвольным доступом (RAM), наиболее широко используемый в качестве ОЗУ современных компьютеров.

Конструктивно память DRAM состоит из «ячеек» размером в 1 или 4 бит, в каждой из которых можно хранить определённый объём данных. Совокупность «ячеек» такой памяти образуют условный «прямоугольник», состоящий из определённого количества строк и столбцов. Один такой «прямоугольник» называется страницей, а совокупность страниц называется банком. Весь набор «ячеек» условно делится на несколько областей.

Принцип действия

Принцип действия чтения DRAM для простого массива 4 на 4.

Физическое представление

В современных компьютерах физически DRAM-память представляет собой электрическую плату — модуль, на котором расположены микросхемы памяти и разъём, необходимый для подключения модуля к материнской плате. Роль «ячеек» играют конденсаторы и транзисторы, расположенные внутри микросхем памяти. Конденсаторы заряжаются в случае, когда в «ячейку» заносится единичный бит, либо разряжаются в случае, когда в «ячейку» заносится нулевой бит. Транзисторы необходимы для удержания заряда внутри конденсатора. При отсутствии подачи электроэнергии к оперативной памяти, происходит разряд конденсаторов, и память опустошается. Это динамическое изменение заряда конденсатора является основополагающим принципом работы памяти типа DRAM. Элементом памяти этого типа является чувствительный усилитель (англ. sense amp), подключенный к каждому из столбцов «прямоугольника». Он, реагируя на слабый поток электронов, устремившихся через открытые транзисторы с обкладок конденсаторов, считывает всю страницу целиком. Именно страница является минимальной порцией обмена с динамической памятью, потому что обмен данными с отдельно взятой ячейкой невозможен.

Характеристики памяти DRAM

Основными характеристиками DRAM являются тайминги и рабочая частота. Для обращения к ячейке контроллер задаёт номер банка, номер страницы в нём, номер строки и номер столбца, на все запросы тратится время, помимо этого довольно большой период уходит на открытие и закрытие банка после самой операции. На каждое действие требуется время, называемое таймингом. Основными таймингами DRAM являются: задержка между подачей номера строки и номера столбца, называемая временем полного доступа (англ. RAS to CAS delay), задержка между подачей номера столбца и получением содержимого ячейки, называемая временем рабочего цикла (англ. CAS delay), задержка между чтением последней ячейки и подачей номера новой строки (англ. RAS precharge). Тайминги измеряются в наносекундах, и чем меньше величина этих таймингов, тем быстрее работает оперативная память. Рабочая частота измеряется в мегагерцах, и увеличение рабочей частоты памяти приводит к увеличению её быстродействия.

Регенерация

В отличие от статической памяти типа англ. static random access memory), которая является конструктивно более сложным и более дорогим типом памяти RAM и используется в основном в кэш—памяти, память DRAM изготавливается на основе конденсаторов небольшой ёмкости, которые быстро теряют заряд, поэтому информацию приходится обновлять через определённые периоды времени во избежание потерь данных. Этот процесс называется регенерацией памяти. Он реализуется специальным контроллером, установленным на материнской плате или на кристалле центрального процессора. На протяжении времени, называемого шагом регенерации, в DRAM перезаписывается целая строка «ячеек», и через 8-64 мс обновляются все строки памяти.

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

Из новых технологий регенерации можно выделить тип регенерации PASR (англ. Partial Array Self Refresh), применяемый компанией Samsung в чипах памяти SDRAM с низким уровнем энергопотребления. Регенерация «ячеек» выполняется только в период ожидания в тех банках памяти, в которых имеются данные. Параллельно с этой технологией реализуется метод TCSR (англ. Temperature Compensated Self Refresh), который предназначен для регулировки скорости процесса регенерации в зависимости от рабочей температуры.

Типы DRAM

На протяжении долгого времени разработчиками создавались различные типы памяти. Они обладали разными характеристиками, в них были использованы разные технические решения. Основной движущей силой развития памяти было развитие ЭВМ и центральных процессоров. Постоянно требовалось увеличение быстродействия и объёма оперативной памяти.

Страничная память

Страничная память (англ. page mode DRAM, PM DRAM) являлась одним из первых типов выпускаемой компьютерной оперативной памяти. Память такого типа выпускалась в начале 90-х годов, но с ростом производительности центральных процессоров и ресурсоёмкости приложений требовалось увеличивать не только объём памяти, но и скорость её работы.

Быстрая страничная память

Быстрая страничная память (англ. fast page mode DRAM, FPM DRAM) появилась в 1995 году. Принципиально новых изменений память не претерпела, а увеличение скорости работы достигалось путём повышенной нагрузки на аппаратную часть памяти. Данный тип памяти в основном применялся для компьютеров с процессорами Intel 80486 или аналогичных процессоров других фирм. Память могла работать на частотах 25 МГц и 33 МГц с временем полного доступа 70 нс и 60 нс и с временем рабочего цикла 40 нс и 35 нс соответственно.

Память с усовершенствованным выходом

C появлением процессоров Intel Pentium память FPM DRAM оказалась совершенно неэффективной. Поэтому следующим шагом стала память с усовершенствованным выходом (англ. extended data out DRAM, EDO DRAM). Эта память появилась на рынке в 1996 году и стала активно использоваться на компьютерах с процессорами Intel Pentium и выше. Её производительность оказалась на 10—15 % выше по сравнению с памятью типа FPM DRAM. Её рабочая частота была 40 МГц и 50 МГц, соответственно, время полного доступа — 60 нс и 50 нс, а время рабочего цикла — 25 нс и 20 нс. Эта память содержит регистр-защелку (англ. data latch) выходных данных, что обеспечивает некоторую конвейеризацию работы для повышения производительности при чтении.

Синхронная DRAM

В связи с выпуском новых процессоров и постепенным увеличением частоты системной шины, стабильность работы памяти типа EDO DRAM стала заметно падать. Ей на смену пришла синхронная память (англ. synchronous DRAM, тактового генератора для синхронизации всех сигналов и использование конвейерной обработки информации. Также память надёжно работала на более высоких частотах системной шины (100 МГц и выше). Недостатками данного типа памяти являлась его высокая цена, а также его несовместимость со многими чипсетами и материнскими платами в силу своих новых конструктивных особенностей. Рабочие частоты этого типа памяти могли равняться 66 МГц, 100 МГц или 133 МГц, время полного доступа — 40 нс и 30 нс, а время рабочего цикла — 10 нс и 7,5 нс.

Пакетная EDO RAM

Пакетная память EDO RAM (англ. burst extended data output DRAM, BEDO DRAM) стала дешёвой альтернативой памяти типа SDRAM. Основанная на памяти EDO DRAM, её ключевой особенностью являлась технология поблочного чтения данных (блок данных читался за один такт), что сделало её работу быстрее, чем у памяти типа SDRAM. Однако невозможность работать на частоте системной шины более 66 МГц не позволила данному типу памяти стать популярным.

Video RAM

Cпециальный тип оперативной памяти Video RAM (видеоплатах. Он позволял обеспечить непрерывный поток данных в процессе обновления изображения, что было необходимо для реализации изображений высокого качества. На основе памяти типа VRAM, появилась спецификация памяти типа Windows RAM (операционными системами семейства Windows. Её производительность стала на 25 % выше, чем у оригинальной памяти типа SDRAM, благодаря некоторым техническим изменениям.

DDR SDRAM

По сравнению с обычной памятью типа SDRAM, в памяти SDRAM с удвоенной скоростью передачи данных (англ. double data rate SDRAM, DDR SDRAM или SDRAM II) была вдвое увеличена пропускная способность. Первоначально память такого типа применялась в видеоплатах, но позднее появилась поддержка DDR SDRAM со стороны чипсетов. Она работает на частотах в 100 МГц и 133 МГц, её время полного доступа — 30 нс и 22,5 нс, а время рабочего цикла — 5 нс и 3,75 нс.

Direct RDRAM, или Direct Rambus DRAM

Тип памяти Rambus. Высокое быстродействие этой памяти достигается рядом особенностей, не встречающихся в других типах памяти. Первоначальная очень высокая стоимость памяти RDRAM привела к тому, что производители мощных компьютеров предпочли менее производительную, зато более дешёвую память DDR SDRAM. Рабочие частоты памяти — 400 МГц, 600 МГц и 800 МГц, время полного доступа — до 30 нс, время рабочего цикла — до 2,5 нс.

DDR2 SDRAM

Конструктивно новый тип оперативной памяти DDR2 SDRAM был выпущен в 2004 году. Основываясь на технологии DDR SDRAM, этот тип памяти за счёт технических изменений показывает более высокое быстродействие и предназначен для использования на современных компьютерах. Память может работать на частотах в 200 МГц, 266 МГц, 333 МГц и 400 МГц. Время полного доступа — 25 нс, 11,25 нс, 9 нс, 7,5 нс. Время рабочего цикла — 5 нс, 3,75 нс, 3 нс, 3,5 нс.

Корпуса

Различные корпуса DRAM. Сверху вниз: DIP, SIP, SIMM (30-контактный), SIMM (72-контактный), DIMM (168-контактный), DIMM (184-контактный, DDR)

Элементы памяти типа DRAM конструктивно выполняют либо в виде отдельных микросхем в корпусах типа SIP (Single In-Line Package), DIMM (Dual In-line Memory Module), RIMM (Rambus In-line Memory Module). Микросхемы в корпусах типа DIP выпускались до использования модулей памяти. Эти микросхемы имеют два ряда контактов, расположенных вдоль длинных сторон чипа и загнутых вниз.

Модули SIP

Модули типа SIP представляют собой прямоугольные платы с контактами в виде маленьких штырьков. Этот тип памяти в настоящее время практически не используется, так как был вытеснен модулями памяти типа SIMM.

Модули SIMM

Модули типа SIMM представляют собой прямоугольную плату с контактной полосой вдоль одной из сторон, модули фиксируются в разъёме поворотом с помощью защёлок. Наиболее распространены 30- и 72-контактные SIMM. Широкое распространение нашли SIMM на 4, 8, 16, 32 и даже 64 Мбайт.

Модули DIMM

Модули типа DIMM наиболее распространены в виде 168-контактных модулей, устанавливаемых в разъём вертикально и фиксируемых защёлками. В портативных устройствах широко применяются SO DIMM — разновидность DIMM малого размера (англ. SO — small outline), они предназначены в первую очередь для портативных компьютеров. Наиболее часто встречаются 72- и 144-контактные модули типа SO DIMM. Память типа DDR SDRAM выпускается в виде 184-контактных DIMM-модулей, а для памяти типа DDR2 SDRAM выпускаются 240-контактные модули.

Модули RIMM

Модули типа RIMM менее распространены, в таких модулях выпускается память типа Direct RDRAM. Они представлены 168/184-контактными[1] прямоугольными платами, которые обязательно должны устанавливаться только в парах, а пустые разъёмы на материнской плате занимаются специальными заглушками. Это связано с особенностями конструкции таких модулей. Так же существуют модули 232-pin PC1066 RDRAM RIMM 4200, не совместимые с 184-контактными разъёмами.

Производители

В пятёрку крупнейших производителей DRAM по итогам первого квартала 2008 года вошли Samsung, Hynix, Elpida, Micron, Qimonda. Samsung занял 27 % рынка. Однако лидером по объёму производства готовых DRAM-модулей является американская Kingston.[2]

Примечания

См. также

Ссылки

Wikimedia Foundation.
2010.

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

Оперативная память может составляться из микросхем динамического (Dynamic Random Access Memory — DRAM) или статического (Static Random Access Memory — SRAM) типа.

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

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



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

Глава 6. Запоминающие устройства ПК

Динамическая память. Управление памятью.

Память
для хранения данных может выделяться
как статически, так и динамически. В
первом случае выделение памяти выполняет
компилятор, встретивший при компиляции
объявление объекта. В соответствии с
типом встретившегося объекта вычисляется
объем памяти, требуемый для его размещения.
Класс памяти задает место, где эти
объекты (данные) будут располагаться.
Это может быть сегмент данных либо стек.
Напомним, что стек (магазин, список
LIFO –
Last
In
First
Out)
представляет собой последовательный
список переменной длины, в котором
включение и исключение элементов
производится только с одной стороны.
Главные операции при работе со стеком
– включение и исключение элемента –
осуществляются с вершины стека, причем
в каждый момент доступен элемент,
находящийся на вершине стека.

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

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

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

Если
выделенный участок памяти больше не
требуется, он может быть освобожден.
При высокой активности по динамическому
распределению памяти «куча» фрагментируется.
Для смягчения отрицательных последствий
фрагментации служат функции повторного
распределения памяти. Они пытаются либо
расширить, либо уменьшить размер ранее
выделенного блока памяти.

Для языка
С:

Функция
управления памятью

Действие

Заголовочный
файл
в BC++ 3.1

Заголовочный
файл в VC++ 6.0

malloc()

Распределение

stdlib.h

alloc.h

stdlib.h

malloc.h

calloc()

Распределение

realloc()

Перераспределение

free()

Освобождение

Управление файлами.

Имена файлов

Файлы
идентифицируются именами. Пользователи
дают файлам символьные имена, при этом
учитываются ограничения ОС как на
используемые символы, так и на длину
имени. До недавнего времени эти границы
были весьма узкими. Так в популярной
файловой системе FAT длина имен
ограничивается известной схемой 8.3 (8
символов — собственно имя, 3 символа —
расширение имени), а в ОС UNIX System V имя не
может содержать более 14 символов. Однако
пользователю гораздо удобнее работать
с длинными именами, поскольку они
позволяют дать файлу действительно
мнемоническое название, по которому
даже через достаточно большой промежуток
времени можно будет вспомнить, что
содержит этот файл. Поэтому современные
файловые системы, как правило, поддерживают
длинные символьные имена файлов.
Например, Windows NT в своей новой файловой
системе NTFS устанавливает, что имя файла
может содержать до 255 символов, не считая
завершающего нулевого символа.

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

Типы файлов

Файлы
бывают разных типов: обычные файлы,
специальные файлы, файлы-каталоги.

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

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

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

Физическая
организация и адрес файла

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

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

Общая
модель файловой системы

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

Задачей
символьного уровня является определение
по символьному имени файла его уникального
имени. В файловых системах, в которых
каждый файл может иметь только одно
символьное имя (например, MS-DOS), этот
уровень отсутствует, так как символьное
имя, присвоенное файлу пользователем,
является одновременно уникальным и
может быть использовано операционной
системой. В других файловых системах,
в которых один и тот же файл может иметь
несколько символьных имен, на данном
уровне просматривается цепочка каталогов
для определения уникального имени
файла. В файловой системе UNIX, например,
уникальным именем является номер
индексного дескриптора файла (i-node).

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

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

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

1 и 2
используются в тех случаях, когда все
процессы целиком помещаются в памяти.

  1. Схема
    с фиксированными разделами

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

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

Самый
простой способ управления оперативной
памятью

«–» число
одновременно выполняемых процессов
ограничено числом разделов.

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

  1. Схема
    с переменными разделами

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

После
выгрузки процесса память временно
освобождается.

Смежные
свободные участки могут быть объединены.

3 стратегии
размещения разделов в памяти:

Стратегия
первого подходящего.

Стратегия
наиболее подходящего. Где после загрузки
останется меньше свободного места.

Стратегия
наименее подходящего. Где останется
место для еще одного процесса.

«–»
внешняя фрагментация
– наличие большого числа участков
неиспользуемой памяти,

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

Одно из
решений проблемы внешней
фрагментации

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

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

Задачи
ОС:

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

  • при
    поступлении новой задачи — анализ
    запроса, просмотр таблицы свободных
    областей и выбор раздела, загрузка
    задачи в выделенный ей раздел и
    корректировка таблиц,

  • после
    завершения задачи – корректировка
    таблиц свободных и занятых областей.

  1. Оверлейная
    структура

Так как
размер логического адресного
пространства

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

Основная
идея – держать в памяти только те
инструкции программы, которые нужны в
данный момент.

A-(B,C)

C-(D,E)

Привязка
к физической
памяти

происходит в момент очередной загрузки
одной из ветвей программы.

«+» процесс
м. поместить в адр. пространство, которое
< адр. пространства процесса.

«–»
программист должен сам определять части
программы.

  1. Динамическое
    распределение. Свопинг

Свопинг
(swapping) – перемещение процессов из главной
памяти на диск и обратно целиком.
Частичная выгрузка процессов на диск
осуществляется в системах со страничной
организацией (paging).

Выгруженный
процесс может быть возвращен в то же
самое адресное
пространство

или в другое.

Свопинг
увеличивает время переключения контекста.

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

Виртуальным
называется ресурс, который пользователю
или пользовательской программе
представляется обладающим свойствами,
которыми он в действительности не
обладает.

Виртуальная
память

– это совокупность программно-аппаратных
средств, позволяющих пользователям
писать программы, размер которых
превосходит имеющуюся оперативную
память; для этого виртуальная память
решает следующие задачи:

  • размещает
    данные в ЗУ разного типа, например,
    часть программы в ОЗУ, а часть на диске;

  • перемещает
    по мере необходимости данные между ЗУ
    разного типа, например, подгружает
    нужную часть программы с диска в
    оперативную память;

  • преобразует
    виртуальные адреса в физические.

Наиболее
распространенными реализациями
виртуальной памяти

является страничное, сегментное и
странично-сегментное распределение
памяти.

Динамическое распределение памяти — это… Что такое Динамическое распределение памяти?

Динамическое распределение памяти — способ выделения оперативной памяти компьютера для объектов в программе, при котором выделение памяти под объект осуществляется во время выполнения программы.

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

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

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

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

Элементы реализации

Язык программирования C (Си)

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

  • malloc (от англ. memory allocation, выделение памяти),
  • calloc (от англ. clear allocation, чистое выделение памяти)
  • realloc (от англ. reallocation, перераспределение памяти).
  • free (англ. free, освободить)

Эти функции имеют следующие описания:

#include <stdlib.h>
 
void *malloc (size_t size);
void *calloc (size_t num, size_t size);
void *realloc(void *block, size_t size);
void free(void *block);

В C++ имеются два оператора:

Язык программирования Object Pascal

В Object Pascal имеются два оператора:

См. также

Языки программирования

Стандарты

Библиотеки

Источники

  • malloc  (англ.). — Описание функции malloc в стандарте POSIX. Архивировано из первоисточника 19 мая 2012.
  • calloc  (англ.). — Описание функции calloc в стандарте POSIX. Архивировано из первоисточника 19 мая 2012.—>

Динамическая память — Учебники по C ++

Новые и новые операторы []

Динамическая память выделяется с помощью оператора new . за новым следует спецификатор типа данных, и, если требуется последовательность из более чем одного элемента, их количество в скобках [] . Он возвращает указатель на начало нового выделенного блока памяти. Его синтаксис:


указатель = новый тип
указатель = новый тип [число_элементов]


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

  1 
2
   int  * foo;
foo =  новый   int  [5];  

В этом случае система динамически выделяет пространство для пяти элементов типа int и возвращает указатель на первый элемент последовательности, который назначается foo (указатель).Следовательно, foo теперь указывает на допустимый блок памяти с пространством для пяти элементов типа int .

Здесь foo является указателем, и, таким образом, к первому элементу, на который указывает foo , можно получить доступ либо с помощью выражения foo [0] , либо с помощью выражения * foo (оба эквивалентны) . Ко второму элементу можно получить доступ либо с помощью foo [1] , либо * (foo + 1) , и так далее …

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

Динамическая память, запрошенная нашей программой, выделяется системой из кучи памяти. Однако память компьютера — ограниченный ресурс, и он может быть исчерпан.Следовательно, нет никаких гарантий, что все запросы на выделение памяти с использованием оператора new будут удовлетворены системой.

C ++ предоставляет два стандартных механизма для проверки успешности выделения:

Первый — обработка исключений. При использовании этого метода при сбое выделения создается исключение типа bad_alloc . Исключения — это мощная функция C ++, описанная далее в этих руководствах. Но пока вы должны знать, что если это исключение выбрасывается и не обрабатывается конкретным обработчиком, выполнение программы прекращается.

Этот метод исключения — метод, используемый по умолчанию в new , и тот, который используется в объявлении, например:

   
  foo =  новый   int  [5];  // если распределение не удается, генерируется исключение   

Другой метод известен как nothrow , и то, что происходит при его использовании, заключается в том, что при сбое выделения памяти вместо выдачи исключения bad_alloc или завершения программы указатель, возвращаемый new , является нулевым . указатель , и программа продолжает свое выполнение в обычном режиме.

Этот метод можно указать с помощью специального объекта с именем nothrow , объявленного в заголовке , в качестве аргумента для new :

   
  foo =  new  (nothrow)  int  [5];  

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

  1 
2
3
4
5
   int  * foo;
foo =  new  (nothrow)  int  [5];
 , если  (foo ==  nullptr ) {
    // ошибка при назначении памяти.Принять меры. 
}  

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

Операторы удаляют и удаляют []

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

  1 
2
   удалить указатель ;
  удалить  [] указатель;  

Первый оператор освобождает память одного элемента, выделенного с использованием new , а второй освобождает память, выделенную для массивов элементов с использованием new и размера в скобках ( [] ).

Значение, переданное в качестве аргумента delete , должно быть либо указателем на блок памяти, ранее выделенным с помощью new , либо нулевым указателем (в случае нулевого указателя , delete не оказывает никакого влияния ).

  1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
   // помните-о-матик 
  #include  
  #include  
  с использованием пространства имен    std;

  int  main ()
{
    int  i, n;
    внутр  * р;
  cout <<  «Сколько чисел вы хотите ввести?» ;
  cin >> я;
  p =  новый  (без выстрела)  int  [i];
   , если  (p ==  nullptr )
    cout <<  «Ошибка: не удалось выделить память» ;
    еще 
  {
      для  (n = 0; n  "Введите число:" ;
      cin >> p [n];
    }
    cout <<  "Вы ввели:" ;
      для  (n = 0; n  "," ;
      удалить  [] п;
  }
    возврат  0;
}  
  Сколько цифр вы хотите ввести? 5
Введите номер: 75
Введите номер: 436
Введите номер: 1067
Введите число: 8
Введите номер: 32
Вы ввели: 75, 436, 1067, 8, 32,  

Обратите внимание, что значение в скобках в новом операторе является значением переменной, введенным пользователем ( i ), а не постоянным выражением:

   
  p =  новый  (без поворота)  int  [i];  

Всегда существует вероятность, что пользователь вводит значение для i настолько большое, что система не может выделить для него достаточно памяти.Например, когда я попытался дать значение 1 миллиард на вопрос «Сколько чисел», моя система не смогла выделить такой объем памяти для программы, и я получил текстовое сообщение, которое мы подготовили для этого случая (Ошибка : память не удалось выделить ).

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

.

c ++ — выполняется ли выделение динамической памяти с помощью указателей

Переполнение стека

  1. Около
  2. Продукты

  3. Для команд
  1. Переполнение стека
    Общественные вопросы и ответы

  2. Переполнение стека для команд
    Где разработчики и технологи делятся частными знаниями с коллегами

  3. Вакансии
    Программирование и связанные с ним технические возможности карьерного роста

  4. Талант
    Нанимайте технических специалистов и создавайте свой бренд работодателя

  5. Реклама
    Обратитесь к разработчикам и технологам со всего мира

  6. О компании

.

новейших вопросов о динамическом распределении памяти — qaru

Переполнение стека

  1. Около
  2. Продукты

  3. Для команд
  1. Переполнение стека
    Общественные вопросы и ответы

  2. Переполнение стека для команд
    Где разработчики и технологи делятся частными знаниями с коллегами

  3. Вакансии
    Программирование и связанные с ним технические возможности карьерного роста

  4. Талант
    Нанимайте технических специалистов и создавайте свой бренд работодателя

  5. Реклама
    Обратитесь к разработчикам и технологам со всего мира

  6. О компании

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *