programowanie aplikacji lokalnych w rodowisku net n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
Programowanie Aplikacji Lokalnych w Środowisku .NET PowerPoint Presentation
Download Presentation
Programowanie Aplikacji Lokalnych w Środowisku .NET

Loading in 2 Seconds...

play fullscreen
1 / 36

Programowanie Aplikacji Lokalnych w Środowisku .NET - PowerPoint PPT Presentation


  • 105 Views
  • Uploaded on

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

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Programowanie Aplikacji Lokalnych w Środowisku .NET' - ivor-dejesus


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
programowanie aplikacji lokalnych w rodowisku net

ProgramowanieAplikacjiLokalnychw Środowisku .NET

Organizacja pamięci

Samodzielne zarządzanie pamięcią

Pamięć w .NET

pami 2gb
Pamięć > 2GB
  • W systemach 32b (począwszyod Windows 2000 Advanced Server), Windows XP Pro możnazredukowaćprzestrzeńjądra do 1GB (iuzyskać 3GB w trybieużytkownika)
    • /3GB w boot.ini
    • linker - /LARGEADDRESWARE
    • Problemy z kompatybilnościąprzyniestand. wykorzystaniuprzezprogramistówgórnegobituwskaźnika do
  • Żeby zobaczyć więcejniż 3GB system musi pracować w trybie PAE –> pot. problemy ze sterownikami
  • Windows 64B – 4TB
operacje na pami ci win32
Operacjenapamięci (Win32)
  • dwaetapypobieraniablokupamięciVirtualAlloc
    • rezerwacjaMEM_RESERVE
    • przydzielenieMEM_COMMIT
  • dwaetapyzwalnianiablokupamięciVirtualFree
    • oddzielenieMEM_DECOMMIT
    • przydzielanieMEM_RELEASE
  • atrybutydostępu do blokupamięciVirtualProtect
  • blokowaniezrzucaniapamięcinadyskVirtualLock / Unlock
pami wirtualna dost p
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ć)
stan pami ci
Stan pamięci

statystykasystemu:

  • GlobalMemoryStatus: 32Bit -> przestrzeń 4GB
    • 2GB aplikacja 2GB system
    • 3GB+1GB – system boot.ini: „/3GB”orazIMAGE_FILE_LARGE_ADDRESS_AWARE dlaaplikacji
  • 64Bit -> >4GB

.NET:

  • System.Management.ManagementClass("Win32_OperatingSystem")
  • System.Management.ManagementClass.GetInstances
  • System.Management.ManagementObject.Properties

stanprzestrzeniadresowej:

  • VirtualQuery
  • VirtualQueryEx(hProcess, ...)
reprezentacja danych
Reprezentacjadanych

Typywartościowe:

  • typyproste, stuktury
  • alokowanenastosie
  • niemożnaponichdziedziczyć

Typyreferencyjne:

  • obiekty
  • alokowanenasterciezarządzalnej
  • unikatowatożsamość
  • dodatkowepola (sync block, Method Table Pointer )
reprezentacja
Reprezentacja

Kolejnośćpól

  • LayoutKind.Auto — o kolejnościułożeniadecyduje CLR.
  • LayoutKind.Sequential — kolejnośćułożeniaodpowiadakolejnościdefinicjipólobiektu w kodzieźródłowym.
  • LayoutKind.Explicit – kolejność jest określonaprzezpodaniekonkretnychoffset’ów.
  • Boxing/unboxing
boxing unboxing
Boxing/unboxing

structPktValue {

public byte X; publicbyte Y;

}

Object Test(Object obj) {

return obj;

}

PktValuev = new PktValue();

Object o = Test(v);

v = (PktValue) o;

Kolekcjegeneryczne

Przeciązaniematod Equals, ImplementacjaEquatable<T>,IComparable<T>

slide9

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());

}

};

slide10

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

slide11

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 Konwersjajaka 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

ycie obiektu wg gc
Życieobiektuwg. GC
  • Rezerwacja - new (IL->newobj)
  • Inicjalizacja (konstruktor)
  • Użycie
  • Deterministyczneuwolnieniezasobów(Dispose)
  • Zaznaczanienieużytków (Mark)
  • Ew. Uwolnieniezasobów (Finalizacja)
  • Zwolnieniepamieci(Sweep&Pack)
gc mark sweep compact
GC Mark&Sweep&Compact

GC - Poszukuje o oznaczaobiekty, któremająkorzeń w

  • zmiennychstatycznych
  • zmiennychlokalnych
  • referencjachmiedzy-generacyjnych
  • obiektach w kolejce do finalizacji

Niezaznaczoneobiektyusuwaikompaktujestertę

sterta zarz dzana
Sterta zarządzana
  • Przydziałniewymagaprzeglądania list wolnychbloków)
  • Możliwa jest reorganizacjasterty
obiekty i mieci
Obiektyiśmieci

Zaznaczanesą:

  • statyczneobiekty
  • Lokalneobiekty
  • paramertyfunkcji
  • Obiektybędącewłasnościąówjużjużzaznaczonych

W momenciebrakupamięciprzeprowadzane jest odśmiecanie

ile razy wykona si gc
Ile razywykonasię 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(); // wymuszeniepracy GC

}

}

ile razy wykona si gc1
Ile razywykonasię 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(); // wymuszeniepracy GC

}

}

  • 1 raz – optymalizacja: kompilator “zapamietujemiejsce do którego jest używanazmiennalokalna”
generacje
Generacje
  • Założenia:
    • starszeobiektyżyjądłużej,
    • starszeobiektysąpotencjalniesilniejzwiązane
  • Po zakończeniuoznaczaniausuwanesąmartweobiekty z b. Pokolenia a żywesąprzemieszczane
generacje1
Generacje
  • Sprzątanie Gen 0 – 1ms?
  • Gen 1 – domyslnie 0.5-4MB
  • Przypięteobiektysąpromowane
  • Wolania m. generacyjne (sprawdzane w momencieprzypisania)

Stertadużychobiektów (>85KB dla.Net <=4.5.1)

  • Odrazutrafiajądigeneracji 2
  • Niepodlegakompaktowaniu (odwersji 4.5.1 jest to możliwe jest ale tylkonarządanie)
  • Zarządzanapoprzezlistęwolnychmiejsc
zarz dzanie automatem
Zarządzanie automatem
  • void GC.Collect(Int32 Generation)
  • void GC.Collect()

GC.Collect(GC.MaxGeneration);

  • Int32 GetGeneration(Object obj)
  • void WaitForPendingFinalizers();
konfiguracja gc
Konfiguracja GC

Wokstation -> pracaprzyjednymprocesorze

Niewspółbieżna – wszystkiewątkiroboczesązawieszonenacałyczassprzątania

Współbieżna – przed.Net 4.0 większaczęśćfazyoznaczania jest wykonywanwspółbieżnie (2 generacja)

Współbieżna – od.Net 4.0 2 wątki

I foreground blokującoodśmieca 0,1 generacjęorazupakowuje 2

II background jest nieblokujący I odznacza (ale nieupakowuje) 2 generację

konfiguracja gc1
Konfiguracja GC

Serwer -> każdyprocesor ma swojąstertę, alokacja I sprzątanieodbywająsierównolegle.

Od 4.5

Praca w tle (2 wątki – analogicznie do workstation)

Zbalansowanaalokacjadużychobiektów – rownomiernierozłożonanawszystkiesterty

  • GC.Collect(2, GCCollectionMode.Optimized)
  • GCCollectionMode: Default | Forced | Optimized.
konfiguracja gc2
Konfiguracja GC

Batch – aplikacjebez GUI/operacjiserwerowych

<gcConcurrent> jest zablokowanyluboba <gcConcurrent> i <gcServer> sąwłączone.

Interactive – GUI

<gcConcurrent> is włączonyi <gcServer> is zablokowany

LowLatency – aplikacje z wymaganymkrótkimczasemodpowiedzi, wrażliwenaspowolnieniespowodowaneprzez GC (-> renderowaniegrafiki?)

SustainedLowLatency: (od .NET 4.5)zarówno dla trybu stacji roboczej,jak i serwera. Pozwalaodwlekać pełne odzyskiwaniepamięci dladługotrwałychoperacji.

GCSettings.LatencyMode = GCLatencyMode.SustainedLowLatency

uwalnianie zasob w
Uwalnianiezasobów

Na życzenie: Dispose

Automatyczne: Finalizator

idisposeable
IDisposeable

// Font : IDisposeable;

Font font1 = new Font("Arial", 10.0f)

...

font1.Dispose(); // finally?

using (Font font1 = new Font("Arial", 10.0f))

{

}

Gdziezwalniany jest obiekt?

finalizator
Finalizator
  • Jest przeznaczony do zwalnianiazasobów
  • Finalizatoraniedefiniujesieexplicite
  • Finalizator jest generowanyautomatycznie - > destruktor

public class BaseObj {public BaseObj() {}public ~ BaseObj () { // zwalnianiezasobównp. Close(db_connection);Console.WriteLine("In Finalize.");}

/* protected override void Finalize() { // zwalnianiezasobównp. Close(db_connection);Console.WriteLine("In Finalize."); }*/

finalizator1
Finalizator

Obiektyzawierającefinalizator

    • sąwolniejalokowane, dużo wolniejzwalniane
    • domyślnie „żyjąjednągeneracjędłużej”
  • dotyczy to równieżwszystkichobiektów, do którychodwołujasiętakieobiektyitd.
  • nie jest znanakolejnośćwołańfinalizatorów
  • nie ma gwarancjizefinalizatorzostanieuruchomiony

MyObject : CriticalFinalizerObject

voidWaitForPendingFinalizers()

w przypadku zabicia procesu nicnie pomoże

  • F. niesawołanedomyslniedlaklasbazowych (por. destruktor)
kolejka do finalizacji
Kolejkado finalizacji

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

kolejka do finalizacji1
Kolejka do finalizacji

kolejka obiektów po finalizacji ale przed dealokacją

powód: w jednej z kolejek (istniejąobiektyposiadające do nichwskaźnik)

wskrzeszenie obiektu
Wskrzeszenieobiektu?

Powód: W czasiefinalizacjipowstajenowareferencja do obiektu

  • rzucany jest wyjątek (tragedia!!!)
  • przypisujemycoś do wskaźnikaglobalnego, statycznego, atrybutu „żyjącegoobiektu”

Problem:

  • obiektmożebyćjuż „sfinalizowany”

Rozwiązanie:

  • flaga – „finalizacjaukończona” wykluczająca operacje

Sterowanie mechanizmem finalizacji – przydatne gdy chcemy finallizować na życzenie

GC.ReRegisterForFinalize(this);

GC.SuppressFinalize(this);

pattern finalize dispose
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);}

zwolnienie na yczenie
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; }}

s abe referencje
Słabe referencje

void Method() {Object o = new Object(); // silnareferencjaWeakReferencewr = new WeakReference(o);o = null; // usuwamysilnąreferencjęo = wr.Target;

if (o == null) {

// GC zwolniłobiekt}

else { // obiektciągleistnieje}

}

monitorowanie gc
Monitorowanie GC

System.Diagnostics.PerformanceCounter

critical object finalizers
Critical Object Finalizers

Podczas tworzenia pierwszego obiektu danego typu, metoda finalizującajest kompilowana przez kompilator JIT (minimalizujemyryzykowystąpienia błędu braku pamięci potem – brakkompilacjiprzypierwszymwołaniu)

Finalizator jest wykonywany powszyskichfinalizatorachobiektówzwykłych

CLR wywołuje metodę finalizacji nawet gdy AppDomainjest niespodziewaniezamykana przez aplikację hostującą (np. IIS).

Ale niemożliwe jest dziedziczeniepoinnymobiekcie(brakwielodziedziczenia)