Однозадачный для соревнований по программированию - PullRequest
3 голосов
/ 23 октября 2011

Я начну с вопроса, а затем продолжу объяснять необходимость:

Учитывая один файл исходного кода C ++, который хорошо компилируется в современном g ++ и использует только стандартную библиотеку, могу ли янастроить операционную систему для одной задачи и запустить ее там?

РЕДАКТИРОВАТЬ : Следуя комментарию Криса Лайвли, я бы лучше спросил: Какой самый простой способ предложить вам попробоватьнастроить Linux, чтобы эффективно дать мне однозадачное поведение.Тем не менее, похоже, что я получил хороший ответ, хотя я недостаточно хорошо сформулировал свой вопрос.См. Второй абзац в ответе Сарнольда о планировщике.

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

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

Другой подход к синхронизации может состоять в измерении времени до и после запуска программы, используя что-то вроде * clock_gettime *, а затем вычитать их значения.Мы также должны вычесть количество времени, потраченного на ввод-вывод, и это можно сделать, перехватывая printf и scanf, используя что-то вроде LD_PRELOAD, и накапливая время, потраченное на каждую из этих функций, проверяя время непосредственно перед и сразу после каждого вызова printf./ scanf (можно требовать, чтобы участники использовали эти функции только для ввода-вывода).

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

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

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

1 Ответ

2 голосов
/ 23 октября 2011

Перво-наперво, то, что я думаю, будет соответствовать вашим потребностям лучше на самом деле будет интерпретатор - тот, который вы можете использовать для отслеживания "времени выполнения" запрограммируйте в некоторых специально созданных единицах, таких как «мемы», для представления обращений к памяти или «циклов» для представления скоростей различных команд. MMIX * 1006 Кнута в его Искусстве компьютерного программирования может обеспечить именно эту функциональность, хотя Python, Ruby, Java, Erlang - все достаточно разумные интерпретаторы, которые могут обеспечить некоторое количество команд / стоимость / стоимость доступа к памяти, если вы делаете достаточно переписать. (Но потеря C ++, очевидно.)

Другой подход, который может вам пригодиться - если использовать его с особой осторожностью, - это запускать ваши проблемы программирования в классе обработки SCHED_FIFO или SCHED_RR в режиме реального времени. Программы, запущенные в одном из этих классов приоритетов в реальном времени, не будут , а уступать другим процессам в системе, позволяя им доминировать над всеми другими задачами. (Обязательно запустите свои sshd(8) и sh(1) в более высоком классе реального времени, чтобы позволить вам убивать беглые задачи.)

...