Так я же написал, что в общей. Дело не в памяти, а в том, как именно через нее взаимодействовать. (Хотя, если совсем точно, то у FIFO в интерфейсе нет адреса, он скрыт внутри реализации). Межъядерные прерывания - не самый удобный механизм синхронизации, впрочем как и spinlock. При нормальной загрузке процессора это слишком большой оверхед, либо малая вероятность захватить spinlock. Простейшая аналогия - дозвониться в call-центр, где звонки в очередь не ставятся.
Формально двусвязный список тоже можно считать очередью (FIFO), если один в него пишет, а другой читает. Однако операции с указателями списка производят обе стороны, и поэтому любая операция постановки/выборки из очереди требует критической секции (spinlock или mutex), что и становится узким местом. В случае кольцевого буфера не нужен ни spinlock, ни mutex. Вот. В общем-то даже прерывания не нужны, хотя с ними можно снизить частоту опроса до минимума и не будить ядро без надобности. По моему опыту вполне жизнеспособный вариант IPC. Я его не никому не хочу навязывать, просто хочу обратить внимание, что бывает, что городят связку список+спинлок там, где хорошо бы подошла именно асинхронная кольцевая очередь (FIFO).
Да, и еще хочу добавить, что такая модель довольно легко масштабируется на случай отсутствия общей памяти между ядрами. Например, у нас была как-то связка HOST+DSP, которые общались между собой вообще через разогнанный до мегабит UART. И такой способ обмена данными тоже довольно удачно лег на модель кольцевых очередей, никто и не заметил.
Сообщение отредактировал Hoodwin - Dec 25 2013, 17:09
|