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.