GNU/Linux >> Znalost Linux >  >> Linux

Sdílená paměť Linuxu:shmget() vs mmap()?

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 pak mmap s MAP_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 s MAP_SHARED jsou dva/tři hovory. Vyžaduje librt na některých operačních systémech.
  • Pokud má váš operační systém /dev/shm/ pak shm_open je ekvivalentní otevření souboru v /dev/shm/ .

Linux
  1. Linux – skutečné využití paměti?

  2. Doporučení pro meziprocesovou komunikaci

  3. Odebrat sdílenou paměť posix, když se nepoužívá?

  1. Využití paměti Linuxu

  2. Jak vymazat mezipaměť v Linuxu

  3. Posix Programmer’s Manual versus Linux Programmer’s Manual?

  1. Linux Out-of-Memory Killer

  2. Správa paměti Linuxu – odkládání, mezipaměti a sdílené virtuální počítače

  3. Vydání Kali Linux 2018.1