Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

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

Podobne prezentacje


Prezentacja na temat: "Zarządzanie pamięcią: ręczne czy automatyczne Łukasz Kosson Tomasz Wasersztrum."— Zapis prezentacji:

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

2 Podstawy

3 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 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 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 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 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 Zliczanie referencji

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

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

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

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 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 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 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 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: real 0m8.555s user 0m8.100s sys 0m0.350s Mono: real 0m2.907s user 0m2.690s sys 0m0.130s

103 Konfrontacja Java: real 0m8.555s user 0m8.100s sys 0m0.350s Mono: real 0m2.907s user 0m2.690s sys 0m0.130s C++: real 0m5.320s user 0m4.360s sys 0m0.940s

104 Konfrontacja A jak wyszło na Windows?

105 Konfrontacja Java: Kernel: User: NET: Kernel: User: C++: Kernel: User: 8.343

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


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

Podobne prezentacje


Reklamy Google