Správa paměti - Memory management
Operační systémy |
---|
Společné rysy |
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
Ú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 alloca
pro 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 alloca
vrá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 _malloca
systé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_account
v 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í GETMAIN
makra a uvolněno pomocí FREEMAIN
makra, 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í
- Donald Knuth . Základní algoritmy , třetí vydání. Addison-Wesley, 1997. ISBN 0-201-89683-4 . Část 2.5: Dynamic Storage Allocation, s. 435–456.
- Jednoduché algoritmy alokace paměti archivované 5. března 2016 na Wayback Machine (původně publikováno na komunitě OSDEV)
- Wilson, PR; Johnstone, MS; Neely, M .; Boles, D. (1995). „Dynamické přidělování úložiště: průzkum a kritická kontrola“. Správa paměti . Přednášky z informatiky. 986 . s. 1–116. CiteSeerX 10.1.1.47.275 . doi : 10,1007/3-540-60368-9_19 . ISBN 978-3-540-60368-9.
- Berger, ED; Zorn, BG; McKinley, KS (červen 2001). „Skládání vysoce výkonných alokátorů paměti“. Sborník z konference ACM SIGPLAN 2001 o návrhu a implementaci programovacího jazyka (PDF) . PLDI '01. s. 114–124. CiteSeerX 10.1.1.1.2112 . doi : 10,1145/378795,378821 . ISBN 1-58113-414-2. S2CID 7501376 .
- Berger, ED; Zorn, BG; McKinley, KS (listopad 2002). „Přehodnocení přidělení vlastní paměti“. Sborník příspěvků ze 17. konference ACM SIGPLAN o objektově orientovaném programování, systémech, jazycích a aplikacích (PDF) . OOPSLA '02. s. 1–12. CiteSeerX 10.1.1.119.5298 . doi : 10,1145/582419,582421 . ISBN 1-58113-471-1. S2CID 481812 .
- Wilson, Paul R .; Johnstone, Mark S .; Neely, Michael; Boles, David (28.-29. září 1995), Dynamic Storage Allocation: A Survey and Critical Review (PDF) , Austin, Texas: Department of Computer Sciences University of Texas , vyvoláno 2017-06-03