GNU/Linux >> Belajar Linux >  >> Linux

Apakah realloc menjaga penyelarasan memori posix_memalign?

Tidak, realloc pada memori yang dikembalikan dari posix_memalign tidak dijamin oleh ISO atau POSIX untuk mempertahankan keselarasan yang sama. A realloc mungkin cukup perluas blok saat ini di alamat yang sama tetapi juga dapat memindahkan blok ke alamat lain yang penyelarasannya tidak seketat aslinya.

Jika Anda menginginkan perataan yang sama, sebaiknya alokasikan blok lain dan salin datanya.

Sayangnya, tidak ada posix_memalign_realloc berfungsi baik dalam Spesifikasi UNIX Tunggal.

Jika Anda tidak ingin repot menyalin data setiap kali, Anda dapat mencoba realloc dan, jika penyelarasannya tidak seperti yang diharapkan, maka dan hanya setelah itu panggil posix_memalign untuk mendapatkan alamat yang selaras dengan benar dan menyalin data ke sana, membebaskan alamat lama setelah selesai.

Hal ini dapat mengakibatkan:

  • nol salinan (jika blok saat ini dapat diperluas di tempat);
  • satu salinan (jika realloc salinan tetapi kebetulan memberi Anda blok yang disejajarkan dengan benar); atau
  • dua salinan (jika realloc salinan dan kemudian Anda juga harus menyalin karena misalignment).

Itu mungkin juga menghasilkan lebih sedikit penyalinan daripada yang ditunjukkan tergantung pada penerapan manajemen memori yang mendasarinya. Misalnya, "salinan" mungkin hanya melibatkan pemetaan ulang blok memori daripada memindahkan data secara fisik.

Jadi, Anda mungkin ingin menyimpan beberapa statistik untuk melihat apakah skema ini bermanfaat.

Perlu diingat bahwa baik halaman manual POSIX maupun Linux tidak menentukan apakah Anda bisa atau tidak teruskan petunjuk ini ke realloc , hanya saja Anda dapat meneruskannya ke free .

Namun, berdasarkan kode sumber libc GNU saat ini, tampaknya berfungsi, meskipun itu bukan jaminan akan terus berfungsi di masa mendatang :-)

Ketakutan saya adalah bahwa itu akan mengalokasikan memori secara normal (penyelarasan standar) dan mengembalikan alamat offset (yaitu, bukan alamat sebenarnya yang dialokasikan, tetapi satu N byte lebih dari itu) yang free cukup cerdas untuk kembali ke alamat sebenarnya sebelum menenun sihirnya.

Salah satu cara melakukannya adalah dengan menyimpan aktual alamat tepat sebelum alamat yang dikembalikan meskipun hal ini tentu saja akan menyebabkan pemborosan bahkan untuk alokasi reguler.

Dalam hal ini, free mungkin dibuat cerdas (karena spesifikasi mengatakan itu harus dapat menangani alokasi yang dilakukan oleh posix_memalign ) tetapi realloc mungkin tidak diberikan kecerdasan yang sama (karena dokumen tidak menyebutkan hal itu).

Namun, berdasarkan GNU glibc 2.14.1, ini sebenarnya mengalokasikan lebih banyak memori daripada yang dibutuhkan kemudian mengutak-atik arena untuk mengosongkan ruang pra dan ruang pasca, sehingga alamat yang dikembalikan adalah alamat "nyata", dapat digunakan oleh free atau realloc .

Namun, seperti yang disebutkan, dokumentasi tidak menjamin hal ini.


Linux
  1. malloc mengembalikan memori atau ruang alamat virtual

  2. Apa yang dilakukan izin eksekusi?

  3. Di mana Linux Mint menyimpan file untuk wallpaper desktop default?

  1. Linux – Bagaimana Pembunuh Oom Memutuskan Proses Mana Yang Harus Dibunuh Pertama?

  2. Bagaimana cara kerja perintah ps?

  3. Bagaimana CPU mengetahui alamat fisik mana yang dipetakan ke alamat virtual mana?

  1. Saat Menggunakan Vlc, Mengapa Screen Saver Terus Bangun?

  2. Linux – Apa yang Disiratkan oleh Tata Letak Memori Kernel Virtual Di Dmesg?

  3. Bagaimana Cara Kerja Perintah Tee??