Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Programowanie Aplikacji Lokalnych w Środowisku.NET Organizacja pamięci Samodzielne zarządzanie pamięcią Pamięć w.NET.

Podobne prezentacje


Prezentacja na temat: "Programowanie Aplikacji Lokalnych w Środowisku.NET Organizacja pamięci Samodzielne zarządzanie pamięcią Pamięć w.NET."— Zapis prezentacji:

1 Programowanie Aplikacji Lokalnych w Środowisku.NET Organizacja pamięci Samodzielne zarządzanie pamięcią Pamięć w.NET

2 Stronicowanie 32 bitowy adres w kodzie AdresFizyczny Strony 4kB (!CE), (adres strony: 0xXXXXX000) Proces -> katalog stron Sprzętowa realizacja mapowania adresów Całkowita izolacja procesów w NT/Win2K/XP/Vista Brak problemów z konsolidacją zwalnianej pamięci Zrzucanie pamięci na dysk (inf. w tablicy stron) Usuwanie stron z pamięci np dll (inf. w tablicy stron)

3 Atrubuty stron PAGE_NOACCESS PAGE_READONLY PAGE_READWRITE PAGE_EXECUTE PAGE_EXECUTE_READ PAGE_EXECUTE_READWRITE PAGE_WRITE_COPY * PAGE_EXECUTE_WRITE_COPY * PAGE_NOCACHE, PAGE_WRITECOMBINE ** PAGE_GUARD *** * współdzielenie danych przez aplikacje ** łączenieoperacji w bloki – sterowniki *** notyfikacja o zapisie (wyjątek) – np. dla realizacji stosu wątku

4 Pamięć > 2GB W systemach 32b (począwszy od Windows 2000 Advanced Server), Windows XP Pro można zredukować przestrzeń jądra do 1GB (i uzyskać 3GB w trybie użytkownika) /3GB w boot.ini linker - /LARGEADDRESWARE Problemy z kompatybilnością przy niestand. wykorzystaniu przez programistów górnego bitu wskaźnika do Żeby zobaczyć więcej niż 3GB system musi pracować w trybie PAE –> pot. problemy ze sterownikami Windows 64B – 4TB

5 Mapa pamięci 0x xFFFFFFFFFFFFFFFF 0xC xFFFFFFFF 0x xFFFFFFFF 0xC xFFFFFFFF Tryb jądra 0x000003FFFFFFFFFF 0xBFFF0000 0xBFFFFFFF 0x7FFF0000 0x7FFFFFFF NDzewnętrzne 64KB ND 0x x003FFFFF Kompatyb. z DOS16 ND 0x xBFFFFFFF Dzielony plik mapw. 0x x000003FFFFFFFFFF 0x xBFFFFFFF 0x x7FFFFFFF 0x x7FFFFFFF Tryb użytkown. 0x x FFFF 0x x0000FFFF 0x x00000FFF Pusty wskaźnik Win 64b Win2K/Xp 3GB Win2K/Xp 2GB Win98Strefa

6 Systemowy alokator pamięci Lektura: Heap: Pleasures and Pains, Murali R. Krishnan, Ms Corp

7 Pamięć Procesu start (32) - przydział przestrzeni adresowej 2GB (3GB) Bloki na granicy ziarnistości (64kB) – nie dotyczy samego systemu rozmiar - wielokrotność strony (dla x86 - 4kB) XP – rozszerzenie Żądanie dostępu Jeśli dane nie są w pamięci wczytanie danych z pliku wymiany lub pliku (DLL) Jeśli brak miejsca zwolnienie strony (w przypadku ew. modyfikacji zapis do pliku wymiany) Mapowanie adresu wirtualnego na fizyczny

8 Operacje na pamięci (Win32) dwa etapy pobierania bloku pamięci VirtualAlloc rezerwacjaMEM_RESERVE przydzielenieMEM_COMMIT dwa etapy zwalniania bloku pamięci VirtualFree oddzielenieMEM_DECOMMIT przydzielanieMEM_RELEASE atrybuty dostępu do bloku pamięci VirtualProtect blokowanie zrzucania pamięci na dysk VirtualLock / Unlock

9 Pamięć wirtualna – dostęp VirtualAlloc najpierw sprawdza czy pamięć już została zamapowana i ew. nie robi tego ponownie. Próba dostępu do pamięci zarezerwowanej, ale nie przydzielonej generuje wyjątek (ktory można obsłużyć)

10 Stan pamięci statystyka systemu: GlobalMemoryStatus : 32Bit -> przestrzeń 4GB 2GB aplikacja 2GB system 3GB+1GB – system boot.ini: /3GB oraz IMAGE_FILE_LARGE_ADDRESS_AWARE dla aplikacji 64Bit -> >4GB.NET: System.Management.ManagementClass("Win32_OperatingSystem") System.Management.ManagementClass.GetInstances System.Management.ManagementObject.Properties stan przestrzeni adresowej: VirtualQuery VirtualQueryEx (hProcess,...)

11 Umieszczający operator new konstruktor klasa::klasa(A a, B b, C c); operator new klasa * w = new klasa(a,b,c); delete w; funkcja operator new: void * operator new(size_t rozmiar); void * pamiec = operator new(sizeof klasa); operator delete(pamiec) umieszczający operator new w = new (pamiec) klasa(a,b,c); w -> ~klasa();

12 Smart pointers template class Ptr { T* p; public: Ptr(T* p_) : p(p_) { p->upcount(); } ~Ptr(void) { p->downcount(); } operator T*(void) { return p; } T& operator*(void) { return *p; } T* operator->(void) { return p; } Ptr& operator=(Ptr &p_) { return operator=((T *) p_); } Ptr& operator=(T* p_) { p->downcount(); p = p_; p->upcount(); return *this; } };

13 Reprezentacja danych Typy wartościowe: typy proste, stuktury alokowane na stosie nie można po nich dziedziczyć Typy referencyjne: obiekty alokowane na stercie zarządzalnej unikatowa tożsamość dodatkowe pola (sync block, Method Table Pointer )

14 Reprezentacja Kolejność pól LayoutKind.Auto o kolejności ułożenia decyduje CLR. LayoutKind.Sequential kolejność ułożenia odpowiada kolejności definicji pól obiektu w kodzie źródłowym. LayoutKind.Explicit – kolejność jest określona przez podanie konkretnych offsetów. Boxing/unboxing

15 Object Test(Object obj) { return obj; } PktValue v = new PktValue(); Object o = Test(v); v = (PktValue) o; Kolekcje generyczne Przeciązanie matod Equals, Implementacja Equatable,IComparable struct PktValue { public byte X; public byte Y; }

16 interface IChangeBoxedPoint { void Change(Int32 x, Int32 y); } struct Point : IChangeBoxedPoint { private Int32 m_x, m_y; public Point(Int32 x, Int32 y) { m_x = x; m_y = y; } public void Change(Int32 x, Int32 y) { m_x = x; m_y = y; } public override String ToString() { return String.Format("({0}, {1})", m_x.ToString(), m_y.ToString()); } };

17 Point p = new Point(1, 1); // 1 Console.WriteLine(p); // 2 p.Change(2, 2); // 3 Console.WriteLine(p); // 4 Object o = p; // 5 Console.WriteLine(o); // 6 ((Point) o).Change(3, 3); // 7 Console.WriteLine(o); // 8 ((IChangeBoxedPoint) p).Change(4, 4); // 9 Console.WriteLine(p); // 10 ((IChangeBoxedPoint) o).Change(5, 5); // 11 Console.WriteLine(o); //12

18 Point p = new Point(1, 1); // 1 Console.WriteLine(p); // 2 Konwersja p.Change(2, 2); // 3 Console.WriteLine(p); // 4 Konwersja Object o = p; // 5 Konwersja + pot. niespójność -> 2 kopie Console.WriteLine(o); // 6 ? ((Point) o).Change(3, 3); // 7 Konwersja jaka jest zawartość o? Console.WriteLine(o); // 8 ((IChangeBoxedPoint) p).Change(4, 4); // 9 Konwersja + zaw. p? Console.WriteLine(p); // 10 Konwersja ((IChangeBoxedPoint) o).Change(5, 5); // 11 Console.WriteLine(o); //12

19 Życie obiektu wg. GC Rezerwacja - new (IL->newobj) Inicjalizacja (konstruktor) Użycie Deterministyczne uwolnienie zasobów (Dispose) Zaznaczanie nieużytków (Mark) Ew. Uwolnienie zasobów (Finalizacja) Zwolnienie pamieci (Sweep&Pack)

20 GC Mark&Sweep&Compact GC - Poszukuje o oznacza obiekty, które mają korzeń w zmiennych statycznych zmiennych lokalnych referencjach miedzy-generacyjnych obiektach w kolejce do finalizacji Niezaznaczone obiekty usuwa i kompaktuje stertę

21 Sterta zarządzana Przydział nie wymaga przeglądania list wolnych bloków) Możliwa jest reorganizacja sterty

22 Zaznaczane są: statyczne obiekty Lokalne obiekty paramerty funkcji Obiekty będące własnością ów już już zaznaczonych W momencie braku pamięci przeprowadzane jest odśmiecanie Obiekty i śmieci

23 Ile razy wykona się GC? class Program { static void Main(string[] args) { Timer timer = new Timer(OnTimer, null, 0, 1000); Console.ReadLine(); } static void OnTimer(object state) { GC.Collect(); // wymuszenie pracy GC }

24 Ile razy wykona się GC? class Program { static void Main(string[] args) { Timer timer = new Timer(OnTimer, null, 0, 1000); Console.ReadLine(); } static void OnTimer(object state) { GC.Collect(); // wymuszenie pracy GC } 1 raz – optymalizacja: kompilator zapamietuje miejsce do którego jest używana zmienna lokalna

25 Generacje Założenia: starsze obiekty żyją dłużej, starsze obiekty są potencjalnie silniej związane Po zakończeniu oznaczania usuwane są martwe obiekty z b. Pokolenia a żywe są przemieszczane

26 Generacje Sprzątanie Gen 0 – 1ms? Gen 1 – domyslnie 0.5-4MB Przypięte obiekty są promowane Wolania m. generacyjne (sprawdzane w momencie przypisania) Sterta dużych obiektów (>85KB dla.Net <=4.5.1) Od razu trafiają di generacji 2 Nie podlega kompaktowaniu (od wersji jest to możliwe jest ale tylko na rządanie) Zarządzana poprzez listę wolnych miejsc

27 Zarządzanie automatem void GC.Collect(Int32 Generation) void GC.Collect() GC.Collect(GC.MaxGeneration); Int32 GetGeneration(Object obj) void WaitForPendingFinalizers();

28 Konfiguracja GC Wokstation -> praca przy jednym procesorze Niewspółbieżna – wszystkie wątki robocze są zawieszone na cały czas sprzątania Współbieżna – przed.Net 4.0 większa część fazy oznaczania jest wykonywan współbieżnie (2 generacja) Współbieżna – od.Net wątki I foreground blokująco odśmieca 0,1 generację oraz upakowuje 2 II background jest nieblokujący I odznacza (ale nie upakowuje) 2 generację

29 Konfiguracja GC Serwer -> każdy procesor ma swoją stertę, alokacja I sprzątanie odbywają sie równolegle. Od 4.5 Praca w tle (2 wątki – analogicznie do workstation) Zbalansowana alokacja dużych obiektów – rownomiernie rozłożona na wszystkie sterty GC.Collect(2, GCCollectionMode.Optimized) GCCollectionMode: Default | Forced | Optimized.

30 Konfiguracja GC Batch – aplikacje bez GUI/operacji serwerowych jest zablokowany lub oba i są włączone. Interactive – GUI is włączony i is zablokowany LowLatency – aplikacje z wymaganym krótkim czasem odpowiedzi, wrażliwe na spowolnienie spowodowane przez GC (-> renderowanie grafiki ?) SustainedLowLatency: (od.NET 4.5) zarówno dla trybu stacji roboczej, jak i serwera. Pozwala odwlekać pełne odzyskiwanie pamięci dla długotrwałych operacji. GCSettings.LatencyMode = GCLatencyMode.SustainedLowLatency

31 Uwalnianie zasobów Na życzenie: Dispose Automatyczne: Finalizator

32 IDisposeable // Font : IDisposeable; Font font1 = new Font("Arial", 10.0f)... font1.Dispose();// finally? using (Font font1 = new Font("Arial", 10.0f)) { } Gdzie zwalniany jest obiekt?

33 Finalizator Jest przeznaczony do zwalniania zasobów Finalizatora nie definiuje sie explicite Finalizator jest generowany automatycznie - > destruktor public class BaseObj { public BaseObj() { } public ~ BaseObj () { // zwalnianie zasobów np. Close(db_connection); Console.WriteLine("In Finalize."); } /* protected override void Finalize() { // zwalnianie zasobów np. Close(db_connection); Console.WriteLine("In Finalize."); }*/

34 Finalizator Obiekty zawierające finalizator są wolniej alokowane, dużo wolniej zwalniane domyślnie żyją jedną generację dłużej dotyczy to również wszystkich obiektów, do których odwołuja się takie obiekty itd. nie jest znana kolejność wołań finalizatorów nie ma gwarancji ze finalizator zostanie uruchomiony MyObject : CriticalFinalizerObject void WaitForPendingFinalizers() w przypadku zabicia procesu nic nie pomoże F. nie sa wołane domyslnie dla klas bazowych (por. destruktor)

35 Kolejka do finalizacji kolejka obiektów do finalizacji – nie mogą one zostać usuniete bez finalizacji

36 Kolejka do finalizacji kolejka obiektów po finalizacji ale przed dealokacją powód: w jednej z kolejek (istnieją obiekty posiadające do nich wskaźnik)

37 Wskrzeszenie obiektu? Powód: W czasie finalizacji powstaje nowa referencja do obiektu rzucany jest wyjątek (tragedia!!!) przypisujemy coś do wskaźnika globalnego, statycznego, atrybutu żyjącego obiektu Problem: obiekt może być już sfinalizowany Rozwiązanie: flaga – finalizacja ukończona wykluczająca operacje Sterowanie mechanizmem finalizacji – przydatne gdy chcemy finallizować na życzenie GC.ReRegisterForFinalize(this); GC.SuppressFinalize(this);

38 Pattern Finalize/Dispose public class MyClass : IDisposable { private bool disposed = false; ~MyResource() { Dispose (false); } public void Dispose() // Do not make this method virtual. { Dispose (true); } public void Close() // Do not make this method virtual. { Dispose (true); }

39 Zwolnienie na życzenie private void Dispose(bool disposing) { // Check to see if Dispose has already been called. if(!this.disposed) { if(disposing) { AllComponent.Dispose(); GC.SuppressFinalize(this); } CloseHandle(handle); handle = IntPtr.Zero; disposed = true; } }

40 Słabe referencje void Method() { Object o = new Object(); // silna referencja WeakReference wr = new WeakReference(o); o = null; // usuwamy silną referencję o = wr.Target; if (o == null) { // GC zwolnił obiekt } else { // obiekt ciągle istnieje } }

41 Czy jest możliwy wyciek pamięci w.NET? btn.Click += OnBtnClick

42 Monitorowanie GC System.Diagnostics.PerformanceCounter

43 Critical Object Finalizers Podczas tworzenia pierwszego obiektu danego typu, metoda finalizująca jest kompilowana przez kompilator JIT (minimalizujemy ryzyko wystąpienia błędu braku pamięci potem – brak kompilacji przy pierwszym wołaniu) Finalizator jest wykonywany po wszyskich finalizatorach obiektów zwykłych CLR wywołuje metodę finalizacji nawet gdy AppDomain jest niespodziewanie zamykana przez aplikację hostującą (np. IIS). Ale nie możliwe jest dziedziczenie po innym obiekcie (brak wielodziedziczenia)

44 dodac GC handle calling the DumpHeap() method in the CLRProfiler API calling the LogWriteLine method in the CLRProfiler API

45 dodac class Host { public event EventHandler Click; } class Client { Host _host; public Client (Host host) { _host = host; _host.Click += HostClicked; } void HostClicked (object sender, EventArgs e) {... } } The following test class contains a method that instantiates 1,000 clients: class Test { static Host _host = new Host(); public static void CreateClients() { Client[] clients = Enumerable.Range (0, 1000).Select (i => new Client (_host)).ToArray(); // Do something with clients... }


Pobierz ppt "Programowanie Aplikacji Lokalnych w Środowisku.NET Organizacja pamięci Samodzielne zarządzanie pamięcią Pamięć w.NET."

Podobne prezentacje


Reklamy Google