Я прочитал данную статью про лимиты памяти, и написал некий код, который вычисляет те или иные значения памяти и времени.
Как я понял, функция clock() измеряет время процессора, которое сильно отличается от того, что выводит мне команда time в шелле. Каким образом в тестирующих системах это отслеживается?
Есть куча разных полей типа:
VmPeak: 11884 kB
VmSize: 11884 kB
VmLck: 0 kB
VmHWM: 1108 kB
VmRSS: 1108 kB
VmData: 272 kB
VmStk: 88 kB
VmExe: 16 kB
VmLib: 3244 kB
VmPTE: 48 kB
VmSwap: 0 kB
Как именно ограничивают ресурсы в тестирующих системах?
Вариант с ps aux совсем не годен для коротко работающих программ.
Ответ
Обычно измеряется процессорное время. Это то, что time выводит как user
По памяти - вам нужен показатель VmSize. Или VmPeak - это пиковое значение VmSize.
Если хотите считать совсем честно - то надо отнять от него data/stack/exe/lib - это не "использование памяти" в смысле явного выделения в коде.
Данные по памяти нельзя определить после завершения процесса, так что единственный вариант - достаточно часто опрашивать данные в фоне. Значение VmPeak за долю секунды до завершения кода будет практически актуальным как "максимум использованной памяти". И заодно следить за превышением выделенного времени выполнения.
Писать свою систему с нуля достаточно тяжело. Посмотрите исходники существующих систем, например ejudge.
Комментариев нет:
Отправить комментарий