GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana mengalokasikan memori yang ukuran halamannya selaras?

Saya pikir tidak mungkin hanya dengan malloc. Anda dapat menggunakan memalign():

char *data = memalign(PAGESIZE, alloc_size);

Dimana PAGESIZE adalah ukuran halaman dan alloc_size adalah ukuran memori yang akan dialokasikan.

Ukuran halaman dapat ditemukan dengan sysconf(_SC_PAGESIZE) .


Ada fungsi untuk ini yang seharusnya Anda gunakan.

Jika Anda tidak bisa, karena alasan apa pun, cara ini umumnya dilakukan adalah dengan menambahkan ukuran blok ke ukuran alokasi, lalu menggunakan tipuan matematika bilangan bulat untuk membulatkan penunjuk.

Sesuatu seperti ini:

/* 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);
}

Ini belum diuji secara mendalam tetapi Anda mendapatkan idenya.

Perhatikan bahwa tidak mungkin menemukan pointer yang tepat ke free() memori nanti. Untuk memperbaikinya, kami harus menambahkan beberapa mesin tambahan:

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;
}

Ini membungkus tipuan pointer sedikit, dan memberi Anda pointer Anda dapat free() , tetapi Anda perlu melakukan dereferensi ke aligned penunjuk untuk mendapatkan penunjuk yang disejajarkan dengan benar.


Linux
  1. Cara Memeriksa Ukuran Ram di Baris Perintah Linux di Gb

  2. Bagaimana Mengurutkan Du Output Berdasarkan Ukuran?

  3. Cara Memeriksa Ukuran Total RAM dan Penggunaan Memori di Linux

  1. Bagaimana cara secara terprogram mendapatkan ukuran halaman cache CPU di C++?

  2. Cara memeriksa ukuran heap untuk suatu proses di Linux

  3. Bagaimana cara mengurangi penggunaan memori ClamAV?

  1. Cara Menghapus Cache Memori di Linux

  2. Cara mendapatkan ukuran direktori di Linux

  3. Bagaimana saya bisa mengurutkan output du -h berdasarkan ukuran