Работа с памятью
Содержание
Определение
При запуске программы операционная система создает процесс, которому выделяется адресное пространство размером
в 32-битных системах, и в 64-битных, представляющее из себя массив байт. В этом массиве можно писать и читать данные из любого его места. Ясно, что адресное пространство не может полностью содержаться в физической памяти, поэтому представим, что эта память просто дана каждому процессу, неважно, где она находится. Важно помнить, что у каждого процесса свое адресное пространство, которое не пересекается с адресными пространствами других программ.Старт процесса
При старте процесса, в адресное пространство помещается код исполняемой программы и код используемых в программе библиотек (например, Kernel.dll). Так же, в адресном пространстве хранится
, в который будут записываться глобальные переменные.TODO: расписать подробнее - надо ли?
Хранение адресного пространства
Хранение в физической памяти
Адресное пространство разбито на страницы объемом по
. Для каждой страницы в хранится ее адрес в физической памяти, либо указание, что эта страница пуста (в таком случае хранить саму страницу не надо - поэтому все адресные пространства помещаются в физической памяти). Физическая память формируется из оперативной памяти ( ), места на жестком диске, отведенного под , и места на жестком диске, где хранится непосредственно код программы.Подгрузка страниц в оперативную память
При обращении к той или иной странице, если она не находится в оперативной памяти, она загружается туда. Для этого, либо в оперативке находится свободное место, либо выбирается страница, которая будет выгружена оттуда. Если эта страница уже существует на жестком диске, и не была изменена за время ее пребывания в оперативной памяти, она просто удаляется оттуда; иначе - записывается в
.Визуализация адресного пространства с помощью VMMap
TODO: Можно не расписывать здесь что есть стэк, что куча, а просто сказать что посмотрим на выделение памяти, и как это выглядит в адресном пространстве
TODO: Если что перенесем в другое место
Программа VMMap предназначена для визуализации адресного пространства. Если ее запустить на каком либо процессе, перед вами будет примерно следующая картина:
Первое, что бросается в глаза - строки помеченные разными цветами. Различные цвета - различные области в адресном пространстве. Также можно увидеть сами адреса памяти(на рисунке выделено в красную рамку).
Давайте посмотрим что происходит при выделении памяти и ее освобождении в адресном пространстве. Для этого запустим следующую программу:
int main() { int *a = new int [1000000]; delete [] a; return 0; }
С помощью оператора new можно выделять память в куче(что такое куча будет рассказано в следующих статьях). Пока что просто посмотрим как эта память выделяется.
До выполнения
int *a = new int [1000000];
После выполнения
int *a = new int [1000000];
Видим выделение памяти, и ее обьем.
TODO: Здесь можно написать про обьем страниц в 4Кб, как я подозреваю выделилось 3908 Кб, тк для хранения 10^6 интов нужно 3906,25 Кб