GNU/Linux >> Znalost Linux >  >> Linux

Rychlejší způsob, jak přesunout stránku paměti než mremap()?

Proč si myslíte mremap může být někdy efektivní pro výměnu jednotlivých 4k stránek? Přinejmenším zpáteční cesta do kernelspace i jen za účelem načtení jedné hodnoty (jako je pid) a jejího vrácení bude stát víc než přesun 4k dat. A to je předtím, než se dostaneme k nákladům na zneplatnění mezipaměti/TLB na přemapování paměti, kterým nerozumím dost dobře na to, abych je řešil v této odpovědi, ale které by měly mít značné náklady.

mremap je užitečný v podstatě pro jednu věc:implementaci realloc pro velké alokace, které obsluhoval mmap . A celkově myslím alespoň 100k.


Zdá se, že neexistuje rychlejší mechanismus pro změnu pořadí paměťových stránek než memcpy(). mremap() je mnohem pomalejší, a proto je užitečné pouze pro změnu velikosti oblasti paměti dříve přiřazené pomocí mmap().

Ale jak říkáte, tabulky stránek musí být extrémně rychlé! A v uživatelském prostředí je možné volat funkce jádra milionkrát za sekundu! Následující odkazy pomáhají vysvětlit, proč je mremap() tak pomalý:

„Úvod do správy paměti Intel“ je pěkným úvodem do teorie mapování paměťových stránek.

"Klíčové koncepty virtuální paměti Intel" podrobněji ukazuje, jak to celé funguje, v případě, že plánujete napsat svůj vlastní OS :-)

"Sdílení tabulek stránek v linuxovém jádře" ukazuje některá obtížná architektonická rozhodnutí mapující paměťovou stránku Linuxu a jejich vliv na výkon.

Když se podíváme na všechny tři odkazy dohromady, můžeme vidět, že architekti jádra dosud vynaložili malé úsilí na to, aby mapování paměťových stránek bylo efektivním způsobem vystaveno. Dokonce i v jádře musí být manipulace s tabulkou stránek prováděna pomocí až tří zámků, což bude pomalé.

Vzhledem k tomu, že samotná tabulka stránek se skládá ze 4 000 stránek, může být možné změnit jádro tak, aby konkrétní stránky tabulky stránek byly jedinečné pro konkrétní vlákno a lze předpokládat, že mají přístup bez zámku po dobu trvání proces. To by usnadnilo velmi efektivní manipulaci s touto konkrétní stránkou tabulky stránek přes uživatelskou oblast. Ale to jde mimo rozsah původní otázky.


Linux
  1. Existuje způsob, jak hledat příznak v manuálové stránce?

  2. Jak přidělit paměť, která je zarovnána podle velikosti stránky?

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

  1. rychlejší způsob připojení vzdáleného souborového systému než sshfs?

  2. Existuje něco rychlejšího než `najít . | wc -l` pro počítání souborů v adresáři?

  3. Rychlejší způsob, jak odstranit velké množství souborů

  1. N Snazší způsob Chrootu než Bind-mounting?

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

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