Difference between revisions of "Ошибка превышения лимита памяти"
|  (Undo revision 2484 by EltsiTrelo (Talk)) |  (...) | ||
| (2 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
| − | + | Навигация: [[Main Page|Главная страница]]/[[Система ejudge]]/[[Использование]]/[[Вердикты тестирования]]/[[Ошибка превышения лимита памяти]] | |
| − | |||
| − | + | Английское название: [[Memory Limit Exceeded]], [[ML]] | |
| − | + | Ошибка диагностируется, если в процессе работы тестирующая программа потребила больше памяти, чем указано в ограничениях задачи. Обоснованность диагностирования этой ошибки вызывает дискуссии (см. далее). | |
| − | + | Разные тестирующие системы подходят к ограничению памяти для работающей программы по-разному. В ejudge ограничение памяти реализуется с помощью установки ограничения на размер виртуального адресного пространства и размер стека (см. [[ulimit]]). Таким образом, тестируемая программа не может превысить установленные ограничения. | |
| − | + | Диагностирование ошибки превышения ограничения по памяти в системе ejudge работает, толко если установлен [[патч к ядру Linux]]. Если патч не установлен, превышение ограничения по памяти будет диагностировано как ошибка времени выполнения. Кроме того, система ejudge позволяет отключить диагностирование данной ошибки даже если патч к ядру установлен. | |
| − | + | Хотя диагностирование данной ошибки может быть полезно для участников для отладки их решений, в большистве ситуаций граница между ошибкой при выполнении программы и ошибкой превышения ограничения по памяти оказывается очень размытой. | |
| − | + | Например, если превышен максимальный размер стека из-за того, что программа вошла в бесконечную рекурсию, то такая ситуация должна скорее рассматриваться как ошибка при выполнении программы. Но с другой стороны, если программа попыталась выделить слишком много памяти в стеке (например, из-за слишком большого локального массива), такая ситуация  должна рассматриваться как превышение ограничения по памяти. Естественно, невозможно простым способом четко различить эти две ситуации. | |
| − | + | С другой стороны, например, в языке C функция malloc возвращает NULL, если память выделить не удалось. Если тестируемая программа не проверяет результат функции malloc на NULL и получает ошибку доступа по нулевому указателю, то это типичная ошибка программиста и должна рассматриваться как ошибка при выполнении программы. И наоборот, программа может отлавливать ситуации, когда malloc возвращает NULL, и модифицировать свое поведение (например, почистив хеш-таблицу). | |
| + | |||
| + | === Добавления в версии [[изменения в версии 3.12.0|3.12.0]] === | ||
| + | |||
| + | Если тестируемые программы | ||
| + | запускаются [[Изоляция недоверенных процессов в контейнерах|в контейнерах]], | ||
| + | для задачи установлено ограничение на | ||
| + | [[Serve.cfg:problem:max_rss_size|максимальный размер оперативной памяти]], | ||
| + | и включен режим | ||
| + | [[serve.cfg:global:enable_memory_limit_error|обнаружения данной ошибки]], | ||
| + | программа [[ej-suid-container]] эвристически определяет возникновение | ||
| + | ошибки превышения ограничения памяти. | ||
Latest revision as of 19:54, 31 December 2023
Навигация: Главная страница/Система ejudge/Использование/Вердикты тестирования/Ошибка превышения лимита памяти
Английское название: Memory Limit Exceeded, ML
Ошибка диагностируется, если в процессе работы тестирующая программа потребила больше памяти, чем указано в ограничениях задачи. Обоснованность диагностирования этой ошибки вызывает дискуссии (см. далее).
Разные тестирующие системы подходят к ограничению памяти для работающей программы по-разному. В ejudge ограничение памяти реализуется с помощью установки ограничения на размер виртуального адресного пространства и размер стека (см. ulimit). Таким образом, тестируемая программа не может превысить установленные ограничения.
Диагностирование ошибки превышения ограничения по памяти в системе ejudge работает, толко если установлен патч к ядру Linux. Если патч не установлен, превышение ограничения по памяти будет диагностировано как ошибка времени выполнения. Кроме того, система ejudge позволяет отключить диагностирование данной ошибки даже если патч к ядру установлен.
Хотя диагностирование данной ошибки может быть полезно для участников для отладки их решений, в большистве ситуаций граница между ошибкой при выполнении программы и ошибкой превышения ограничения по памяти оказывается очень размытой.
Например, если превышен максимальный размер стека из-за того, что программа вошла в бесконечную рекурсию, то такая ситуация должна скорее рассматриваться как ошибка при выполнении программы. Но с другой стороны, если программа попыталась выделить слишком много памяти в стеке (например, из-за слишком большого локального массива), такая ситуация должна рассматриваться как превышение ограничения по памяти. Естественно, невозможно простым способом четко различить эти две ситуации.
С другой стороны, например, в языке C функция malloc возвращает NULL, если память выделить не удалось. Если тестируемая программа не проверяет результат функции malloc на NULL и получает ошибку доступа по нулевому указателю, то это типичная ошибка программиста и должна рассматриваться как ошибка при выполнении программы. И наоборот, программа может отлавливать ситуации, когда malloc возвращает NULL, и модифицировать свое поведение (например, почистив хеш-таблицу).
Добавления в версии 3.12.0
Если тестируемые программы запускаются в контейнерах, для задачи установлено ограничение на максимальный размер оперативной памяти, и включен режим обнаружения данной ошибки, программа ej-suid-container эвристически определяет возникновение ошибки превышения ограничения памяти.
