GNU/Linux >> Belajar Linux >  >> Linux

new[] tidak mengurangi memori yang tersedia hingga terisi

Saat perpustakaan Anda mengalokasikan memori dari OS, OS hanya akan mencadangkan rentang alamat di ruang alamat virtual proses. Tidak ada alasan bagi OS untuk benar-benar menyediakan memori ini hingga Anda menggunakannya - seperti yang Anda tunjukkan.

Jika Anda melihat mis. /proc/self/maps Anda akan melihat rentang alamat. Jika Anda melihat memori atas gunakan Anda tidak akan melihatnya - Anda belum menggunakannya.


Silakan cari overcommit. Linux secara default tidak mencadangkan memori sampai diakses. Dan jika Anda akhirnya membutuhkan lebih banyak memori daripada yang tersedia, Anda tidak mendapatkan kesalahan tetapi proses acak dimatikan. Anda dapat mengontrol perilaku ini dengan /proc/sys/vm/* .

IMO, overcommit harus menjadi pengaturan per proses, bukan global. Dan defaultnya seharusnya tidak ada overcommit.


Tentang paruh kedua pertanyaan Anda:

Standar bahasa tidak mengizinkan penundaan dalam melempar bad_alloc. Itu harus terjadi sebagai alternatif new[] mengembalikan pointer. Itu tidak bisa terjadi nanti!

Beberapa OS mungkin mencoba melakukan overcommit alokasi memori, dan kemudian gagal. Itu tidak sesuai dengan standar bahasa C++.


Linux
  1. Penggunaan Memori Linux

  2. 4 cara untuk memeriksa memori yang tersedia di Ubuntu 20.04 LTS

  3. Linux – Bagaimana Mendapatkan Jumlah Memori Yang Tersedia Secara Portabel di Seluruh Distribusi?

  1. Grep:Memori Habis?

  2. Apa itu ioremap()

  3. Jenkins aktif (keluar)

  1. Batas memori PHP

  2. Bagaimana cara membatasi cache yang digunakan dengan menyalin sehingga masih tersedia memori untuk cache lain?

  3. Memori tidak aktif Linux