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

Slides:



Advertisements
Podobné prezentace
OZD: Hašování RNDr. Michal Žemlička.
Advertisements

A1PRG - Programování – Seminář Ing. Michal Typová konverze, oblast platnosti, paměťové třídy 9 Verze
Tento výukový materiál vznikl v rámci Operačního programu Vzdělávání pro konkurenceschopnost 1. KŠPA Kladno, s. r. o., Holandská 2531, Kladno,
Programovací jazyk C++
Přednáška 11 Jiří Šebesta
Semestrální práce KIV/PT Martin Kales Hana Hůlová.
Pole, ukazatele a odkazy
BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod
Operační systémy. OPERAČNÍ SYSTÉMY pomoc operátorovi, podpora vlastností reálného času, víceuživatelských a více úlohových systémů.
Alg51 Rozklad problému na podproblémy Postupný návrh programu rozkladem problému na podproblémy –zadaný problém rozložíme na podproblémy –pro řešení podproblémů.
Architektury a techniky DS Tvorba efektivních příkazů I Přednáška č. 3 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Programování v C++ Cvičení.
Principy překladačů Běhová podpora Jakub Yaghob. Běhová podpora Statická podpora jazyka Překladač Interface na knihovny Hlavičkové soubory Dynamická podpora.
Kontakty Webpage přednášky: – Slajdy (MS PowerPoint): –ftp://ulita.ms.mff.cuni.cz/predn/PRG017 Technické.
ADT Strom.
Vzdělávací materiál / DUMVY_32_INOVACE_02B5 Správa pamětí AutorIng. Petr Haman Období vytvořeníčerven 2013 Ročník / věková kategorie2. ročník Vyučovací.
ORGANIZACE DATOVÉ STRUKTURY SOUBOR
Řadicí algoritmy autor: Tadeáš Berkman.
A1PRG - Programování – Seminář Ing. Michal Operátory (2. část) 4 Verze
Seminář C cvičení STL, Trolltech Ing. Jan Mikulka.
Algoritmy a programovací techniky
C# - pointery Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí.
Objektové programování
Dynamická alokace, polymorfismus
Seminář C cvičení Obsluha výjimek Ing. Jan Mikulka.
Strategy. Strategy – „All-in-1“ na začátek class AStrategy { public: virtual void Algorithm()=0; protected: AStrategy(); }; class SpecificStrategy: public.
A1PRG - Programování – Seminář Ing. Michal Ukazatele a pole 10 Verze
KIV/PPA1 cvičení 8 Cvičící: Pavel Bžoch. Osnova cvičení Objekty v Javě Třída Konstruktor Metody Metody a proměnné třídy x instance Program sestávající.
IB111 Programování a algoritmizace
Operační systémy Přednášky pro výuku předmětu Operační systémy Ing. Antonín Vaněk, CSc. DFJP, Univerzita Pardubice září 2003.
Dokumentace informačního systému
STROMY Datová struktura sestávající z uzlů
Metodika objektového přístupu při tvorbě překladačů. Marek Běhálek Informatika a aplikovaná matematika FEI VŠB-TU Ostrava.
Kompresní algoritmus LZW Dokumentografické informační systémy.
Ukazatele BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky © Miroslav Balík Fakulta informačních technologií České vysoké.
Distribuované algoritmy - přehled Přednášky z Distribuovaných systémů Ing. Jiří Ledvina, CSc.
Vnitřní (operační paměť)
Počítače a programování 1 7.přednáška. Základy Pole ve třídách a metodách Pole Arrays.
Databázové systémy Přednáška č. 5 Datové typy a Fyzická organizace dat.
FEL Komunikátor. Memory Leak program konsumuje operační paměť, kterou neumožňuje uvolnit o uvolnění paměti stará Garbage Collector ▫plně v režii Java.
Vazby dynamických proměnných,databázové systémy Přednáška č. 10.
OSNOVA: a) Ukazatel b) Pole a ukazatel c) Pole ukazatelů d) Příklady Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování 1 pro.
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část II.
Základy operačních systémů
IB111 Práce se soubory Správa paměti. Práce se soubory v Pythonu Soubor musíme „otevřít“ Poté s ním pracujeme –Čteme a/nebo zapisujeme Nakonec musíme.
XSLT překladač Marek Běhálek Informatika a aplikovaná matematika FEI VŠB-TU Ostrava.
Kontakty slajdy: ftp://ulita.ms.mff.cuni.cz/predn/POS.
PROGRAMOVÁNÍ 3ITA,3ITB Jaroslav Burdys Hlavní zdroj:
Uvedení autoři, není-li uvedeno jinak, jsou autory tohoto výukového materiálu a všech jeho částí. Tento projekt je spolufinancován ESF a státním rozpočtem.
Uvedení autoři, není-li uvedeno jinak, jsou autory tohoto výukového materiálu a všech jeho částí. Tento projekt je spolufinancován ESF a státním rozpočtem.
VIRTUÁLNÍ PAMĚŤ EP1. Kryštof Supek. Umožňuje předložit běžícímu procesu adresní prostor paměti, který je větší, než je fyzicky připojená paměť RAM Procesor.
ZŠ Brno, Řehořova 3 S počítačem snadno a rychle Informatika 7. ročník III
Překladače Operační paměť © Milan Keršláger
Uvedení autoři, není-li uvedeno jinak, jsou autory tohoto výukového materiálu a všech jeho částí. Tento projekt je spolufinancován ESF a státním rozpočtem.
Stránkování MATĚJ JURIČIČ 2015/2016 EP1 SPŠ A VOŠ JANA PALACHA KLADNO.
Y36PJC Programování v jazyce C/C++
Programovací jazyk C++
Soubor Soubor v informatice označuje pojmenovanou sadu dat uloženou na nějakém datovém médiu, se kterou lze pracovat nástroji operačního systému jako.
Y36PJC Programování v jazyce C/C++
Fragmentace paměti Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je Ing. Libor Otáhalík. Dostupné z Metodického portálu ISSN: 
ZAL – 3. cvičení 2016.
Programování 2. hodina RNDr. Jan Lánský, Ph.D.
Návrhový vzor Flyweight
Programování v jazyce C++
Abstraktní datové typy
Správa paměti.
Oblast platnosti identifikátoru (1)
Segmentace Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je Ing. Libor Otáhalík. Dostupné z Metodického portálu ISSN: 
C# přehled vlastností.
Paměť.
Transkript prezentace:

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

Správa paměti2 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.

Správa paměti3 Motivace 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ěti4 Ú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ěti5 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

Správa paměti6 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

Správa paměti7 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ěti8 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ěti9 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í

Správa paměti10 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

Správa paměti11 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ěti12 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 Vyplnění prostoru spec. vzorem – pro ladění Volná paměť

Správa paměti13 Přidělování na zásobník 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; }

Správa paměti14 Přidělování na zásobník 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

Správa paměti15 Přidělování ze seznamu volných bloků 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 volných bloků do jednoho celku (defragmentace paměti) – co s ukazateli?

Správa paměti16 Přidělování ze seznamu volných bloků přidělení uvolnění

Správa paměti17 Metody pro přidělování volných bloků First fit Prochází seznam volných bloků 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.

Správa paměti18 Metody pro přidělování volných bloků 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

Správa paměti19 Metody pro přidělování volných bloků 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ěti20 Metody pro přidělování volných bloků 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ěti21 Metody pro přidělování volných bloků 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ý.

Správa paměti22 Přidělování s omezenou velikostí bloku (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 volných bloků.

Správa paměti23 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ěti24 Example of Buddy System

Správa paměti25 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ěti26 Metody regenerace paměti 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

Správa paměti27 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ěti28 Metoda dvoufázového značkování (mark and sweep) Root Set Heap

Správa paměti29 Metoda dvoufázového značkování (mark and sweep) Č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ěti30 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…)

Správa paměti31 Regenerace s počítáním odkazů (reference counting)

Správa paměti32 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ěti33 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ěti34 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 volných bloků long* buffer; buffer = (long*)calloc(40, sizeof(long)); buffer = (long*)realloc(buffer, 100 * sizeof(long));

Správa paměti35 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ěti36 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ěti37 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ěti38 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ěti39 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