Заметил, что если приложение выполняет некий непрерывный цикл без пауз, загружая таким образом все ядро, то одна итерация этого цикла всреднем выполняется дольше, чем если в цикле ставиться пауза, или итерация происходит по сигналу. По всей видимости, ядро захлебывается, создавая большие задержки, которые влияют на среднюю. Можно ли как то с этим бороться? Вариант уставновка sleep(1) не желателен, поскольку такая пауза слишком велика.
Ээммм, пишете очень странное. Почитайте про то как работает планировщик операционной системы и как он распределяет процессорное время.
Сами подумайте как такое может быть? Вот у вас есть процесс, он использует ресурсы железа которые ему выделела ОС. В каждый транк времени ОС выделяет какому то процессу все ресурсы, чем больше транков именно этому процессору достаётся - тем больше ресурсов железа он может утилизировать, тем быстрее выполнится. Транк закончился, ОС сбрасывает состояние процесса в регистры и отдаёт процессор и другие ресурсы следующему процессу и так по кругу. Как в такое логике пауза в работе ему поможет?
Такое возможно только в ситуации, когда какой-либо используемый этим процессом компонент деградирует в производительности при максимальной загрузке. Такое возможно с диском, остальные части системы обычно работают одинаково вне зависимости от нагрузки (сколько процессор не используй он работает, сколько оперативной памяти не займи она работает, сеть отдаёт всё что есть и тыды).
Либо вы меня не поняли, либо я не понимаю ваш ответ. Что значит транк? что значит транк закончился? Почему он должен закончится? Я работаю с потоком (или однопоточным процессом), этот поток выполняет работу и нагружает логический ЦП на 100%. Если выполнена команда sleep это значит, что на время сна этого потока процессор может выполнять или другие задачи или спать. Что именно я не правильно описал?
современные ОС каждую секунду делят процессорное время между потоками\процессами которые стоят в очереди. Планировщик ОС (а именно так называется механизм, которые делает это) определяет процесс и его поток, которому необходимо сейчас дать процессора, и передаёт ему (потоку или процессу, зависит от контекста, упростим) управление, потом забирает управление (или процесс сам его возвращает, досрочно) и так по кругу. У ОС есть критерии определения приоритета процессов, она знает кто ждёт вывода или ввода, кто уснул и попросил пока не трогать, ОС следит за прерываниями железа и так далее. Каждую секунду такое перераспределение ресурсов происходит много раз, каждый такой "раз" я, для простоты, назвал транком (кусок времени). Ваш поток, если ОС показывает нагрузку 100% на ядро, загружает систему во все свободные транки (без учёта времени ядра - это то время которое тратит сам планировщик, прерывания железа и ожидания ответа драйверов и т.д).
Т.е. ваш процесс полностью получает процессор во всё дозволенное ему время и говорит ОС, что ему так норм (заметили же, что не все процессы так делают, некоторые не грузят систему, они сообщают ОС, что им пока не нужно, и она передаёт управление кому-то другому).
Теперь с учётом выше изложенного, скажите, как по вашему, при каком условии ваш процесс будет работать быстрее, если вы вставите паузу в его работу?
Евгений Быченко: в том то и дело, что не должен, тем более даже нет переключения контекста, но дефакто это происходит. Если поток сжирает 100% ядра, начинается разброс времени выполнения одной итерации цикла. Если цикл отдает управление между итерациями, это существенно сокращает разброс и улучшает среднюю. Мой вопрос именно в этом и заключается, почему так происходит и как с этим бороться?