Správa paměti. Správa paměti. (c)marek Běhálek, Katedra informatiky FEI VŠB-TU Ostrava 1. Motivace. Úrovně správy paměti. Obsah přednášky.

Podobné dokumenty
Správa paměti. doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 /

Správa paměti. Ing. Marek Běhálek katedra informatiky FEI VŠB-TUO A-1018 /

Správa paměti. Ing. Marek Běhálek katedra informatiky FEI VŠB-TUO A-1018 / marek.behalek@vsb.

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

TÉMATICKÝ OKRUH Softwarové inženýrství

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

IUJCE 07/08 Přednáška č. 6

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

NMIN102 Programování /2 Z, Zk

Přednáška. Správa paměti I. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Operační systémy. Přednáška 7: Správa paměti I

Operační systémy. Správa paměti (SP) Požadavky na SP. Spojování a zavedení programu. Spojování programu (linking) Zavádění programu (loading)

Struktura programu v době běhu

Spojová implementace lineárních datových struktur

Programování v C++ 2, 4. cvičení

Uklízení odpadků a analýza úniku

Úvod do programovacích jazyků (Java)

Struktura a architektura počítačů (BI-SAP) 11

Paměťový podsystém počítače

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

09. Memory management. ZOS 2006, L.Pešička

Základní datové struktury

Více o konstruktorech a destruktorech

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Architektura COM. Historie Component Object Model (COM) Komunikace s komponentami Rozhraní komponent COM komponenty v.net.

Přednáška. Správa paměti II. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012

Operační systémy. Jednoduché stránkování. Virtuální paměť. Příklad: jednoduché stránkování. Virtuální paměť se stránkování. Memory Management Unit

Principy objektově orientovaného programování

Přidělování paměti II Mgr. Josef Horálek

Lineární datové struktury

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

Abstraktní datové typy: zásobník

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Reprezentace dat v informačních systémech. Jaroslav Šmarda

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Správa paměti na platformě Java. Ladislav Thon

Ukazka knihy z internetoveho knihkupectvi

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Úvod do programovacích jazyků (Java)

PB161 Programování v jazyce C++ Přednáška 4

Úvod Seznámení s předmětem Co je.net Vlastnosti.NET Konec. Programování v C# Úvodní slovo 1 / 25

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Datové struktury. alg12 1

Práce s pamětí a předávání parametrů. Úvod do programování 1

Datové typy a struktury

Matematika v programovacích

4. Rekurze. BI-EP1 Efektivní programování Martin Kačer

Čo ak program potrebuje pamäť, ktorej veľkosť závisí od konkrétneho vstupu?

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

Programování v C++ 3, 3. cvičení

11. Přehled prog. jazyků

Programování v C++, 2. cvičení

B4B35OSY: Operační systémy

Pointery II. Jan Hnilica Počítačové modelování 17

Př. další použití pointerů

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

PB161 Programování v jazyce C++ Přednáška 9

8 Třídy, objekty, metody, předávání argumentů metod

DobSort. Úvod do programování. DobSort Implementace 1/3. DobSort Implementace 2/3. DobSort - Příklad. DobSort Implementace 3/3

ADT/ADS = abstraktní datové typy / struktury

Datové struktury 2: Rozptylovací tabulky

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

PB071 Programování v jazyce C Jaro 2015

Přidělování paměti I Mgr. Josef Horálek

Pokročilé architektury počítačů

PB161 Programování v jazyce C++ Přednáška 5

Systém adresace paměti

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Algoritmizace prostorových úloh

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Dynamické datové struktury IV.

Pohled do nitra mikroprocesoru Josef Horálek

Mělká a hluboká kopie

Odvozené a strukturované typy dat

Rekurzivní algoritmy

Algoritmizace prostorových úloh

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

Přednáška. Systémy souborů. FAT, NTFS, UFS, ZFS. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

bfs, dfs, fronta, zásobník, prioritní fronta, halda

Náplň. v Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění

Principy počítačů a operačních systémů

1 Nejkratší cesta grafem

Implementace numerických metod v jazyce C a Python

Základy programování 2 KMI/ZP2

Rekurze. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Softwarové komponenty a Internet

PB071 Programování v jazyce C Jaro 2017

Kolekce, cyklus foreach

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Při překrývání se využívá toho, že ne všechny moduly programu jsou vyžadovány současně. Jakmile skončí využívání jednoho

Programování v C++ 1, 1. cvičení

Funkce, intuitivní chápání složitosti

Transkript:

Motivace Správa paměti Ing. Marek Běhálek katedra informatiky FEI VŠB-TUO A-1018 / 597 324 251 http://www.cs.vsb.cz/behalek marek.behalek@vsb.cz Statické přidělení paměti Známe předem velikost i počet prvků datové struktury int pole[10]; // 10 * sizeof(int) Proměnné deklarované na globální úrovni Statické proměnné Dynamické přidělení paměti Neznámý počet prvků int* pole = new int[pocet]; Rekurze int f(int n) { return n == 0? 1 : n * f(n-1); } Správa paměti 3 Obsah přednášky Motivace Úrovně správy paměti. Manuální a automatická správa paměti. Metody přidělování paměti. Metody regenerace paměti. Správa paměti v konkrétních programovacích jazycích. Úrovně správy paměti Technické vybavení registry, cache Operační systém virtuální paměť segmentace, stránkování Aplikace Přidělování paměti Regenerace paměti Manuální delete, dispose, free(), Automatická garbage collection Správa paměti 2 Správa paměti 4 (c)marek Běhálek, Katedra informatiky FEI VŠB-TU Ostrava 1

Omezení na správu paměti Časová režie Kolik času navíc zabere správa paměti? Doba pozdržení interaktivity Na jak dlouho se aplikace zasekne během správy paměti? Paměťová režie Kolik prostoru spotřebuje správa paměti? Interní fragmentace zaokrouhlování velikosti bloků Externí fragmentace nevhodné využití paměti Historie 1957 FORTRAN, statické přidělování 1958 LISP, dynamické přidělování s regenerací 1962 virtuální paměť 1965 vyrovnávací paměti (cache) 1969 Intel čip 1 kb RAM 1974 Intel 8080 přístup k 64 kb paměti 1975 Dijkstra - inkrementální regenerace paměti Správa paměti 5 Správa paměti 7 Problémy správy paměti Předčasné uvolnění paměti Přístup k paměti, která již byla uvolněna Únik paměti (memory leak) Neuvolňování nepotřebné paměti Externí fragmentace Rozdělení volné paměti na mnoho malých bloků Špatná lokalita odkazů Vliv velikosti cache Chybné předpoklady při návrhu aplikace Manuální správa paměti Program sám vrací část paměti, kterou nepotřebuje Přidělování z hromady Volání funkcí pro přidělování a uvolňování paměti Zodpovědnost je na programátorovi Střídání bloků přidělené a volné paměti Přidělování na zásobníku Pro lokální proměnné a parametry funkcí Uvolňuje se vždy naposledy přidělená paměť Správa paměti 6 Správa paměti 8 (c)marek Běhálek, Katedra informatiky FEI VŠB-TU Ostrava 2

Automatická správa paměti Vyhledání obsazených bloků paměti Živé bloky program s nimi dále pracuje (jak to zjistíme??) Dostupné bloky program s nimi je schopen dále pracovat Globální a lokální proměnné, registry kořeny dosažitelnosti Regenerace nevyužité paměti Paměť je k dispozici pro opakované přidělení Metody přidělování paměti Máme k dispozici jistým způsobem organizovanou volnou paměť. Dle požadavků aplikace postupně odebíráme a přidělujeme jednotlivým datovým objektům. Úkolem přidělování paměti je pro zadanou velikost požadované paměti vyhledat vhodný úsek volné paměti a jeho adresu vrátit. Správa paměti 9 Správa paměti 11 Automatická správa paměti Výhody Programátor se může věnovat jiným problémům Přehlednější rozhraní programových modulů (kdo uvolní přidělenou paměť?) Menší množství chyb spojených s přístupem do paměti Mnohem efektivnější správa paměti Nevýhody Uvolňuje se pouze nedostupná paměť Není k dispozici ve starších jazycích Přidělování na zásobník Přidělení paměti Posune ukazatel o velikost přiděleného prostoru Uvolnění paměti Prázdná operace Volná paměť Vyplnění prostoru spec. vzorem pro ladění Správa paměti 10 Správa paměti 12 (c)marek Běhálek, Katedra informatiky FEI VŠB-TU Ostrava 3

Přidělování na zásobník Přidělování ze seznamu class SimpleAllocator { public SimpleAllocator(char* memaddr, unsigned memsize) { m_addr = memaddr; m_size = memsize; } public char* alloc(unsigned size) { if( size > m_size ) throw new NoMemoryException(); char* addr = m_addr; m_addr += size; return addr; } public void free(char* addr, unsigned size) {} // Aktuální začátek volné paměti protected char* m_addr; // Aktuální velikost volné paměti protected unsigned m_size; } Volné bloky paměti seřazené do seznamu Přidělení paměti Vyhledání bloku vhodné velikosti Zařazení nevyužité části volného bloku zpět do seznamu Uvolnění paměti Zařazení bloku do seznamu Spojení s navazujícími bloky snížení fragmentace Přesun do jednoho celku (defragmentace paměti) co s ukazateli? Správa paměti 13 Správa paměti 15 Přidělování na zásobník Přidělování ze seznamu velmi rychlá metoda často se požívá v rámci bloku, který získáme jinou metodou sublokátor přidělování paměti pro aktivační záznamy (C/C++/Pascal) jednou z modifikací je zavedení operací mark a release uvolnění přidělení Správa paměti 14 Správa paměti 16 (c)marek Běhálek, Katedra informatiky FEI VŠB-TU Ostrava 4

Metody pro přidělování First fit Prochází seznam a vybere první, jehož velikost je větší nebo rovna požadované velikosti. Blok je rozdělen na přidělenou paměť a zbylé volné místo Při uvolňování je potřeba volný blok opět zařadit do seznamu Nevýhoda na začátku seznamu vznikne mnoho malých bloků, jejich sekvenční procházení může podstatně zpomalit operaci přidělování paměti. Metody pro přidělování Next fit vyhledávání začíná na pozici, kde předchozí vyhledávání skončilo zabrání hromadění menších bloků na začátku seznamu Nevýhoda přidělené bloky od sebe mohou být značně vzdálené Celkově vede k menší efektivitě Správa paměti 17 Správa paměti 19 Metody pro přidělování Různě strukturovaný seznam Zařazení uvolněného bloku na začátek/konec seznamu složitější slévání sousedních volných bloků. Použití uspořádaného seznamu podle adres bloku. Použití složitějších struktur například stromy. Lze použít u všech prezentovaných metod Metody pro přidělování Best fit snažíme se najít volný blok, jehož velikost je větší nebo rovna požadované Nevýhody pro velké množství objektů bude prohledávání a tedy i přidělování paměti pomalé velké množství nepoužitelných malých zbytků paměti Optimalizace více seznamů pro bloky přibližně stejné délky indexace + seřazení bloků podlé délky (nebo složitější datové struktury) Správa paměti 18 Správa paměti 20 (c)marek Běhálek, Katedra informatiky FEI VŠB-TU Ostrava 5

Metody pro přidělování Worst fit Je použit největší volný blok paměti. Nově vzniklý blok (zbytek po přidělení paměti) bude dostatečně velký. Binární přidělování Nejznámější buddy systém. Velikost bloků je vždy mocnina dvou. Při dělení se blok rozdělí na dvě stejné části. Všechny bloky jsou zarovnané na mocninu dvou. Přístup k blokům je tedy zajištěn na jednoduchém výpočtu pomocí bitových operací. Správa paměti 21 Správa paměti 23 Přidělování s omezenou velikostí bloku (buddy system) Example of Buddy System Hierarchické dělení paměti na části podle pevných pravidel Spojovat lze pouze sousední bloky v hierarchii (buddies) Výsledek pak bude patřit do bezprostředně vyšší úrovně hierarchie. Souseda bloku najdeme jednoduchým výpočtem nižší režie (1 bit volný/obsazený) Pro každou možnou velikost bloků se udržuje samostatný seznam. Správa paměti 22 Správa paměti 24 (c)marek Běhálek, Katedra informatiky FEI VŠB-TU Ostrava 6

Fibonacciho přidělování f(1)=1, f(2)=2, f(n)=f(n-1)+f(n-2) 1, 2, 3, 5, 8, Tato varianta se snaží snížit vnitřní fragmentaci bloků využít kompaktnější sady možných velikostí bloků. Každý blok lze beze zbytku rozdělit na dva bloky, jejichž velikosti jsou opět prvky řady. Problémem je přidělování několika bloků stejné velikosti. Správa paměti 25 Metoda dvoufázového značkování (mark and sweep) Předpoklady: Známe kořeny dosažitelnosti Globální a lokální proměnné Registry Známe strukturu dat (kde jsou další ukazatele) Postup: Označkujeme všechny bloky dosažitelné z kořenů Neoznačené bloky uvolníme Správa paměti 27 Metody regenerace paměti Metoda dvoufázového značkování (mark and sweep) Nepoužité bloky paměti chceme znovu využít Jak vyhledat nepoužité bloky? Čítače odkazů Sledování odkazů značkování Inkrementální metody Úklid paměti se střídá s během aplikace Lze využít pro systémy pracující v reálném čase Heap Root Set Správa paměti 26 Správa paměti 28 (c)marek Běhálek, Katedra informatiky FEI VŠB-TU Ostrava 7

Metoda dvoufázového značkování (mark and sweep) Regenerace s počítáním odkazů (reference counting) Čas potřebný na prozkoumání dostupnosti objektů je závislý na velikosti hromady, ne na množství smetí (garbage). Jeden průchod ušetříme, pokud použijeme regeneraci s kopírováním. Správa paměti 29 Správa paměti 31 Regenerace s kopírováním Všechny obsazené bloky zkopírujeme do jiné souvislé oblasti paměti (vyhledáme je stejně jako u metody Mark and Sweep). Je třeba přesměrovat odkazy na kopírované objekty Při kopírování se snažíme vytvořit jeden kompaktní blok (má-li A odkaz na B, dáme je za sebe ) Regenerace s počítáním odkazů (reference counting) Postup Každý objekt obsahuje počitadlo odkazů L := R zvýší počet odkazů na R a sníží počet odkazů na předchozí hodnotu L Při snížení počitadla na nulu se paměť uvolní Problémy Nefunguje pro cyklické odkazy Nebezpečí tranzitivního uvolňování odezva Velká režie při častých změnách lok. proměnné Správa paměti 30 Správa paměti 32 (c)marek Běhálek, Katedra informatiky FEI VŠB-TU Ostrava 8

Generační regenerace paměti (Generational) Většina objektů má krátkou životnost. Objekty rozděleny do několika oblastí dle jejich stáři. Pokud objekt přežije regeneraci paměti je zvětšena hodnota určující jeho stáří. Objekty v oblastech pro staré objekty není nutné tak často testovat. Správa paměti v jazyce C++ Součást syntaxe jazyka T* ptr = new T() delete ptr; Přidělování paměti pro pole long* buffer = new long[40]; delete[] buffer; Nekombinovat malloc/new a free/delete! Správa paměti 33 Správa paměti 35 Správa paměti v jazyce C Standardní knihovní funkce void* malloc(size_t size) void* calloc(size_t num, size_t size) void* realloc(void* ptr, size_t size) void free(void* ptr) Implementace obvykle seznamem long* buffer; buffer = (long*)calloc(40, sizeof(long)); buffer = (long*)realloc(buffer, 100 * sizeof(long)); Správa paměti v jazyce C++ Vlastní přidělování/uvolňování pro třídu class C { public: C(char* s); void* operator new(size_t size, int arg); void operator delete(void* ptr, size_t size); } C* cp = new(10) C( abc ); Správa paměti 34 Správa paměti 36 (c)marek Běhálek, Katedra informatiky FEI VŠB-TU Ostrava 9

Správa paměti v jazyce Java Automatická regenerace paměti (záleží na výrobci, SUN, IBM - mark & sweep, prázdné bloky spojovány kopírováním, generational GC Neexistuje destruktor (kdy by se měl volat?) Inkrementální regenerace Samostatné vlákno s nízkou prioritou Před uvolněním paměti volá metodu: protected void finalize() throws Throwable Můžeme přímo volat garbage collector: System.gc() Pro vyhledání referencí se využívají metadata Správa paměti v jazyce C# (2) Inkrementální regenerace Dva vlákna běžící na pozadí 1. Používá metodu dvoufázového značkování a identifikuje garbage. 2. Volá finalize a uvolňuje pamět. Můžeme explicitně uvolnit paměť: System.GC.Collect uvolní všechny Pro jednotlivé instance nutno použít rozhraní System.IDispose Správa paměti 37 Správa paměti 39 Správa paměti v jazyce C# (1) Automatická regenerace paměti Používá algoritmus next fit, regenerace s kopírováním, využívá generací. Udržuje pointer na další volné místo: NextObjPointer. Při regeneraci paměti jsou objekty na hromadě setříděny dle jejich vzdálenosti od kořenů. Udržuje tři generace. Vytvořené objekty Objekty které přežily jeden průchod GC. Objekty které přežily více průchodů GC. Správa paměti 38 (c)marek Běhálek, Katedra informatiky FEI VŠB-TU Ostrava 10