2016-05-24 7 views

Antwort

8

Eine Platte ist eine Sammlung von Objekten der gleichen Größe. Es vermeidet Fragmentierung, indem es einen ziemlich großen Speicherblock zuweist und ihn in gleich große Teile unterteilt. Die Anzahl der Teile ist typischerweise viel größer als zwei, sagen wir 128 oder so.

Es gibt zwei Möglichkeiten, wie Sie Brammen verwenden können. Erstens könnten Sie eine Platte nur für eine Größe haben, die Sie sehr häufig zuweisen. Zum Beispiel könnte ein Kernel eine Inode-Platte haben. Sie können jedoch auch eine Anzahl von Brammen in progressiven Größen haben, wie eine 128-Byte-Platte, eine 192-Byte-Platte, eine 256-Byte-Platte und so weiter. Sie können dann ein Objekt beliebiger Größe ab der nächsten Plattengröße zuweisen.

Beachten Sie, dass in keinem Fall eine Platte Speicher für ein Objekt anderer Größe wiederverwendet, es sei denn, die gesamte Platte wird wieder an einen globalen "großen Block" zugewiesen.

Das Buddy-System ist eine nicht verwandte Methode, bei der jedes Objekt ein "Buddy" -Objekt hat, mit dem es verschmolzen wird, wenn es freigegeben wird. Blöcke werden halbiert, wenn kleinere Blöcke benötigt werden. Beachten Sie, dass Blöcke im Buddy-System unterteilt und zu größeren Blöcken zusammengeführt werden, um die Zuordnung zu ermöglichen und zur Wiederverwendung zurückzukehren. Das ist sehr anders als das Arbeiten mit Brammen.

Oder, um es einfacher auszudrücken:

Buddy System: Verschiedene große Blöcke unterteilt werden, wenn zugeordnet und koalesziert, wenn befreit, um effizient einen großen Block in kleinere Blöcke in verschiedenen Größen unterteilen, wie benötigt wird.

Platte: Sehr große Blöcke werden zugewiesen und einmal in gleich große Blöcke aufgeteilt. Es findet kein weiteres Teilen oder Zusammenfügen statt, und freigegebene Blöcke werden nur in einer Liste gehalten, die nachfolgenden Zuordnungen zugewiesen wird.

Der Core-Allokator des Linux-Kernels ist ein flexibler Buddy-System-Allokator. Dieser Zuweiser stellt die Brammen für die verschiedenen Brammen-Allcoatoren bereit.

+0

Wäre auch schön, wenn Sie die Verbindung zwischen Buddy-Allokator und Slab-Allokator in Ihrer Antwort erklären können (etwas wie [this] (http://image.slidesharecdn.com/mm-121212232739-phpapp02/95/linux- memory-management-11-638.jpg? cb = 1355354903), aber wahrscheinlich mit mehr Details). Vielen Dank. –

2

Im Allgemeinen ist der Plattenverteiler eine Liste von Platten mit fester Größe, die für die Platzierung vordefinierter Größenelemente geeignet ist. Wie alle Objekte im Pool der gleichen Größe gibt es keine Fragmentierung.

Buddy Allocator teilt Speicher in Chunks, deren Größe verdoppelt wird. Wenn zum Beispiel min chunk 1k ist, wird der nächste 2K, dann 4K usw. Wenn wir also die Zuweisung von 100b anfordern, wird der Chunk mit der Größe 1k ausgewählt. Was zu einer Fragmentierung führt, erlaubt es jedoch, Objekte beliebiger Größe zuzuweisen (daher ist es gut geeignet für Benutzerspeicherzuweisungen, bei denen die genaue Objektgröße jede Größe haben könnte). auch

Siehe:

auch schlimmer diese Präsentationen überprüfen: http://events.linuxfoundation.org/images/stories/pdf/klf2012_kim.pdf Slides ab Seite 22 zeigen die Zusammenfassung der differencies.