GNU/Linux >> Belajar Linux >  >> Linux

Apakah mungkin untuk mengalokasikan memori virtual dalam jumlah besar di linux?

Apakah mungkin untuk mengalokasikan sejumlah besar memori virtual di linux?

Mungkin. Namun Anda mungkin perlu mengonfigurasinya agar diizinkan:

Kernel Linux mendukung mode penanganan overcommit berikut

0 - Penanganan overcommit heuristik. Overcommit yang jelas dari ruang alamat ditolak. Digunakan untuk sistem tipikal. Ini memastikan alokasi yang sangat liar gagal sementara mengizinkan overcommit untuk mengurangi penggunaan swap. root diizinkan untuk mengalokasikan sedikit lebih banyak memori dalam mode ini. Ini adalah defaultnya.

1 - Selalu berkomitmen berlebihan. Sesuai untuk beberapa aplikasi ilmiah. Contoh klasik adalah kode yang menggunakan susunan jarang dan hanya mengandalkan memori virtual yang hampir seluruhnya terdiri dari nol halaman.

2 - Jangan terlalu berkomitmen. Komitmen total ruang alamat untuk sistem tidak diizinkan melebihi swap + jumlah yang dapat dikonfigurasi (standarnya adalah 50%) dari RAM fisik. Bergantung pada jumlah yang Anda gunakan, dalam sebagian besar situasi ini berarti proses tidak akan dimatikan saat mengakses halaman tetapi akan menerima kesalahan pada alokasi memori yang sesuai.

Berguna untuk aplikasi yang ingin menjamin alokasi memorinya akan tersedia di masa mendatang tanpa harus menginisialisasi setiap halaman.

Kebijakan overcommit diatur melalui sysctl `vm.overcommit_memory'.

Jadi, jika Anda ingin mengalokasikan lebih banyak memori virtual daripada memori fisik, maka Anda ingin:

# in shell
sysctl -w vm.overcommit_memory=1

RLIMIT_AS Ukuran maksimum memori virtual proses (ruang alamat) dalam byte. Batasan ini mempengaruhi panggilan ke brk(2), mmap(2) dan mremap(2), yang gagal dengan kesalahan ENOMEM setelah melebihi batas ini. Ekspansi tumpukan otomatis juga akan gagal (dan menghasilkan SIGSEGV yang mematikan proses jika tidak ada tumpukan alternatif yang tersedia melalui sigaltstack(2)). Karena nilainya panjang, pada mesin dengan panjang 32-bit batas ini maksimal 2 GiB, atau sumber daya ini tidak terbatas.

Jadi, Anda ingin:

setrlimit(RLIMIT_AS, {
    .rlim_cur = RLIM_INFINITY,
    .rlim_max = RLIM_INFINITY,
});

Atau, jika Anda tidak dapat memberikan izin proses untuk melakukan ini, Anda dapat mengonfigurasinya secara terus-menerus di /etc/security/limits.conf yang akan memengaruhi semua proses (pengguna/grup).

Oke, jadi mmap tampaknya mendukung ... tetapi memerlukan deskriptor file. ... bisa menjadi kemenangan tetapi tidak jika harus didukung oleh file ... Saya tidak suka ide melampirkan ke file

Anda tidak perlu menggunakan mmap yang didukung file. Ada MAP_ANONYMOUS untuk itu.

Saya tidak tahu nomor apa yang harus diminta

Kemudian gunakan nol. Contoh:

mmap(nullptr, 256*GB, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)

Artinya, jika Anda telah mengonfigurasi sistem seperti yang dijelaskan, maka new harus berfungsi sebaik mmap . Mungkin akan menggunakan malloc yang mungkin akan menggunakan mmap untuk alokasi besar seperti ini.

Petunjuk bonus:Anda bisa mendapatkan keuntungan dengan memanfaatkan Halaman HugeTLB.


Nilai 256*GB tidak cocok dengan rentang tipe integer 32-bit. Coba uint64_t sebagai jenis GB :

constexpr uint64_t GB = 1024*1024*1024;

atau, alternatifnya, paksa perkalian 64-bit:

char* p = new char[256ULL * GB];

PL:Saya lebih suka definisi GB ini :

constexpr uint64_t GB = 1ULL << 30;

Adapun batas memori virtual, lihat jawaban ini.


Linux
  1. Jalankan mesin virtual Linux di Podman

  2. Penggunaan Memori Linux

  3. Perintah Linux:menjelajahi memori virtual dengan vmstat

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

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

  3. Cara Menambahkan Memori, vCPU, Hard Disk ke Mesin Virtual KVM Linux

  1. Kemungkinan untuk membatalkan shutdown di Linux?

  2. Penggunaan Memori Virtual dari Java di Linux, terlalu banyak memori yang digunakan

  3. Kemungkinan untuk menggunakan .dll di Linux