Hmm... det räcker nog inte bara med "jättesnabb FIFO", hela designen måste genomgående vara tweakad för performance...
Föreslår att du
* conf'ar kernel med low latency scheduler (har ingen aning om vad dina realtidskrav är
men med original kernel.org rt kommer man ofta ganska långt)
* disable'ar swap. Man vill absolut inte att kernel ska få för sig att skicka ut nåt på disk
som sedan måste läsas in i minnet igen för att kunna exekveras.
* i samband med swap disable måste man stänga av overcommit av minnet (linux tillåter
normalt allokering in absurdum av minne, det är först när man *skriver* till en page (4096
bytes minnes chunk) som det blir en fysisk allokering) sedan måste koden skrivas snyggt
förstås och alltid kolla efter NULL pekare vid minnes allokering...
* programmera ett gäng trådar app istället för ett gäng processer.
Iofs ifall du har en multicore CPU kan det vara intressant att ha fler än en process och
därmed kunna låsa de olika processerna till var sin core. Dessa kan ju i sin tur vara
multitrådade, men man får bättre parallellism i sin kod. ( inte helt enkelt att göra sådan
design helt optimal, man bör tänka på cache som ofta delas mellan core's tex)
* dina trådar delar du upp i lämpliga prioriteter, tex så här i början av tråden innan huvudloopen:
Kod: Markera allt
#if POSIX_RT
struct sched_param threadsched;
threadsched.sched_priority = 30;
status = sched_setscheduler(0, SCHED_FIFO, &threadsched);
if (status) {
printf("%s: sched_setscheduler %d\n", __FUNCTION__, status);
pthread_exit(&jog_status);
}
// never let us be swapped out
mlockall(MCL_CURRENT | MCL_FUTURE);
#endif
(den sista raden behövs egentligen inte ifall man gjort det rätt från början i och med disable av swap...)
Nu mer till din fråga, hur passa data snabbt mellan trådar? Så här skulle mina val, lite snabbt nerplitat
bli, med fallande behov av snabbhet (men kanske stigande i form av enkelhet, beror ju på din nivå)
* cirkulära buffrar - i princip allokerar du innan loop'arna en bit minne som du själv får hantera
i din applikation. Snabbare än så här blir det inte i mjukvara.
(Unix IPC/FIFO/PIPES och sockets lämnar jag därhän, de är mer lämpade för kommunikation mellan processer istället för trådar...)
Det blev alltså en ganska kort lista... enbart cirkulär buffert. Gammalt, enkelt, oldschool men genialt
Du hittar mycket intressant att läsa vidare på om linux advanced programming på just linux advanced programming site'n

Finns att köpa som bok eller ladda ner som pdf'er.
http://www.advancedlinuxprogramming.com
Gör man sådant här får man riktigt bra prestanda, man kan glömma tramsa runt med RTAI.
EDIT: glömde förstås exempel på hur man stänger av overcommit...