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

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

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

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

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

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

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

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

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.

Více o konstruktorech a destruktorech

Struktura programu v době běhu

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

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

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

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

Principy objektově orientovaného programování

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

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

Programování v Javě I. Únor 2009

Datové struktury. alg12 1

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

Abstraktní datové typy: zásobník

Programování v Javě I. Leden 2008

Úvod do programovacích jazyků (Java)

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

Teoretické minimum z PJV

Jazyk C# (seminář 6)

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

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ě

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

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

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

Generické programování

ADT/ADS = abstraktní datové typy / struktury

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

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++, 2. cvičení

Úvod do programovacích jazyků (Java)

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

Konstruktory a destruktory

int t1, t2, t3, t4, t5, t6, t7, prumer; t1=sys.readint();... t7=sys.readint(); prume pru r = r = ( 1+t 1+t t3+ t3+ t4 t5+ t5+ +t7 +t7 )/ ;

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Algoritmizace a programování

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

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

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

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Neměnné objekty. Tomáš Pitner, upravil Marek Šabo

typová konverze typová inference

PREPROCESOR POKRAČOVÁNÍ

NMIN102 Programování /2 Z, Zk

1. Téma 12 - Textové soubory a výjimky

Vláknové programování část V

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

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

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.

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

IB111 Úvod do programování skrze Python Přednáška 7

6. lekce Úvod do jazyka C knihovny datové typy, definice proměnných základní struktura programu a jeho editace Miroslav Jílek

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N

Lineární spojový seznam (úvod do dynamických datových struktur)

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

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

Vlákno odlehčený proces kód vlákna, zásobník privátní ostatní sdíleno s dalšími vlákny téhož procesu

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

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

Anotace. Pointery. Martin Pergel,

Lineární datové struktury

Seminář Java II p.1/43

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný

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

DSA, První krok: máme dokázat, že pro left = right vrátí volání f(array, elem, left, right)

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

Řídicí struktury. alg3 1

5 Rekurze a zásobník. Rekurzivní volání metody

ISU Cvičení 7. Marta Čudová

1. Programování proti rozhraní

Ukazatele #2, dynamická alokace paměti

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

Spojové struktury. Spojová struktura (linked structure):

Semin aˇr Java V yjimky Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Unor 2008 Radek Koˇc ı Semin aˇr Java V yjimky 1/ 25

7. Datové typy v Javě

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

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

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

IRAE 07/08 Přednáška č. 1

konstruktory a destruktory (o)

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

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

Typický prvek kolekce pro české řazení

Dynamická vícerozměrná pole. Základy programování 2 Tomáš Kühr

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

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

Úvod do programování - Java. Cvičení č.4

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Stream API. Petr Krajča. Základy programovaní 4 (Java) Katedra informatiky Univerzita Palackého v Olomouci

Transkript:

Správa paměti Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016 Objektové modelování, B36OMO 10/2016, Lekce 2 https://cw.fel.cvut.cz/wiki/courses/xxb36omo/start B36OMO, 2016, Lekce 2, 1/36

Paměťový model Paměť je rozdělena do tří (někdy čtyř) oblastí: Kód (code area, může být ROM) Statická data (global memory) Zásobník (stack) Halda (heap) Tento model je zjednodušený! Budeme uvažovat programy běžící v jednom vlákně. B36OMO, 2016, Lekce 2, 2/36

Alokace paměti Statická alokace - paměť je přidělena prakticky v době kompilace. Nelze použít pro dynamické datové struktury. Alokace na zásobníku - dynamická alokace na zásobníku v rámci současného rámce. Po skončení volání je paměť automaticky de-alokována. Alokace na haldě - dynamická alokace na haldě, alokovanou paměť je třeba spravovat. V jazyce Java to za nás dělá Garbage Collector. B36OMO, 2016, Lekce 2, 3/36

Příklad public class CoffeeMaker { static int coffeecount = 0; Coffee makecoffee() { coffeecount++; Coffee c = new Coffee(); c.milk = true; return c; public static void main(string[] args) { CoffeeMaker coffeemaker; coffeemaker = new CoffeeMaker(); Coffee c = coffeemaker.makecoffee(); statický objekt automatický objekt na zásobníku dynamický objekt na haldě B36OMO, 2016, Lekce 2, 4/36

Správa zásobníku (automatická) Při volání metody je nutné zachytit vstup do kontextu metody. To znamená vytvořit lokální objekty metody, zaznamenat aktuální parametry, připravit místo pro výsledek metody. Poznamenat si, kam se po provedení metody vrátit. Při výstupu z metody je třeba tyto pomocné struktury zrušit a uvolnit, předat návratovou hodnotu a vrátit se do místa, kde byla metoda vyvolána. Vhodnou strukturou pro tyto účely je zásobník (LIFO). Na zásobník se při volání metody ukládají informace ve formě tzv. aktivačního záznamu. B36OMO, 2016, Lekce 2, 5/36

Aktivační záznam (Activation Record) Když je metoda volána, tak veškeré informace nutné pro její běh jsou umístěny na zásobník. Tyto informace se nazývají aktivační záznam (Activation Record - AR). Když volání skončí (return), pak je AR odstraněn ze zásobníku. Zdroj: http://ineed.coffee/wp-content/uploads/2011/04/object-oriented-memory-management-java-c++.pdf B36OMO, 2016, Lekce 2, 6/36

Aktivační záznam obsahuje Návratová hodnota (Co vracím?) RV Adresa návratu (Kam se vracím?) RA Ukazatel na zásobník (Odkud jsem přišel?) SP Hodnoty parametrů metody. Lokální proměnné. B36OMO, 2016, Lekce 2, 7/36

Příklad Zdroj: http://ineed.coffee/wp-content/uploads/2011/04/object-oriented-memory-management-java-c++.pdf B36OMO, 2016, Lekce 2, 8/36

Příklad static stack heap statická data zásobník halda B36OMO, 2016, Lekce 2, 9/36

Příklad static heap acoffeemaker = null statická data zásobník halda B36OMO, 2016, Lekce 2, 10/36

Příklad static acoffeemaker = CoffeeMaker statická data zásobník halda B36OMO, 2016, Lekce 2, 11/36

Příklad static RV =? RA = SP = #820 this = #1900 acoffeemaker = #1900 CoffeeMaker statická data Zásobník (#800) halda (#1900) B36OMO, 2016, Lekce 2, 12/36

Příklad static acoffeemaker = #1900 CoffeeMaker statická data Zásobník (#800) halda (#1900) B36OMO, 2016, Lekce 2, 13/36

Příklad static CoffeeMaker statická data Zásobník (#800) halda (#1900) B36OMO, 2016, Lekce 2, 14/36

Příklad (po úklidu GC) static statická data Zásobník (#800) halda (#1900) B36OMO, 2016, Lekce 2, 15/36

SAR - pro jazyky s blokovou strukturou Návratová hodnota (co vracím?) RV Adresa návratu (kam se vracím?) RA Ukazatel na zásobník (odkud jsem přišel?) SP Hodnoty parametrů metody. Lokální proměnné. Statický link (odkaz na nadřazený blok) SL Pozn: SAR Scope Activation Record B36OMO, 2016, Lekce 2, 16/36

Příklad SAR Zdroj: http://ineed.coffee/wp-content/uploads/2011/04/object-oriented-memory-management-java-c++.pdf B36OMO, 2016, Lekce 2, 17/36

Jiný příklad B36OMO, 2016, Lekce 2, 18/36

Formalismus pro zachycení obsahu paměti Umožňuje přehledně zaznamenat stav programu. Lze ho použít pro krokování programu na papír. Hodnoty: Logické: true, false Čísla: 0, 1, -1, 2, -2, Znaky: a, A, b, B, Řetězce: Super řetězec, Adresy: null, #1, #2, #3, B36OMO, 2016, Lekce 2, 19/36

Formalismus pro zachycení obsahu paměti Proměnné: Jméno = hodnota např. contents = 5, nebo next = #3 Hodnota proměnné musí odpovídat jejímu typu. Objekty: Třída(attr1 = hodn1, attr2 = hodn2, ) např. (contents = 1, next = #2) Jména atributů musí korespondovat s danou třídou, na jejich pořadí nezáleží. Pokud atributy neznáme, můžeme je vypustit: ( ) (pokr.) B36OMO, 2016, Lekce 2, 20/36

Formalismus pro zachycení obsahu paměti (pokr.) Halda: Mapování z adres na objekty. Používáme šipkovou notaci (symbol není podstatný). #1 -> (contents = 2, next = #2), #2 -> (contents = 3, next = #2) Na jedné adrese nemohou být dva objekty. Statické proměnné: Třída1.proměnná1 = hodnota1, Třída2.proměnná2 = hodnota2 Např..globalhead = #2, Car.totalCount = 10211432 Statické proměnné musí korespondovat s definicemi použitých tříd. B36OMO, 2016, Lekce 2, 21/36

Formalismus pro zachycení obsahu paměti Zásobník: Rámec = Stack Frame = Activation Record Zásobník se skládá z rámců, každý rámec odpovídá jedné zavolané metodě. Uvnitř rámce jsou vypsány existující lokální proměnné a jejich hodnoty. Rámce zpravidla píšeme nad sebe a oddělujeme vodorovnou čarou. Nesmíme zapomenout na this! Příklad: a = 3, b = 5, this = #1 x = #1, a = abecede (pokr.) B36OMO, 2016, Lekce 2, 22/36

class { final int v; next; (int v, next) { this.v = v; this.next = next; boolean f(int t) { // stav B return v == t (next!= null && next.f(t)); public static void main(string[] args) { n = new (2, new (3, new (1, null))); new (1, n); // stav A if (n.f(1)) { n.next = null; // stav C Příklad B36OMO, 2016, Lekce 2, 23/36

class { final int v; next; (int v, next) { this.v = v; this.next = next; boolean f(int t) { // stav B return v == t (next!= null && next.f(t)); public static void main(string[] args) { n = new (2, new (3, new (1, null))); new (1, n); // stav A if (n.f(1)) { n.next = null; // stav C Příklad B36OMO, 2016, Lekce 2, 24/36

class { final int v; next; (int v, next) { this.v = v; this.next = next; boolean f(int t) { // stav B return v == t (next!= null && next.f(t)); public static void main(string[] args) { n = new (2, new (3, new (1, null))); new (1, n); // stav A if (n.f(1)) { n.next = null; // stav C Příklad B36OMO, 2016, Lekce 2, 25/36

class { final int v; next; (int v, next) { this.v = v; this.next = next; boolean f(int t) { // stav B return v == t (next!= null && next.f(t)); public static void main(string[] args) { n = new (2, new (3, new (1, null))); new (1, n); // stav A if (n.f(1)) { n.next = null; // stav C Příklad B36OMO, 2016, Lekce 2, 26/36

class Coffee { public boolean milk; public Coffee() { public class CoffeeMaker { static int coffeecount = 0; Coffee makecoffee() { coffeecount++; Coffee c = new Coffee(); c.milk = true; return c; public static void main(string[] args) { Příklad CoffeeMaker coffeemaker; coffeemaker = new CoffeeMaker(); Coffee c = coffeemaker.makecoffee(); B36OMO, 2016, Lekce 2, 27/36

Úklid paměti - Garbage Collection Manuální správa paměti může vést k chybám: úniky paměti (memory leak), nesprávné ukazatele - ukazují na paměť, která již není alokována. GC umožňuje programátorovi se více soustředit na samotný program (ovšem za cenu určité režie). Cíl: uvolnit objekty, které nebudou již více používané. Dosažitelnost: tranzitivní uzávěr ukazatelů začínající v kořenové množině (root set) (všechny lokální a globální proměnné). B36OMO, 2016, Lekce 2, 28/36

Metody GC Algoritmy: Reference Counting. Mark and Sweep, Mark and Compact, Mark and Copy. Přístupy: Hybrid Collecting - kombinace předchozích. Generational Collectors (Java) - zavedení generací podle stáří objektů. B36OMO, 2016, Lekce 2, 29/36

Reference Counting Každý objekt obsahuje čítač. Přiřazení objektu do proměnné snížení stavu čítače starého objektu a zvýšení stavu čítače objektu nově přiřazeného (pokud existují). Když čítač u objektu dosáhne 0, objekt se uvolní (jeho paměť připadne na free list). Nevýhody: velká přidaná zátěž, neporadí si s cyklickými odkazy. B36OMO, 2016, Lekce 2, 30/36

Příklad x, y; x = new (3, null); y = x; x = null; y = x; x = null y = null B36OMO, 2016, Lekce 2, 31/36

Příklad x, y; x = new (3, null); y = x; x = null; y = x; x = { 3, null RC = 1 y = null B36OMO, 2016, Lekce 2, 32/36

Příklad x, y; x = new (3, null); y = x; x = null; y = x; x = { 3, null RC = 2 y = B36OMO, 2016, Lekce 2, 33/36

Příklad x, y; x = new (3, null); y = x; x = null; y = x; x = null { 3, null RC = 1 y = B36OMO, 2016, Lekce 2, 34/36

Příklad x, y; x = new (3, null); y = x; x = null; y = x; x = null { 3, null RC = 0 y = null B36OMO, 2016, Lekce 2, 35/36

Příklad x, y; x = new (3, null); y = x; x = null; y = x; x = null { 3, null RC = 0 y = null B36OMO, 2016, Lekce 2, 36/36

Problém cyklické odkazy RC = 1 RC = 1 B36OMO, 2016, Lekce 2, 37/36

Mark and Sweep Každý objekt obsahuje značku (mark). Jednou za čas dojde ke konstrukci transitivního uzávěru z kořenové množiny a všechny dosažitelné objekty jsou označeny. Neoznačené objekty jsou uvolněny (sweep) (přidání jejich paměti na free-list). Zbylé objekty jsou opět odznačeny. B36OMO, 2016, Lekce 2, 38/36

Příklad F F F x = F y = F F B36OMO, 2016, Lekce 2, 39/36

Příklad F T T x = T y = T F B36OMO, 2016, Lekce 2, 40/36

Příklad F T T x = T y = T F B36OMO, 2016, Lekce 2, 41/36

Příklad T T x = T y = T B36OMO, 2016, Lekce 2, 42/36

Příklad F F x = F y = F B36OMO, 2016, Lekce 2, 43/36

Generační GC Využívá statistický předpoklad, že mladší objekty umírají dříve. Zavádí generace objektů. Různé generace udržuje v různých paměťových prostorech. Když se tento prostor zaplní, zkoumá, zda jsou objekty v něm živé zda je na ně odkaz ze starší generace objektů. Proces úklidu se tím zrychluje, neboť se neprobírají vždy všechny objekty. B36OMO, 2016, Lekce 2, 44/36

The End http://ineed.coffee/wp-content/uploads/2011/04/object-oriented-memorymanagement-java-c++.pdf B36OMO, 2016, Lekce 2, 45/36