Як Windows відстежує місця, які використовуються в пам'яті?


1

Моє розуміння (основного) визначення витоку пам'яті - це місце в пам'яті, яке було зарезервовано, але вказівник на цю пам'ять у програмі, яка резервувала пам'ять, була видалена / втрачена.

Моє запитання таке: для того, щоб Windows (або взагалі будь-яка операційна система) усвідомлювала, що пам’ять все-таки зарезервована після знищення покажчика, який використовується для управління цією пам'яттю всередині програми, він повинен незалежно відстежувати, якою пам'яттю використовується. Де це робиться, і як?

Відповіді:


2

Ви маєте рацію - кожна операційна система відстежує використання та розподілення пам'яті окремо. Це одна з його життєво важливих функцій. З багатьох причин просто не було б сенсу передавати повний контроль над пам’яттю процесу користувальницької системи - безпеку можна вказати як один із прикладів: Ваш процес може зберігати конфіденційну інформацію в пам’яті, таким чином Операційна система повинна керувати, до яких процесів буде дозволено отримати доступ до нього.

Як правило, всі операційні системи мають підсистему під назвою Управління пам'яттю (або Менеджер пам'яті в Windows), яка відслідковує віртуальну пам'ять. Інша частина ОС, Hardware Abstraction, потім відображає цю віртуальну пам'ять на фізичні пристрої. Це, звичайно, забороняє пряму взаємодію між будь-яким процесом користувача та фізичною пам'яттю.

Безпосередньо взаємодія з цією частиною операційної системи є частково доступною через загальнодоступний API - див. Функції управління пам’яттю для Windows. У Linux існує декілька способів доступу до пам'яті, ця сторінка буде найкращим способом розпочати роботу з нею.


1

Ну, так, це функція частини ОС, яка називається диспетчером пам'яті, але насправді це трохи збиває питання з дороги. ОП запитала не лише "куди", але "як" .... так, ось як.

Менеджер пам’яті Windows (абревіатура Mm) відслідковує періоди використання віртуальних адрес через набір структур даних, що називаються Дескриптори віртуальної адреси . Для адресного простору в режимі користувача це робиться щоденно. Коли процес вперше створений, він не має VAD. Коли шматок віртуального адресного простору переходить від вільного до невільного - не вільний може бути зарезервований, скоєний, нанесений на карту або один-два менш поширених варіанта - створюється VAD. VAD містить стартову адресу (завжди вирівнювання сторінки) та розмір (також завжди вирівнювання сторінки) регіону, тип виділення (зарезервовано, здійснено тощо) та кілька інших речей.

Область, описана VAD, може бути перероблена та / або підрозділена. Наприклад, дуже часто для великого зарезервованого діапазону часточка себе змінила на "скоєний". Це призводить до того, що оригінальний VAD модифікується для відображення нової довжини зарезервованої області та нового VAD, створеного для опису скоєного регіону. Якщо закріплений регіон виходить із "середини" діапазону, визначеного оригінальним VAD, потрібно створити два нових VAD.

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

Зважаючи на характер дерева цього типу, ця операція є дуже ефективною як для пошуку існуючих VAD, так і для додавання та видалення VAD. для пошуку існуючих VAD ефективним є так само, як ефективний "двійковий пошук" у простому упорядкованому списку. Якщо на дереві є, наприклад, від 31 до 64 VAD, для пошуку будь-якої адреси потрібно переглянути максимум шість VAD. Для 65 до 128 VAD, пошук займає всього сім кроків і т. Д. Але на відміну від простого упорядкованого списку, додавання або видалення записів не потребує перестановки всіх існуючих.

Коли потрібно виділити новий регіон, дерево потрібно "пройтися", щоб знайти вільну область достатнього розміру. Це помірно дорога операція, але це нормально, оскільки це трапляється не так часто.

Щодо "знищення вказівника" - вказівник - це лише місце в пам'яті. Коли я виділяю віртуальну пам'ять (в API Windows виклик низького рівня для цього - VirtualAlloc), я отримую вказівник на виділений регіон. Перезапис вказівника з нулем або навіть розміщення віртуальної пам'яті, в якій він зберігається, не говорить ОС, що я закінчую з регіоном. Зрештою, я, можливо, скопіював це значення вказівника десь ще. Що говорить ОС «Я закінчив із цим регіоном», це дзвінок до VirtualFree. Це видаляє VAD, який описав регіон. Звичайно, весь віртуальний адресний простір за кожним процесом є атрибутом процесу, і все, що все-таки виділяється, зникає, коли процес видаляється (тому що всі VAD також відходять).

Асоціація між номерами віртуальних сторінок і фізичними номерами сторінок підтримується в структурах, званих таблицями сторінок . Вони також допомагають керувати віртуальним адресним простором. Існує таблиця сторінок, що складається з 512 записів таблиці сторінок і займає одну сторінку, на кожні 2 Мб віртуального адресного простору; кожен PTE описує одну сторінку. ПТ організовані в просту ієрархічну структуру, три рівні глибиною на 32-бітному x86, чотири рівні на x64. Таблиці сторінок, що відповідають 2-мегабайтним розширенням vas, які є вільними (тобто ніякі VAD нічого не описують у 2 Мб) насправді не існують; таким чином, відповідні записи на ПТ верхнього рівня дорівнюють нулю. Таблиці сторінок також підтримуються та оновлюються менеджером пам'яті ОС (а не "апаратним рівнем абстракції", як заявлено в іншій відповіді).

(Попередній абзац передбачає PAE на x86. Без PAE це 1024 PTE на PT, а в дереві є лише два рівні PT.)

Ще один набір даних, '' масив PFN '', відстежує стан кожної фізичної сторінки. Це простий масив структур, індексований фізичним номером сторінки ("номер кадру сторінки"). Кожен елемент масиву містить інформацію про стан відповідної фізичної сторінки: на якій із загальносистемних сторінок перелічено його (вільний, очікуваний, нульовий, модифікований) або якщо він знаходиться в одному чи кількох робочих наборах процесів, скільки процесів це в тощо.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.