Hodně z toho souvisí s historií a budoucím směřováním.
Kdysi existovaly dvě hlavní (a trochu i konkurenční) verze unixu - system V a BSD. SysV měl své vlastní verze IPC, včetně velké 3 – sdílené paměti, semaforů a front zpráv. POSIX přišel, aby se pokusil věci sjednotit.
V současné době tedy máme dvě verze – posix sdílenou paměť, MQ a semafory a verze sysV. Aby to bylo ještě trochu matoucí, verze sysV jsou také část posix.
Takže v podstatě vaše otázka zní, zda chcete používat sdílenou paměť ve stylu Posix nebo sysV? Obecně platí, že většina lidí bere dlouhodobý pohled a volí Posix, protože se zdá, že je to cesta do budoucnosti. Ale realisticky je sysV tak vestavěný do tolika systémů, že musíte mít vážné pochybnosti, že někdy zmizí.
Takže po odstranění dlouhodobých věcí jde o to, co má smysl pro váš projekt a váš vkus. Obecně bývají verze sysV ve skutečnosti poněkud výkonnější, ale mají neohrabané rozhraní, které většinu lidí při prvním kontaktu trochu zaráží. To platí zejména pro semafory sysV a fronty zpráv. Pokud jde o sdílenou paměť, lze tvrdit, že sysV i posix jsou nepříjemné. Verze sysV nesou neohrabaný ftok
a klíčové věci, zatímco posix skončí tím, že vezme několik hovorů a nastaví některé závodní podmínky. Zvenčí mají verze posix výhodu v tom, že využívají souborový systém a lze je udržovat pomocí standardních funkcí příkazového řádku, jako je 'rm', spíše než se spoléhat na samostatné obslužné programy (např. ipcs
), který sysV vyžaduje.
Které byste tedy měli použít? Zpravidla verze posix. Ale měli byste se opravdu seznámit s verzemi sysV. Mají některé funkce, které přesahují možnosti verzí posix, které můžete chtít využít ve specifických situacích.
Obě metody jsou životaschopné. mmap
metoda je trochu restriktivnější než shmget
, ale jednodušší na použití. shmget
je starý model sdílené paměti System V a má nejširší podporu. mmap
/shm_open
je nový způsob POSIX, jak dělat sdílenou paměť a je snadněji použitelný. Pokud váš operační systém umožňuje použití sdílené paměti POSIX, pak bych navrhoval jít s tím.
Několik rad:
- Pokud své děti vytvoříte pomocí
fork
pakmmap
sMAP_ANONYMOUS | MAP_SHARED
je zdaleka nejjednodušší způsob – stačí jeden hovor.MAP_ANONYMOUS
je však rozšíření Linuxu, které není specifikováno POSIX. - Pokud procesy spouštíte nezávisle, ale můžete jim poskytnout název sdílené paměti, pak
shm_open
(+ftruncate
) +mmap
sMAP_SHARED
jsou dva/tři hovory. Vyžadujelibrt
na některých operačních systémech. - Pokud má váš operační systém
/dev/shm/
pakshm_open
je ekvivalentní otevření souboru v/dev/shm/
.