Windows зависает, когда моя программа использует файл подкачки - PullRequest
0 голосов
/ 27 февраля 2009

Я запускаю программу пользовательского режима с обычным приоритетом. Моя программа ищет проблему с НП и в результате использует много памяти, которая в конечном итоге попадает в файл подкачки.

Затем моя мышь зависает, и диспетчеру задач требуется целая вечность, чтобы позволить мне завершить процесс.

Что я хочу знать, так это как остановить полную блокировку операционной системы Windows от этого, даже если используется только одно из двух моих ядер.

Edit: Спасибо за ответы.

Я знаю, что использование меньшего объема памяти поможет, но для меня не имеет смысла блокировать всю ОС.

Ответы [ 4 ]

2 голосов
/ 27 февраля 2009

Очевидный ответ: «использовать меньше памяти». Когда ваше приложение использует все В свободной памяти ОС должна вывести на экран диспетчер задач (и т. д.), чтобы освободить место для вашего приложения. Когда вы переключаете программы, ОС вынуждена возвращать другие программы обратно (по мере необходимости). Чтение с диска происходит медленнее, чем чтение из памяти, поэтому все выглядит идет медленнее.

Если вы хотите избежать этого, пусть ваше приложение управляет собственной памятью, или используйте лучший алгоритм, чем грубая сила. (Есть генетические алгоритмы, имитация отжига и т. д.)

1 голос
/ 27 февраля 2009

Это немного экстремально, но вы всегда можете свести к минимуму файл подкачки, чтобы у вас не было всего диска, а вашей программе не разрешалось выделять много виртуальной памяти. В разделе «Панель управления» / «Дополнительно» / «Дополнительно» / «Производительность» / «Виртуальная память» установите для файла подкачки произвольный размер и введите значение 2 МБ (наименьшее допустимое в XP). В случае сбоя выделения вы должны получить исключение и иметь возможность корректно завершить работу. Это не совсем решает вашу проблему, просто ускоряет ее;)

Еще одна вещь, которую стоит рассмотреть, это если вы работаете на 32-битной платформе, портируете на 64-битную систему и получаете коробку с гораздо более адресуемой оперативной памятью.

1 голос
/ 27 февраля 2009

Проблема заключается в том, что когда другая программа (например, explorer.exe) будет выполняться, весь ее код и память будут выгружены. Чтобы освободить место для другой программы, Windows сначала необходимо записать данные, которые ваша программа использует, на диск, а затем загрузить память другой программы. Каждая новая страница кода, которая выполняется в другой программе, требует доступа к диску, что приводит к ее медленной работе.

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

Чтобы дать другим процессам больше оперативной памяти для жизни, вы можете использовать SetProcessWorkingSetSize , чтобы уменьшить максимальный объем оперативной памяти, который может использовать ваша программа. Конечно, это заставит вашу программу работать медленнее, потому что она должна выполнять больше операций подкачки.

Еще одна альтернатива, которую вы можете попробовать, - это добавить больше дисков в систему и распределить между ними файлы подкачки. У вас может быть двухъядерный процессор, но у вас есть только один диск. Распределение файла подкачки по нескольким дискам позволяет Windows сбалансировать работу между ними (хотя у меня нет непосредственного опыта, насколько хорошо это происходит).

1 голос
/ 27 февраля 2009

Я не думаю, что есть программный ответ на этот вопрос, кроме «реструктуризации вашего приложения, чтобы использовать меньше памяти». Проблема с файлом подкачки, скорее всего, связана с узким местом доступа к диску, особенно если вы используете жесткий диск IDE или сильно фрагментированный файл подкачки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...