Как запустить процесс с ограниченной памятью? - PullRequest
2 голосов
/ 01 октября 2009

Как создать и запустить процесс (т.е. запустить файл .exe) с ограничением ОЗУ с использованием c ++ и win32 API?

Какой код ошибки будет возвращен, если процесс превысит лимит?

Ответы [ 5 ]

2 голосов
/ 02 октября 2009

Работа Объекты - верный путь.

Что касается кода ошибки, на самом деле его нет. Вы создаете процесс (с CreateProcess) и задание (с CreateJobObject), затем связываете процесс с объектом задания (с AssignProcessToJobObject).

Родительский процесс не получит сообщение об ошибке, если дочерний объект выделит больше, чем допустимый объем памяти. Фактически, ограничение будет применяться, даже если родительский процесс завершится. Если дочерний процесс пытается выделить больше допустимого объема памяти, выделение будет просто неудачным.

2 голосов
/ 02 октября 2009

NT Задание объектов (SetInformationJobObject & JOBOBJECT_BASIC_LIMIT_INFORMATION)

2 голосов
/ 01 октября 2009

Вы можете использовать CreateProcess () для запуска процесса.

Как только вы это сделаете, вы можете использовать SetProcessWorkingSetSize () , чтобы попытаться контролировать, сколько физической памяти он использует, но это скорее сильное предложение для VMM, чем какой-то действующий указ, который будет вызвать malloc () и new, чтобы начать терпеть неудачу.

Нельзя сказать, что «этот процесс займет 4 МБ памяти, и после этого все выделения завершатся неудачно». Я имею в виду, что вы собираетесь ссылаться на win32 dll и не знаете, какое использование памяти требуется для этих вещей. Если вы хотите, чтобы ваше приложение занимало только определенный объем памяти, не выделяйте больше. И не делай то, что выделяет память.

Ваш вопрос относительно кода ошибки не имеет никакого смысла.

1 голос
/ 01 октября 2009

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

1 голос
/ 01 октября 2009

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

У вас есть это на Java, поскольку JVM использует только предопределенный объем памяти, но там это не особенность, а скорее проблема;

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