GNU/Linux >> Znalost Linux >  >> Linux

Použití souborů pro sdílenou paměť IPC

V podstatě se snažím porozumět tomu, co se stane, když dva procesy mají otevřený stejný soubor současně, a jestli by se to dalo použít k bezpečné a výkonné komunikaci mezi procesy.

Pokud používáte běžné soubory pomocí read a write operace (tj. ne jejich mapování paměti), pak tyto dva procesy nesdílejí žádnou paměť.

  • Paměť uživatelského prostoru v jazyce Java Buffer objekty přidružené k souboru NENÍ sdíleny v adresových prostorech.
  • Když write provede se syscall, data se zkopírují od stránek v adresovém prostoru jednoho procesu po stránky v prostoru jádra. (Tyto mohly být stránkami v mezipaměti stránek. To je specifické pro OS.)
  • Když read provede se syscall, data se zkopírují od stránek v prostoru jádra po stránky v adresovém prostoru procesů čtení.

Musí se to tak dělat. Pokud by operační systém sdílel stránky přidružené ke čtecímu a zapisovacímu zařízení, které zpracovává vyrovnávací paměti za jejich zády, pak by to byla díra v zabezpečení / úniku informací:

  • Čtenář by mohl vidět data v adresovém prostoru zapisovače, která ještě nebyla zapsána pomocí write(...) a možná nikdy nebude.
  • Zapisovatel by mohl vidět data, která čtenář (hypoteticky) zapsal do své vyrovnávací paměti pro čtení.
  • Problém by nebylo možné vyřešit chytrým využitím ochrany paměti, protože granularita ochrany paměti je stránka oproti granularitě read(...) a write(...) což je jen jeden bajt.

Jistě:můžete bezpečně používat čtení a zápis souborů k přenosu dat mezi dvěma procesy. Ale budete muset definovat protokol, který umožní čtenáři vědět, kolik dat zapisovatel zapsal. A čtenář ví, kdy spisovatel napsal něco, co by mohlo znamenat dotazování; např. abyste zjistili, zda byl soubor změněn.

Pokud se na to podíváte z hlediska pouhého kopírování dat v komunikačním "kanálu"

  • Pomocí souborů mapovaných v paměti zkopírujete (serializujete) data z objektů haldy aplikace do mapované vyrovnávací paměti a podruhé (deserializujete) z mapované vyrovnávací paměti do objektů haldy aplikace.

  • U běžných souborů existují dvě další kopie:1) z vyrovnávací paměti procesů zápisu (nemapované) do stránek prostoru jádra (např. v mezipaměti stránek), 2) ze stránek prostoru jádra do vyrovnávací paměti procesů čtení (nemapované). .

Níže uvedený článek vysvětluje, co se děje s konvenčním čtením/zápisem a mapováním paměti. (Je to v kontextu kopírování souboru a "nulové kopie", ale to můžete ignorovat.)

Reference:

  • Zero Copy I:Perspektiva uživatelského režimu

Linux
  1. Jak obnovit smazané soubory v systému Linux pomocí nástroje pro obnovu dat Scalpel?

  2. Linux – Problémy s oprávněními pro sdílený adresář na serveru?

  3. Pseudo soubory pro dočasná data?

  1. Jak přenášet soubory mezi dvěma počítači pomocí příkazů nc a pv

  2. Použití Bash pro automatizaci

  3. Použití /proc/stat pro počet procesů běžících v systému

  1. Použití GPG k šifrování a dešifrování souborů v systému Linux [Hands-on pro začátečníky]

  2. Grep:Vyčerpaná paměť?

  3. Použití rsync k synchronizaci souborů