Если на машине всего 4 ядра, то при необходимости обработки 30 очередей заданий нет смысла запускать 30 потоков. В современных HTTP-серверах, как я знаю, никогда не запускается потоков больше, чем кол-во ядер, но в HTTP-серверах количество соединений очень велико, поэтому разницу между 4 потоками и сотнями тысяч потоков (если бы по 1 потоку на соединение) разработчик HTTP-сервера увидит невооружённым глазом. Это всё мои предположения.
Меня интересует разница между 4, 30 и 100000 НЕСПЯЩИМИ потоками в системе (спящие можно не учитывать, т.к. насколько я понимаю, шедулер им не передаёт управление вообще, пока они в особом состоянии спанья, например таймер ждут, который раз в секунду срабатывает или пакет в сетевуху).
Когда конфигуришь ядро, там есть число - частота переключений потоков (процессов, потоки в linux переключаются тем же «движком», что и процессы). Допустим там стоит 250 Гц.
То есть ядро ставит таймер на 1/250 и по прерыванию шедулер передаёт управление новому неспящему потоку.
Правильно я понимаю, что если у меня 250 неспящих потоков, выполняющих одни и те же суровые вычисления и одно ядро ЦП, то каждый будет получать управление раз в секунду на интервал, равный 1/250 секунды? А если у меня 2 потока, то каждый в течение 1с получит управление 125 раз на 1/250 сек?
Верно ли то, что сколько бы потоков в системе у меня ни было (1 или 1000000), операция переключения потоков (в коде шедулера) будет жрать одно и то же количество процессора? Ведь она тупо выполняется с частотой 250 Гц. С повышением количества потоков каждый поток просто будет иметь меньше времени, да?
А вот в каком направлении думать, когда мне интересно, какая разница между такими схемами:
Есть 100 очередей заданий и 2 ядра. Я могу запустить 2 потока, в которых по очереди брать задание из очереди или запустить 100 потоков, в каждом из которых сразу начать обрабатывать одно задание?