Ist Speicherzuordnung einem system call? Zum Beispiel malloc
und new
. Ist der heap geteilt, die durch verschiedene Prozesse und werden verwaltet von dem OS. Was ist mit private heap? Wenn die Speicherzuordnung im heap verwaltet wird durch das OS, wie teuer ist das?
Ich würde auch gerne noch einige link zum Orte, wo ich mehr über dieses Thema.
Im Allgemeinen
malloc
undnew
nicht, führen Sie einen system-call bei jedem Aufruf. Jedoch, verwenden Sie eine niedrigere Ebene Mechanismus zum zuordnen, große Seiten-Speicher. Auf Windows -, der untere Mechanismus istVirtualAlloc()
. Ich glaube, auf POSIX-Systemen ist dies etwas entsprichtmmap()
. Diese beiden führen einen system-Aufruf, um Speicher zuzuweisen, um den Prozess auf OS-Ebene. Nachfolgende Zuweisungen verwenden Sie kleinere Teile von diesen vielen Seiten, ohne dass ein system nennen.Heap ist normalerweise inner-Prozess und wird nicht von verschiedenen Prozessen genutzt. Wenn Sie dies benötigen, die meisten Betriebssysteme haben eine API für die Zuordnung der shared memory. Eine portable wrapper für diese APIs ist in der Boost.Interprozesskommunikation Bibliothek.
Wenn Sie möchten, erfahren Sie mehr über die Speicherzuweisung und die Beziehung mit dem OS, sollten Sie einen Blick in ein gutes Buch über Betriebssysteme. Ich immer empfehlen Moderne Betriebssysteme von Andrew S. Tanenbaum, da es sehr leicht zu Lesen.
brk(2)
undsbrk(2)
sind nebenmmap(2)
. Ich würde auch erwähnen, dass Knuth die AOCP Vol. Ich ist eine große Referenz für die Zuweisung von Speicher zu.syscall
odersysenter
Unterricht. Diese Anweisungen sind inntdll.dll
, nichtkernel32.dll
. Und Sie sind innerhalb von Funktionen, deren Namen beginnen mitNt
undZw
, nichtRtl
. Und in der TatHeapAlloc
AnrufeRtlAllocateHeap
, die nicht nicht unbedingt ausführen, der system calls.mmap
. Dieselbe Wahrheit für windows, Standard-CRT-s malloc ist nur ein Aufruf anVirtualAlloc
. Die Tage von kompliziertendlmalloc
,tcmalloc
und cie sind vorbei.(Vorausgesetzt, ein Betriebssystem mit Speicherschutz. Vielleicht nicht der Fall sein, z.B. in embedded-Geräten.)
Nicht unbedingt jeder Zuordnung. Der Prozess muss zum aufrufen der kernel, wenn seine Haufen nicht groß genug für die angeforderte schon, aber die C-Bibliotheken in der Regel verlangen größere Brocken, wenn Sie so tun, mit dem Ziel einer Reduzierung der Anzahl der Systemaufrufe.
Dem heap wird nicht zwischen Prozessen. Es ist zwischen threads gemeinsam genutzt werden obwohl.
Wie teuer kernel memory allocation system calls werden kommt ganz auf das OS. Denn das ist eine sehr gewöhnliche Sache, Sie können erwarten, dass es effizient sein, unter normalen Umständen. Dinge, die kompliziert in der niedrigen RAM-Situationen.
Sehen den geschichteten Speicher-management in Win32.
Zuweisung von Speicher ist immer ein system nennen, aber die Zuteilung erfolgt wie Seiten. Wenn es Raum zur Verfügung, in der commit-Seiten-Speicher-manager zugewiesen werden, der angeforderte Raum ohne ändern der kernel-Modus. Die beste Sache über HeapAlloc ist, bietet es eine feine Kontrolle über die Zuteilung, wo Virtual Alloc Runde die Zuordnung für eine einzelne Seite. Es kann dazu führen, übermäßige Nutzung in Erinnerung.
Grundsätzlich die Standard-heap und privaten heaps behandelt werden, gleiche, außer die Standard-heap-Größe angegeben ist, während der Verknüpfung die Zeit. Die Standard-heap-Größe von 1 MB und wächst, wie erforderlich.
"Memory allocation is always a system call"
Dies bedeutet, dass jeder Aufrufmalloc()
Ergebnisse in einem system-call (ein übergang in den kernel-Modus), das ist 100% falsch.Speicherzuweisung Funktionen und Sprache Aussagen, wie " malloc/free und new/delete sind keine system-Aufrufe. Malloc\free ist ein Teil der C\C++ - Bibliothek und die neue\löschen ist ein Teil der C++ - runtime-system. Gespräche der beiden, kann es vereinzelt zu dem system fordert. In den anderen Sprachen, die Zuweisung von Speicher implementiert auf ähnliche Weise.
Im Allgemeinen Speicher-management kann nicht umgesetzt werden ohne mit OS ist, denn der Speicher ist einer der wichtigsten system-Ressourcen, und aufgrund dieser globalen Speicher management durch Betriebssystem-kernel. Aber aufgrund der Tatsache, dass die system calls sind relativ teuer, Völker, die versuchen, design, Sprachen und memory allocation Bibliotheken in der Weise zu minimieren Menge von system-calls.
Ich weiß heap ist ein intra-process-entity. Das wird bedeuten, dass alle memory allocation/deallocation-Anforderungen verwaltet werden, vollständig vom Prozess selbst. Betriebssystem kennt nur die heap-Größe und Position und Dienstleistungen zwei Arten von Anfragen aus dem intra-Prozess-memory-management-system:
Lokalen Speicher-management-system, fordern Sie diese services, wenn es entscheidet, dass es nicht genügend Speicher in den Speicherbereich des heap, und wenn es entscheidet, dass es zu viel Speicher in den Speicherbereich des heap.
Trotz der Tatsache, dass die Zuweisung von Speicher ist in der Regel so konzipiert eine Möglichkeit der Minimierung der Anzahl der system-nennt es bleiben noch über, um dann teuere Speicher-Allokation auf Stapel. Dies ist, weil die Speicherreservierung\Freigabe heap-algorithmen sind wesentlich komplexer und teuer als die gleichen stack.