Стековый менеджер памяти

Менеджеры памяти

Есть менеджер памяти ОС и менеджер памяти программы. Менеджер ОС сработает первым. Пока он не отработал, сегмента не существует.

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

Переменные & объекты

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

То есть:

· Проблема 1 – переполнение сегмента

· Проблема 2 – при выделении переменных сегмент должен быть пропорционален той памяти, которая нам нужна в ПП (неоправданное увеличение размера сегмента)

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

Как поступить?

1. Использовать умный менеджер памяти

2. Регулировать размер сегмента руками

Нельзя освободить пару страниц из памяти (в центре сегмента) или если переменная в конце сегмента и происходит его уменьшение то получается Segmentation Fault.

3. Не использовать менеджер памяти (как же я получаю доступ к блокам? Напрямую обращаюсь к ОС)

Для крупных объектов – API ОС и выделяю столько памяти, сколько нужно (новый сегмент).

Под изображение 300 mpx нужно 1 ГБ RAM.

Если откроем, то сегмент потом не сузится и будет 1 ГБ постоянно. Можно матрицу открыть в одном сегменте, обработать её и закрыть.

Адрес = сегмент + смещение

В каждом сегменте можно получить макс. ВАП (4 ГБ)

В 32-х битных системах плоская модель (1 ВАП, внутри которого сегменты). 16000 сегментов Intel x86 может обрабатывать 64 ГБ внутренних адресов и 4 ГБ наружу. Ничего не стоит заложить в оборудование больше возможностей, чем предлагает ОС.

Достоинства:

+ Суперскоростное выделение памяти

+ Суперскоростное освобождение памяти

Недостатки:

- У меня в памяти остаются данные, считающиеся не нужными

- Требует прямого доступа к объектам по прямой ссылке

Когда открывается функция, хранится адрес возврата. Если нет контроля вводимых данных, то мы можем перетереть данные в стеке. Адреса растут сверху вниз, возможно перетереть адрес возврата в функции.

В АП имеется право загрузить дополнительные страницы, если нет контроля, то данные занимают буфер, данные, адрес возврата из функции

Ещё одна забавная ситуация:

Стек не обнуляется в Release-режиме. В режиме отладки стек заполняется нулями и соответственно программа работает

longjmp.h

настроить jmp

выполнить jmp

Можно выскочить из любой точки рекурсии. Long jmp не влияет на менеджер вообще. Должны использовать его аккуратно.

В С++ переменные на стеке можна располагать как вниз так и вверх. В Java переменные могут отправляться только наверх и считаете, что блоки закрыты и переменных на стеке не существует.


 

Лекция (14.02.2013)