Есть ли хорошие эмпирические данные о стоимости переключения контекста между потоками одного и того же процесса в Linux (в основном интересны x86 и x86_64)? Я говорю о количестве циклов или наносекунд между последней инструкцией, которую один поток выполняет в пользовательском пространстве, прежде чем получить добровольно или непроизвольно спать, а первая команда - другой поток того же процесса, выполняющийся после пробуждения на одном процессоре/ядре.
Я написал программу быстрого тестирования, которая постоянно выполняет rdtsc
в 2 потоках, назначенных одному и тому же процессору/ядру, сохраняет результат в переменной volatile и сравнивается со своей дочерней нитью, соответствующей переменной volatile. В первый раз, когда он обнаруживает изменение значения сестринского потока, он печатает разницу, а затем возвращается к циклу. Я получаю минимальный/средний подсчет около 8900/9600 циклов таким образом на процессоре Atom D510. Эта процедура кажется разумной, и цифры кажутся правдоподобными?
Моя цель состоит в том, чтобы оценить, может ли в современных системах модель сервера нитей за соединение быть конкурентоспособной или даже превосходить мультиплексирование выборочного типа. Это кажется правдоподобным в теории, поскольку переход от выполнения IO на fd X
к fd Y
предполагает просто переходить в спящий режим в одном потоке и просыпаться в другом, а не в нескольких системных вызовах, но он зависит от накладных расходов при переключении контекста.