Správa paměti - Memory management

Správa paměti je forma správy prostředků aplikovaná na paměť počítače . Základním požadavkem správy paměti je poskytnout způsoby, jak dynamicky alokovat části paměti programům na jejich žádost, a uvolnit ji pro opětovné použití, když již není potřeba. To je zásadní pro jakýkoli pokročilý počítačový systém, kde může kdykoli probíhat více než jeden proces .

Bylo navrženo několik metod, které zvyšují účinnost správy paměti. Virtuální paměťové systémy oddělují paměťové adresy používané procesem od skutečných fyzických adres, což umožňuje oddělení procesů a zvětšení velikosti prostoru virtuálních adres nad dostupné množství paměti RAM pomocí stránkování nebo přepnutí na sekundární úložiště . Kvalita správce virtuální paměti může mít značný vliv na celkový výkon systému .

V některých operačních systémech , např. OS/360 a následnících , je paměť spravována operačním systémem. V jiných operačních systémech, např. V operačních systémech podobných Unixu, je paměť spravována na úrovni aplikace.

Správa paměti v adresním prostoru je obecně kategorizována buď jako ruční správa paměti, nebo automatická správa paměti .

Manuální správa paměti

Příklad externí fragmentace

Úkol splnit žádost o přidělení spočívá v nalezení bloku nevyužité paměti dostatečné velikosti. Požadavky na paměť jsou uspokojeny přidělením částí z velkého fondu paměti nazývaného halda nebo volné úložiště . V daném okamžiku jsou některé části haldy používány, zatímco některé jsou „zdarma“ (nepoužívané), a jsou tedy k dispozici pro budoucí přidělení.

Implementaci komplikuje několik problémů, například externí fragmentace , ke které dochází, když existuje mnoho malých mezer mezi bloky přidělené paměti, což zneplatňuje jejich použití pro žádost o přidělení. Metadata alokátoru mohou také zvětšit velikost (jednotlivě) malých alokací. To je často řízeno blokováním . Systém správy paměti musí sledovat zbývající alokace, aby se zajistilo, že se nepřekrývají a že žádná paměť nebude nikdy „ztracena“ (tj. Že nedojde k „ nevracení paměti “).

Účinnost

Implementovaný specifický algoritmus přidělení dynamické paměti může výrazně ovlivnit výkon. Studie provedená v roce 1994 společností Digital Equipment Corporation ilustruje režijní náklady na různé alokátory. Nejnižší průměrná délka instrukční cesty potřebná k přidělení jednoho paměťového slotu byla 52 (měřeno profilerem úrovně instrukcí na různých softwarech).

Implementace

Protože přesné umístění alokace není předem známé, přistupuje se k paměti nepřímo, obvykle prostřednictvím odkazu na ukazatel . Specifický algoritmus používaný k uspořádání oblasti paměti a přidělení a zrušení přidělení bloků je propojen s jádrem a může použít některou z následujících metod:

Přidělení bloků pevné velikosti

Alokace bloků pevné velikosti, nazývaná také alokace oblasti paměti, používá bezplatný seznam bloků paměti pevné velikosti (často všechny stejné velikosti). To funguje dobře u jednoduchých vestavěných systémů, kde není třeba přidělovat žádné velké objekty, ale trpí fragmentací , zejména s adresami s dlouhou pamětí. Vzhledem k výrazně snížené režii však tato metoda může podstatně zlepšit výkon u objektů, které vyžadují časté přidělování / oddělování a často se používá ve videohrách .

Buddy bloky

V tomto systému je paměť alokována do několika oblastí paměti místo pouze do jedné, kde každá oblast představuje bloky paměti o určité síle dvou velikostí nebo bloky nějaké jiné vhodné velikosti. Všechny bloky konkrétní velikosti jsou uloženy v seřazeném propojeném seznamu nebo stromu a všechny nové bloky, které jsou vytvořeny během přidělení, jsou přidány do jejich příslušných oblastí paměti pro pozdější použití. Pokud je požadována menší velikost, než je k dispozici, je vybrána a rozdělena nejmenší dostupná velikost. Je vybrána jedna z výsledných částí a proces se opakuje, dokud není požadavek dokončen. Když je blok přidělen, alokátor začne s nejmenším dostatečně velkým blokem, aby se předešlo zbytečnému lámání bloků. Když je blok uvolněn, je porovnán s jeho kamarádem. Pokud jsou oba volní, zkombinují se a umístí do odpovídajících větších seznamů bloků.

Přidělení desek

Tento mechanismus alokace paměti předběžně přidělí bloky paměti vhodné pro objekty určitého typu nebo velikosti. Tyto kusy se nazývají mezipaměti a přidělovač musí sledovat pouze seznam volných slotů mezipaměti. Při konstrukci objektu se použije některý z volných slotů mezipaměti a zničením objektu se slot přidá zpět do seznamu slotů volné mezipaměti. Tato technika zmírňuje fragmentaci paměti a je účinná, protože není třeba hledat vhodnou část paměti, protože postačí jakýkoli otevřený slot.

Přidělení zásobníku

Mnoho unixových systémů a Microsoft Windows implementují funkci požadovanou allocapro dynamické přidělování paměti zásobníku podobným způsobem jako na základě haldy malloc. Kompilátor jej obvykle převede na vložené pokyny manipulující s ukazatelem zásobníku. Ačkoli není potřeba ručně uvolňovat takto přidělenou paměť, protože se automaticky uvolní, když se allocavrátí funkce, která volala , existuje riziko přetečení. A protože alloca je rozšíření ad hoc, které je vidět v mnoha systémech, ale nikdy v POSIXu nebo standardu C, jeho chování v případě přetečení zásobníku není definováno.

V _mallocasystému Microsoft Windows existuje bezpečnější verze alokace s názvem , která hlásí chyby. Vyžaduje použití _freea. gnulib poskytuje ekvivalentní rozhraní, i když místo vyvolání výjimky SEH při přetečení deleguje malloc, když je detekována nadměrná velikost. Podobnou funkci lze emulovat pomocí ručního účetnictví a kontroly velikosti, například při použití alloca_accountv glibc.

Automatická správa paměti

V mnoha implementacích programovacího jazyka je runtime prostředí pro program automaticky přidělí paměť v zásobníku volání pro non-statické lokální proměnné jednoho podprogramu , tzv automatických proměnných , pokud je podprogram, a automaticky pořídí, že paměť, pokud je podprogram ukončen. Speciální deklarace mohou umožnit místním proměnným zachovat hodnoty mezi vyvoláním procedury nebo mohou umožnit přístup k lokálním proměnným jinými podprogramy. Automatické přidělení místních proměnných umožňuje rekurzi do hloubky omezené dostupnou pamětí.

Sběr odpadků

Garbage collection je strategie pro automatické zjišťování paměti přidělené objektům, které již nejsou v programu použitelné, a vrácení této přidělené paměti do fondu volných paměťových míst. Tato metoda je na rozdíl od "ruční" správy paměti, kde programátor v programu explicitně kóduje požadavky na paměť a uvolnění paměti. Zatímco automatické uvolňování paměti má výhody spočívající ve snížení zátěže programátoru a prevenci určitých druhů chyb při přidělování paměti, sběr odpadků vyžaduje vlastní paměťové prostředky a může konkurovat aplikačnímu programu o čas procesoru.

Systémy s virtuální pamětí

Virtuální paměť je metoda oddělení organizace paměti od fyzického hardwaru. Aplikace pracují s pamětí prostřednictvím virtuálních adres . Každý pokus aplikace o přístup k určité adrese virtuální paměti má za následek, že adresa virtuální paměti bude přeložena na skutečnou fyzickou adresu . Tímto způsobem přidání virtuální paměti umožňuje granulární kontrolu nad paměťovými systémy a způsoby přístupu.

V systémech virtuální paměti operační systém omezuje přístup procesu k paměti. Tuto funkci, nazývanou ochrana paměti , lze použít k zakázání procesu číst nebo zapisovat do paměti, která mu není přidělena, a zabránit tak škodlivému nebo nefunkčnímu kódu v jednom programu, aby rušil provoz jiného programu.

I když je paměť vyhrazená pro konkrétní procesy obvykle izolovaná, procesy někdy musí být schopné sdílet informace. Sdílená paměť je jednou z nejrychlejších technik meziprocesové komunikace .

Paměť je obvykle klasifikována podle přístupové rychlosti do primárního úložiště a sekundárního úložiště . Systémy správy paměti mimo jiné také zvládají přesun informací mezi těmito dvěma úrovněmi paměti.

Správa paměti v OS/360 a následnících

IBM System/360 nepodporuje virtuální paměť. Izolace paměti úloh se volitelně provádí pomocí ochranných klíčů , přiřazení úložiště pro každou úlohu jiným klíčem, 0 pro správce nebo 1–15. Správa paměti v OS/360 je funkce supervizora . Úložiště je požadováno pomocí GETMAINmakra a uvolněno pomocí FREEMAINmakra, což má za následek volání správce ( SVC ) k provedení operace.

V OS/360 se detaily liší podle toho, jak je systém generován , např. Pro PCP , MFT , MVT .

V OS / 360 MVT, suballocation v růstu pracovních míst v regionu , nebo sdílené systémové fronty prostoru (SQA) je založen na subpools plochy násobek 2 KB velikost-velikost prostoru chráněné ochranného klíče. Podpole jsou očíslovány 0–255. V rámci oblasti jsou dílčím fondům přiřazena ochrana úložiště úlohy nebo klíč supervizora, klíč 0. Dílčí oblasti 0–127 obdrží klíč úlohy. Zpočátku se vytvoří pouze nula subpoolu a všechny požadavky na úložiště uživatelů jsou splněny z dílčí oblasti 0, pokud není v požadavku na paměť uveden jiný. Podpole 250–255 jsou vytvářeny požadavky paměti na nadřízeného jménem úlohy. Většině z nich je přiřazen klíč 0, i když někteří dostanou klíč úlohy. Čísla subpoolu jsou v MFT také relevantní, i když detaily jsou mnohem jednodušší. MFT používá místo dynamických oblastí pevné oddíly předefinovatelné operátorem a PCP má pouze jeden oddíl.

Každý dílčí fond je mapován seznamem řídicích bloků identifikujících přidělené a volné paměťové bloky v dílčím fondu. Paměť je přidělována vyhledáním volné oblasti dostatečné velikosti nebo přidělením dalších bloků v dílčí oblasti až do velikosti oblasti úlohy. Je možné uvolnit celou nebo část vyhrazené oblasti paměti.

Podrobnosti pro OS/VS1 jsou podobné jako pro MFT a pro MVT; podrobnosti pro OS/VS2 jsou podobné jako pro MVT, kromě toho, že velikost stránky je 4 KiB. Pro OS/VS1 i OS/VS2 není sdílená oblast systémové fronty (SQA) stránkovatelná.

V MVS adresní prostor obsahuje další stránkovatelnou sdílenou oblast, Common Storage Area (CSA) a další soukromou oblast System Work area (SWA). Také klíče úložiště 0-7 jsou vyhrazeny pro použití privilegovaným kódem.

Viz také

Poznámky

Reference

OS360Sup
OS Release 21 IBM System/360 Operating System Supervisor Services and Macro Instructions (PDF) . Referenční knihovna systémů (8. vydání). IBM. Září 1974. GC28-6646-7.
OSVS1Dig
Referenční přehled programátora OS/VS1, vydání 6 (PDF) . Systems (Sixth ed.). IBM. Listopad 1975. GC24-5091-5.

Další čtení

externí odkazy