Я ищу IPC с наименьшей задержкой , которая позволяет перевести один процесс в спящий режим и позволить другому процессу его пробудить.
Я ищу метод с наименьшей задержкой. Некоторые возможные методы на данный момент:
Есть ли другие лучшие идеи?
Любое решение, специфичное для Linux, также подойдет.
Использование того же кода, предоставленного @Artyom, но в большем количестве аппаратных средств Мордена.
ЦП : i9-9900k, закрываясь C/S/P-state и политика масштабирования набора как performance
, который поддерживает ядра в рабочем состоянии на максимальной частоте (~5GHz).
ОС : вытеснять-RT исправил Linux с kernel5.0.21, обеспечив лучше производительность в реальном времени.
привязка ЦП : два процесса apartly, работающий в двух изолированных ядрах , которые держатся подальше от несоответствующих процессов и прерывают AMSP.
Результаты:
Семафор (sem_wait/sem_post - ядро - futex):
sleep us mean minimum median %99
1 1.75 ±0.1 1.60 1.74 1.82
10 1.76 ±0.0 1.61 1.75 1.83
100 2.12 ±0.3 1.59 2.24 2.42
1000 2.46 ±0.3 1.75 2.47 2.56
10000 2.45 ±0.1 2.11 2.44 2.54
Сигнал (kill/sigwait)
sleep us mean minimum median %99
1 2.15 ±0.2 2.00 2.13 2.22
10 2.12 ±0.2 1.93 2.11 2.19
100 2.56 ±0.3 2.00 2.67 2.88
1000 2.90 ±0.3 2.17 2.90 3.01
10000 2.94 ±0.5 2.66 2.89 3.03
Канал (передают по каналу + запись-чтение)
sleep us mean minimum median %99
1 2.05 ±0.2 1.88 2.03 2.15
10 2.06 ±0.3 1.89 2.04 2.17
100 2.54 ±0.4 1.88 2.63 2.87
1000 2.98 ±0.3 2.27 2.98 3.09
10000 2.98 ±0.3 2.69 2.96 3.07
Сокет (socketpair +write/read)
sleep us mean minimum median %99
1 3.11 ±0.4 2.85 3.09 3.22
10 3.14 ±0.1 2.92 3.14 3.25
100 3.66 ±0.5 2.92 3.74 4.01
1000 4.03 ±0.4 3.28 4.03 4.17
10000 3.99 ±0.4 3.64 3.96 4.10
Как ссылочное активное ожидание:
sleep us mean minimum median %99
1 0.07 ±0.1 0.06 0.07 0.07
10 0.07 ±0.1 0.06 0.07 0.07
100 0.07 ±0.0 0.06 0.07 0.08
1000 0.09 ±0.1 0.07 0.08 0.09
10000 0.09 ±0.1 0.07 0.09 0.09