Подтвердить что ты не робот

Самый низкий метод уведомления о задержке между процессом под Linux

Я ищу самый низкий латентный IPC, который позволяет перевести один процесс в режим сна и позволить другому процессу разбудить его.

Я ищу метод наименьшей задержки. Некоторые возможные методы:

  • Запись байта в канал и чтение его из него.
  • Запись байта в сокет и чтение его из него.
  • Отправка сигнала (kill) и его ожидание (sigwait)
  • Использование sem_post/sem_wait

Любые другие лучшие идеи?

Любое решение, специфичное для Linux, также отлично подходит.

4b9b3361

Ответ 1

Как правило... Практически нет никакой разницы между методами ОС.

Настройка:

  • Два процесса с близостью к двум различным процессорам.
  • Один процесс спит (наноселек) для N микросекунд измеряет текущее время  и затем уведомляет о других процессах.
  • Другие процессы пробуждают текущее время и сравнивают его с временем клиента.
  • Среднее, стандартное отклонение, медиана и процентиль 95 вычисляются по 1К выборкам после разминки на 100 оповещениях.
  • ОС: Linux 2.6.35 x86_64
  • Процессор: Intel i5 M460

Результаты:

Семафор (sem_wait/sem_post - kernel - futex):

sleep us     mean             median      %95
       1     4.98 ±18.7         3.78     5.04
      10     4.14 ±14.8         3.54     4.00
     100    20.60 ±29.4        22.96    26.96
    1000    49.42 ±37.6        30.62    78.75
   10000    63.20 ±22.0        68.38    84.38

Сигнал (kill/sigwait)

sleep us     mean             median      %95
       1     4.69 ±3.8          4.21     5.39
      10     5.91 ±14.8         4.19     7.45
     100    23.90 ±17.7        23.41    35.90
    1000    47.38 ±28.0        35.27    81.16
   10000    60.80 ±19.9        68.50    82.36

Труба (труба + запись/чтение)

sleep us     mean             median      %95
       1     3.75 ±5.9          3.46     4.45
      10     4.42 ±3.5          3.84     5.18
     100    23.32 ±25.6        24.17    38.05
    1000    51.17 ±35.3        46.34    74.75
   10000    64.69 ±31.0        67.95    86.80

Socket (socketpair + write/read)

sleep us     mean             median      %95
       1     6.07 ±3.2          5.55     6.78
      10     7.00 ±7.1          5.51     8.50
     100    27.57 ±14.1        28.39    50.86
    1000    56.75 ±25.7        50.82    88.74
   10000    73.89 ±16.8        77.54    88.46

В качестве ссылки ожидание:

sleep us     mean             median      %95
       1     0.17 ±0.5          0.13     0.23
      10     0.15 ±0.3          0.13     0.19
     100     0.17 ±0.3          0.16     0.21
    1000     0.22 ±0.1          0.18     0.35
   10000     0.38 ±0.3          0.30     0.78