Virtuelle Adressbereich eines Prozesses
Kurz gesagt: ist der virtuelle Adressraum eines Prozesses zusammenhängenden?
Ich muss wissen, etwas über eine virtuelle Adresse zugeordnet Prozess, durch den kernel. Bitte korrigieren Sie mich, wenn ich falsch bin, wie ich gehen.
Auf die Prozess-Erstellung, der kernel zugewiesenen virtuellen Speicher für den Prozess und speichert die beginnt und endet der virtuellen Adressen der verschiedenen Segmente des Prozesses in der mm_struct
im task_struct
.
Nun sagen die einen Prozess ausgeführt hat, den heap und die Erhöhung der heap-Größe.Anrufe brk()
.
Wenn der virtuelle Adressbereich zusammenhängend ist, ist die neu zugewiesenen Stück heap zur Verfügung gestellt von außerhalb der Bandbreite reserviert wurde ursprünglich für diesen Prozess? Oder ist es auf eine Weise verteilt, dass das neue Stück ist neben dem original ein. Was, wenn kein Platz vorhanden ist für Sie, dass (weil die memory-mapped-segment liegt dort). wie ist es im Auge behielten?
Wenn der virtuelle Adressbereich nicht zusammenhängend ist, wie funktioniert das vm_struct
verfolgen der verschiedenen Abschnitte der Adresse reicht für den heap (oder einem anderen segment)?
Können Sie bitte löschen Sie mein Konzept auf?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den virtuellen Adressraum nicht zusammenhängend ist. Siehe die Ausgabe von
cat /proc/<pid>/mem
.Beim starten einen Prozess, der kernel ordnet mehrere mappings für den dynamischen linker und für den Prozess selbst. Danach wird der dynamische linker ordnet weitere Zuordnungen über
mmap()
, und der Prozess zuordnen können weitere Zuordnungen übermmap()
und erweitern Sie den heap überbrk()
.malloc()
auf dlmalloc und Derivate verwendetbrk()
für Zuweisungen kürzer ist als ein Schwellenwert und diemmap()
für Zuordnungen, die größer als oder gleich dem Schwellenwert (etwa 128 KB IIRC).In jedem Fall beim Aufruf
mmap()
der kernel in der Regel Karten Speicher weit aus dem heap, so ist es in der Regel genug Platz, um verlängern heap. Wenn es keinen virtuellen Speicherplatz zu erweitern heapbrk()
fehl./proc/<pid>/maps
ist wahrscheinlich das, was Sie sollten auf den ersten Blick, suppie.Nein, der virtuelle Adressraum eines Prozesses ist nicht unbedingt zusammenhängend. In den alten Tagen, ein Prozess gewonnen Speicher über
brk
, die in der Tat gezwungen, die Prozess-heap zu einer angrenzenden zone des Speichers. Heutzutage Speicher-Zuteilung erfolgt durchmmap
, die manipulieren können, den Prozess des virtuellen Speichers Seite.Wenn Sie neugierig auf die kernel-Seite der Dinge ist, empfehle ich zwei Verweise:
mm
- Verzeichnis; beginnen Sie mitmmap.c
odermm.h
.Wenn Sie möchten, um zu erkunden, um auf Ihrem system, können Sie sehen, jede Prozess-Speicher-mapping in
/proc/$pid/maps
. Sehen Wie lese ich aus /proc/$pid/mem unter Linux? für weitere Informationen.brk()
für die Zuweisungen unter einen bestimmten Schwellenwert, obwohl ich gebe zu, ich habe nicht gesehen vor kurzem. OTOH, wenn ich mich Recht erinnere, verwendet OpenBSDmmap()
für jede Zuordnung.Dank..
nach Durchlaufen der sagte Literaturen gemäß meinem Verständnis,
den virtuellen Adressraum ist nicht zusammenhängend über den gesamten Prozess, so gut wie gar nicht während einer bestimmten memory-segment. und die verschiedenen Stücke der virtuellen Adressbereiche verwaltet werden, in den kernel mit einem AVL-Baum der
vm_area_struct
(virtuelle Speicherbereiche). dadurch einfaches hinzufügen und löschen von Blöcken von virtuelle Speicherbereiche dertask_struct
des Prozesses. ref: Virtueller Speicher. aber die virtuelle Speicherbereiche in sich zusammenhängend sind.d.h. im Effekt der
task_struct
enthält einen Zeiger aufmm_struct
enthält einen Zeiger auf die Köpfe von AVL-Bäumen (ein Baum für jede Speicher-region). die Knoten des Baumes sind nichts abervm_area_struct
s die start-und end-Zeiger markiert den Beginn und das Ende der virtuelle Speicherbereichevielen Dank