Верно ли утверждение что программа выполняющаяся на компьютере хранится в оперативной памяти
Внешняя память - это память, предназначенная для длительного хранения программ и данных. Целостность содержимого ВЗУ не зависит от того, включен или выключен компьютер.
Внутренняя память -
Оперативная память (ОП) предназначена для временного хранения выполняемых программ и данных, обрабатываемых этими программами. Это энергозависимая память. Физически реализуется в модулях ОЗУ (оперативных запоминающих устройствах) различного типа. При выключении электропитания вся информация в оперативной памяти исчезает.
Объём хранящейся информации в ОЗУ составляет от 32 до 512 Мбайт и более. Занесение информации в память и её извлечение, производится по адресам. Каждый байт ОП имеет свой индивидуальный адрес (порядковый номер) . Адрес – число, которое идентифицирует ячейки памяти (регистры) . ОП состоит из большого количества ячеек, в каждой из которых хранится определенный объем информации. ОП непосредственно связана с процессором. Возможности ПК во многом зависят от объёма ОП.
Кеш память - очень быстрая память малого объема служит для увеличения производительности компьютера, согласования работы устройств различной скорости.
Специальная - постоянная, Fiash, видеопамять и тд.
Постоянное запоминающее устройство (ПЗУ) – энергонезависимая память для хранения программ управления работой и тестирования устройств ПК. Важнейшая микросхема ПЗУ – модуль BIOS (Basic Input/Output System – базовая система ввода/вывода) , в котором хранятся программы автоматического тестирования устройств после включения компьютера и загрузки ОС в оперативную память. Это Неразрушимая память, которая не изменяется при выключении питания
Перепрограммируемая постоянная память (Flash Memory) – энергонезависимая память, допускающая многократную перезапись своего содержимого
CMOS RAM (Complementary Metal-Oxide Semiconductor) - память с невысоким быстродействием и минимальным энергопотреблением от батарейки. Используется для хранения информации о конфигурации и составе оборудования компьютера, о режимах его работы. Содержимое изменяется программой, находящейся в BIOS (Basic Input Output System).
Видеопамять – запоминающее устройство, расположенное на плате управления дисплеем и предназначенное для хранения текстовой и графической информации, отображаемой на экране. Содержимое этой памяти сразу доступно двум устройствам – процессору и дисплею, что позволяет изменять изображение на экране одновременно с обновлением видеоданных в памяти.
Так что данные хранятся во внешней памяти.
Оперативная память играет важную роль: во время работы компьютера в ней хранятся текущие данные, которые необходимы процессору в тот или иной момент времени. Например, когда вы запускаете какую-нибудь программу, она в первую очередь загружается с жесткого диска в оперативную память и только после этого становится доступной для процессора.
Допустим, вы поработали в какой-то программе и вдруг решили поиграть в очень интересную игру. Для простоты предположим, что вы сначала закрыли свою программу, после чего запустили игрушку. При этом данные, связанные с программой, выгружаются из оперативной памяти, а информация об игре загружается в «оперативку». То есть уже данные игры (а не программы) станут доступны для процессора, что и позволит вам насладиться именно игрой.
Усложним пример. Допустим, вы запустили несколько программ (или игр) одновременно. При этом все связанные с запущенными приложениями данные загрузятся в оперативную память (конечно, если ее объема для этого достаточно). В зависимости от того, на какую конкретно программу вы решили переключиться, процессор обратится именно к тем ячейкам памяти, в которых хранятся данные, связанные с этой программой.
Соединяем узнанное воедино
Как мы уже упоминали, процессор «общается» с оперативной памятью не напрямую, а через специальную микросхему на материнской плате, которая называется северным мостом. При этом процессор, северный мост и оперативная память соединены между собой почти сотней очень тоненьких проводников, которые и называются системной шиной (FSB), о которой мы также уже говорили.
«Для чего вообще нужна оперативная память? – спросите вы. – Почему бы процессору не работать напрямую с файлами программ, хранящимися на жестком диске компьютера?»
Дело в том, что тогда бы возникли серьезные проблемы со скоростью работы компьютера. Пока все существующие в природе жесткие диски работают медленнее оперативной памяти в тысячи раз. Вот и приходится сначала загружать необходимые данные в намного более быструю оперативную память, чтобы процессор мог с ними нормально работать.
Внимание!
Нужно четко представлять, что оперативная память является энергозависимой. Это означает, что, как только вы выключите компьютер (или вдруг пропадет электричество), все данные из оперативной памяти пропадут.
По-английски оперативная память называется Random Access Memory (RAM), что переводится как «память с произвольным доступом». Что это за произвольный доступ? Будем разбираться, как говорится, «на пальцах».
Данные в оперативной памяти хранятся в так называемых ячейках. Каждая ячейка имеет индивидуальный адрес, который состоит из номеров строки и столбца, в которых расположена эта ячейка. Таких ячеек очень много (миллионы), и вместе они составляют двумерную матрицу.
Так вот, произвольный тип доступа оперативной памяти означает то, что если процессору вдруг понадобились данные из ячейки какого-нибудь стотысячного столбца и двухсоттысячной строки, ему не нужно последовательно перебирать все предыдущие тысячи столбцов и строк, чтобы добраться до искомой ячейки. Поиск и обращение к нужной ячейке происходят непосредственно и за счет этого очень быстро, что, согласитесь, достаточно благоприятно влияет на скорость работы.
Иными словами, сочетание «произвольный доступ» означает, что скорость доступа к конкретной ячейке не зависит от ее физического расположения в памяти.
Для сравнения
К примеру, на так называемых ленточных носителях информации реализован последовательный доступ. При таком типе доступа, чтобы прочитать содержимое ячейки (блока) под номером 1000, устройству чтения первым делом необходимо обнаружить начальную ячейку (для чего перемотать магнитную ленту к началу), потом последовательно отсчитать 999 блоков и только после этого произвести чтение из нужной ячейки.
Зададимся вопросом: «Что собой представляет оперативная память или, говоря более понятным языком, как она выглядит?» Это плата с расположенными с двух сторон прямоугольными микросхемами, в которых непосредственно и находится оперативная память (рис. 4.6).
Рис. 4.6. Плата оперативной памяти (один из видов)
На материнской плате оперативная память устанавливается в специально предназначенные для этого слоты (рис. 4.7).
Рис. 4.7. Слоты для оперативной памяти
Следует иметь в виду, что для каждого вида модулей оперативной памяти существуют собственные слоты. То есть вы не сможете, к примеру, установить память SDRAM в слот для DDR SDRAM, и наоборот.
Примечание
Не пугайтесь. Чуть позже вы узнаете, что означают загадочные аббревиатуры SDRAM и DDR SDRAM.
Впрочем, как самостоятельно устанавливать оперативную память на материнскую плату, мы рассмотрим в главе 11, а пока поговорим о ее основных характеристиках и видах.
Объем оперативной памяти
Самой понятной для обычного пользователя характеристикой памяти является ее объем. Как мы уже упоминали, объем современных плат памяти измеряется сотнями мегабайт. Чтобы ваш компьютер работал эффективно, он должен быть «вооружен» достаточным количеством оперативной памяти.
Если перевести наш разговор в русло сухих фактов, то вы узнаете, что для работы в операционной системе Windows XP неплохо бы иметь минимум 256 Мбайт «оперативки» (это необходимый минимум, комфортно работать с таким объемом памяти не получится), а лучше – 512 Мбайт. Если же компьютер работает под управлением Windows Vista, памяти понадобится значительно больше, то есть никак не меньше 512 Мбайт. А если вы хотите насладиться всеми прелестями полупрозрачного и трехмерного интерфейса Vista, придется начинать плясать от 1 Гбайт.
Быстродействие и производительность
Вы уже знаете, что самым быстрым устройством компьютера является процессор. Поэтому задача роста производительности ПК сводится не столько к повышению тактовой частоты ядра процессора, сколько к увеличению скорости работы остальных устройств, чтобы процессор не так долго простаивал, ожидая своих неторопливых коллег.
Оперативная память хоть и работает намного быстрее других внутренних устройств компьютера, все равно сильно отстает от скорости процессора. В связи с этим производители памяти все время пытаются всячески увеличить ее скорость.
Основным параметром быстродействия оперативной памяти является время доступа. Это время, которое проходит между моментом, когда чипсет дает запрос о содержимом ячейки памяти, и моментом, когда к нему возвращается ответ.
Время доступа измеряется в наносекундах. Напомним, что 1 нс = 10 –9 с. Такие промежутки времени могут показаться вам неимоверно малыми, но для процессора они все равно остаются очень большими.
Величина, обратная времени доступа, называется тактовой частотой. Этот параметр является более наглядным, так как позволяет реально сравнить скорость работы процессора и оперативной памяти. Например, устаревшие уже типы «оперативки» имели время доступа около 15 нс, что соответствовало тактовой частоте 60 МГц. Современные же типы памяти могут работать с тактовыми частотами 1066 МГц и выше.
Помимо скорости, оперативная память характеризуется таким важным параметром, как производительность (она же – теоретическая пропускная способность). Как производительность процессора зависит от разрядности системной шины, так производительность оперативной памяти зависит от разрядности шины памяти.
Разрядность шины памяти – это количество бит (байт), которые память может одновременно записать или прочитать за раз. Большинство современных типов памяти имеют разрядность шины 64 бита (8 байт) (хотя есть и выше).
Производительность оперативной памяти определяет количество информации, которое память способна принять или выдать за 1 секунду. И вычисляется она простым умножением разрядности шины памяти на скорость памяти.
Но не будем слишком глубоко вдаваться в технические тонкости. Вычислять быстродействие и производительность оперативной памяти вы вряд ли будете, скорее всего, просто купите ту, которая подходит к вашей материнской плате.
Типы памяти и виды модулей памяти
• FPM RAM (Fast Page Mode RAM) – память с так называемым быстрым страничным обменом использовалась в первые годы компьютерной эры. Как мы уже упоминали, оперативная память представляет собой многомиллионную матрицу ячеек. Для ускорения доступа к оперативной памяти она разбивалась на так называемые страницы. Это позволяло увеличить скорость доступа к данным в случаях, когда изменялся только номер столбца ячейки, а номер строки оставался неизменным. Время доступа FPM RAM составляло 200 нс.
• В 1995 году появилась память EDO RAM (Extended Data Output RAM), то есть оперативная память с расширенными возможностями вывода. EDO RAM была усовершенствованной версией FPM RAM. Время доступа данной памяти составляло уже 50 нс, но все равно было еще очень и очень большим (по сравнению со скоростью работы процессоров).
Эти два типа памяти безнадежно устарели и вряд ли уже когда-либо вам встретятся. Хотя, если вам попадется один из первых компьютеров на базе процессора Pentium Pro…
• В конце 1990-х годов производители памяти осчастливили пользователей компьютеров памятью нового типа SDRAM (Synchronous Dynamic RAM) – синхронная динамическая память. Данная память функционировала значительно быстрее предшественниц (время доступа составляло 6–9 нс) за счет синхронизации своей работы с системной платой. Память SDRAM хоть и считается уже морально устаревшей, однако ее все еще довольно часто можно встретить на не очень новых компьютерах. К тому же найти данную память в продаже не так легко.
• Следующим витком эволюции оперативной памяти стала DDR SDRAM. Аббревиатура DDR означает Double Data Rate – удвоенная скорость передачи данных. Как можно догадаться из названия, данная память работает в два раза быстрее SDRAM, и это действительно так. Память DDR SDRAM (и ее потомки) используется практически на всех современных компьютерах. Такая популярность памяти DDR SDRAM объясняется тем, что она способна работать с большинством современных системных плат, функционирующих на высоких частотах.
• Нетрудно предположить, что память DDR2 SDRAM и DDR3 SDRAM – это дальнейшее развитие DDR SDRAM. Эти типы различаются некоторыми технологическими особенностями, но нам это не так интересно. Просто запомните, что DDR2 работает быстрее, чем DDR, а DDR3 – быстрее, чем DDR2.
• Некоторое время лидером в быстродействии являлась память RDRAM (Rambus Dynamic RAM) – динамическая память от компании Rambus. Она работала на частотах 400 и 533 МГц и очень дорого стоила. Из-за своей дороговизны RDRAM не получила широкого распространения и встречается в некоторых компьютерах на базе уже несколько устаревшего процессора Pentium 4. Другие же производители материнских плат решили использовать более доступную память DDR SDRAM.
Вот такие типы памяти существовали либо существуют на рынке компьютерных технологий.
Теперь поговорим о модулях оперативной памяти. Под модулем мы будем понимать плату, на которой расположены микросхемы памяти (см. рис. 4.6). Модули отличаются друг от друга размерами и формой (форм-фактором). Вам могут встретиться модули памяти трех видов: SIMM, DIMM и RIMM.
• Модули SIMM (Single Inline Memory Module – модуль памяти с однорядным расположением выводов) являются устаревшими, так как именно на них реализовывалась память FPM и EDO. Данные модули производились в двух вариантах: 30– и 72-контактные (рис. 4.8).
Рис. 4.8. 30-контактный (сверху) и 72-контактный (снизу) модули SIMM
Отличительной особенностью модулей SIMM являлось то, что их нельзя было устанавливать на материнскую плату по одиночке или в нечетном количестве: 72-контактные модули располагались только парами, а маленькие 30-контактные – группами по четыре штуки. При нарушении этого правила материнская плата просто «не видела» память.
• Модули DIMM (Dual Inline Memory Module – модуль памяти с двухрядным расположением выводов) появились вместе с памятью SDRAM. Эти модули имеют 168 контактов и поддерживают скорости работы 66, 100 и 133 МГц. С появлением памяти DDR SDRAM появились 184-контактные модули, работающие на частоте от 200 МГц. Кстати, на рис. 4.6 изображен именно модуль DIMM.
Хоть 168– и 184-контактные модули DIMM и одинаковы по размерам, они имеют некоторые различия в форме. Это сделано именно для того, чтобы нельзя было установить модуль DIMM с памятью SDRAM в слот для памяти DDR SDRAM и наоборот.
• Как вы уже догадались, модули RIMM поддерживают память RDRAM. Они имеют 184 контакта, такие же размеры, как модуль DIMM, однако и ряд специфических особенностей конструкции (рис. 4.9), которые не позволят установить их в слот для модулей DIMM.
Рис. 4.9. Модуль RIMM
Подытоживая разговор об оперативной памяти, хочется отметить, что все описанные выше параметры вы, как правило, можете найти прямо на модуле памяти. Производители указывают их на специальных наклеечках. Там должна быть приведена информация о емкости модуля памяти, ее типе, быстродействии, рабочем напряжении питания, а также название фирмы-изготовителя. Если вам кто-то попробует продать память без такой наклейки, советуем ее не покупать – наверняка вам пытаются подсунуть какую-нибудь дешевую подделку.
Данный текст является ознакомительным фрагментом.
Продолжение на ЛитРес
Убей в себе “слактивиста”[16]
Убей в себе “слактивиста”[16] Те, кого заворожили возможности “цифровой” политической деятельности, увы, редко могут отличить ее от “слактивизма”, или “диванного активизма”. Эта опасная разновидность слишком часто ведет к беспорядочным гражданским связям (обычно в
Сам себе СМИ
Сам себе СМИ Метки: СМИ, пользовательский контентЖурнал Time в 2006 году присвоил звание «Человек года» интернет-пользователю как таковому, вынеся на свою обложку зеркальный монитор с надписью You, в котором отражается тот, кто взял в руки журнал. Редакция Time тем самым хотела
Оперативная память
Оперативная память Минимальным необходимым объемом оперативной памяти для работы с программой Premiere Pro считается 512 Мбайт для работы с видео формата DV и 2 Гбайт для работы с видео формата HDV.Оперативная память, как и процессор, влияет на быстродействие всей системы в целом,
6.3. Сам себе Спилберг (DVD-студия Windows)
6.3. Сам себе Спилберг (DVD-студия Windows) DVD отличается от CD не только большой емкостью, это еще и особый формат. Он поддерживает создание меню, ускоренную и замедленную перемотку (очень ускоренную и очень замедленную), «перелистывание» разделов… Словом, если вы смотрите фильмы
Заведите себе врага
Заведите себе врага БоритесьИногда лучший способ узнать, каким должно быть ваше приложение — это узнать, каким оно не должно быть. Пусть это будет врагом вашего приложения, и вы будете видеть свет, на который вы должны идти.Когда мы решили создать систему управления
Процессор и оперативная память
Процессор и оперативная память Для комфортной работы с Pinnacle Studio 11 в Windows XP разработчики рекомендуют наличие в системе процессора Intel Pentium или AMD Athlon с тактовой частотой не ниже 1,4 ГГц (для комфортной работы желателен процессор с частотой не ниже 2,4 ГГц).Для работы в Windows Vista
Оперативная память
Оперативная память Оперативная память (оперативное запоминающее устройство, ОЗУ, «мозги», «оперативка») – микросхемы, используемые процессором для временного хранения данных при выполнении расчетов. В подавляющем большинстве случаев такая память представлена в виде
8.2. Как представлять себе программы на Прологе
8.2. Как представлять себе программы на Прологе Одной из характерных особенностей Пролога является то, что в нем допускается как процедурный, так и декларативный стиль мышления при составлении программы. Эти два подхода детально обсуждались в гл. 2 и затем многократно
ПИСЬМОНОСЕЦ: Сам себе «Компьютерру»
ПИСЬМОНОСЕЦ: Сам себе «Компьютерру» Автор: Сергей ВильяновВот Евгений Антонович обрадовался, получив камеру в подарок. Приятно. А своему другу-то чего приятное не стал делать? Взял бы и подарил. Была бы дружба крепче.И еще непонятна фраза «ушел в руки друга по цене,
Оперативная память
Оперативная память Именно оперативная память оказывает очень большое влияние на производительность системы. Компьютер даже с самым мощным процессором будет крайне медленно «ворочаться», если в его памяти тесно приложениям и данным. В таком случае система будет
1.3.3. Оперативная память
1.3.3. Оперативная память Почему эта память — оперативная? Потому что она нужна при выполнении оперативных задач, например открыть Word, запустить почту, посмотреть картинку, поиграть в Квейк и т. д.В оперативную память (ОЗУ, оперативное запоминающее устройство) загружаются
Оперативная память
Оперативная память Оперативная память – одно из устройств, от объема и скорости работы которого зависит быстродействие всего компьютера. Ее задача – своевременное предоставление процессору необходимой информации.Наиболее популярны модули памяти DDR2 SDRAM
Резюме: Не подпускать к себе конкурентов
Резюме: Не подпускать к себе конкурентов В данном случае проблема была обнаружена до возможного нанесения ущерба. Конечно, обнаружить такие проблемы во время профилактического аудита безопасности соседних систем удается не во всех компаниях. Многие из них вообще не
Оперативная память
Оперативная память Из предыдущего раздела должно быть понятно, что процессор – это устройство, обрабатывающее данные, которые хранятся в памяти. В этом разделе главы мы поговорим об одном из типов компьютерной памяти – оперативной памяти, или ОЗУ[4] (рис. 3.2). Рис. 3.2.
Глава 12 Я противоречу сам себе
Глава 12 Я противоречу сам себе Разбираются разновидности вычислительного способа мышления, определяется реалистичный вычислительный подход к нему.Культура вычислительного подхода к природеВ Кремниевой долине можно встретить буддистов, анархистов, поклонников культа
Управление памятью – одна из главных задач ОС. Она критична как для программирования, так и для системного администрирования. Я постараюсь объяснить, как ОС работает с памятью. Концепции будут общего характера, а примеры я возьму из Linux и Windows на 32-bit x86. Сначала я опишу, как программы располагаются в памяти.
Каждый процесс в многозадачной ОС работает в своей «песочнице» в памяти. Это виртуальное адресное пространство, которое в 32-битном режиме представляет собою 4Гб блок адресов. Эти виртуальные адреса ставятся в соответствие (mapping) физической памяти таблицами страниц, которые поддерживает ядро ОС. У каждого процесса есть свой набор таблиц. Но если мы начинаем использовать виртуальную адресацию, приходится использовать её для всех программ, работающих на компьютере – включая и само ядро. Поэтому часть пространства виртуальных адресов необходимо резервировать под ядро.
Это не значит, что ядро использует так много физической памяти – просто у него в распоряжении находится часть адресного пространства, которое можно поставить в соответствие необходимому количеству физической памяти. Пространство памяти для ядра отмечено в таблицах страниц как эксклюзивно используемое привилегированным кодом, поэтому если какая-то программа пытается получить в него доступ, случается page fault. В Linux пространство памяти для ядра присутствует постоянно, и ставит в соответствие одну и ту же часть физической памяти у всех процессов. Код ядра и данные всегда имеют адреса, и готовы обрабатывать прерывания и системные вызовы в любой момент. Для пользовательских программ, напротив, соответствие виртуальных адресов реальной памяти меняется, когда происходит переключение процессов:
Голубым отмечены виртуальные адреса, соответствующие физической памяти. Белым – пространство, которому не назначены адреса. В нашем примере Firefox использует гораздо больше места в виртуальной памяти из-за своей легендарной прожорливости. Полоски в адресном пространстве соответствуют сегментам памяти таким, как куча, стек и проч. Эти сегменты – всего лишь интервалы адресов памяти, и не имеют ничего общего с сегментами от Intel. Вот стандартная схема сегментов у процесса под Linux:
Когда программирование было белым и пушистым, начальные виртуальные адреса сегментов были одинаковыми для всех процессов. Это позволяло легко удалённо эксплуатировать уязвимости в безопасности. Зловредной программе часто необходимо обращаться к памяти по абсолютным адресам – адресу стека, адресу библиотечной функции, и т.п. Удаленные атаки приходилось делать вслепую, рассчитывая на то, что все адресные пространства остаются на постоянных адресах. В связи с этим получила популярность система выбора случайных адресов. Linux делает случайными стек, сегмент отображения в память и кучу, добавляя смещения к их начальным адресам. К сожалению, в 32-битном адресном пространстве особо не развернёшься, и для назначения случайных адресов остаётся мало места, что делает эту систему не слишком эффективной.
Самый верхний сегмент в адресном пространстве процесса – это стек, в большинстве языков хранящий локальные переменные и аргументы функций. Вызов метода или функции добавляет новый кадр стека (stack frame) к существующему стеку. После возврата из функции кадр уничтожается. Эта простая схема приводит к тому, что для отслеживания содержимого стека не требуется никакой сложной структуры – достаточно всего лишь указателя на начало стека. Добавление и удаление данных становится простым и однозначным процессом. Постоянное повторное использование районов памяти для стека приводит к кэшированию этих частей в CPU, что добавляет скорости. Каждый поток выполнения (thread) в процессе получает свой собственный стек.
Можно прийти к такой ситуации, в которой память, отведённая под стек, заканчивается. Это приводит к ошибке page fault, которая в Linux обрабатывается функцией expand_stack(), которая, в свою очередь, вызывает acct_stack_growth(), чтобы проверить, можно ли ещё нарастить стек. Если его размер не превышает RLIMIT_STACK (обычно это 8 Мб), то стек увеличивается и программа продолжает исполнение, как ни в чём не бывало. Но если максимальный размер стека достигнут, мы получаем переполнение стека (stack overflow) и программе приходит ошибка Segmentation Fault (ошибка сегментации). При этом стек умеет только увеличиваться – подобно государственному бюджету, он не уменьшается обратно.
Динамический рост стека – единственная ситуация, в которой может осуществляться доступ к свободной памяти, которая показана белым на схеме. Все другие попытки доступа к этой памяти вызывают ошибку page fault, приводящую к Segmentation Fault. А некоторые занятые области памяти служат только для чтения, поэтому попытки записи в эти области также приводят к Segmentation Fault.
После стека идёт сегмент отображения в память. Тут ядро размещает содержимое файлов напрямую в памяти. Любое приложение может запросить сделать это через системный вызов mmap() в Linux или CreateFileMapping() / MapViewOfFile() в Windows. Это удобный и быстрый способ организации операций ввода и вывода в файлы, поэтому он используется для подгрузки динамических библиотек. Также возможно создать анонимное место в памяти, не связанное с файлами, которое будет использоваться для данных программы. Если вы сделаете в Linux запрос на большой объём памяти через malloc(), библиотека C создаст такую анонимное отображение вместо использования памяти из кучи. Под «большим» подразумевается объём больший, чем MMAP_THRESHOLD (128 kB по умолчанию, он настраивается через mallopt().)
Если в куче оказывается недостаточно места для выполнения запроса, эту проблему может обработать сама программа без вмешательства ядра. В ином случае куча увеличивается системным вызовом brk(). Управление кучей – дело сложное, оно требует хитроумных алгоритмов, которые стремятся работать быстро и эффективно, чтобы угодить хаотичному методу размещению данных, которым пользуется программа. Время на обработку запроса к куче может варьироваться в широких пределах. В системах реального времени есть специальные инструменты для работы с ней. Кучи тоже бывают фрагментированными:
И вот мы добрались до самой нижней части схемы – BSS, данные и текст программы. BSS и данные хранят статичные (глобальные) переменные в С. Разница в том, что BSS хранит содержимое непроинициализированных статичных переменных, чьи значения не были заданы программистом. Кроме этого, область BSS анонимна, она не соответствует никакому файлу. Если вы пишете static int cntActiveUsers , то содержимое cntActiveUsers живёт в BSS.
Сегмент данных, наоборот, содержит те переменные, которые были проинициализированы в коде. Эта часть памяти соответствует бинарному образу программы, содержащему начальные статические значения, заданные в коде. Если вы пишете static int cntWorkerBees = 10 , то содержимое cntWorkerBees живёт в сегменте данных, и начинает свою жизнь как 10. Но, хотя сегмент данных соответствует файлу программы, это приватное отображение в память (private memory mapping) – а это значит, что обновления памяти не отражаются в соответствующем файле. Иначе изменения значения переменных отражались бы в файле, хранящемся на диске.
Пример данных на диаграмме будет немного сложнее, поскольку он использует указатель. В этом случае содержимое указателя, 4-байтный адрес памяти, живёт в сегменте данных. А строка, на которую он показывает, живёт в сегменте текста, который предназначен только для чтения. Там хранится весь код и разные другие детали, включая строковые литералы. Также он хранит ваш бинарник в памяти. Попытки записи в этот сегмент оканчиваются ошибкой Segmentation Fault. Это предотвращает ошибки, связанные с указателями (хотя не так эффективно, как если бы вы вообще не использовали язык С). На диаграмме показаны эти сегменты и примеры переменных:
Изучить области памяти Linux-процесса можно, прочитав файл /proc/pid_of_process/maps. Учтите, что один сегмент может содержать много областей. К примеру, у каждого файла, сдублированного в память, есть своя область в сегменте mmap, а у динамических библиотек – дополнительные области, напоминающие BSS и данные. Кстати, иногда, когда люди говорят «сегмент данных», они имеют в виду данные + bss + кучу.
Бинарные образы можно изучать при помощи команд nm и objdump – вы увидите символы, их адреса, сегменты, и т.п. Схема виртуальных адресов, описанная в этой статье – это т.н. «гибкая» схема, которая по умолчанию используется уже несколько лет. Она подразумевает, что переменной RLIMIT_STACK присвоено какое-то значение. В противном случае Linux использует «классическую» схему:
Привет, Хабр! Представляю вашему вниманию перевод статьи «Demystifying memory management in modern programming languages» за авторством Deepu K Sasidharan.
В данной серии статей мне бы хотелось развеять завесу мистики над управлением памятью в программном обеспечении (далее по тексту — ПО) и подробно рассмотреть возможности, предоставляемые современными языками программирования. Надеюсь, что мои статьи помогут читателю заглянуть под капот этих языков и узнать для себя нечто новое.
Углублённое изучение концептов управления памятью позволяет писать более эффективное ПО, потому как стиль и практики кодирования оказывают большое влияние на принципы выделения памяти для нужд программы.
Часть 1: Введение в управление памятью
Управление памятью — это целый набор механизмов, которые позволяют контролировать доступ программы к оперативной памяти компьютера. Данная тема является очень важной при разработке ПО и, при этом, вызывает затруднения или же вовсе остаётся черным ящиком для многих программистов.
Для чего используется оперативная память?
Когда программа выполняется в операционный системе компьютера, она нуждается в доступе к оперативной памяти (RAM) для того, чтобы:
- загружать свой собственный байт-код для выполнения;
- хранить значения переменных и структуры данных, которые используются в процессе работы;
- загружать внешние модули, которые необходимы программе для выполнения задач.
Стек используется для статичного выделения памяти. Он организован по принципу «последним пришёл — первым вышел» (LIFO). Можно представить стек как стопку книг — разрешено взаимодействовать только с самой верхней книгой: прочитать её или положить на неё новую.
- благодаря упомянутому принципу, стек позволяет очень быстро выполнять операции с данными — все манипуляции производятся с «верхней книгой в стопке». Книга добавляется в самый верх, если нужно сохранить данные, либо берётся сверху, если данные требуется прочитать;
- существует ограничение в том, что данные, которые предполагается хранить в стеке, обязаны быть конечными и статичными — их размер должен быть известен ещё на этапе компиляции;
- в стековой памяти хранится стек вызовов — информация о ходе выполнения цепочек вызовов функций в виде стековых кадров. Каждый стековый кадр это набор блоков данных, в которых хранится информация, необходимая для работы функции на определённом шаге — её локальные переменные и аргументы, с которыми её вызывали. Например, каждый раз, когда функция объявляет новую переменную, она добавляет её в верхний блок стека. Затем, когда функция завершает свою работу, очищаются все блоки памяти в стеке, которые функция использовала — иными словами, очищаются все блоки ее стекового кадра;
- каждый поток многопоточного приложения имеет доступ к своему собственному стеку;
- управление стековой памятью простое и прямолинейное; оно выполняется операционной системой;
- в стеке обычно хранятся данные вроде локальных переменных и указателей;
- при работе со стеком есть вероятность получать ошибки переполнения стека (stack overflow), так как максимальный его размер строго ограничен. Например, ошибка при составлении граничного условия в рекурсивной функции совершенно точно приведёт к переполнению стека;
- в большинстве языков существует ограничение на размер значений, которые можно сохранить в стек;
Использование стека в JavaScript. Объекты хранятся в куче и доступны по ссылкам, которые хранятся в стеке. Тут можно посмотреть в видеоформате
Куча используется для динамического выделения памяти, однако, в отличие от стека, данные в куче первым делом требуется найти с помощью «оглавления». Можно представить, что куча это такая большая многоуровневая библиотека, в которой, следуя определённым инструкциям, можно найти необходимую книгу.
- операции на куче производятся несколько медленнее, чем на стеке, так как требуют дополнительного этапа для поиска данных;
- в куче хранятся данные динамических размеров, например, список, в который можно добавлять произвольное количество элементов;
- куча общая для всех потоков приложения;
- вследствие динамической природы, куча нетривиальна в управлении и с ней возникает большинство всех проблем и ошибок, связанных с памятью. Способы решения этих проблем предоставляются языками программирования;
- типичные структуры данных, которые хранятся в куче — это глобальные переменные (они должны быть доступны для разных потоков приложения, а куча как раз общая для всех потоков), ссылочные типы, такие как строки или ассоциативные массивы, а так же другие сложные структуры данных;
- при работе с кучей можно получить ошибки выхода за пределы памяти (out of memory), если приложение пытается использовать больше памяти, чем ему доступно;
- размер значений, которые могут храниться в куче, ограничен лишь общим объёмом памяти, который был выделен операционной системой для программы.
Почему эффективное управление памятью важно?
В отличие от жёстких дисков, оперативная память весьма ограниченна (хотя и жёсткие диски, безусловно, тоже не безграничны). Если программа потребляет память не высвобождая её, то, в конечном итоге, она поглотит все доступные резервы и попытается выйти за пределы памяти. Тогда она просто упадет сама, или, что ещё драматичнее, обрушит операционную систему. Следовательно, весьма нежелательно относиться легкомысленно к манипуляциям с памятью при разработке ПО.
Различные подходы
Современные языки программирования стараются максимально упростить работу с памятью и снять с разработчиков часть головной боли. И хотя некоторые почтенные языки всё ещё требуют ручного управления, большинство всё же предоставляет более изящные автоматические подходы. Порой в языке используется сразу несколько подходов к управлению памятью, а иногда разработчику даже доступен выбор какой из вариантов будет эффективнее конкретно для его задач (хороший пример — C++). Перейдём к краткому обзору различных подходов.
Ручное управление памятью
Язык не предоставляет механизмов для автоматического управления памятью. Выделение и освобождение памяти для создаваемых объектов остаётся полностью на совести разработчика. Пример такого языка — C. Он предоставляет ряд методов (malloc, realloc, calloc и free) для управления памятью — разработчик должен использовать их для выделения и освобождения памяти в своей программе. Этот подход требует большой аккуратности и внимательности. Так же он является в особенности сложным для новичков.
Сборщик мусора
Получение ресурса есть инициализация (RAII)
RAII — это программная идиома в ООП, смысл которой заключается в том, что выделяемая для объекта область памяти строго привязывается к его времени существования. Память выделяется в конструкторе и освобождается в деструкторе. Данный подход был впервые реализован в C++, а так же используется в Ada и Rust.
Автоматический подсчёт ссылок (ARC)
Данный подход весьма похож на сборку мусора с подсчётом ссылок, однако, вместо запуска процесса подсчёта в определённые интервалы времени, инструкции выделения и освобождения памяти вставляются на этапе компиляции прямо в байт-код. Когда же счётчик ссылок достигает нуля, память освобождается как часть нормального потока выполнения программы.
Автоматический подсчёт ссылок всё так же не позволяет обрабатывать циклические ссылки и требует от разработчика использования специальных ключевых слов для дополнительной обработки таких ситуаций. ARC является одной из особенностей транслятора Clang, поэтому присутствует в языках Objective-C и Swift. Так же автоматический подсчет ссылок доступен для использования в Rust и новых стандартах C++ при помощи умных указателей.
Владение
Это сочетание RAII с концепцией владения, когда каждое значение в памяти должно иметь только одну переменную-владельца. Когда владелец уходит из области выполнения, память сразу же освобождается. Можно сказать, что это примерно как подсчёт ссылок на этапе компиляции. Данный подход используется в Rust и при этом я не смог найти ни одного другого языка, который бы использовал подобный механизм.
В данной статье были рассмотрены основные концепции в сфере управления памятью. Каждый язык программирования использует собственные реализации этих подходов и оптимизированные для различных задач алгоритмы. В следующих частях, мы подробнее рассмотрим решения для управления памятью в популярных языках.
Читайте так же другие части серии:
Ссылки
Вы можете подписаться на автора статьи в Twitter и на LinkedIn.
За вычитку перевода отдельное спасибо Александру Максимовскому и Катерине Шибаковой
Если вы когда-нибудь задумывались, что это за процесс, за которым следует процессор и Оперативная память что он назначил для получения данных и инструкций, которые он должен выполнить, то вам повезло, потому что в этой статье мы собираемся объяснить, что это за процесс связи между двумя наиболее важными элементами ПК, с которыми общаются разное.
В этой статье мы не будем объяснять, какой тип оперативной памяти лучше or спецификации каждого , но процессор связывается с ним, чтобы иметь возможность выполнять программы.
Причина почему мы используем внешнюю память потому, что количество транзисторов, необходимых для хранения информации, не поместится в пространстве процессора , поэтому необходимо использовать память RAM, внешнюю по отношению к процессору, для хранения инструкций и данных, которые они будут выполнять.
Зачем процессору связь с ОЗУ?
Стадия, на которой ЦП берет следующую инструкцию для выполнения из ОЗУ, называется «выборкой» и является одним из трех этапов, составляющих цикл команд: Fetch-Decode-Execute, о котором мы поговорим только в этой статье о первой, а о второй два будут оставлены на другой раз, так как оперативная память не вмешивается в них, кроме как для записи результата обратно.
- Счетчик команд: ПК указывает на следующую строку памяти, где находится следующая инструкция процессора. Его значение увеличивается на 1 каждый раз, когда завершается полный цикл команд или когда команда перехода изменяет значение программного счетчика.
- Регистр адреса памяти: MAR копирует содержимое ПК и отправляет его в RAM через адресные контакты ЦП, которые соединены с адресными контактами RAM.
- Регистр данных памяти : Если инструкция прочитана, то ОЗУ будет передавать через свою шину данных содержимое адреса памяти, на который указывал MAR.
- Реестр инструкций: Инструкция копируется в регистр инструкций, откуда блок управления расшифровывает ее, чтобы знать, как выполнить инструкцию.
Что такое память DRAM?
тип памяти, используемой для RAM как системное ОЗУ, так и видеопамять или видеопамять. Память DRAM или 1T-DRAM . В этом типе памяти каждый бит хранится в комбинация конденсатора и транзистора , а не в нескольких транзисторах, таких как SRAM, отсюда и название 1T-DRAM.
Вся память RAM, используемая в настоящее время в ПК: DDR4, GDDR6, HBM2e, LPDDR4 и т. Д., Является памятью типа DRAM, в то время как внутренняя память процессоров, кеши регистров и блокноты относятся к типу SRAM.
Указанная комбинация конденсатора и транзистора называется Bitcell , когда конденсатор битовой ячейки заряжен, интерпретируется, что информация, содержащаяся в этой битовой ячейке, равна 1, когда она не заряжена, она интерпретируется как 0.
Битовые ячейки организованы в матрицу, в которой контакты адресации используются для доступа к ним следующим образом:
- Первая половина битов выбирает строку, к которой мы хотим получить доступ
- Вторая половина битов адресации содержит столбец, к которому мы хотим получить доступ,
Для этого между матрицей битовых ячеек и шиной адресации существует двоичный декодер, который позволяет выбрать соответствующую битовую ячейку.
Контакты для связи с RAM
- адресация штифты : Обычно обозначается от A0 до AN, где N - количество контактов и равно количеству бит адресации, которое всегда равно 2 ^ N.
- Контакты данных : Здесь данные передаются в оперативную память и из нее.
- Запись разрешена: Если вывод активен, передача данных осуществляется в память, запись, с другой стороны, если она не активна, то в сторону процессора, чтение.
Если наша система имеет несколько микросхем памяти RAM, то первые биты адресации используются для выбора, к какой из микросхем памяти мы хотим получить доступ в модуле памяти DIMM. Также были случаи, когда адрес и контакты данных совпадали. Это связано с тем, что адресация и доступ к данным не выполняются одновременно.
Но чтобы понять, как работает адресация, мы должны рассмотреть основную часть электроники - двоичный декодер.
Двоичный декодер и его роль в связи с RAM
В оперативной памяти адресация передается в двух циклах: сначала отправляется строка, к которой необходимо получить доступ, а затем столбец, а не одновременно.
По этой причине обращение к оперативной памяти происходит в два этапа.
Банки памяти
Данные в ОЗУ не хранятся последовательно , но в разных банках на одном чипе, каждый из банков содержит массив битовых ячеек , но если мы хотим передать, например, n битов данных, нам понадобится n массивов битовых ячеек, каждый из которых подключен к выводу шины данных.
Использование несколько банков , в той же микросхеме памяти, позволяет выбрать несколько бит одновременно с одним доступом к памяти , поскольку все банки разделяют адресацию . Таким образом, если у нас есть 8 банков памяти, выбор конкретной битовой ячейки приведет к одновременной передаче данных в 8 банков памяти и из них.
Стандартный размер банков в памяти RAM составляет 8 бит, поэтому максимальный объем памяти при адресации всегда считается как 2 ^ n байтов. Фактически, это 16-, 32-, 64-битные шины и т. Д. Они передают данные нескольких последовательных адресов памяти, начиная с первого.
Связь между RAM и CPU
- Выберите столбец (Адресация)
- Выберите строку (Адресация)
- Передача данных.
Для этого используется ряд специальных контактов, один из которых мы уже видели, и это запись Enable, а два других следующие:
- Строб доступа к колонке: Этот вывод активируется, когда мы указываем оперативной памяти, что указываем столбец, к которому хотим получить доступ.
- Строб доступа к строке :: Этот вывод активируется, когда мы указываем оперативной памяти, что указываем строку, к которой хотим получить доступ.
Обе операции можно резюмировать следующим образом:
- Операция чтения очень проста, для этого у вас должен быть неактивен вывод WE, чтобы указать, что данные идут из ОЗУ в процессор, указать строку, а затем столбец, чтобы информация поступала к процессору из ОЗУ памяти. .
- Операция записи несколько отличается, для этого вывод WE должен быть активен, но данные передаются не после выбора столбца данных, а после выбора строки и одновременно с выбором столбца, в котором находятся данные.
Благодаря этому вы уже можете получить приблизительное представление о том, как работает связь между процессором и его оперативной памятью.
Читайте также: