КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Стековый менеджер памяти
Менеджеры памяти Есть менеджер памяти ОС и менеджер памяти программы. Менеджер ОС сработает первым. Пока он не отработал, сегмента не существует. У каждого сегмента есть служебные данные (как он распределил оставшуюся часть сегмента на прикладные нужды). Переменные & объекты Если их создаётся много, то наступит момент, когда сегмент будет заполнен нужными данными и мы не сможем разместить физически новые данные. То есть: · Проблема 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)
Дата добавления: 2014-01-06; Просмотров: 501; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |