Чи можна натякнути Windows повністю вивести процес із свопу


13

Чи можна натякнути менеджеру віртуальної пам’яті Windows, щоб вивести певний процес із заміни?

Ситуація, в якій я часто опиняюся, зазвичай використовує близько 50% моєї оперативної пам’яті для всіх звичайних програм, зокрема, IDE для вбудованої цілі, а також пов’язаний з цим відладчик.

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

Тоді спорадичні паузи для того, щоб замінити процес назад, викликають проблеми з налагоджувачем, імовірно, через проблеми з тимчасовою передачею в комах між IDE та апаратним відладчиком. Таким чином, управління цільовим пристроєм може носити спорадичний характер, поки достатньо спроб не поверне дані налагодження в IDE назад із свопу.


Це було б дуже корисно! З точки зору користувачів, прикро чекати процесу заміни після кожного клацання чи дії користувача. Було б набагато краще сказати: "скасуйте цей процес!" , піти на каву та повернутися до чуйної системи!
Томаш

Я не знайомий зі специфікою процесу заміни Windows, але це щось, що ви шукаєте? У коментарях повинен бути робочий бінарний приклад.
Рік

1
У мене колись було подібне запитання , і я написав програму, грунтуючись на відповідях, які я отримав на Stack Overflow.
Керрек СБ

@Kerrek, я спробував скомпілювати ваш код під MinGW і отримав помилки при кожному прочитаному "Не вдалося прочитати один байт від 0x161000, помилка 299 (0 байтів прочитано)." Оскільки у мене працює тільки Windows, я не був достатньо сміливим, щоб запустити випадковий бінарний файл, який ви додали, щоб проблема могла бути в моїй компіляції.
Грег

1
@KerrekSB, здається, незначна проблема. Можливо, ви торкаєтесь області пам’яті, яка не відображена? У всякому разі, я думаю, що ваша відповідь заслуговує на винагороду :) PS: відміна здається набагато повільнішою, ніж могла бути, порівняно зі швидкістю жорсткого диска. Здається, вузьке місце є десь ще, але де?
Томаш

Відповіді:


1

KerrekSB розробив для цього спеціальний інструмент:

/programming//a/2940209/684229

Він доступний на GiTHUB з бінарними файлами: https://github.com/louisdx/unpage

Під час запуску ви отримуєте безліч помилок "Не вдалося прочитати один байт від 0x .... 000, помилка 299 (0 байтів прочитано)", але це не проблема, інструмент чудово працює.


"але це проблема"? Я не думаю, що це проблема.
Керрек СБ

Цитата: "інструмент, який намагається повернути всі програми у фізичну пам'ять". Якщо "процес голодної пам'яті" плаката, це може не спрацювати.
harrymc

@harrymc Цитата з питання : After the big process is finished, most processes are left in swap.. Тож, мабуть, він уже закінчив «процес голодного пам’яті».
Рік

@KerrekSB звичайно, це була помилка. Спасибі :-)
Томаш

@Tomas Я це знайшов . З моїми дуже обмеженими знаннями c ++ я переконався, що для кожного невдалого доступу сторінка дійсно захищена бітом PAGE_GUARD. Я використовував if (meminfo.Protect > 50) { std::cerr << meminfo.Protect << " - " << PAGE_GUARD << std::endl; }безпосередньо перед ReadProcessMemory-line. PAGE_GUARD - це 256, і я отримав 260 з проваленими сторінками. Так можна позбутися від помилок. Хтось із знаннями c ++ та підказка повинен читати на біті PAGE_GUARD.
Рік

1

Ви можете використовувати Process Lasso, щоб надати процесу пріоритет на сторінці пам'яті :

Починаючи з Windows Vista, кожна сторінка пам'яті має пріоритет у межах від 0 до 7. Список очікування розділений на вісім списків, у яких кожна сторінка обробляє різні пріоритети. Коли Менеджер пам'яті хоче зняти сторінку зі списку очікування, вона спочатку переносить сторінки зі списків із низьким пріоритетом. "

Процес Lasso може допомогти керувати пріоритетами пам’яті, дозволяючи встановлювати стійкі пріоритети пам’яті для процесів, так що їх сторінки віртуальної пам’яті встановлюються під певний пріоритет кожен раз.

Процес Lasso має дві версії: безкоштовну та комерційну ($ 18,95 з пробною версією).


Я боюся, що ви відповідаєте на зовсім інше запитання. Надання процесу пріоритету пам’яті процесу - це різне завдання, напевно, марне в контексті ОП, і мені замальовано: коли у вас вже є процес, який знаходиться в свопі, і хочете його відмінити. Ви не хочете заважати йому перейти на обмін.
Томаш

@Tomas: Це не моє розуміння. Запит полягає в тому, щоб не допустити заміни певного процесу. Якщо сам процес не запрограмований для блокування своїх сторінок у пам'яті, наступне найкраще рішення - надати йому найвищий пріоритет пам’яті, щоб зменшити ймовірність його заміни.
harrymc

3
@harrymc, OP каже, що коли свиня пам’яті працює, «все заміняється - як слід», так що ОП хоче. Просто вранці в понеділок він хоче, щоб робочі набори важливих процесів були занесені відразу, а не в крапельниці та драби, невдалі сторінки з часом.
mgkrebbs

@mgkrebbs: Це інше рішення проблеми, яке, на мою думку, неможливо зробити. Моє рішення полягає в тому, що якщо IDE ніколи не змінюватимуться, тоді не потрібно міняти його назад. "Процес, голодний пам'яті", матиме лише кілька мегабайт менше оперативної пам'яті, що не вплине занадто сильно на його продуктивність.
harrymc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.