Конференція vbstreets - перегляд теми - віртуальна пам'ять

Вирішив торкнутися цієї теми в зв'язку з великим числом помилок і непорозумінь на цю тему (в т.ч. і тут на форумі).

Через це збіги поширився міф, що Windows не може виділити більше 4 ГБ пам'яті всім програмам в сумі. Насправді, навіть без PAE наявність своппинга дозволяє виділити всім процесам в сумі 64Гб пам'яті: Windows дозволяє мати до 16 файлів підкачки, розміром до 4 ГБ кожен. З PAE це обмеження ще розширюється до 256ТБ (16x16ТБ).


* Для спрощення роботи з віртуальною пам'яттю застосовується її сторінкова організація: вся пам'ять дробиться на рівні сторінки (в Windows - по 4Кб кожна), і на сторінку цілком застосовуються однакові параметри. Сторінка віртуального АП може перебувати в одному з трьох станів: вільна, зарезервована, зайнята. Різниця між вільною і зарезервованої сторінкою тільки в тому, що зарезервована сторінка не може бути повернута функціями виділення пам'яті; тому динамічно зростаючі безперервні структури (наприклад, стеки потоків) при своєму створенні резервуються цілком. Це гарантує, що порожня частина зарезервованого під стек обсягу залишиться порожньою до того моменту, коли її потрібно зайняти розширився стеком.

Зайнята сторінка може бути одного з двох видів: file-backed (образ файлу: завантажений виконуваний файл, або явно створений файл-маппінг) або swap-backed; і незалежно від свого виду, зайнята сторінка може бути в одному з двох положень: завантажена (тобто відповідає сторінці ФП) або вивантажено. Вивантажені file-backed сторінки ніде не зберігаються; при необхідності, вони знову завантажуються з того ж файлу, з якого були створені. Вивантажені swap-backed сторінки зберігаються в файлі підкачки (win386.swp на Win9x, pagefile.sys на WinNT). До слова: своппинг вперше з'явився саме в Windows / 386, тому що процесор 386 вперше підтримував сторінкову організацію пам'яті. Віртуальні АП були можливі починаючи з 286, але в Windows були задіяні тільки починаючи з WinNT 3.1. Вивантаження невикористовуваних ресурсів з пам'яті і подгрузка їх з ехе-файлу на диску, так само як і об'єднання в пам'яті секцій коду кількох примірників однієї програми, існувало починаючи з Windows 1.0.

Важливо, що swap-backed сторінки додаються в файл підкачки на диску не в момент своєї вивантаження, а в момент створення - щоб до моменту вивантаження була впевненість, що сторінку є куди вивантажувати. Тому файл підкачки такий величезний. навіть якщо у всій системі немає жодної вивантажених swap-backed сторінки, для всіх них там зарезервовано місце "на випадок раптового запуску 15 примірників Фотошопа."

Змінити тип сторінки можна тільки в одному напрямку - з file-backed в swap-backed (це робиться викликом VirtualProtect). Після цього зміни сторінка починає займати місце в файлі підкачки. Якщо додаток самомодіфіцірующіеся свій код (наприклад, якщо воно запаковане UPX або подібним пакувальником), то воно при запиті доступу на запис в свою секцію коду переводить її сторінки в тип swap-backed, і в підсумку це додаток займає більше місця на диску (бо в файлі підкачки тепер зберігається його повний розпакований образ). Якщо таке стислий додаток запустити другий раз, то і в пам'яті, і в файлі підкачки створиться ще одна копія розпакованого образу - тоді як без пакувальника в новий процес були б спроектовані ті ж сторінки ФП, в які був перш завантажений код першого примірника. Отже, упаковані додатки займають більше місця, ніж розпаковані - і на диску, і в пам'яті. Ніяк не збагну, навіщо і кому прийшло в голову займатися подібною дурницею.

Останнє в цій області - поняття "working set". Це набір сторінок АП процесу, які зайняті і знаходяться в завантаженому становищі (незалежно від їх типу). Саме цей обсяг стовпець "Mem Usage" вкладки "Processes" Диспетчера завдань. Це число може змінюватися, навіть якщо процес нічого не робить: система сама вирішує, коли завантажувати і вивантажувати сторінки його пам'яті. А графік "Mem Usage" сусідній вкладки "Performance" відображає вже інший обсяг - обсяг всіх swap-backed сторінок (незалежно від їх положення). (В останніх версіях Windows його, нарешті, перейменували в "Page File Usage".) Цей графік показує виділення і звільнення процесами віртуальної пам'яті і ніяк не пов'язаний із завантаженням ФП. Немає нічого дивного, що сума всіх чисел на одній вкладці не дорівнюватиме числу на інший: ці числа відображають зовсім різні речі.


* У сторінок ВП, крім асоціації з деякими сховищем (ФП і / або файл), є ще режим доступу. Крім стандартних прав (читання, запис, виконання), підтримується ще один незвичайний прапор - PAGE_GUARD. Сторінка з цим прапором "замінована": вона працює як звичайна зайнята сторінка, але при першій спробі доступу до неї відбувається виключення STATUS_GUARD_PAGE_VIOLATION, і прапор знімається. Може бути, для цього прапора і можна придумати купу різноманітних застосувань, але я знаю тільки одне - обробка переповнення стека.

Саморозширюється стек працює, в загальному, в такий спосіб. спочатку резервується вказаний в заголовку додатки обсяг (за замовчуванням - 1 Мб), його верхня частина (початок стека) коммітов, і відразу під закомміченной частиною створюється "замінована сторінка". Оброблювач виключення від цієї сторінки, відповідно, коммітов стек далі вниз, створюючи під знову закомміченной частиною нову ЗС. Коли вся зарезервована частина стека закоммічена, далі рости він вже не може: нова ЗС не створюється і спроба доступу за межі стека призводить до звичайної помилку захисту пам'яті "memory can not be 'written'".

tyomitch писал (а): якщо запущені, згорнуті і давно не використовуються кілька копій горезвісного Фотошопа, більше нічого зробити з системою вже не вдасться.


Перевіряв? Фотошоп використовує свій власний механізм свопу, незалежний від віндового.

Ще, наскільки я пам'ятаю, для роботи / 3GB потрібно як мінімум Advanced Server.

Ennor
Фотошоп напевно не найвдаліший приклад. А ось якщо на одному гігабайті оперативці запустити Quake 4 без свопу, система закричить що не вистачає оперативної пам'яті.

Перевіряв? Фотошоп використовує свій власний механізм свопу, незалежний від віндового.

tyomitch писал (а): якщо запущені, згорнуті і давно не використовуються кілька копій горезвісного Фотошопа, більше нічого зробити з системою вже не вдасться.


Перевіряв? Фотошоп використовує свій власний механізм свопу, незалежний від віндового.

Ennor писал (а): Ще, наскільки я пам'ятаю, для роботи / 3GB потрібно як мінімум Advanced Server.


В MSDN, акурат за наведеною мною посиланням, перераховані підтримувані системи. Скопіпастіть сюди спеціально для ледарів, чи що? У будь-якому випадку, WinXP Pro в цьому списку є.

Бачу, так; переплутав з серверною платформою, пардон.

Маленька заміточка з приводу EXCEPTION_STACK_OVERFLOW від Кріса Касперски (якщо кому цікаво):

мищьх писал (а): я-то осів думав, що EXCEPTION_STACK_OVERFLOW вискакує
при зверненні до передостанній сторінці стека, після чого
система виділяє нам ще одну сторінку, щоб ми могли якось
обробити виникло виключення.

а ось при доступі за кордону стеці генериться EXCEPTION_ACCESS_VIOLATION

А я все практикую лікування травами.

Схожі статті