Пробуждение начинается, когда данные записываются в общую память - PullRequest
0 голосов
/ 22 ноября 2018

У нас есть приложение, которое состоит из процесса CORE, который связан с несколькими процессами (все они являются дочерними элементами процесса CORE).

Для обмена данными они используют разные области общей памяти.Эти области создаются следующим образом:

fd_value = shm_open(shm_key, O_CREAT | O_RDWR | O_EXCL , S_IRWXU);
pshm = mmap(NULL, memory_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_value, 0);

И различные процессы присоединяются к этим областям следующим образом:

shm_fd = shm_open(shm_key, O_RDWR, S_IRWXU);
pshm = mmap(NULL, memory_size, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);

Это создает несколько файлов дескрипторов, расположенных в / dev / shm/

В настоящее время каждый процесс имеет периодический таймер.Процесс спит, пока не истечет таймер, затем он просыпается, проверяет, есть ли новые данные в этой области общей памяти, и если нет, он возвращается в спящий режим в бесконечном цикле.Если появляются новые данные, он выполняет некоторые подпрограммы и снова возвращается в спящий режим.

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

Мы всегда можем уменьшить период (увеличить частоту), но это значительно увеличивает загрузку ЦП.

Как мы могли бы реализовать более оптимальное решение с некоторым механизмом « polling » для опроса данных, записанных в области общей памяти, чтобы процесс получал сигнал каждый раз, когда записываются новые данные, вместо того, чтобы периодически просыпаться?

Как нам нужно настроить области совместно используемой памяти для достижения этого?

...