Одним из довольно простых способов было бы соединение двух потоков через канал. Один поток будет делать (псевдокод):
for(n = 1000; n--;) {
now = clock_gettime(CLOCK_MONOTONIC_RAW);
write(pipe, now);
sleep(1msec); // to make sure that the other thread blocks again on pipe read
}
Другой поток будет делать:
context_switch_times[1000];
while(n = 1000; n--;) {
time = read(pipe);
now = clock_gettime(CLOCK_MONOTONIC_RAW);
context_switch_times[n] = now - time;
}
То есть он будет измерять продолжительность времени между моментом, когда данные были записаны в канал одним потоком, и временем, когда другой поток проснулся и прочитал эти данные. Гистограмма массива context_switch_times
будет показывать распределение времени переключения контекста.
Время будет включать в себя накладные расходы на чтение и запись канала и получение времени, однако, это дает хорошее представление о большом времени переключения контекста.
В прошлом я проводил аналогичный тест с использованием стандартного ядра Fedora 13 и потоков FIFO в реальном времени. Минимальное время переключения контекста, которое я получил, было около 4-5 раз.