GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie wird Speicher zugewiesen, der auf die Seitengröße ausgerichtet ist?

Ich glaube nicht, dass das nur mit malloc möglich ist. Sie können memalign():

verwenden
char *data = memalign(PAGESIZE, alloc_size);

Wobei PAGESIZE ist die Größe einer Seite und alloc_size ist die Größe des zugewiesenen Speichers.

Die Größe der Seite kann mit sysconf(_SC_PAGESIZE) ermittelt werden .


Dafür gibt es Funktionen, die Sie verwenden sollten.

Wenn Sie dies aus irgendeinem Grund nicht können, wird dies im Allgemeinen dadurch erreicht, dass Sie die Blockgröße zur Zuweisungsgröße addieren und dann ganzzahlige mathematische Tricks anwenden, um den Zeiger zu runden.

Etwa so:

/* Note that alignment must be a power of two. */
void * allocate_aligned(size_t size, size_t alignment)
{
  const size_t mask = alignment - 1;
  const uintptr_t mem = (uintptr_t) malloc(size + alignment);
  return (void *) ((mem + mask) & ~mask);
}

Dies wurde nicht sehr gründlich getestet, aber Sie haben die Idee.

Beachten Sie, dass es unmöglich wird, den richtigen Zeiger auf free() herauszufinden die Erinnerung später. Um das zu beheben, müssten wir einige zusätzliche Maschinen hinzufügen:

typedef struct {
  void *aligned;
} AlignedMemory;

AlignedMemory * allocate_aligned2(size_t size, size_t alignment)
{
  const size_t mask = alignment - 1;
  AlignedMemory *am = malloc(sizeof *am + size + alignment);
  am->aligned = (void *) ((((uintptr_t) (am + 1)) + mask) & ~mask);
  return am;
}

Dies umschließt die Zeiger-Tricks ein wenig und gibt Ihnen einen Zeiger, den Sie free() verwenden können , aber Sie müssen in aligned dereferenzieren Zeiger, um den richtig ausgerichteten Zeiger zu erhalten.


Linux
  1. So überprüfen Sie die RAM-Größe in der Linux-Befehlszeile in GB

  2. So löschen Sie den Speichercache in Linux

  3. So überprüfen Sie die gesamte RAM-Größe und Speichernutzung in Linux

  4. So erhalten Sie die Verzeichnisgröße in Linux

  5. Wie erhalte ich programmgesteuert die CPU-Cache-Seitengröße in C++?

So verwenden Sie du Command unter Linux

So löschen Sie den Auslagerungsspeicher unter Linux

Wie kann ich die Speichernutzung profilieren?

Wie ändere ich die Schriftgröße in Dwarf-fortress?

Wie kann die ClamAV-Speichernutzung reduziert werden?

Wie kann ich die Ausgabe von du -h nach Größe sortieren?