PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : malloc



29-03-2001, 13:36
Hi

Nun man (frau) müßte sich mal die Funktion malloc() genauer ansehen !

Ich schätze es wird so sein das die Funktion den verwendeten Speicherbereich speichert (!)
sich merkt ) und dann jegliche Zugriffe per durch ne eigene Routine einfach abblockt .. oder so http://www.linuxforen.de/ubb/smile.gif))

Ich werd für dich mal in meinem Programmierkurs nach sehen !!!!

CU PS .: Viel spaß beim allocieren ( klingt irgendwie schweinisch dieser Begriff

------------------
Echelon`sNetz (http://www.echelonnet.de)

thommy
29-03-2001, 16:27
Also malloc tut nichts anderes, als beim Betriebssystem den gewünschten Speicher anzufordern. Die Verwaltung und der Schutz dessen obliegt dem Betriebsystem.

Während dynamische Objekte (die mit malloc bzw. new erzeugt werden) auf dem so genannten Heap angelegt werden, landen statische Variablen auf dem Stack. Jede Funktion (oder wie Du es nennst: jedes Objekt) verfügt über seinen eigenen Stack und dieser wird automatisch freigegeben, sobald die Funktion endet bzw. das Objekt stirbt.

Eine "int i"- Variable darfst (und kannst) Du niemals manuell frei geben. Und ein Buch wäre vielleicht doch eine Hilfe http://www.linuxforen.de/ubb/wink.gif

Thomas

christophwth
29-03-2001, 16:28
Hi

zu deiner malloc frage , malloc ist C
jeder speicher bereich der mit malloc freigegeben wurde muß zur programmlaufzeit
mit free wieder freigegeben werden.
der kernel oder viel mehr das speichermanage ment greift nur ein wenn du versuchst den dir zu gewiesenen speicherbereich zu überschreiten.
das resultat ist meisst ein segmentation fault.
wenn ein programm beendet wird, wird der von ihm genutzte speicherbereich automatisch wieder freigegeben.
bei variablen ist es etwas anders.
jede variable, ausgenommen globale, ist nur innerhalb eines blocks gültig , bzw existent.
ein block wird in C durch {} begrenzt.
das mit den objekten ist c++ dort laufen die vorgänge ähnlich.
aber, ein neues objekt, in c++ ist alles ein
objekt, wird mit new erzeugt und mit delete
vernichtet.

das nur als kurze erklärung.
gruss
christoph

29-03-2001, 18:51
cool, danke leute,
hat mir wirklich geholfen, hab immer das problem, dass ich das alles genau verstehen will,
der satz: " das machst du einfach so und so und dann geht das irgendwie"
is mir immer zu wenig, ...
aber danke, werd mich wohl mal bischen näher damit beschäftigen ... genauso interessiert mich, wie das geht, das man auch in C OO programmieren kann, bin von java(zwangsweise) jetz mal auf c++ (weils mir spass macht http://www.linuxforen.de/ubb/wink.gif ) umgestiegen, und jetz würd mich schon mal interessieren, wie man OO relativ hardwarenah umsetzen kann, aber will euch nich ausnutzen, ich nerv ja hier schon oft genug mit ziemlich seltsamen fragen ... http://www.linuxforen.de/ubb/wink.gif
have a nice day

29-03-2001, 22:32
Hi, Ich probier mal nen Speicherrundumschlag

Unter C gibts es drei Arten von Speicher:
<ul>
statisch allozierter Speicher: globale Variablen (per Definiton beim Programmstart mit Null gefuellt, falls nicht explizit initialisiert).
Stack: locale/automatische Variablen: alle am Anfang einer Funktion deklarierten Variablen, liegen zusammen mit der Ruecksprungadresse der Funktion auf dem Stack (das ermoeglicht die Buffer overruns)
mit malloc/free verwalteter Speicher: Dynamisch alloziert.
[/list]

Das Betriebssystem verwaltetet den Specher in gewissen Bloecken, auch Pages genannt. (Unter Linux/386 typischerweise 4 kBytes gross).

Ein Programm kann nun solche Bloecke von Betriebsystem anfordern. So ein Block kann den verschiedene Eigenschaften haben (z.B. Read_only (nur lesbar ;-), executable (enthaltender code kann ausgefuert werden), shared (darf von mehreren Prozessen genutzt werden), etc.. ).
Diese Bloecke die irgendwo im pyhsikalischem Speicher liegen koennen, werden an bestimmten Stellen in den logischen Adressraum eines Prozesses eingeblendet (Macht die MMU [MemoryMangmentUnit] alles in Hardware). Ist im pysikalischem Speicher nix mehr frei, koennen ungenutze Seiten auf die Festplatte ausgelagert werden und bei Bedarf (ein Prozess greift auf eine Stueck seines Adressraums zu an dem diese Page eingeblendet ist) wieder eingelsen werden.
Greift ein Prozess auf ein Stueck eines Adressraums zu, dem keine Page zugeordnet ist, oder tut er was unerlaubtes (schrieben einer read_only, page, ausfuehren in einer nicht als executbale markeirten page) gibts einen Speicherzugriffsfehler, segmentation fault.

Wird eine ausführbare Datei gestartet unter Linux (ELF-Format) so wird ein neuer Prozess angelegt und der Speicher fuer den Code + Globale Variablen angefordert. Dann wird der entsprechende Dateiinhalt dorthin in den Adressraum kopiert und die Startadresse Angesprungen (shared libaries und andere Feinheiten mal aussen vor gelassen).
Der Stack wird so angelegt, dass er automatisch waechst, also neue Pages angefrodert werden, wenn der momentane Stack nicht reicht (das geht naturlich nur solange gut, wie noch Speicher vorhanden ist (RAM+SWAP) und natuerlich noch Platz im logsichen Adressraum (4GByte) ist).

Da Speicher in 4096 Byte Einheiten zum Programmieren etwas unhandlich ist, gibst es malloc, dass auch kleinere und groesser Bloecke verwalten kann.
Dazu fuehrt malloc ueber die angeforderten Pages Buch. Dieses Buch kostet natuerlich auch Speicher und Rechenzeit und es gibt verschiedene Strategien das ganze moeglichst effizient zu machen.

Bei kleinen Speicherblocken werden meist in einer Page nur Speicherbloecke gleicher Groesse abgelegt und ueber ein bit-array festgehalten, welche frei und welche belegt sind.

Groessere Speicherbreiche werden in Tabellen eingetragen oder als verkette Liste im Speicher gehalten. Ziel ist es meist den Speicherverschnitt und die Buchfuerungsinformation moeglichst klein zu halten, ohne zu grosse Performanceverluste bei der Speicherverwaltung zu haben.

Jetzt bin ich aber viel zu muede um weiter zu schrieben, wimmelt sicher schon nur so von Tippfehlern,
gute nacht

christophwth
29-03-2001, 22:45
Hi

macht nichts, das sind keine seltsamen
fragen. so hat jeder von uns mal angefangen.
ich kann dir ne gute linksammlung zu vielen
tutorien und online versionen von büchern
geben. www.dokuwelt.de (http://www.dokuwelt.de)
wenn du englisch kannst kann ich dir auch dieses buch empfehen: http://www.bruceeckel.com/ThinkingInCPP2e.html
gibt es als download version

ich habe mir die c++ bibel gekauft .
Stroustrup , Die CPlusplus Programmiersprache
ist aber meines erachtens nicht so schön aufgebaut und als nachschlagewerk unbrauchbar.

gruss
christoph

30-03-2001, 00:46
moin,
hab mir grad mal malloc etc. reingezogen, is ja eigendlich ganz easy http://www.linuxforen.de/ubb/wink.gif
wie läuft das aber, wenn ich was allociere, hab ich ja dann nen pointer, wo wird jetz gespeichert, das das reserviert ist ? ind der MMU ? woher wissen andre proggies das sie da nich hin dürfen ? oder macht das der kernel ? und wie läuft das dann bei normalen variablen ? die belegen doch genauso speicher wenn ich die deklariere, wird dieser automatisch freigegeben, wenn mein object stirbt ? oder mein proggie beendet ist ? und kann ich auch nen normalen zB int i manuell wieder freigeben ? sollte mir evtl mal nen buch holen, oder ? naja
uiui, wieder n ganzer haufen ... sorry,
trotzdem danke falls jmd die geduld hat das zu lesen http://www.linuxforen.de/ubb/wink.gif