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(...)
awrite(...)
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