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

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

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.

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

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

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

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

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

Principy objektově orientovaného programování

Struktura programu v době běhu

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

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

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)

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

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

Komponenty v.net. Obsah přednášky

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

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.

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

Úvod do programovacích jazyků (Java)

NMIN102 Programování /2 Z, Zk

Více o konstruktorech a destruktorech

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

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

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

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

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

Softwarové komponenty a Internet

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

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

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

Abstraktní datové typy: zásobník

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

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

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

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

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

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

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

Matematika v programovacích

Základní datové struktury

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

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

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

Úvod do programovacích jazyků (Java)

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

Ukazka knihy z internetoveho knihkupectvi

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

Vytváření a použití knihoven tříd

11. Přehled prog. jazyků

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

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

Dědění, polymorfismus

Základy programování 2 KMI/ZP2

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

Pokročilé architektury počítačů

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

Systém adresace paměti

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

Datové struktury. alg12 1

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

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

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

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

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

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ě

Lineární datové struktury

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

Principy operačních systémů. Lekce 2: Správa paměti

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

PB071 Programování v jazyce C Jaro 2015

Rekurzivní algoritmy

Dynamická alokace paměti

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

konstruktory a destruktory (o)

typová konverze typová inference

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

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

Jazyk C++, některá rozšíření oproti C

B4B35OSY: Operační systémy

Mělká a hluboká kopie

ADT/ADS = abstraktní datové typy / struktury

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

Přidělování zdrojů (prostředků)

Konstruktory a destruktory

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

1 Nejkratší cesta grafem

Metody připojování periferií BI-MPP Přednáška 2

ÚVOD DO OPERAČNÍCH SYSTÉMŮ. Správa paměti. Přímý přístup k fyzické paměti, abstrakce: adresový prostor, virtualizace, segmentace

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

Datové typy a struktury

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

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

Metody připojování periferií

Souborové systémy Mgr. Josef Horálek

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řetížení operátorů (o)

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

Transkript:

Správa paměti doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz 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ěti 2 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 1

Motivace Statické přidělení paměti Známe předem velikost i počet prvků datové struktury int pole[10]; // 10 * sizeof(int) 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 Úrovně správy paměti Technické vybavení registry, cache Operační systém 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 4 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 2

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ěti 5 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ěti 6 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 3

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 1979 Sony a Philips - DVD 2002 COBOL regenerace paměti Správa paměti 7 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 8 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 4

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ěti 9 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ěti 10 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 5

Přidělování bez regenerace Volná paměť 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í Správa paměti 11 Přidělování ze seznamu volných bloků přidělení uvolnění Správa paměti 12 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 6

Přidělování ze seznamu volných bloků Přidělení paměti Vyhledání bloku vhodné velikosti First-fit (první vhodný blok) Best-fit (nejmenší vhodný blok) 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ěti 13 Přidělování s omezenou velikostí bloku (buddy system) Hierarchické dělení paměti na části podle pevných pravidel Binární dělení bloky velikosti 2 n Fibonacciho dělení bloky velikosti Fib(n) Spojovat lze pouze sousední bloky v hierarchii (buddies) Souseda bloku najdeme jednoduchým výpočtem nižší režie (1 bit volný/obsazený) Správa paměti 14 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 7

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ěti 15 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 16 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 8

Regenerace s kopírováním Všechny obsazené bloky zkopírujeme do jiné souvislé oblasti paměti Je třeba přesměrovat odkazy na kopírované objekty Správa paměti 17 Regenerace s počítáním odkazů (reference counting) Správa paměti 18 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 9

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 19 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ěti 20 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 10

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 21 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 22 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 11

Správa paměti v jazyce Java Automatická regenerace paměti Neexistuje destruktor (kdy by se měl volat?) Inkrementální regenerace Samostatné vlákno s nízkou prioritou Pro vyhledání referencí se využívají metadata Správa paměti 23 (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava 12