Вам потрібно більше оперативної пам'яті для запуску 32-бітних програм у 64-бітній Windows?

Більшість комп'ютерів сьогодні поставляються з 64-бітною версією Windows і часто з мінімальним обсягом оперативної пам'яті. Це ставить під питання ефективність цих систем. Це особливо актуально, коли користувачі хочуть запускати свої застарілі 32-розрядні програми на цих нових комп'ютерах.

Читач запитує:

Чи правда, що для запуску 32-розрядних додатків у 64-розрядній системі Windows потрібно в 1,5 рази більше пам'яті порівняно з 32-розрядним додатком у 32-розрядній операційній системі Windows?


Брюс відповідь:

Раніше ми вже обговорювали переваги і недоліки збереження всього 64-бітного коду і деякі ефекти «змішування і зіставлення». Сьогодні ми розглянемо, як 32-бітові додатки виконуються в 64-бітових версіях Windows.

64-розрядна операційна система Windows не може запустити 32-розрядну програму Windows без будь-якої додаткової допомоги. Вони просто занадто різні: від індексів і типів даних, до того, як системні виклики (як програми використовують ресурси базової операційної системи). Вам потрібен якийсь спосіб зробити їх сумісними.

Розуміння WoW64

Windows використовує підсистему WoW64 (Windows32 на Windows64) для компенсації відмінностей. Він ефективно працює як 32-розрядний міні-емулятор Windows в системах x64 і як повноцінний емулятор в системах Itanium (IA64).

Системи IA64 вимагають повного емулятора через відмінності в інструкціях процесора і розмірах сторінок пам'яті (4K в x86 і x64, 8K в IA64). Оскільки процесори x64 мають всі інструкції процесорів x86 і використовують один і той же розмір сторінки пам'яті, для нього не потрібен повний емулятор.

В обох випадках WoW64 забезпечує інтерфейс між 64-бітним ядром Windows і 32-бітовою версією ntdll.dll (містить список основних функцій ядра Windows), перехоплюючи виклики ядра і змінюючи їх, щоб вони могли оброблятися рідні 64-бітові функції, що надаються ядром Windows.

Для досягнення цієї мети в системах x64/ IA64 використовуються 3 файли DLL: wow64cpu.dll, wow64win.dll и wow64.dll. Їх функції полягають у тому, щоб абстрагувати характеристики процесора і надавати thunks (про них ми поговоримо пізніше) в win32k.sys, який надає функціональність «вікна», і ntoskrnl.exe, який містить виконавчий модуль, ядро, менеджер пам'яті, планувальник процесів (не для плутати з планувальником завдань, доступним з панелі управління) та іншими основними основними елементами операційної системи.


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

У цьому випадку він витягує аргументи зі стеку викликів 32-бітної програми, перетворює їх на їх 64-бітові аналоги і виконує 64-бітний системний виклик. Після повернення з виклику він перетворює 64-бітові результати назад на 32-бітові і повертає їх назад у стек викликів програми для використання стороною, що викликає.

Всі операції виконуються в користувальницькому режимі (який має обмежені дозволи) з двох причин. По-перше, він мінімізує вплив помилок в коді, які можуть призвести до діри в безпеці, пошкодження даних або збою системи при роботі в режимі ядра.

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

Повертаючись до систем Itanium, слід відзначити й інші важливі відмінності. Системи IA64 використовують два додаткові файли. IA32exec.bin - це програмний емулятор x86, а Wowia32x.dll забезпечує інтерфейс між WoW64 і програмним емулятором.

32-розрядний процес завантажить ці файли, а також 64-розрядну версію ntdll.dll. Це єдині 64-розрядні двійкові файли, які можуть бути завантажені в 32-розрядний процес до Windows 7. У Windows 7 і пізніших версіях також є інша DLL, apisetschema.dll, яка буде завантажена в усі процеси.

Коли запускається 32-розрядний процес, він завантажує файл Wow64.dll, який, своєю чергою, завантажує 32-розрядну версію ntdll.dll і всі необхідні 32-розрядні бібліотеки DLL з% systemroot%\ SysWOW64. Більшість цих файлів ідентичні двійковим файлам у 32-розрядній системі, хоча деякі з них були переписані, щоб поводитися по-іншому в WOW64.


Дивлячись на список завантажених бібліотек DLL, ми бачимо, що в процесі під Win64 завантажено 9 бібліотек DLL, яких немає в системі Win32.

Тепер у вас може виникнути спокуса подивитися на розміри файлів, скласти їх і використовувати їх як основу для визначення обсягу використовуваної додаткової пам'яті, але в результаті ви отримаєте неточні результати. Ці файли за своєю природою призначені для використання в якості загальних компонентів, і в результаті перший файл, для якого потрібен DLL, завантажує його в пам'ять.

Наступні програми, яким потрібна одна і та ж DLL, не завантажують весь компонент в пам'ять. Вони отримують покажчик на вже завантажений компонент і виділяють ОЗУ для додаткових елементів, які завантажуються в процес.

Наша тестова установка

Щоб побачити, що відбувається, я налаштував дві віртуальні машини під керуванням Windows 7 Ultimate з 2 ГБ оперативної пам'яті, виділеної для кожної. Одна з них - 32-бітна версія, а інша - 64-бітна. Обидва пройшли однаковий процес встановлення і виправлення.

Після того, як обидві системи були виправлені, я відключив файл підкачки на обох, щоб отримати краще уявлення про використання пам'яті, гарантуючи, що ОЗУ не може бути вивантажено на диск. Після цього LibreOffice 5.0.3.2 був встановлений.


Копія Sysinternals Process Explorer була також розміщена на обох машинах. Це інструмент, який я використовував для збору інформації про використання пам'яті. Типове налаштування стовпчика було змінено, щоб я міг подивитися на використання Робочого набору і WS Private.

Ці числа робочих наборів відображають обсяг оперативної пам'яті, яку використовують програми. Це ще більш ускладнило ситуацію, відобразивши обсяг пам'яті, що використовується бібліотеками, що розділяються, навіть якщо вони вже були завантажені іншим процесом. Через це, якщо ви додасте весь стовпчик, ви можете отримати загальний обсяг пам'яті, що перевищує встановлену. Робочий набір, як і раніше, є найкращим індикатором того, скільки саме пам'яті потрібно для процесу.

Процеси, які ми вивчаємо, теж не самотні. Різні програми LibreOffice запускають ще один процес, soffice.exe, який буде виконувати ще один процес, soffice.bin. Нам необхідно переглянути підсумки всіх трьох процесів, щоб побачити ефективне використання пам'яті кожною програмою.

Для початкового тесту я просто окремо відкрив Writer, Calc і Impress, щоб подивитися, скільки пам'яті вони споживають без завантаження даних, і експортував дані з Process Explorer. З Calc і Impress я відкрив 3,7 МБ файл.xls і 3,9 МБ файл.pptx відповідно і записав нове використання пам'яті. Результати можна побачити в таблиці нижче. Всі дані в КБ.

Великий сюрприз стався з Impress. Без документа він використовував на 4,1% більше оперативної пам'яті в 64-бітній системі і на 9,9% менше при завантаженому документі. Я викопав кілька інших презентацій і отримав схожі результати з усіма з них. 64-бітова система використовувала менше оперативної пам'яті, ніж 32-бітна.


Отже, чи вимагають 64-розрядні версії Windows більше оперативної пам'яті, ніж їх 32-розрядні аналоги, при запуску 32-розрядних додатків? Загалом так.

Але вам потрібно оновити оперативну пам'ять? Можливо ні. Різниця насправді не така велика. Це, звичайно, не в 1,5 рази відрізняється.

COM_SPPAGEBUILDER_NO_ITEMS_FOUND

logo