Работа с памятью

Материал из Викиконспекты
Версия от 20:05, 15 июля 2011; Megasoch (обсуждение | вклад) (Старт процесса)
Перейти к: навигация, поиск
Эта статья находится в разработке!

Определение

Адресное пространство
Хранение в физической памяти
(серым выделена заполненная память)

При запуске программы операционная система создает процесс, которому выделяется адресное пространство размером [math]4GB[/math] в 32-битных системах, и [math]2^{64}B[/math] в 64-битных, представляющее из себя массив байт. В этом массиве можно писать и читать данные из любого его места. Ясно, что адресное пространство не может полностью содержаться в физической памяти, поэтому представим, что эта память просто дана каждому процессу, неважно, где она находится. Важно помнить, что у каждого процесса свое адресное пространство, которое не пересекается с адресными пространствами других программ. Адресное пространство существует, пока живёт процесс.

Старт процесса

Адресное пространство


TODO: наверно лучше вставить картиночку чтото типа этой без хипа

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

Хранение адресного пространства

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

Адресное пространство разбито на страницы объемом по [math]4kB[/math]. Для каждой страницы в хранится ее адрес в физической памяти, либо указание, что эта страница пуста (в таком случае хранить саму страницу не надо - поэтому все адресные пространства помещаются в физической памяти). Физическая память формируется из оперативной памяти ([math]RAM[/math]), места на жестком диске, отведенного под [math]swap[/math], и места на жестком диске, где хранится непосредственно код программы и подгружаемых библиотек.

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

Обращение к адресному пространству

При обращении к той или иной странице, если она не находится в оперативной памяти, она загружается туда. Для этого, либо в оперативке находится свободное место, либо выбирается страница, которая будет выгружена оттуда. Если эта страница уже существует на жестком диске, и не была изменена за время ее пребывания в оперативной памяти, она просто удаляется оттуда; иначе — записывается в [math]swap[/math].

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

Page fault

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

Визуализация с помощью VMMap

Окно программы VMMap

Для визуализации адресного пространства можно использовать программу VMMap. В главном окне на диаграмме можно видеть распределение физической памяти адресного пространство между самой программой, подключенными библиотеками, переменными и др. Как видно из скриншота, адресное пространство занимает в физической памяти много меньше, чем предоставленные ему [math]4GB[/math] (или [math]2^{64}B[/math] для 64-битных систем), то есть, оно не хранит пустые страницы. Именно поэтому даже на 64-битных системах возможно одновременно запускать несколько процессов, и не бояться того, что объем физической памяти сильно меньше [math]2^{64}B[/math].