Задержка переключения контекста в centos7
В моем приложении C основной процесс разветвляется на дочерний процесс, а затем спит в течение десяти микросекунд, чтобы дать ребенку время для подготовки. После периода ожидания родительский процесс отправляет сигнал дочернему процессу, чтобы начать прослушивание на указанном порту.
Этот код прекрасно выполнялся в CentOS6, и было всего несколько случаев, когда период ожидания был недостаточен для того, чтобы дочерний процесс настраивал свои обработчики сигналов до доставки сигнала от родителя. Однако когда этот код был запущен в CentOS7 с теми же системными спецификациями, дочерний процесс не смог вовремя установить свои обработчики сигналов. Мне пришлось увеличить период ожидания до 10 миллисекунд (в 1000 раз дольше), чтобы получить ту же производительность, что и в CentOS6.
Я хотел бы знать, что может быть причиной медленного переключения контекста в CentOS 7 по сравнению с CentOS 6 на оборудовании той же спецификации?
2 ответа
Планирование процессов / потоков осуществляется по усмотрению ядра ОС. CentOS 7 использует ядро, отличное от CentOS 6.
В любом случае, это вовсе не обязательно проблема переключения контекста. Переключение контекста применяется к потокам / процессам, использующим один и тот же процессор [ядро], но одноядерные процессоры в наши дни редки, по крайней мере, на тех классах машин, где вы ожидаете найти CentOS. Фактически, это может быть связано с тем, запланирован ли изначально дочерний процесс в том же ядре, что и родительский, и если да, то что возвращается первым из fork()
,
Предположим, например, что в CentOS 6 дочерний и родительский процесс обычно планировался (изначально) на одном и том же ядре, а дочерний получал это ядро первым. В этом случае родительский процесс вообще не нуждается в задержке, пока дочерний элемент настраивает свои обработчики сигналов до того, как он сначала выдаст ЦП. Если в CentOS 7, с другой стороны, дочерний процесс обычно изначально запланирован на другом ядре, и оба процесса выполняются сразу, то задержка, которая на самом деле не имела значения, внезапно имеет значение. Кстати, это было бы улучшение производительности по большинству показателей.
Все это, конечно, умозрительно. Основная проблема в том, что ваш подход глубоко ошибочен. Родитель не должен пытаться угадать, когда ребенок будет готов. Вместо этого ему следует подождать, пока ребенок не объявит о своей готовности. Дочерний может сделать это через канал или сигнализировать родителю, или, что еще лучше, они могут синхронизироваться через общий семафор или мьютекс (что, в конце концов, для чего предназначены эти объекты).
По-разному скомпилированные ядра ведут себя по-разному. Вы не можете полагаться на временные интервалы для таких вещей. Поскольку у вас установлен обработчик сигнала в родительском устройстве, почему бы просто не изменить логику: когда дочерний элемент готов, он может отправить сигнал родительскому элементу, а затем родительский элемент может начать контролировать дочерний элемент - никто не занят сном, и все зависит от события