2016-04-22 3 views
0

У меня есть два разных приложения, которые должны работать вместе. процесс 1 действует как источник времени, а процесс 2 выполняет действия в соответствии с источником времени, предоставленным процессом 1. Мне нужно запустить несколько копий процесса 2. Цель состоит в том, чтобы один процесс источника времени сигнализировал 5-10 другим процессам в то же время поэтому они все выполняют свою работу одновременно.Использование одного процесса для сигнализации нескольких других процессов «одновременно»

В настоящее время, я это реализуется следующим образом:

  1. Время начала исходной программы, создал разделяемый сегмент памяти, создает пустой список PIDs, затем разблокирует сегмент.
  2. Каждый раз, когда запускается одна из клиентских программ, они идут в общую память, добавляют свой собственный pid в список и затем разблокируют.
  3. Источник времени имеет таймер, чем выключается каждые 10 мс. Каждый раз, когда таймер отключается, он циклически просматривает список pid и посылает сигнал всем, кто находится в нем, назад.

Этот подход в основном работает хорошо, но я надеюсь, что его можно улучшить. В настоящее время у меня есть две точки прилипания:

  1. Очень редко сигнал, передаваемый на один из клиентских процессов, будет искажен на ~ 2 миллисекунды или около того. Конечный результат: | 12ms | 8ms | вместо | 10ms | 10ms |.
  2. Вторая проблема заключается в том, что все клиентские программы на самом деле многопоточны и выполняют большую работу (хотя для обработки сигнала отвечает только исходный поток). Если у меня сразу работает несколько клиентских процессов, доставка сигналов становится более споратичной и перекошенной, как если бы их было сложнее поставить, когда система более облагается налогом (даже если клиентский процесс готов и ждет прерывания).

Какие еще подходы следует учитывать при выполнении этого типа вещей? Я рассмотрел следующее (все в сегменте разделяемой памяти):

  • Использование volatile uin8_t флаги (заданы процессом источника времени, очищенным клиентом).
  • Использование семафоров, но если процесс источника времени запущен и клиент еще не запущен, как я могу продолжать увеличивать семафор снова и снова?
  • Переменные условий, хотя, похоже, не существует решения, которое может использоваться в общей памяти между несвязанными процессами.
+2

Что касается вашей последней опции (переменные условия в SHM): http://stackoverflow.com/q/2782883/694576 – alk

+2

Вы можете попробовать поместить все процессы в одну группу процессов и отправить сигнал группе. –

+0

Я думаю, вы сбиваете с толку время, необходимое для того, чтобы процесс был готов к запуску со временем, чтобы фактически выполнить процесс, когда он готов к запуску. Вы можете легко использовать futex, чтобы любое количество процессов было готово к запуску в один и тот же момент. Переменные состояния в общей памяти тоже будут работать. –

ответ

1

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

Настройка приоритета (или хорошего уровня) или процессов и потоков влияет на планировщик ядра. ¨ Вы также можете поиграть с различными планировщиками, которые доступны в вашем ядре, и их параметрами.

+0

Раньше сегодня я начал корректировать хороший уровень процессов и полностью устранил проблему. Я также могу исправить проблему, выборочно назначая процессы на разные ядра (или даже резервируя ядра раньше времени). Я рассмотрю разные варианты планирования, но ваши отзывы соответствуют моему опыту. – user1764386

Смежные вопросы