GNU/Linux >> Belajar Linux >  >> Linux

malloc mengembalikan memori atau ruang alamat virtual

malloc mengalokasikan memori pada heap, titik.

Pustaka C Anda biasanya menyimpan daftar (atau beberapa struktur data yang lebih rumit) dari potongan memori yang tersedia, menemukan potongan yang cocok untuk memenuhi malloc (mungkin membagi potongan yang lebih besar menjadi beberapa yang lebih kecil) dan mengembalikan free 'd memori ke daftar (mungkin menggabungkan beberapa potongan kecil menjadi yang lebih besar)

Hanya ketika daftar tidak berisi potongan yang cukup besar untuk memenuhi malloc Anda , perpustakaan akan meminta lebih banyak memori pada OS, mis. menggunakan syscall sbrk. Alamat yang dikembalikan oleh syscall ini mungkin alamat virtual, atau alamat asli, tergantung pada perangkat keras Anda, tetapi sebagai pemrogram Anda tidak dapat (dan tidak perlu) mengetahui hal ini.

Mengatakan bahwa malloc mengalokasikan ruang alamat virtual daripada blok di heap seperti mengatakan bahwa read membaca dari hard disk Anda, bukan dari file:ini tidak relevan dari sudut pandang penelepon, dan tidak selalu benar.


Setidaknya ada 3 cara mengukur konsumsi memori:

  • ruang alamat virtual - jumlah ruang alamat proses Anda yang dipakai oleh alokasi. ini juga memengaruhi fragmentasi dan alokasi maksimum yang dapat Anda buat di masa mendatang.
  • commit charge - ini adalah sistem operasi yang memperhitungkan kemungkinan penyimpanan fisik maksimum yang diperlukan untuk mempertahankan semua memori yang dapat ditulisi, bukan file/didukung perangkat yang dialokasikan untuk proses Anda. jika OS memungkinkannya melebihi total memori fisik + pertukaran, hal yang sangat buruk dapat terjadi saat pertama kali kelebihan ditulis.
  • memori fisik - jumlah sumber daya fisik (berpotensi termasuk swap, tergantung pada interpretasi Anda) yang sedang digunakan oleh proses Anda. Ini mungkin kurang dari biaya komit karena halaman nol perawan dan peta file pribadi perawan yang dapat ditulis, atau lebih dari biaya komit karena pemetaan yang tidak dapat ditulis atau dibagikan yang digunakan proses (namun ini biasanya dapat ditukar/dibuang).

malloc umumnya mempengaruhi mereka semua.

Edit: Jadi, cara terbaik yang dapat saya pikirkan untuk menjawab pertanyaan Anda adalah dengan mengatakan:

malloc mengalokasikan memori virtual .

Dan memori virtual mengkonsumsi:

  • ruang alamat virtual,
  • melakukan biaya, dan
  • sumber daya fisik, jika telah ditulis.

malloc adalah panggilan perpustakaan. Di linux, ini pada gilirannya memanggil sbrk panggilan sistem. sbrk akan meningkatkan ukuran heap tetapi sebenarnya tidak mengalokasikan memori fisik. Saat proses mencoba mengakses alamat ini, sebuah page fault dimunculkan dan kemudian pada saat itu kernel mengalokasikan halaman fisik aktual dan memetakan ke alamat virtual.

TL;DR:malloc mengembalikan alamat virtual dan TIDAK mengalokasikan memori fisik.

Lihat ini.


Linux
  1. Mesin Virtual dengan CentOS 5 32-Bit OS Tidak Mengatasi Memori Fisik Lebih dari 3 GB

  2. Ruang alamat proses 32-bit di linux 64-bit

  3. Bagaimana cara mengakses alamat fisik dari ruang pengguna di Linux?

  1. Cara mendapatkan alamat memori tertentu menggunakan C

  2. Malloc di linux tanpa komitmen berlebihan

  3. Apa gunanya memiliki bagian kernel di ruang memori virtual proses Linux?

  1. Bagaimana menerapkan malloc deterministik

  2. Apakah realloc menjaga penyelarasan memori posix_memalign?

  3. Force free() untuk mengembalikan memori malloc kembali ke OS