Метод уведомления с наименьшей задержкой между процессами в Linux - PullRequest
13 голосов
/ 02 ноября 2011

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

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

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

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

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

1 Ответ

21 голосов
/ 05 ноября 2011

В общем ... Практически нет различий между методами ОС.

Установка:

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

Результаты:

Семафор (sem_wait / sem_post - ядро ​​- 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

Сокет (socketpair + запись / чтение)

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
...