Это связано с тем, что обработчик сигнала действителен как для родителя, так и для дочернего элемента после вызова fork ().
Поскольку разветвленный дочерний процесс выполняется в той же группе процессов, что и родительский, оба процесса получают сигнал.
Вы можете использовать эту команду printf ():
printf("interrupt has been invoked in pid %d\n", (int)getpid());
Драйвер tty имеет настроенную группу процессов tty, и если вы наберете ^C, а ^C настроен как символ TTY INTR, то драйвер tty отправляет SIGINT всем процессам, которые находятся в той же группе процессов, что и tty. Водитель.
Лучший ответ на этот вопрос: "попробуй и посмотри"... проведи несколько стресс-тестов и посмотри, что дает наилучшие результаты. Это связано с тем, что очень незначительные нюансы в поведении ваших потоков могут вызвать различия в производительности.
Следующее во многом основано на моем собственном опыте...
Способность Linux предотвращать голодание потоков довольно хороша. Это не обязательно означает, что каждый поток получит равную долю пирога, но все потоки, по крайней мере, получат часть пирога. Если у вас есть два потока, конкурирующих за процессорное время... скажем, один пытается использовать 100% ЦП, а другой пытается использовать только 10%... тогда не удивляйтесь, если это уравновесит 91% и 9% или где-то еще вокруг этого.
Общая производительность может снизиться, если на конкретный ресурс сильно превышено количество подписок. Это особенно верно для дискового ввода-вывода на вращающихся жестких дисках. Головке приходится физически перемещаться (искать )между местами на диске, а непрерывные колебания между разными файлами могут вызвать значительное замедление. Но этот эффект часто довольно мал, если один поток сильно связан с вводом-выводом, а другой хотел бы выполнять небольшой ввод-вывод.
Вместе эти две вещи означают, что часто лучше иметь на 20% больше подписчиков, чем на 20% меньше подписчиков. Другими словами, не резервируйте время ЦП для потоков, которые не пытаются использовать много ЦП.
Например, :Если у вас есть потоки, привязанные к ЦП, и потоки, связанные с дисковым вводом-выводом, и у вас есть 8 ядер и 1 жесткий диск, то начните с 8 потоков, привязанных к ЦП, и одного потока, связанного с жестким диском, ввода-вывода. 7 и 1 могут просто оставлять ядро бездействующим большую часть времени. 8 и 1 почти наверняка не истощат поток HD, что означает, что вы полностью используете как HD, так и ЦП.
Просто имейте в виду, что Linux может столкнуться с большим количеством короткоживущих потоков.Это более очевидно при преднамеренных попытках повредить систему . Но постоянное порождение потоков/процессов может подтолкнуть Linux к плохому поведению.
В своем вопросе вы описали выделенные рабочие потоки, которые звучат как долгоживущие потоки. Это звучит как правильный подход.
Ждешь автобус полчаса, а потом приезжает сразу 5. Это происходит потому, что пассажиры, садящиеся в передний автобус, тормозят его. Отсутствие пассажиров в более поздних автобусах ускоряет их, вызывая эффект скопления.
Та же проблема может возникнуть при многопоточности, особенно когда потоки конкурируют за ресурсы. Если у вас есть потоки, которые предсказуемо чередуются между задачами, например чтение с одного диска, а затем запись на другой, то они могут иметь тенденцию группироваться вместе, а не стохастически рассеиваться, как вы можете ожидать. Таким образом, один ресурс может замедлить использование другого. По этой причине иногда бывает лучше дополнительно разделить задачи потока.
Я не буду вдаваться в подробности. Но я должен упомянуть, что в Linux есть возможность, называемая «cgroups», которая позволяет вам группировать процессы и ограничивать их коллективные ресурсы. Это может быть очень полезно при дальнейшей настройке производительности.
Их краткое обсуждение здесь . Но я бы посоветовал вам потратить немного времени на Google, чтобы увидеть их все возможности, потому что они могут помочь вам в долгосрочной перспективе.