Работа с памятью — различия между версиями
Megasoch (обсуждение | вклад) (→Визуализация адресного пространства с помощью VMMap) |
Phil (обсуждение | вклад) |
||
| Строка 27: | Строка 27: | ||
{{TODO|t=Если что перенесем в другое место}} | {{TODO|t=Если что перенесем в другое место}} | ||
| − | + | [[Файл:vmmap.png|right|thumb|200px|Окно программы VMMap]] | |
| − | + | Для визуализации адресного пространства можно использовать программу VMMap. В главном окне на диаграмме можно видеть распределение физической памяти адресного пространство между самой программой, подключенными библиотеками, переменными и др. | |
| − | + | Рассмотрим процесс выделения памяти в куче на примере простой программы: | |
| − | + | [[Файл:vmmap_before.png|right|thumb|200px|Память не выделена]] | |
| + | [[Файл:vmmap_after.png||right|thumb|200px|Выделена память под массив]] | ||
| + | [[Файл:vmmap_delete.png||right|thumb|200px|Память освобождена]] | ||
int main() | int main() | ||
| Строка 41: | Строка 43: | ||
return 0; | return 0; | ||
} | } | ||
| − | |||
| − | |||
До выполнения | До выполнения | ||
int *a = new int [1000000]; | int *a = new int [1000000]; | ||
| − | + | куча в адресном пространстве программы занимает <tex>1152kB</tex>, а после выполнения команды - <tex>5060kB</tex>. Значит, память была выделена именно в куче, и объем выделенной памяти равен <tex>3908kB</tex>, что почти в точности соответствует объему массива <tex>int</tex> из <tex>1000000</tex> элементов при выделении <tex>4B</tex> на элемент. | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
После выполнения | После выполнения | ||
delete [] a; | delete [] a; | ||
| − | + | размер кучи снова равен <tex>1152kB</tex>, как и до выделение памяти под массив. | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
{{TODO|t=Показать в адресном пространстве ран-тайм, библиотеки ядра}} | {{TODO|t=Показать в адресном пространстве ран-тайм, библиотеки ядра}} | ||
Версия 18:47, 11 июля 2011
Содержание
Определение
При запуске программы операционная система создает процесс, которому выделяется адресное пространство размером в 32-битных системах, и в 64-битных, представляющее из себя массив байт. В этом массиве можно писать и читать данные из любого его места. Ясно, что адресное пространство не может полностью содержаться в физической памяти, поэтому представим, что эта память просто дана каждому процессу, неважно, где она находится. Важно помнить, что у каждого процесса свое адресное пространство, которое не пересекается с адресными пространствами других программ.
Старт процесса
При старте процесса, в адресное пространство помещается код исполняемой программы и код используемых в программе библиотек (например, Kernel.dll). Так же, в адресном пространстве хранится , в который будут записываться глобальные переменные.
TODO: расписать подробнее - надо ли?
Хранение адресного пространства
Хранение в физической памяти
Адресное пространство разбито на страницы объемом по . Для каждой страницы в хранится ее адрес в физической памяти, либо указание, что эта страница пуста (в таком случае хранить саму страницу не надо - поэтому все адресные пространства помещаются в физической памяти). Физическая память формируется из оперативной памяти (), места на жестком диске, отведенного под , и места на жестком диске, где хранится непосредственно код программы.
Подгрузка страниц в оперативную память
При обращении к той или иной странице, если она не находится в оперативной памяти, она загружается туда. Для этого, либо в оперативке находится свободное место, либо выбирается страница, которая будет выгружена оттуда. Если эта страница уже существует на жестком диске, и не была изменена за время ее пребывания в оперативной памяти, она просто удаляется оттуда; иначе - записывается в .
Визуализация адресного пространства с помощью VMMap
TODO: Можно не расписывать здесь что есть стэк, что куча, а просто сказать что посмотрим на выделение памяти, и как это выглядит в адресном пространстве
TODO: Если что перенесем в другое место
Для визуализации адресного пространства можно использовать программу VMMap. В главном окне на диаграмме можно видеть распределение физической памяти адресного пространство между самой программой, подключенными библиотеками, переменными и др.
Рассмотрим процесс выделения памяти в куче на примере простой программы:
int main()
{
int *a = new int [1000000];
delete [] a;
return 0;
}
До выполнения
int *a = new int [1000000];
куча в адресном пространстве программы занимает , а после выполнения команды - . Значит, память была выделена именно в куче, и объем выделенной памяти равен , что почти в точности соответствует объему массива из элементов при выделении на элемент.
После выполнения
delete [] a;
размер кучи снова равен , как и до выделение памяти под массив.
TODO: Показать в адресном пространстве ран-тайм, библиотеки ядра

