Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
1
Zarządzanie pamięcią: ręczne czy automatyczne
Łukasz Kosson Tomasz Wasersztrum
2
Podstawy
3
Podstawy Stos i sterta
4
Podstawy Stos i sterta
5
Podstawy Stos i sterta malloc() i free()
6
Podstawy Stos i sterta malloc() i free() (implementacja windows)
7
Podstawy Stos i sterta malloc() i free() (implementacja windows)
tablica wolnych bloków
8
Podstawy Stos i sterta malloc() i free() (implementacja windows)
tablica wolnych bloków bloki „zawieszone”
9
Podstawy Stos i sterta malloc() i free() (implementacja windows)
tablica wolnych bloków bloki „zawieszone” schemat algorytmów
10
Podstawy Stos i sterta malloc() i free() (implementacja windows)
tablica wolnych bloków bloki „zawieszone” schemat algorytmów new i delete
11
Problemy zarządzania pamięcią
12
Problemy zarządzania pamięcią
Wycieki pamięci (memory leak)
13
Problemy zarządzania pamięcią
Wycieki pamięci (memory leak) Pseudokod obsługi windy.
14
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
15
Problemy zarządzania pamięcią
Wycieki pamięci (memory leak)
16
Problemy zarządzania pamięcią
Wycieki pamięci (memory leak) Nieaktualne referencje (dangling pointers)
17
Problemy zarządzania pamięcią
Wycieki pamięci (memory leak) Nieaktualne referencje (dangling pointers) Fragmentacja
18
Garbage collector
19
Garbage collector Czym jest i co robi?
20
Garbage collector Czym jest i co robi?
Jeden z mechanizmów zarządzania zasobami (m.in. pamięcią)
21
Garbage collector Czym jest i co robi?
Jeden z mechanizmów zarządzania zasobami (m.in. pamięcią) Odpowiedzialny za zwalnianie niepotrzebnych zasobów
22
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
23
Garbage collector Czym nie jest i czego nie robi?
24
Garbage collector Czym nie jest i czego nie robi?
Nie zwalnia z racjonalnego korzystania z pamięci
25
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
26
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
27
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
28
Garbage collector Gdzie jest wykorzystywany?
29
Garbage collector Gdzie jest wykorzystywany? Początki: LISP, 1960
30
Garbage collector Gdzie jest wykorzystywany? Początki: LISP, 1960
Głównie wykorzystywany do zarządzania pamięcią operacyjną ...
31
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
32
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)
33
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
34
GC – zasada działania Jakie obiekty sprzątać?
35
GC – zasada działania Jakie obiekty sprzątać?
Optymalne rozwiązanie: kasować obiekty nieosiągalne semantycznie
36
GC – zasada działania Jakie obiekty sprzątać?
Optymalne rozwiązanie: kasować obiekty nieosiągalne semantycznie Problem: zagadnienie równoważne problemowi stopu.
37
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
38
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
39
GC – zasada działania Algorytm naiwny (mark and sweep):
40
GC – zasada działania Algorytm naiwny (mark and sweep):
Dla każdego obiektu trzymamy bit osiągalności
41
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
42
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ść
43
GC – zasada działania Wady algorytmu naiwnego:
44
GC – zasada działania Wady algorytmu naiwnego:
Wymaga wstrzymania procesu
45
GC – zasada działania Wady algorytmu naiwnego:
Wymaga wstrzymania procesu Przeglądanie całej pamięci
46
GC – zasada działania Wady algorytmu naiwnego:
Wymaga wstrzymania procesu Przeglądanie całej pamięci Duża fragmentacja pamięci
47
GC – zasada działania Modyfikacje algorytmu mark-and-sweep:
48
GC – zasada działania Modyfikacje algorytmu mark-and-sweep:
Stop-and-copy: redukuje fragmentację, ale zwiększa dwukrotnie wymagania pamięciowe
49
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ę
50
GC – zasada działania Obserwacja:
Im obiekt młodszy, tym szybciej staje się niedostępny
51
GC – zasada działania Obserwacja:
Im obiekt młodszy, tym szybciej staje się niedostępny Wniosek: Nie traktować wszystkich obiektów jednakowo
52
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
53
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
54
GC – zasada działania Współczesne GC:
Rozróżnienie na obiekty młode i stare (dwie lub trzy klasy)
55
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
56
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)
57
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
58
GC – jak mu pomóc
59
GC – jak mu pomóc Weak reference:
60
GC – jak mu pomóc Weak reference: Działa jak zwykły wskaźnik ...
61
GC – jak mu pomóc Weak reference: Działa jak zwykły wskaźnik ...
... ale nie jest traktowany przez GC jako referencja
62
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
63
GC – jak sobie pomóc
64
GC – jak sobie pomóc Finalizacja:
65
GC – jak sobie pomóc Finalizacja: Mechanizm zastępujący destruktory
66
GC – jak sobie pomóc Finalizacja: Mechanizm zastępujący destruktory
Kwestia wydajności
67
GC – jak sobie pomóc Finalizacja: Mechanizm zastępujący destruktory
Kwestia wydajności A co gdy korzystamy z zewnętrznych zasobów?
68
GC – środowiska hybrydowe
Co się dzieje w sytuacji, gdy mamy wskaźniki na obiekty?
69
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); }
70
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) ...
71
Zamiast GC…
72
Zamiast GC… Zliczanie referencji
73
Zamiast GC… Zliczanie referencji refcountedstruct , REF() , UNREF()
struct refcountedstruct { int refcount; } void REF(void *data) struct refcountedstruct *rstruct; rstruct = (struct refcountedstruct *) data; rstruct->refcount++;
74
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); }
75
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); }
76
Zamiast GC… Zliczanie referencji
77
Zamiast GC… Zliczanie referencji Łatwe w obsłudze
78
Zamiast GC… Zliczanie referencji Łatwe w obsłudze
Proste w implementacji
79
Zamiast GC… Zliczanie referencji Łatwe w obsłudze
Proste w implementacji Nie obsługuje poprawnie struktur cyklicznych
80
Zamiast GC… Zliczanie referencji Łatwe w obsłudze
Proste w implementacji Nie obsługuje poprawnie struktur cyklicznych Spowalnia przypisania
81
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
82
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...
83
Zamiast GC… Zliczanie referencji
84
Zamiast GC… Zliczanie referencji Strefy pamięci (obstack)
85
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);
86
Zamiast GC… Zliczanie referencji Strefy pamięci (obstack)
87
Zamiast GC… Zliczanie referencji Strefy pamięci (obstack)
Łatwe w obsłudze
88
Zamiast GC… Zliczanie referencji Strefy pamięci (obstack)
Łatwe w obsłudze Szereg dostępnych implementacji
89
Zamiast GC… Zliczanie referencji Strefy pamięci (obstack)
Łatwe w obsłudze Szereg dostępnych implementacji Szybkie
90
Zamiast GC… Zliczanie referencji Strefy pamięci (obstack)
Łatwe w obsłudze Szereg dostępnych implementacji Szybkie Hermetyczne
91
Zamiast GC… Zliczanie referencji Strefy pamięci (obstack)
Łatwe w obsłudze Szereg dostępnych implementacji Szybkie Hermetyczne Problem w przypadku zmian w kodzie
92
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...
93
Konfrontacja Przykład 1 – wyrażenia Vector v1, v2, v3; Scalar s1, s2;
v3 = v1 * s1 + v2 * s2;
94
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))
95
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?
96
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ł?
97
Konfrontacja Przykład 2 – formatowanie Kto sprząta? time_t tm;
time(&tm); char *str = ctime(&tm); cout << str; delete str; Kto sprząta?
98
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();
99
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 < ; ++i) { A a = new A(); }
100
Konfrontacja Wyniki dla linuxie (students)
101
Konfrontacja Java: real 0m8.555s user 0m8.100s sys 0m0.350s
102
Konfrontacja Java: Mono: real 0m8.555s user 0m8.100s sys 0m0.350s
103
Konfrontacja Java: Mono: C++: real 0m8.555s user 0m8.100s sys 0m0.350s
104
Konfrontacja A jak wyszło na Windows?
105
Konfrontacja Java: .NET: C++: Kernel: 0.015 User: 0.156 Kernel: 0.031
106
Konfrontacja Przykład 5 while (true) {
Connection conn = GetConnection(); ReadRequest(conn); SendResponse(conn); }
107
Konfrontacja Przykład 5
while (true) { Connection conn = GetConnection(); ReadRequest(conn); SendResponse(conn); } Pytanie: czy i kiedy połączenia same się będą zamykać?
108
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
109
Konfrontacja Koniec
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.