Sdílet prostřednictvím


Ochrana paměti

Paměť, která patří do procesu, je implicitně chráněna svým privátním virtuálním adresním prostorem. Kromě toho systém Windows poskytuje ochranu paměti pomocí hardwaru virtuální paměti. Implementace této ochrany se liší od procesoru, například znakové stránky v adresním prostoru procesu mohou být označeny jen pro čtení a chráněny před úpravami vlákny v uživatelském režimu.

Úplný seznam atributů najdete v tématu Konstanty ochrany paměti.

Ochrana proti kopírování při zápisu

Ochrana proti kopírování při zápisu je optimalizace, která umožňuje více procesům mapovat virtuální adresní prostory tak, aby sdílely fyzickou stránku, dokud některý z procesů stránku nemodifikuje. Jedná se o součást techniky označované jako opožděné vyhodnocení, což umožňuje systému šetřit fyzickou paměť a čas tím, že neprovádí operaci, dokud není nezbytně nutná.

Předpokládejme například, že dva procesy načítají stránky ze stejné knihovny DLL do svých virtuálních paměťových prostorů. Tyto stránky virtuální paměti se mapují na stejné stránky fyzické paměti pro oba procesy. Pokud se na tyto stránky nezapisuje žádný proces, může je mapovat a sdílet, stejné fyzické stránky, jak je znázorněno v následujícím diagramu.

polích a šipek procesu 1 a 2 stránek mapovaných na stejnou fyzickou paměť

Pokud proces 1 zapíše na jednu z těchto stránek, obsah fyzické stránky se zkopíruje na jinou fyzickou stránku a mapa virtuální paměti se aktualizuje pro proces 1. Oba procesy teď mají vlastní instanci stránky ve fyzické paměti. Proto není možné, aby jeden proces zapisovat na sdílenou fyzickou stránku a druhý proces viděl změny.

polích a šipek procesů a přemapování fyzické paměti

Načítání aplikací a knihoven DLL

Pokud se načte více instancí stejné aplikace založené na Systému Windows, každá instance se spustí ve vlastním chráněném virtuálním adresního prostoru. Jejich obslužné rutiny instance (hInstance) však obvykle mají stejnou hodnotu. Tato hodnota představuje základní adresu aplikace ve svém virtuálním adresní prostoru. Pokud je možné každou instanci načíst do výchozí základní adresy, může namapovat a sdílet stejné fyzické stránky s ostatními instancemi pomocí ochrany kopírování při zápisu. Systém umožňuje těmto instancím sdílet stejné fyzické stránky, dokud jeden z nich nezmění stránku. Pokud z nějakého důvodu nelze některou z těchto instancí načíst do požadované základní adresy, obdrží vlastní fyzické stránky.

Knihovny DLL se vytvářejí s výchozí základní adresou. Každý proces, který používá knihovnu DLL, se pokusí načíst knihovnu DLL v rámci svého vlastního adresního prostoru na výchozí virtuální adresu knihovny DLL. Pokud může knihovna DLL načíst více aplikací na výchozí virtuální adresu, mohou sdílet stejné fyzické stránky knihovny DLL. Pokud proces z nějakého důvodu nemůže načíst knihovnu DLL na výchozí adresu, načte knihovnu DLL jinam. Ochrana proti kopírování při zápisu vynutí zkopírování některých stránek knihovny DLL do různých fyzických stránek pro tento proces, protože opravy pro přeskakování instrukce jsou zapsány na stránkách knihovny DLL a budou pro tento proces odlišné. Pokud oddíl kódu obsahuje mnoho odkazů na oddíl dat, může to způsobit zkopírování celého oddílu kódu na nové fyzické stránky.