Zarządzanie pamięcią: ręczne czy automatyczne

Slides:



Advertisements
Podobne prezentacje
C++ wykład 2 ( ) Klasy i obiekty.
Advertisements

C++ wykład 4 ( ) Przeciążanie operatorów.
Język C/C++ Funkcje.
Klasa listy jednokierunkowej Przekazywanie parametrów do funkcji
Standardowa biblioteka języka C++
Wskaźniki repetytorium Wskaźniki int Y = 1, X = 2; X = 5; int *p = &X; Y X p 4 4 p = &Y; *p = 4; 5.
Wzorce.
Prowadzący: mgr inż. Elżbieta Majka
SYSTEMY OPERACYJNE WSTĘP
Bezpieczeństwo wyjątków w C++: OpenGL
dynamiczny przydział pamięci
Dziel – Rządź - Złącz.
Wydajne aplikacje na platformie .NET
CLR na platformie .NET Tomasz Kostarski.
Szablony (wzorce) Przykład 1: Szablon klasy -
Odśmiecanie Grzegorz Timoszuk
Licznik template<class Count_Type> class Count { public:
Zakres i zasięg deklaracji Zakres : obszar programu, w którym identyfikator może być użyty zakres globalny : cały program zakres lokalny : definicja pojedynczej.
Wskaźniki. Definiowanie wskaźników Wskaźnik może wskazywać na obiekt dowolnego typu. int * w; char * Wsk_Znak; float * Wskaz_Real; Przykłady: Wskaźnik.
Tablice.
Systemy operacyjne Wykład nr 5: Wątki Piotr Bilski.
Wykład nr 3: Struktura systemu operacyjnego
Wykład nr 2: Struktura systemu komputerowego a system operacyjny
C++ wykład 2 ( ) Klasy i obiekty.
Wykład 1: Wskaźniki Podstawy programowania Programowanie w C
Języki programowania obiektowego
Język Java Wielowątkowość.
Semafory według normy POSIX
Pamięć wspólna Przegląd stosowanych rozwiązań Marcin Kamiński, Michał Kotra Wydział EAIiE Katedra Automatyki Kraków, 2008.
Techniki programowania gier
Podstawy C# Grupa .NET PO.
Podstawy programowania
Podstawy programowania II
Zbiór do posortowania mieści się w pamięci
Wskaźnik może wskazywać na obiekt dowolnego typu. int * w; char * Wsk_Znak; float * Wskaz_Float; Przykład: Wskaźnik przechowuje adres obiektu wskazanego.
struct nazwa { lista składników }; Dostęp do składowych struktury Nazwa_Zmniennej_Strukturalnej. Nazwa_Składnika.
Temat: Eksplorator Windows - wędrówka po drzewie folderów
Podstawy programowania II
Podstawy programowania
sortowanie na bazie – wykorzystanie sortowania ze zliczaniem
Programowanie obiektowe III rok EiT dr inż. Jerzy Kotowski Wykład VIII.
Jerzy F. Kotowski1 Informatyka I Wykład 14 DEKLARATORY.
Inicjalizacja i sprzątanie
Programowanie obiektowe Wykład 3 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Dariusz Wardowski.
Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski.
Podstawy informatyki 2013/2014 Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
Programowanie obiektowe 2013/2014
Kurs języka C++ – wykład 8 ( )
K URS JĘZYKA C++ – WYKŁAD 7 ( ) Wyjątki.
Kurs języka C++ – wykład 4 ( )
K URS JĘZYKA C++ – WYKŁAD 1 ( ) Łagodne wprowadzenie do języka C++
Modele pamięci Tiny - mikroskopijny do 64 K zmienne inicjalizowane kod programu zmienne nie inicjalizowane HEAP (sterta) obszar wolny STACK (stos) Model.
1 dynamiczny przydział pamięci malloc() free() realloc() calloc() memset() memcpy( ) mempcpy( ) memmove() (wskaźniki!! )
1 Uzupełnienie dot. przekazywania argumentów #include struct nowa { int f; char line[20000]; int k; } reprezentant; int main() { void funkcja7( struct.
Zakres Wzorce projektowe ( -Adapter (str , wykład wzorce projektowe.
Paweł Starzyk Obiektowe metody projektowania systemów
Programowanie Zaawansowane
Struktura systemu operacyjnego
PO13-1 / 19 Wykład 13 Wyjątki i ich zgłaszanie Wyłapywanie wyjątków Obsługa wyjątków Wykorzystanie polimorfizmu Filtrowanie wyjątków Błędy w konstruktorach.
Wykład 5 Klasa Vec i jej operatory 1.Kategorie operatorów 2.Operatory ogólne - przykłady 3.Operatory specjalne [ ], ( ) oraz –> 4.Operatory new i delete.
Seminarium Dyplomowe: Metodyka i Techniki Programowania Autor: Bartłomiej Fornal.
K URS JĘZYKA C++ – WYKŁAD 3 ( ) Przenoszenie Składowe statyczne Funkcje wbudowane Argumenty domyślne.
K URS JĘZYKA C++ – WYKŁAD 1 ( ) Łagodne wprowadzenie do języka C++
Strumienie, Wczytywanie, Zapisywanie, Operacje na plikach
Kurs języka C++ – wykład 3 ( )
Programowanie Obiektowe – Wykład 2
Aplikacje i usługi internetowe
Założenia projektowe Javy
dynamiczny przydział pamięci
Zapis prezentacji:

Zarządzanie pamięcią: ręczne czy automatyczne Łukasz Kosson Tomasz Wasersztrum

Podstawy

Podstawy Stos i sterta

Podstawy Stos i sterta

Podstawy Stos i sterta malloc() i free()

Podstawy Stos i sterta malloc() i free() (implementacja windows)

Podstawy Stos i sterta malloc() i free() (implementacja windows) tablica wolnych bloków

Podstawy Stos i sterta malloc() i free() (implementacja windows) tablica wolnych bloków bloki „zawieszone”

Podstawy Stos i sterta malloc() i free() (implementacja windows) tablica wolnych bloków bloki „zawieszone” schemat algorytmów

Podstawy Stos i sterta malloc() i free() (implementacja windows) tablica wolnych bloków bloki „zawieszone” schemat algorytmów new i delete

Problemy zarządzania pamięcią

Problemy zarządzania pamięcią Wycieki pamięci (memory leak)

Problemy zarządzania pamięcią Wycieki pamięci (memory leak) Pseudokod obsługi windy.

Problemy zarządzania pamięcią Wycieki pamięci (memory leak) Pseudokod obsługi windy. When a button is pressed:   Get some memory, which will be used to remember the floor number  Put the floor number into the memory  Are we already on the target floor?  If so, we have nothing to do: finished  Otherwise:     Wait until the lift is idle     Go to the required floor     Release the memory we used to remember the floor number

Problemy zarządzania pamięcią Wycieki pamięci (memory leak)

Problemy zarządzania pamięcią Wycieki pamięci (memory leak) Nieaktualne referencje (dangling pointers)

Problemy zarządzania pamięcią Wycieki pamięci (memory leak) Nieaktualne referencje (dangling pointers) Fragmentacja

Garbage collector

Garbage collector Czym jest i co robi?

Garbage collector Czym jest i co robi? Jeden z mechanizmów zarządzania zasobami (m.in. pamięcią)

Garbage collector Czym jest i co robi? Jeden z mechanizmów zarządzania zasobami (m.in. pamięcią) Odpowiedzialny za zwalnianie niepotrzebnych zasobów

Garbage collector Czym jest i co robi? Jeden z mechanizmów zarządzania zasobami (m.in. pamięcią) Odpowiedzialny za zwalnianie niepotrzebnych zasobów Często zmniejsza fragmentację (zewnętrzną i wewnętrzną) pamięci

Garbage collector Czym nie jest i czego nie robi?

Garbage collector Czym nie jest i czego nie robi? Nie zwalnia z racjonalnego korzystania z pamięci

Garbage collector Czym nie jest i czego nie robi? Nie zwalnia z racjonalnego korzystania z pamięci Nie służy do wykrywania wycieków

Garbage collector Czym nie jest i czego nie robi? Nie zwalnia z racjonalnego korzystania z pamięci Nie służy do wykrywania wycieków Nie dotyka zewnętrznych zasobów

Garbage collector Czym nie jest i czego nie robi? Nie zwalnia z racjonalnego korzystania z pamięci Nie służy do wykrywania wycieków Nie dotyka zewnętrznych zasobów Nie czyni cudów

Garbage collector Gdzie jest wykorzystywany?

Garbage collector Gdzie jest wykorzystywany? Początki: LISP, 1960

Garbage collector Gdzie jest wykorzystywany? Początki: LISP, 1960 Głównie wykorzystywany do zarządzania pamięcią operacyjną ...

Garbage collector Gdzie jest wykorzystywany? Początki: LISP, 1960 Głównie wykorzystywany do zarządzania pamięcią operacyjną ... ... ale także np. połączeniami, plikami

Garbage collector Gdzie jest wykorzystywany? Początki: LISP, 1960 Głównie wykorzystywany do zarządzania pamięcią operacyjną ... ... ale także np. połączeniami, plikami Środowiska, np: .NET, JVM (także ME)

Garbage collector Gdzie jest wykorzystywany? Początki: LISP, 1960 Głównie wykorzystywany do zarządzania pamięcią operacyjną ... ... ale także np. połączeniami, plikami Środowiska, np: .NET, JVM (także ME) Języki skryptowe, np JavaScript

GC – zasada działania Jakie obiekty sprzątać?

GC – zasada działania Jakie obiekty sprzątać? Optymalne rozwiązanie: kasować obiekty nieosiągalne semantycznie

GC – zasada działania Jakie obiekty sprzątać? Optymalne rozwiązanie: kasować obiekty nieosiągalne semantycznie Problem: zagadnienie równoważne problemowi stopu.

GC – zasada działania Jakie obiekty sprzątać? Optymalne rozwiązanie: kasować obiekty nieosiągalne semantycznie Problem: zagadnienie równoważne problemowi stopu. Prostsze rozwiązanie: osiągalność syntaktyczna

GC – zasada działania Jakie obiekty sprzątać? Optymalne rozwiązanie: kasować obiekty nieosiągalne semantycznie Problem: zagadnienie równoważne problemowi stopu. Prostsze rozwiązanie: osiągalność syntaktyczna Praktyka: rozwiązanie pośrednie

GC – zasada działania Algorytm naiwny (mark and sweep):

GC – zasada działania Algorytm naiwny (mark and sweep): Dla każdego obiektu trzymamy bit osiągalności

GC – zasada działania Algorytm naiwny (mark and sweep): Dla każdego obiektu trzymamy bit osiągalności Zaczynając od obiektów bezpośrednio osiągalnych przeglądamy strukturę obiektów

GC – zasada działania Algorytm naiwny (mark and sweep): Dla każdego obiektu trzymamy bit osiągalności Zaczynając od obiektów bezpośrednio osiągalnych przeglądamy strukturę obiektów Zwalniamy obiekty do których się nie udało dojść

GC – zasada działania Wady algorytmu naiwnego:

GC – zasada działania Wady algorytmu naiwnego: Wymaga wstrzymania procesu

GC – zasada działania Wady algorytmu naiwnego: Wymaga wstrzymania procesu Przeglądanie całej pamięci

GC – zasada działania Wady algorytmu naiwnego: Wymaga wstrzymania procesu Przeglądanie całej pamięci Duża fragmentacja pamięci

GC – zasada działania Modyfikacje algorytmu mark-and-sweep:

GC – zasada działania Modyfikacje algorytmu mark-and-sweep: Stop-and-copy: redukuje fragmentację, ale zwiększa dwukrotnie wymagania pamięciowe

GC – zasada działania Modyfikacje algorytmu mark-and-sweep: Stop-and-copy: redukuje fragmentację, ale zwiększa dwukrotnie wymagania pamięciowe Mark-and-compact: redukuje fragmentację

GC – zasada działania Obserwacja: Im obiekt młodszy, tym szybciej staje się niedostępny

GC – zasada działania Obserwacja: Im obiekt młodszy, tym szybciej staje się niedostępny Wniosek: Nie traktować wszystkich obiektów jednakowo

GC – zasada działania Obserwacja: Im obiekt młodszy, tym szybciej staje się niedostępny Wniosek: Nie traktować wszystkich obiektów jednakowo Pomysł: Algorytmy pokoleniowe

GC – zasada działania Obserwacja: Im obiekt młodszy, tym szybciej staje się niedostępny Wniosek: Nie traktować wszystkich obiektów jednakowo Pomysł: Algorytmy pokoleniowe Efekt: Szybsze zwalnianie pamięci

GC – zasada działania Współczesne GC: Rozróżnienie na obiekty młode i stare (dwie lub trzy klasy)

GC – zasada działania Współczesne GC: Rozróżnienie na obiekty młode i stare (dwie lub trzy klasy) JVM: Obiekty młode odzyskiwane przez stop-and-copy Obiekty stare – przez mark-and-sweep

GC – zasada działania Współczesne GC: Rozróżnienie na obiekty młode i stare (dwie lub trzy klasy) JVM: Obiekty młode odzyskiwane przez stop-and-copy Obiekty stare – przez mark-and-sweep Możliwość wymuszenia użycia innego algorytmu (w tym: współbieżnego)

GC – zasada działania Współczesne GC: Rozróżnienie na obiekty młode i stare (dwie lub trzy klasy) JVM: Obiekty młode odzyskiwane przez stop-and-copy Obiekty stare – przez mark-and-sweep Możliwość wymuszenia użycia innego algorytmu (w tym: współbieżnego) .NET: Wszystkie pokolenia obsługiwane przez mark-and-compact

GC – jak mu pomóc

GC – jak mu pomóc Weak reference:

GC – jak mu pomóc Weak reference: Działa jak zwykły wskaźnik ...

GC – jak mu pomóc Weak reference: Działa jak zwykły wskaźnik ... ... ale nie jest traktowany przez GC jako referencja

GC – jak mu pomóc Weak reference: Działa jak zwykły wskaźnik ... ... ale nie jest traktowany przez GC jako referencja Szczególnie przydatny przy implementowaniu pamięci podręcznej

GC – jak sobie pomóc

GC – jak sobie pomóc Finalizacja:

GC – jak sobie pomóc Finalizacja: Mechanizm zastępujący destruktory

GC – jak sobie pomóc Finalizacja: Mechanizm zastępujący destruktory Kwestia wydajności

GC – jak sobie pomóc Finalizacja: Mechanizm zastępujący destruktory Kwestia wydajności A co gdy korzystamy z zewnętrznych zasobów?

GC – środowiska hybrydowe Co się dzieje w sytuacji, gdy mamy wskaźniki na obiekty?

GC – środowiska hybrydowe Co się dzieje w sytuacji, gdy mamy wskaźniki na obiekty? unsafe { Bitmap img = Image.FromFile(„pict.jpg”); BitmapData data = img.LockBits(); byte* pixels = data.Scan0; Process(pixels); img.UnlockBits(data); }

GC – środowiska hybrydowe Co się dzieje w sytuacji, gdy mamy wskaźniki na obiekty? unsafe { Bitmap img = Image.FromFile(„pict.jpg”); BitmapData data = img.LockBits(); byte* pixels = data.Scan0; Process(pixels); img.UnlockBits(data); } Odpowiedź: fixed (byte* pixels = data.Scan0) ...

Zamiast GC…

Zamiast GC… Zliczanie referencji

Zamiast GC… Zliczanie referencji refcountedstruct , REF() , UNREF() struct refcountedstruct { int refcount; } void REF(void *data) struct refcountedstruct *rstruct; rstruct = (struct refcountedstruct *) data; rstruct->refcount++;

Zamiast GC… Zliczanie referencji refcountedstruct , REF() , UNREF() void UNREF(void *data) { struct refcountedstruct *rstruct; rstruct = (struct refcountedstruct *) data; rstruct->refcount--; if(rstruct->refcount == 0) free(rstruct); }

Zamiast GC… Zliczanie referencji refcountedstruct , REF() , UNREF() użycie w kodzie struct mydata { int refcount; int datafield; }; void dosomething(struct mydata *data) REF(data); /* Process data */ UNREF(data); }

Zamiast GC… Zliczanie referencji

Zamiast GC… Zliczanie referencji Łatwe w obsłudze

Zamiast GC… Zliczanie referencji Łatwe w obsłudze Proste w implementacji

Zamiast GC… Zliczanie referencji Łatwe w obsłudze Proste w implementacji Nie obsługuje poprawnie struktur cyklicznych

Zamiast GC… Zliczanie referencji Łatwe w obsłudze Proste w implementacji Nie obsługuje poprawnie struktur cyklicznych Spowalnia przypisania

Zamiast GC… Zliczanie referencji Łatwe w obsłudze Proste w implementacji Nie obsługuje poprawnie struktur cyklicznych Spowalnia przypisania Wymaga ciągłego pamiętania o REF i UNREF

Zamiast GC… Zliczanie referencji Łatwe w obsłudze Proste w implementacji Nie obsługuje poprawnie struktur cyklicznych Spowalnia przypisania Wymaga ciągłego pamiętania o REF i UNREF A jak REF albo UNREF rzuci wyjątek...

Zamiast GC… Zliczanie referencji

Zamiast GC… Zliczanie referencji Strefy pamięci (obstack)

Zamiast GC… Zliczanie referencji Strefy pamięci (obstack) struct obstack *global_pool; struct obstack *connection_pool; struct obstack *request_pool; int main() { /* inicjalizacja */ while(1) wait_for_connection(); while(more_requests_available()) handle_request(); obstack_free(request_pool, NULL); } obstack_free(connection_pool, NULL);

Zamiast GC… Zliczanie referencji Strefy pamięci (obstack)

Zamiast GC… Zliczanie referencji Strefy pamięci (obstack) Łatwe w obsłudze

Zamiast GC… Zliczanie referencji Strefy pamięci (obstack) Łatwe w obsłudze Szereg dostępnych implementacji

Zamiast GC… Zliczanie referencji Strefy pamięci (obstack) Łatwe w obsłudze Szereg dostępnych implementacji Szybkie

Zamiast GC… Zliczanie referencji Strefy pamięci (obstack) Łatwe w obsłudze Szereg dostępnych implementacji Szybkie Hermetyczne

Zamiast GC… Zliczanie referencji Strefy pamięci (obstack) Łatwe w obsłudze Szereg dostępnych implementacji Szybkie Hermetyczne Problem w przypadku zmian w kodzie

Zamiast GC… Zliczanie referencji Strefy pamięci (obstack) Łatwe w obsłudze Szereg dostępnych implementacji Szybkie Hermetyczne Problem w przypadku zmian w kodzie A jak pomylisz pulę pamięci przy alokacji...

Konfrontacja Przykład 1 – wyrażenia Vector v1, v2, v3; Scalar s1, s2; v3 = v1 * s1 + v2 * s2;

Konfrontacja Przykład 1 – wyrażenia Lub inaczej: Vector v1, v2, v3; Scalar s1, s2; v3 = v1 * s1 + v2 * s2; Lub inaczej: v3 = v1.mult(s1).add(v2.mult(s2))

Konfrontacja Przykład 1 – wyrażenia Lub inaczej: Vector v1, v2, v3; Scalar s1, s2; v3 = v1 * s1 + v2 * s2; Lub inaczej: v3 = v1.mult(s1).add(v2.mult(s2)) Ile obiektów będzie utworzonych?

Konfrontacja Przykład 1 – wyrażenia Lub inaczej: Vector v1, v2, v3; Scalar s1, s2; v3 = v1 * s1 + v2 * s2; Lub inaczej: v3 = v1.mult(s1).add(v2.mult(s2)) Ile obiektów będzie utworzonych? Kto będzie sprzątał?

Konfrontacja Przykład 2 – formatowanie Kto sprząta? time_t tm; time(&tm); char *str = ctime(&tm); cout << str; delete str; Kto sprząta?

Konfrontacja Przykład 3 – zasoby zewnętrzne, GUI Problem: nie możemy samemu niszczyć obiektów Irytujący przykład: JFrame JFrame frm = new JFrame(); BigModel mdl = new BigModel(); BigComponent cmp = new BigComponent(mdl); frm.add(cmp); frm.show();

Konfrontacja Przykład 4 – wydajność class A { private int x; public A() { x = 0; ++x; } } class Example public static void Main() for (int i = 0; i < 500000000; ++i) { A a = new A(); }

Konfrontacja Wyniki dla linuxie (students)

Konfrontacja Java: real 0m8.555s user 0m8.100s sys 0m0.350s

Konfrontacja Java: Mono: real 0m8.555s user 0m8.100s sys 0m0.350s

Konfrontacja Java: Mono: C++: real 0m8.555s user 0m8.100s sys 0m0.350s

Konfrontacja A jak wyszło na Windows?

Konfrontacja Java: .NET: C++: Kernel: 0.015 User: 0.156 Kernel: 0.031

Konfrontacja Przykład 5 while (true) { Connection conn = GetConnection(); ReadRequest(conn); SendResponse(conn); }

Konfrontacja Przykład 5 while (true) { Connection conn = GetConnection(); ReadRequest(conn); SendResponse(conn); } Pytanie: czy i kiedy połączenia same się będą zamykać?

Konfrontacja Przykład 5 while (true) { Connection conn = GetConnection(); ReadRequest(conn); SendResponse(conn); } Pytanie: czy i kiedy połączenia same się będą zamykać? Odpowiedź: nie wiadomo czy i nie wiadomo kiedy

Konfrontacja Koniec