Fungsi VirtualAllocExNuma (memoryapi.h)
Mencadangkan, menerapkan, atau mengubah status wilayah memori dalam ruang alamat virtual dari proses yang ditentukan, dan menentukan simpul NUMA untuk memori fisik.
Sintaks
LPVOID VirtualAllocExNuma(
[in] HANDLE hProcess,
[in, optional] LPVOID lpAddress,
[in] SIZE_T dwSize,
[in] DWORD flAllocationType,
[in] DWORD flProtect,
[in] DWORD nndPreferred
);
Parameter
[in] hProcess
Handel ke proses. Fungsi ini mengalokasikan memori dalam ruang alamat virtual proses ini.
Handel harus memiliki hak akses PROCESS_VM_OPERATION . Untuk informasi selengkapnya, lihat Keamanan Proses dan Hak Akses.
[in, optional] lpAddress
Penunjuk yang menentukan alamat awal yang diinginkan untuk wilayah halaman yang ingin Anda alokasikan.
Jika Anda menyimpan memori, fungsi membulatkan alamat ini ke kelipatan granularitas alokasi terdekat.
Jika Anda menerapkan memori yang sudah dicadangkan, fungsi membulatkan alamat ini ke bawah ke batas halaman terdekat. Untuk menentukan ukuran halaman dan granularitas alokasi pada komputer host, gunakan fungsi GetSystemInfo .
Jika lpAddressADALAH NULL, fungsi menentukan tempat mengalokasikan wilayah.
[in] dwSize
Ukuran wilayah memori yang akan dialokasikan, dalam byte.
Jika lpAddressNULL, fungsi membulatkan dwSize ke batas halaman berikutnya.
Jika lpAddress bukan NULL, fungsi mengalokasikan semua halaman yang berisi satu atau beberapa byte dalam rentang dari lpAddress ke (lpAddress+dwSize)
. Ini berarti, misalnya, bahwa rentang 2 byte yang melekat pada batas halaman menyebabkan fungsi mengalokasikan kedua halaman.
[in] flAllocationType
Jenis alokasi memori. Parameter ini harus berisi salah satu nilai berikut.
Nilai | Makna |
---|---|
|
Mengalokasikan biaya memori (dari ukuran memori keseluruhan dan file halaman pada disk) untuk halaman memori yang dipesan yang ditentukan. Fungsi ini juga menjamin bahwa ketika penelepon awalnya mengakses memori, kontennya akan menjadi nol. Halaman fisik aktual tidak dialokasikan kecuali/sampai alamat virtual benar-benar diakses.
Untuk memesan dan menerapkan halaman dalam satu langkah, panggil fungsi dengan Mencoba menerapkan rentang alamat tertentu dengan menentukan MEM_COMMIT tanpa MEM_RESERVE dan lpAddressnon-NULL gagal kecuali seluruh rentang telah dicadangkan. Kode kesalahan yang dihasilkan ERROR_INVALID_ADDRESS. Upaya untuk menerapkan halaman yang sudah diterapkan tidak menyebabkan fungsi gagal. Ini berarti Anda dapat menerapkan halaman tanpa terlebih dahulu menentukan status komitmen saat ini dari setiap halaman. |
|
Mencadangkan berbagai ruang alamat virtual proses tanpa mengalokasikan penyimpanan fisik aktual dalam memori atau dalam file halaman pada disk.
Anda menerapkan halaman yang dipesan dengan memanggil fungsi lagi dengan MEM_COMMIT. Untuk memesan dan menerapkan halaman dalam satu langkah, panggil fungsi dengan Fungsi alokasi memori lainnya, seperti malloc dan LocalAlloc, tidak dapat menggunakan memori yang dipesan hingga dirilis. |
|
Menunjukkan bahwa data dalam rentang memori yang ditentukan oleh lpAddress dan dwSize tidak lagi menarik. Halaman tidak boleh dibaca dari atau ditulis ke file halaman. Namun, blok memori akan digunakan lagi nanti, sehingga tidak boleh dinonaktifkan. Nilai ini tidak dapat digunakan dengan nilai lain.
Menggunakan nilai ini tidak menjamin bahwa rentang yang dioperasikan dengan MEM_RESET akan berisi nol. Jika Anda ingin rentang berisi nol, nonaktifkan memori lalu masukkan kembali. Saat Anda menggunakan MEM_RESET, fungsi mengabaikan nilai fProtect. Namun, Anda masih harus mengatur fProtect ke nilai perlindungan yang valid, seperti PAGE_NOACCESS. Fungsi mengembalikan kesalahan jika Anda menggunakan MEM_RESET dan rentang memori dipetakan ke file. Tampilan bersama hanya dapat diterima jika dipetakan ke file halaman. |
|
MEM_RESET_UNDO hanya boleh dipanggil pada rentang alamat yang MEM_RESET berhasil diterapkan sebelumnya. Ini menunjukkan bahwa data dalam rentang memori yang ditentukan oleh lpAddress dan dwSize menarik bagi pemanggil dan mencoba membalikkan efek MEM_RESET. Jika fungsi berhasil, itu berarti semua data dalam rentang alamat yang ditentukan utuh. Jika fungsi gagal, setidaknya beberapa data dalam rentang alamat telah diganti dengan nol.
Nilai ini tidak dapat digunakan dengan nilai lain. Jika MEM_RESET_UNDO dipanggil pada rentang alamat yang tidak MEM_RESET sebelumnya, perilaku tersebut tidak ditentukan. Saat Anda menentukan MEM_RESET, fungsi VirtualAllocExNuma mengabaikan nilai flProtect. Namun, Anda masih harus mengatur flProtect ke nilai perlindungan yang valid, seperti PAGE_NOACCESS. Windows Server 2008 R2, Windows 7, Windows Server 2008 dan Windows Vista: Bendera MEM_RESET_UNDO tidak didukung hingga Windows 8 dan Windows Server 2012. |
Parameter ini juga dapat menentukan nilai berikut seperti yang ditunjukkan.
Nilai | Makna |
---|---|
|
Mengalokasikan memori menggunakan dukungan halaman besar.
Ukuran dan perataan harus kelipatan minimum halaman besar. Untuk mendapatkan nilai ini, gunakan fungsi GetLargePageMinimum . Jika Anda menentukan nilai ini, Anda juga harus menentukan MEM_RESERVE dan MEM_COMMIT. |
|
Mencadangkan rentang alamat yang dapat digunakan untuk memetakan halaman Ekstensi Windowing Alamat (AWE).
Nilai ini harus digunakan dengan MEM_RESERVE dan tidak ada nilai lain. |
|
Mengalokasikan memori pada alamat setingkat mungkin. |
[in] flProtect
Perlindungan memori untuk wilayah halaman yang akan dialokasikan. Jika halaman sedang diterapkan, Anda dapat menentukan salah satu konstanta perlindungan memori.
Atribut perlindungan yang ditentukan saat melindungi halaman tidak dapat bertentangan dengan yang ditentukan saat mengalokasikan halaman.
[in] nndPreferred
Simpul NUMA tempat memori fisik harus berada.
Hanya digunakan saat mengalokasikan wilayah VA baru (baik berkomitmen atau dicadangkan). Jika tidak, parameter ini diabaikan ketika API digunakan untuk menerapkan halaman di wilayah yang sudah ada
Nilai kembali
Jika fungsi berhasil, nilai pengembalian adalah alamat dasar dari wilayah halaman yang dialokasikan.
Jika fungsi gagal, nilai yang dikembalikan adalah NULL. Untuk mendapatkan informasi kesalahan yang diperluas, hubungi GetLastError.
Keterangan
Setiap halaman memiliki status halaman terkait. Fungsi VirtualAllocExNuma dapat melakukan operasi berikut:
- Menerapkan wilayah halaman yang dipesan
- Pesan wilayah halaman gratis
- Cadangkan dan terapkan wilayah halaman gratis secara bersamaan
VirtualAllocExNuma tidak dapat memesan halaman yang dipesan. Ini dapat menerapkan halaman yang sudah diterapkan. Ini berarti Anda dapat melakukan rentang halaman, terlepas dari apakah halaman tersebut telah diterapkan, dan fungsinya tidak akan gagal.
Anda dapat menggunakan VirtualAllocExNuma untuk memesan blok halaman lalu melakukan panggilan tambahan ke VirtualAllocExNuma untuk menerapkan halaman individual dari blok yang dipesan. Ini memungkinkan proses untuk memesan berbagai ruang alamat virtualnya tanpa mengkonsumsi penyimpanan fisik sampai diperlukan.
Jika parameter lpAddress bukan NULL, fungsi menggunakan parameter lpAddress dan dwSize untuk menghitung wilayah halaman yang akan dialokasikan. Status saat ini dari seluruh rentang halaman harus kompatibel dengan jenis alokasi yang ditentukan oleh parameter flAllocationType . Jika tidak, fungsi gagal dan tidak ada halaman yang dialokasikan. Persyaratan kompatibilitas ini tidak menghalangi penerapan halaman yang sudah dilakukan; lihat daftar sebelumnya.
Karena VirtualAllocExNuma tidak mengalokasikan halaman fisik apa pun, itu akan berhasil apakah halaman tersedia pada simpul tersebut atau di tempat lain dalam sistem atau tidak. Halaman fisik dialokasikan sesuai permintaan. Jika simpul yang disukai kehabisan halaman, manajer memori akan menggunakan halaman dari simpul lain. Jika memori di-page out, proses yang sama digunakan ketika dibawa kembali.
Untuk menjalankan kode yang dihasilkan secara dinamis, gunakan VirtualAllocExNuma untuk mengalokasikan memori dan fungsi VirtualProtectEx untuk memberikan akses PAGE_EXECUTE .
Fungsi VirtualAllocExNuma dapat digunakan untuk memesan wilayah memori Address Windowing Extensions (AWE) dalam ruang alamat virtual dari proses tertentu. Wilayah memori ini kemudian dapat digunakan untuk memetakan halaman fisik ke dalam dan kehabisan memori virtual seperti yang diperlukan oleh aplikasi. Nilai MEM_PHYSICAL dan MEM_RESERVE harus diatur dalam parameter AllocationType . Nilai MEM_COMMIT tidak boleh diatur. Proteksi halaman harus diatur ke PAGE_READWRITE.
Fungsi VirtualFreeEx dapat menonaktifkan halaman yang diterapkan, merilis penyimpanan halaman, atau secara bersamaan dapat menonaktifkan dan merilis halaman yang diterapkan. Ini juga dapat merilis halaman yang dipesan, menjadikannya halaman gratis.
Untuk mengkompilasi aplikasi yang menggunakan fungsi ini, tentukan _WIN32_WINNT sebagai 0x0600 atau yang lebih baru.
Contoh
Misalnya, lihat Mengalokasikan Memori dari Simpul NUMA.
Persyaratan
Klien minimum yang didukung | Windows Vista [hanya aplikasi desktop] |
Server minimum yang didukung | Windows Server 2008 [hanya aplikasi desktop] |
Target Platform | Windows |
Header | memoryapi.h (termasuk Windows.h, Memoryapi.h) |
Pustaka | onecore.lib |
DLL | Kernel32.dll |
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk