2010-07-09 6 views
13

Wenn ich über den Speicher eines Prozesses spreche, hörte ich Dinge wie Code-Speicher und Datenspeicher.Wie wird der Code-Speicher verwaltet?

Und für die Datenspeicher, gibt es 2 wichtige Management-Mechanismen, Stack und Heap.

Ich frage mich jetzt, wie ist der Code-Speicher verwaltet? Und wer schafft es?

Verzeihen Sie mir, wenn meine Aussage nicht so klar ist.

Danke.

Antwort

17

Ich empfehle http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory (und die anderen Speicher verwandten Artikel), wenn Sie mehr über die Details der Speicherverwaltung des Prozesses erfahren möchten.

Codespeicher = Textsegment

Beachten Sie, wie der Adressraum 4 GB ist. Wenn der Kernel einen Prozess erstellt, erhält er virtuellen Speicher. Im Folgenden finden Sie ein Beispiel für ein 32-Bit-Betriebssystem. Der Kernel verwaltet, welche Adressen über die MMU des Prozessors dem tatsächlichen RAM zugeordnet werden. So verwalten der Kernel und die MMU den Code-Speicher, genauso wie sie den gesamten Adressraum eines Prozesses verwalten.

Borrowed from duartes.org http://static.duartes.org/img/blogPosts/linuxFlexibleAddressSpaceLayout.png

+1

sehr netter Link ... – wrapperm

+0

ich zweites Wrapperm. :) – smwikipedia

+2

Das Layout wird im Allgemeinen vom Linker und nicht vom Kernel festgelegt (und verwaltet).Der Kernel liest einfach die Information im ausführbaren Image und richtet die Memory Map entsprechend ein. Der dynamische Linker wird zugeordnet, wenn die ausführbare Datei dies angibt (was für dynamisch verknüpfte ausführbare Dateien der Fall ist) und viele Dinge handhabt. Sie können den Linker als Teil des Betriebssystems betrachten, aber Sie könnten einen benutzerdefinierten Linker erstellen, der fast alles, was Sie wollen, –

2

Es wird vom Betriebssystem verwaltet. Wenn ein Programm ausgeführt wird, wird der Code aus einer ausführbaren Datei in eine bestimmte Speicheradresse geladen. Abhängig von der Art des Programms werden einige Änderungen an den Codeabschnitten vorgenommen, z. Sprünge zu dynamisch verknüpften Bibliotheken werden aufgelöst.

Wie von Space_C0wb0y vorgeschlagen, überprüfen Sie en.wikipedia.org/wiki/Dynamic_linker für Details zu dem, was vor sich geht.

+1

Überprüfen Sie diesen Wikipedia-Artikel über dynamisches Laden für einige Einblicke in, was vor sich geht: http://en.wikipedia.org/wiki/Dynamic_linker –

+0

Danke Space_C0wb0y, dieser Link ist hilfreich. – smwikipedia

0

Ihr Betriebssystem bietet so genannten Systemaufrufe dynamisch Speicher zuweisen (malloc, frei, etc.), sondern auch den Mechanismus Ihr Programm zu laden und auszuführen bietet.

Wenn das Programm vom Betriebssystem geladen wird, wird das Textsegment (Code-Speicher) eingerichtet und der statisch zugewiesene Speicher in Ihrem Programm ist sofort verfügbar. Wenn Ihr Code Funktionen aufruft, werden die (statisch zugewiesenen) Variablen in Ihren Funktionen auf dem Stack zugewiesen und Ihr dynamisch zugewiesener Speicher (z. B. mit malloc()) wird auf dem Heap zugewiesen. Während der Zeit, die Ihr Programm läuft, ist es Ihre (der Programmierer) Verantwortung, den Speicher zu verwalten (das Fehlen von dies führt zu Speicherlecks und wird schließlich dazu führen, dass ein lang laufendes Programm den Speicher ausgeht und es wird oder extrem abstürzen Fälle, je nach Betriebssystem, nehmen Sie das gesamte Betriebssystem mit).

Siehe auch diesen Artikel: http://www.maxi-pedia.com/what+is+heap+and+stack

+0

Der Heap wird auf den meisten Betriebssystemen nicht vom Kernel verwaltet. Es ist normalerweise eine reine Benutzermoduskomponente, die sich in irgendeiner Art von Laufzeitbibliothek (z. B. ntdll, libc) befindet, die dann Systemaufrufe zu Seitenverarbeitungsfunktionen niedrigerer Ebene durchführt (z. B. NtAllocateVirtualMemory). – wj32

4

Der Codespeicher Verwaltung nicht braucht, weil es sich nicht ändert. Wenn eine ausführbare Datei in den Adressraum geladen wird, wird der Code gerade aus der ausführbaren Datei in den Speicher gelesen. Tatsächlich ist das Code-Segment bei modernen Betriebssystemen nur dem Speicher der ausführbaren Datei zugeordnet.

+1

Nun, gut .... es hängt vom Betriebssystem ab. Wie ich aus dem Buch von A. Silberschatz über Betriebssysteme weiß, können einige Architekturen den Code vielleicht verschieben, aber er muss für den Programmierer transparent sein. Das Laden/Entladen von dynamischen Bibliotheken beinhaltet auch eine gewisse Speicherverwaltung des Codes. – doc

+0

@doc: True, aber es unterscheidet sich zwischen Betriebssystem und Architektur. Was ich oben gesagt habe, basiert hauptsächlich darauf, mit dem OS X ausführbaren Dateiformat herumzustochern. – JeremyP

Verwandte Themen