Windows зависает, когда моя программа использует файл подкачки

StackOverflow https://stackoverflow.com/questions/593842

  •  09-09-2019
  •  | 
  •  

Вопрос

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

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

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

Редактировать:Спасибо за ответы.

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top