У нас есть приложение, которое состоит из процесса 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 » для опроса данных, записанных в области общей памяти, чтобы процесс получал сигнал каждый раз, когда записываются новые данные, вместо того, чтобы периодически просыпаться?
Как нам нужно настроить области совместно используемой памяти для достижения этого?