Можно ли намекнуть на Windows, чтобы вывести процесс из свопа полностью

13

Можно ли намекнуть диспетчеру виртуальной памяти Windows, чтобы вывести определенный процесс из свопинга?

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

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

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

Greg
источник
Это было бы очень полезно! С точки зрения пользователей раздражает ожидание процесса замены после каждого щелчка или действия пользователя. Было бы гораздо лучше сказать: «отмени этот процесс!» Пойди кофе и вернись к отзывчивой системе!
Томас
Я не знаком со спецификой процесса обмена 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 байт)», но это не проблема, инструмент работает отлично.

Tomas
источник
"но это проблема"? Я не думаю, что это проблема.
Керрек С.Б. 19.12.13
Цитата: «инструмент, который пытается вернуть все приложения в физическую память». С "голодным процессом памяти" плаката это может не сработать.
harrymc
@harrymc предложение от вопроса: After the big process is finished, most processes are left in swap.. По-видимому, он уже закончил «процесс, требующий памяти».
Рик
@KerrekSB конечно, это была опечатка. Спасибо :-)
Томас
@ Томас Я нашел это . С моим очень ограниченным знанием c ++ я убедился, что для каждого неудачного доступа страница действительно защищена битом PAGE_GUARD. Я использовал как if (meminfo.Protect > 50) { std::cerr << meminfo.Protect << " - " << PAGE_GUARD << std::endl; }раз перед ReadProcessMemoryстрокой. PAGE_GUARD - 256, а я получил 260 с ошибочными страницами. Так что от ошибок можно избавиться. Кто-то с некоторыми знаниями C ++ и Paging должен прочитать бит PAGE_GUARD.
Рик
1

Вы можете использовать Process Lasso, чтобы дать процессу приоритет страницы памяти :

Начиная с Windows Vista, каждая страница памяти имеет приоритет от 0 до 7. Резервный список разделен на восемь списков, каждый из которых обрабатывает страницы с различным приоритетом. Когда диспетчер памяти хочет получить страницу из списка ожидания, он сначала берет страницы из списков с низким приоритетом. "

Process Lasso может помочь в управлении приоритетами памяти, позволяя устанавливать постоянные приоритеты памяти для процессов, чтобы их страницы виртуальной памяти устанавливались на определенный приоритет при каждом запуске.

Процесс Lasso имеет две версии: бесплатную и коммерческую (18,95 долларов США с пробной версией).

harrymc
источник
Боюсь, что вы отвечаете на совершенно другой вопрос. Придание процессу процесса приоритета памяти - это другая задача, вероятно, бесполезная в контексте OP, и я набросал ее в общих чертах: когда у вас уже есть процесс, который находится в режиме подкачки, и вы хотите отменить его. Вы не хотите помешать этому поменяться.
Томас
@ Томас: Это не мое понимание. Запрос состоит в том, чтобы не допустить замены данного процесса. Если сам процесс не запрограммирован на блокировку его страниц в памяти, следующее лучшее решение - дать ему наивысший приоритет памяти, чтобы уменьшить вероятность его замены.
Harrymc
3
@harrymc, OP говорит, что при запуске памяти «все выгружается - как они должны», и именно этого хочет OP. Просто в понедельник утром он хочет, чтобы рабочие наборы важных процессов были введены сразу, а не по частям и сбою страниц с течением времени.
mgkrebbs
@mgkrebbs: Это другое решение проблемы, которое я считаю невозможным. Мое решение состоит в том, что если IDE никогда не будет заменен, то нет необходимости снова его менять. У «голодного процесса» будет только несколько мегабайт оперативной памяти, что не сильно повлияет на ее производительность.
Harrymc