GNU/Linux >> Znalost Linux >  >> Linux

Proč mají regiony mapované v paměti pouze pro čtení špinavé stránky?

Špinavá stránka nutně nevyžaduje zpětný zápis. Špinavá stránka je stránka, na kterou bylo zapsáno od doby, kdy ji jádro naposledy označilo jako čistou. Data nemusí být vždy uložena zpět do původního souboru.

Stránky jsou soukromé, nejsou sdílené, takže by nebyly uloženy zpět do původního souboru. Bylo by nemožné mít špinavou stránku podloženou souborem pouze pro čtení. Pokud je třeba stránku odebrat z paměti RAM, bude uložena ve swapu.

Stránky, které jsou pouze pro čtení, soukromé a nečisté, ale v rozsahu souboru mapovaného do paměti, jsou obvykle datové stránky, které obsahují konstanty, které je třeba inicializovat za běhu, ale po inicializaci se nemění. Mohou například obsahovat statická data, která vkládají ukazatele; hodnoty ukazatele závisí na adrese, na které je program nebo knihovna namapována, takže je třeba ji vypočítat po spuštění programu, přičemž stránka je v této fázi čtení a zápisu. Po výpočtu ukazatelů se obsah stránky v této instanci programu nikdy nezmění, takže stránku lze změnit na pouze pro čtení. Viz „Hunting Down Dirty Memory Pages“ od stosb pro příklad s fragmenty kódu.

Výjimečně můžete vidět stránky pouze pro čtení, spustitelné, soukromé, špinavé stránky; k tomu dochází u některých linkerů, které volněji kombinují kód a data, nebo při kompilaci just-in-time.


Kromě případů, které Gilles uvádí:

Když se proces rozdělí, jádro může označit všechny své nečisté stránky jako pouze pro čtení a budou sdíleny mezi rodičem a potomkem. Když jeden z procesů zapíše na stránku, dojde k výjimce a jádro stránku zkopíruje a označí ji jako zapisovatelnou. To ušetří práci s kopírováním stránek, které nakonec nejsou znovu upravovány žádným procesem. (Všimněte si, že v této situaci jsou stránky v hardwaru označeny pouze pro čtení, ale jádro o nich ví, že je lze zapisovat.)


Linux
  1. Proč je Windows10 VM pomalý na OpenStack?

  2. Proč může Rm odebrat soubory pouze pro čtení?

  3. Linux – Proč Linux ukazuje více i méně paměti, než jsem fyzicky nainstaloval?

  1. Linux – Jak zajistit, aby sdílená knihovna měla své paměťové stránky sdílené několika procesy?

  2. Proč mají „mužské“ stránky mnoho řádků navíc?

  3. Proč používat shm_open?

  1. Proč má „/“ položku „...“?

  2. TCP odeslání nulové kopie uživatelského prostoru mapované paměti dma_mmap_coherent().

  3. Proč můj systém ukazuje jen 3,2 GiB RAM, když mám určitě 4,0 GiB