Speicherverwaltung

Algorithmen, Sprachunabhängige Diskussionen zu Konzepten, Programmiersprachen-Design
Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Speicherverwaltung

Beitrag von cloidnerux » Sa Nov 29, 2008 7:09 pm

ICh meine, wenn irgendwer ein Pointer Initialisiert, ihn aber nicht Refernziert, dann muss ich das wissen, um zu verhindern, das er meine GDT zerstört.
Auch wenn irgendwer eine VAriable ohhne malloc() haben will, muss ich das Wissen, um evt. irgenwas spezielles zu machen.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Speicherverwaltung

Beitrag von Xin » Sa Nov 29, 2008 7:12 pm

cloidnerux hat geschrieben:ICh meine, wenn irgendwer ein Pointer Initialisiert, ihn aber nicht Refernziert, dann muss ich das wissen, um zu verhindern, das er meine GDT zerstört.
Nein, musst Du nicht. Dann entsteht ein Memory-Leak.
cloidnerux hat geschrieben:Auch wenn irgendwer eine VAriable ohhne malloc() haben will, muss ich das Wissen, um evt. irgenwas spezielles zu machen.
Es gibt keine Variablen ohne malloc().
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Speicherverwaltung

Beitrag von cloidnerux » Di Dez 02, 2008 5:29 pm

Jezt steh ich total auf dem Schlauch.
Heißt das jezt also, das bei jedem Aufruf wie dieser hier:

Code: Alles auswählen

int var=10;
eine Funktion und/oder Interrupt aufgerufen wird, um dem System evt. mitzuteilen, das irgenwas Speicher haben will??
Ich dann alos nurnoch meine Speicherverwaltung auf diesen INterrupt zu mappen, und es läuft??
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Speicherverwaltung

Beitrag von Kerli » Di Dez 02, 2008 5:47 pm

cloidnerux hat geschrieben:Jezt steh ich total auf dem Schlauch.
Heißt das jezt also, das bei jedem Aufruf wie dieser hier:

Code: Alles auswählen

int var=10;
eine Funktion und/oder Interrupt aufgerufen wird, um dem System evt. mitzuteilen, das irgenwas Speicher haben will??
Ich dann alos nurnoch meine Speicherverwaltung auf diesen INterrupt zu mappen, und es läuft??
Nein. Um soetwas muss sich der Compiler kümmern, da diese Variablen ja auf dem Stack liegen. Bei der Speicherverwaltung geht es um den Heap, dh. um Speicher der mit malloc/free bzw. new/delete angefordert und freigegeben wird.

Ich hoffe ich liege damit nicht ganz daneben, aber soweit ich das verstanden habe sollte es stimmen :D
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Speicherverwaltung

Beitrag von Xin » Di Dez 02, 2008 6:09 pm

Kerli hat geschrieben:Nein. Um soetwas muss sich der Compiler kümmern, da diese Variablen ja auf dem Stack liegen. Bei der Speicherverwaltung geht es um den Heap, dh. um Speicher der mit malloc/free bzw. new/delete angefordert und freigegeben wird.
Startet ein Programm, so muss das Programm erst mittels malloc() Speicher für den Stack organisieren. Dafür, dass das Programm sich einen Stack besorgt ist entweder das OS verantwortlich, in dem es den Stack an das Program übergibt oder das Programm selbst.
Das Annehmen und Verarbeiten, bzw. Anfragen nach Stack geschieht in der Startroutine des Programms und das ist bei einem C-Programm nicht main().
main() ist lediglich der Einsprungpunkt, ab dem die Anweisungen des Programmierers abgearbeitet werden. main ist nichts weiter als eine normale Funktion, die von dem Programm gerufen wird, den der Compiler noch drumrum konstruiert.
Diese Startroutinen sorgen zum Beispiel dafür, dass main(argc, argv) die Parameter in kleinen Häppchen bekommt, statt lediglich einen langen String.

Lokale Variablen landen vollständig auf dem Stack, das bedeutet, dass für ein 'int var' kein zusätzliches malloc() erforderlich ist.
Belegt man zuviele lokale Variablen, zum Beispiel, weil man eine Funktion immer wieder rekursiv Aufruf, bekommt man einen "Stack overflow error": Das Programm schreibt über die Größe des Stacks hinaus, schreibt also in Bereiche, in die es nicht reinschreiben darf, also stürzt es ab.

Fazit: das OS muss sich (erstmal) nur um malloc kümmern. Was Du meinst ist Paging und das schreibst Du noch nicht.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Speicherverwaltung

Beitrag von cloidnerux » Di Dez 02, 2008 6:18 pm

Aber dann müsste der Stack auch im Arbeitsspeicher des Computer ligen, und würde sich mit jeder neuen Variable Vergrößern.
Denn wenn man 1000 VAriablen a 4Byte nutzt, dann kommt amn auch auf 4KB und hat somit ne Page voll.
Da ich selber auch anderweitig Programmiere, weiß ich, das ich selten malloc verwende.
Xin hat geschrieben:Es gibt keine Variablen ohne malloc().
Würde also heißen, das ich vor jedem Variablenaufruf ein malloc stellen müsste,
oder es für normale Variablen nicht gilt.

Also wenn Kerli recht hat, dann müsste ich also nur eine Bitmap haben, um die malloc() Funktion auf entsprechende Speicherstellen zu richten.
Nichts weiter??
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Speicherverwaltung

Beitrag von Dirty Oerti » Di Dez 02, 2008 6:35 pm

Vieles richtig, ein paar Dinge (das OS betreffend) nicht ganz so richtig.

Was klar geworden sein dürfte: Es wird natürlich kein Interrupt/keine Funktion bei jeder Variablenbenutzung verwendet.
Worauf Speicherverwaltung UND Speicherschutz hinauslaufen ist, dass jedes einzelne Programm "scheinbar" 4GB Speicher hat und auf den Speicher des anderen Programms nicht zugreifen kann.
Dazu benötigt es natürlich gewisse Mechanismen...

Dazu gehört einmal die Speicherverwaltung (was in diesem Sinne noch so gut wie überhaupt nichts mit malloc zu tun hat) und Paging/Segmentierung für den Speicherschutz.
Bevor du deinen Speicher schützt, solltest du aber erstmal wissen, welcher Speicher überhaupt benutzt wird.
Du musst also eine Möglichkeit (z.B. durch eine Bitmap) finden, um für jeden Teil (meist 4KB Teile, genannt Frames) speichern zu können, ob es benutzt wird oder frei ist.
Mehr nicht. Um Programme hast du dich im Moment wirklich gar nicht zu kümmern, bekomme erst einmal deinen Speicher in den Griff.

Wenn du eine Möglichkeit gefunden hast, dann implementiere Funktionen, die einzelne Frames (nur ganze Frames, also immer 4 kB !) anfordern und freigeben können.

Über diese Funktionen forderst du ab dem Zeitpunkt deinen Speicher an. Da du nicht jedesmal 4 KB besetzen willst, wenn du nur ein int speichern willst, solltest du dir später einen sog. Heap einbauen, der dann über die Funktionen malloc und free verfügt (die sind NUR für den Kernel, vergiss Programme, davon bist du noch weit weit weg).

Bevor du diesen Heaps implementierst, solltest du dir über Paging Gedanken machen.
Aktiviere es und verwalte es richtig.

Dann kannst du iwo im virtuellen Speicher eine Adresse festlegen, an der der Heap steht. Der Heap ist im Endeffekt nur ein riesiger Platz mit unterschiedlich großen Strukturen drinnen, die einen Datenteil (zum Benutzen) und einen Informationsteil beinhalten. Im Infoteil steht dann z.B. wie groß der Datenbereich ist oder auch ob der Bereich frei ist oder nicht. Dann kannst du freie Bereiche (aneinandergrenzende) zu einem großen freien Bereich zusammenfügen. Willst du nun einen Teil des Speichers, dann musst du neue Strukturen dahinein pflanzen.
Das macht malloc/free.

Für jedes Programm existiert aber ein eigenes malloc/free (sonst könntest du den Speicher nicht schützen).
Die Funktionen muss jedes Programm natürlich nicht bereitstellen, die werden in Form von Libaries mitgegeben. Den Bereich, in dem der Heap liegt festlegen macht meines Wissens nach entweder der Compiler oder es ist Aufgabe des Betriebssystems.

MfG
Daniel

P.S.: Vergiss verdammt nochmal Programme^^ :D


Nochwas:
Startet ein Programm, so muss das Programm erst mittels malloc() Speicher für den Stack organisieren.
Das Programm bekommt eine "große leere Wüste" an Speicher, darin ist ein Bereich als Stack festgelegt. Malloc() hat da meines Wissens nach nichts zu schaffen.


--------

Aber dann müsste der Stack auch im Arbeitsspeicher des Computer ligen, und würde sich mit jeder neuen Variable Vergrößern.
Genau das tut der Stack.
Würde also heißen, das ich vor jedem Variablenaufruf ein malloc stellen müsste,
oder es für normale Variablen nicht gilt.
So sieht eine "normale" Variable aus:

Code: Alles auswählen

00102d0b <test>:
  102d0b:	55                   	push   %ebp
  102d0c:	89 e5                	mov    %esp,%ebp
  102d0e:	83 ec 08             	sub    $0x8,%esp #### Hier wird Speicher für die lokale Variable frei
  102d11:	c7 04 24 05 00 00 00 	movl   $0x5,(%esp) ### Hier wird in den Speicher geschrieben
  102d18:	e8 23 fd ff ff       	call   102a40 <PENX>
  102d1d:	c9                   	leave  
  102d1e:	c3                   	ret    

Code: Alles auswählen

void test(void){
    int a;
    a = 5;
    PENX(a);
}
Lies dir am besten mal im Wiki das Kapitel Stack durch, dann weißt du, wie man Speicher auf dem Stack bekommt :)
Nichts weiter??
Viel Spaß ;) *lach*
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Speicherverwaltung

Beitrag von cloidnerux » Di Dez 02, 2008 7:08 pm

OK, werde mich mal daran versuchen
P.S.: Vergiss verdammt nochmal Programme^^
Mann sollte vielleciht doch ein Bsschen an die Zukunft denken und ich akns mir leichter vorstellen.

Aber thx das du Mir geholfen hast.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Speicherverwaltung

Beitrag von Dirty Oerti » Di Dez 02, 2008 7:10 pm

cloidnerux hat geschrieben:
P.S.: Vergiss verdammt nochmal Programme^^
Mann sollte vielleciht doch ein Bsschen an die Zukunft denken und ich akns mir leichter vorstellen.
Nein, was passiert, wenn du an Programme denkst ist, dass du anfängst Dinge zu verwechseln. So, wie es bei einem normalen Programm abläuft wird es eben nicht bei deinem Kernel ablaufen können.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Speicherverwaltung

Beitrag von cloidnerux » Di Dez 02, 2008 7:20 pm

JO.
Noch eine kleine Frage:
Muss eine Bitmap volle 4 GB abdecken, oder sich dynamisch nach dem Speicher richten??

Edit: Muss hier noch was Notieren:
Jede Page ist 4.096KB goß
es müssen 4.294.967.296 Byte Verwaltet werden
in 1.048.576 frames unterteilt, das man in
einer Bitmap von der Länge

Code: Alles auswählen

long int bitmap[131.072];
angelegt werden.
Richtig??
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten