C Tutorium – Memory Management – Knut Stolze. 2 Agenda Einführung in die Speicherverwaltung Stack vs. Heap Malloc Free Sizeof Tipps/Hinweise.

Slides:



Advertisements
Ähnliche Präsentationen
Einführung in die Programmiersprache C/C++
Advertisements

Imperative Programmierung
Imperative Programmierung
der Universität Oldenburg
4.5 Virtueller Speicher Problemsituation: Programme und Daten sind zu groß für den verfügbaren Arbeitsspeicher Frühere Lösung Aufspaltung der Programme.
Wiederholung Betriebssystem bietet eine Abstraktion der Hardware an:
C Tutorium – Fehlerbehandlung – Knut Stolze. 2 Grundsatz Also ist auch nach jedem Funktionsaufruf auf Fehler zu prüfen!! Jeder(!) Funktionsaufruf kann.
C Tutorium – Semaphoren –
Kapitel 3: Listen Lineare Liste: endliche Folge von Elementen eines Grundtyps (n>=0), leere Liste falls n=0 Listenelemente besitzen.
der Universität Oldenburg
der Universität Oldenburg
Enno Rehling und Roger Butenuth, Uni-GH Paderborn: Arminius: Software für Linux-basierte SCI-Cluster Arminius: Software für Linux-basierte SCI-Cluster.
SAP R/3 - Speichermanagement
Java: Dynamische Datentypen
Indirekte Adressierung
FH-Hof Indirekte Adressierung Richard Göbel. FH-Hof Einfache Speicherung von Daten Eine "einfache" Deklaration definiert direkt eine Speicherplatz für.
Java: Grundlagen der Sprache
Java: Referenzen und Zeichenketten
Garbage Collection Maik Theisen Betreuer: Guido Tack
Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt.
Dynamischer Speicher. Ein Vergleich aus dem täglichen Leben...
Dynamischer Speicher und Struktur
Objekte und Arbeitsspeicher
V AdresseWert public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher.
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
Verkettete Liste Visualisierung. New-Operator Mit dem New-Operator kann zur Laufzeit (dynamisch) Speicherplatz reserviert und angelegt werden Vorteil:
DVG Felder1 Felder. DVG Felder 2 Was sind Felder? Felder sind Reihungen aus endlich vielen Elementen gleichen Typs. Z.B.: Vektoren : (x.
Arrays,Strings&Pointer in C/C++
DVG Klassen und Objekte
Wir müssen also überlegen: Implementierung der Knoten, Implementierung der Kanten, daraus: Implementierung des Graphen insgesamt. Annahme: die Knoteninhalte.
Wichtige Fachausdrücke in C
Programmieren in C Zeichen-/Stringfunktionen Dynamischer Speicher
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Repetitorium PG : Pointer FH-Darmstadt, FB Informatik.
Java Garbage Collection Angelika Kusel, Überblick Was ist Garbage Collection? Vor- und Nachteile von GC GC-Algorithmen/Verfahren Java Garbage.
EPROG Tutorium Einheit 4 Klassen und Objekte. Wiederholung Schleifen do... while while for break/continue Strings String char Methoden für Strings Arrays.
Einführung in die Programmierung Wintersemester 2012/13 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Programmiersprache C 4
VP1 VP2 VP3 PP1.1 PP2.1 PP2.2 PP1.2 PP2.3 PP1.3 MMU VP1 VP2 VP3 PP1 PP4 PP6 MMU-Konfiguration für Prozess P1 Virtual Memory von P1 Physical Memory.
Vom Umgang mit Daten. public void myProgram() { int[] saeulenWerte = new int[world.getSizeX()]; for (int i = 0; i < saeulenWerte.length; i++) { saeulenWerte[i]
Eine Präsentation von Peter Rasser
Dynamische Datentypen
Variablenkonzept Klassisch, in Java Basistyp
EPROG Tutorium #3 Philipp Effenberger
Thomas Negeli | Reference Counting I Folie 1 / 20 Seminar Garbage Collection | WS2005 Reference Counting I Negeli Thomas.
Die Idee hinter Copying Garbage Collection (1) Aufteilung des Heaps in zwei Teile: To-Space und From-Space Nutzung eines Teiles durch das Programm Ist.
Programmieren in C Grundlagen C 2
Betriebssysteme Übung Tutorium „TLB & Virtual Memory“
5. Zeiger und komplexe Datenstrukturen
Autor: Timo Pagel Nutzung: Diese Lernkarten sind für die Nutzung mit OpenCards gedacht Siehe dazu
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
C Tutorium – Shared Memory – Knut Stolze. 2 Shared Memory Ein Speicherbereich, auf den mehrere Prozesse Zugriff haben – Also kein privater Speicher –
Pointer. Grundsätzliches: Im Arbeitsspeicher werden Daten gespeichert. Um auf die Daten eindeutig zugreifen zu können, werden diesen Daten Adressen zugeordnet.
Pointer. Precompiled Header  Vorübersetzung eingebundener Dateien häufig genutzt, selten geändert  Projekttyp „Win32 Console Application“
Variablen und Operatoren. C++ Teil 2: Grundstrukturen Variablen Operatoren Kontrollstrukturen Funktionen Header-Dateien Pointer und Referenzen.
Tutorium Software-Engineering SS14 Florian Manghofer.
Pointer, Arrays und verkettete Listen. Mehrdimensionale Arrays  Pointer auf ein Array von Pointern  int32 **matrix = new int32*[3];  matrix: Zeiger.
Tutorium Software-Engineering SS14 Florian Manghofer.
C++ FÜR cOMPUTERSPIELENTWICKLER
Strukturen (Eigenschaften) Strukturen dienen zur Zusammenfassung mehrerer Komponenten verschiedener Typen zu einer Einheit, die dann mit gemeinsamen Namen.
Pointer. * und &  Bei der Definition int var1; ○ // „normale“ Variable int *var2; ○ // Zeiger auf einen Integer int *var2 = NULL; ○ // … incl. Initialisierung.
Dr. Wolfram Amme, Automatische Speicherverwaltung, Informatik II, FSU Jena, SS Automatische Speicherverwaltung.
ESP Tutorium Studienassistent: Ewald Moitzi Gruppe 1.
Anforderungen an die neue Datenstruktur
Dynamischer Speicher malloc wird in c++ eher nicht mehr verwendet.
Programmieren in C Wie speichert C
Objektorientierte Programmierung
 Präsentation transkript:

C Tutorium – Memory Management – Knut Stolze

2 Agenda Einführung in die Speicherverwaltung Stack vs. Heap Malloc Free Sizeof Tipps/Hinweise

3 Speicherverwaltung Speicher (RAM) ist (meist) liniar und ein zusammenhängender Bereich – Muss unterteilt/strukturiert werden Alle Informationen (Daten und Programme) müssen im Hauptspeicher abgelegt werden Virtualisierung von Speicher – Erweiterung des physisch vorhandenen Hauptspeichers um Paging/Swap Space – Betriebssystem kümmert sich um Paging/Swapping

4 Speicherverwaltung (2) Programme können parallel laufen – Jedes Programm ist unabhängig von anderen – Speicher muss zugeteilt/reserviert werden – Jede Variable in einem Programm muss in einem zuvor reservierten Speicherbereich abgelegt werden! Prozess 1Prozess 3 Gesamter (virtueller) Speicher

5 Stack vs. Heap Speicher, der einem Programm insgesamt zur Verfügung steht HeapStack Stack-Pointer

6 Stack vs. Heap (2) Stack und Heap teilen sich gesamten zur Verfügung stehenden Speicher – Pro Prozess Heap: dynamisch benötigter Speicher Stack: statisch verwendeter Speicher

7 Stack Für alle statischen Informationen während des Programmablaufs – Wird zur Laufzeit allokiert – nicht beim Starten! Aufrufinformationen – Welche Funktion wurde von wo aufgerufen – Parameter der aufgerufenen Funktion – Rücksprungadresse Statische Variablen in der Funktion – Z.B. int a[50] Genügend Speicher für 50 “int” Werte – Werden automatisch beim Verlassen der Funktion aufgeräumt, d.h. der Speicher wird wieder freigegeben

8 Stack (2) Andere Programmiersprachen – C++: Destruktor von Objekten wird aufgerufen und Speicher wird freigegeben – Java: Reference count von Objekten auf dem Stack wird reduziert  garbage collector räumt auf Allokation auf dem Stack ist schneller/performanter als vom Heap – Heap kann Fragmentieren; Stack nicht

9 Heap Für dynamisch allokierten Speicher Wird vom Betriebssystem (OS) verwaltet – Funktion “malloc” fordert Speicherblock an Passender Block muss gesucht, reserviert und zurückgegeben werden – Funktion “free” gibt zuvor angeforderten Speicherblock wieder frei OS verwaltet alle angeforderten Speicherblöcke Speicher des Heaps kann fragmentieren

10 Ulimit (Unix) Legt Maximum von Resourcen für einen Prozess fest: – Maximal nutzbarer Speicherbereich (virtuell) – Größe des Stacks – Größe von “core” Dateien – Größe des “data segment” eines Prozesses – Größe von Dateien, die ein Prozess anlegen kann – Größe des ge”pin”ten SpeicherbereichsAnzahl der geöffneten Dateien – Blockgröße bei Pipes – Anzahl der Prozesse eines Nutzers – CPU-Zeit

11 Malloc Fordere einen Speicherblock vom Heap an ptr = malloc(size); – “ptr” ist ein Zeiger auf den Beginn des Speicherblocks Ein Zeiger ist eine Adresse im Hauptspeicher – “size” ist die Größe des Blocks in Anzahl von Bytes Speicherblock Heap im Hauptspeicher ptr (0x )

12 Malloc (2) Gibt Zeiger vom Typ “void *” zurück – Typ der Werte, die im Speicherblock hinterlegt werden sollen ist “malloc” nicht bekannt – Typ muss mittels Cast umgewandelt werden int *ptr = NULL; ptr = (int *)malloc(size); Es darf nicht ausserhalb des allokierten Speicherblocks zugegriffen werden – Speicher könnte anderen Prozessen oder anderen Datenstrukturen des gleichen Prozesses gehören

13 Malloc (3) Ähnliche Systemfunktionen: – calloc Andere Programmiersprachen verwenden ähnliche Operatoren, die Typisierung gleich mitliefern, d.h. der Cast wird intern gleich mit erledigt: – C++: Class *object = new Class(); – Java: Class object = new Class();

14 Grundlagen von Zeiger-Arithmetik Ergebnis von “malloc” zeigt auf 1 Element des spezifizierten Datentyps ptr = (int *)malloc(size); – “ptr” zeigt auf ein “int”-Wert Zeigerarithmetik arbeitet grundsätzlich auf dem zu Grunde liegenden Datentyp – “ptr = ptr + 1;” lässt den Zeiger auf den nächsten “int”- Wert zeigen (und nicht auf das zweite Byte)

15 Free Angeforderte Speicherblöcke müssen wieder freigegeben werden free(ptr); – Sobald nicht mehr gebraucht – Geschieht automatisch beim Programmende Zeiger auf Speicherblock darf bis zum “free” nicht verloren gehen! Ein Block kann nur genau 1x freigegeben werden – Mehrfache “free” Operationen könnten einen falschen Block freigeben – Danach darf Block nicht mehr verwendet werden

16 Free (2) Freigegebener Block (oder ein Teil davon) kann beim nächsten “malloc” wieder vergeben werden Andere Programmiersprachen verwenden intern auch “free”: – C++: delete-Operator – Java: garbage collection

17 Sizeof Operator Anzahl der Bytes von Datentypen kann von Plattform zu Plattform variieren – Z.B. unterschiedliche Größen von “int” Werten (32 vs. 64 Bit Prozessoren) – Unterschiedliche Optimierungsstrategien der Compiler – Unterschiedliche Mächtigkeit/Performance der Adressierungsbefehle des Prozessors – Zugriff auf Speicheradressen, die ein Vielfaches von 4 Bytes sind, oft schneller als Adressierung einzelner Bytes

18 Sizeof Operator (2)  Padding-Bytes können vom Compiler eingeschoben werden  Genaue Größe von Strukturen oft nicht bekannt oder soll nicht hart-verdrahtet werden (Portabilität)

19 Sizeof Operator (3) “sizeof” berechnet Größe eines Wertes oder eines Datentyps size = sizeof(int); size = sizeof(struct myStruct); size = sizeof myValue; – Anzahl an Bytes, die die physisch Repräsentation im Speicher benötigt ptr = (int *)malloc(N * sizeof(int)); Kann bereits zur Übersetzungszeit errechnet werden und belastet somit nicht die Laufzeit

20 Realloc Vorgrößern von Speicherblöcken ist nicht direkt möglich – Andere Speicherblöcke können physisch im Speicher direkt dahinter liegen int *ptr = NULL; int *biggerPtr = NULL; ptr = (int *)malloc(orig_size); … biggerPtr = (int *)realloc(ptr, new_size);

21 Memset, memcpy, memmove Angeforderte Speicherblöcke (malloc) sollten immer initialisiert werden memset(ptr, 0x00, size); – Bei sicherheitskritischen Anwendung ist ein “Leeren” vor dem Freigeben auch oft ratsam! Kopieren zwischen überlappungsfreien Speicherblöcken memcpy(destination, source, size); Kopieren zwischen überlappenden Speicherblöcken memmove(destination, source, size);

22 Richtlinien & Tipps Speicherallokation kann fehl schlagen!! – Ergebnis ist dann NULL-Zeiger – Ergebnis muss immer überprüft werden Speicherblock nach “free” nicht weiter verwenden – Am besten Zeiger auf NULL setzen: free(ptr); ptr = NULL

23 Richtlinien & Tipps (2) Alle Variablen sofort bei der Deklaration initialisieren char *str = NULL; int counter = 0; str = (char *)malloc(strlen(orig_str)+1); if (!str) { … } memset(str, 0x00, strlen(orig_str)+1);

24 Potientielle Probleme Keine gute Kontrolle über Speicher – Keine Gruppierung von Speicher – Keine Fehlermeldung beim falschen Freigeben  Programm stürzt eventuell ab; vielleicht auch an ganz anderer Stelle Buffer Overflow verhindern – Zugriff ausserhalb des aktuellen Speicherblocks – Oft keine/unzureichende Prüfung von Überläufen – Kann sich oft zu Sicherheitsproblemen ausweiten

25 Potentielle Probleme (2) Memory Leaks – angeforderter Speicher wird nie freigegeben – Zeiger auf Speicherblock ist verloren gegangen Funktionen dürfen keinen Zeiger in den Stack zurückgeben – Informationen auf dem Stack sind beim Verlassen der Funktion nicht mehr gültig “free” auf Objekt auf dem Stack ist nicht zulässig – Führt meist zum Absturz des Programms