VirtualAllocExNuma 函式 (memoryapi.h)
在指定進程的虛擬位址空間內保留、認可或變更記憶體區域的狀態,並指定實體記憶體的 NUMA 節點。
語法
LPVOID VirtualAllocExNuma(
[in] HANDLE hProcess,
[in, optional] LPVOID lpAddress,
[in] SIZE_T dwSize,
[in] DWORD flAllocationType,
[in] DWORD flProtect,
[in] DWORD nndPreferred
);
參數
[in] hProcess
進程的控制碼。 函式會在此進程的虛擬位址空間內配置記憶體。
控制碼必須具有 PROCESS_VM_OPERATION 存取權限。 如需詳細資訊,請參閱 處理安全性和存取權限。
[in, optional] lpAddress
指標,指定您想要配置之頁面區域所需的起始位址。
如果您要保留記憶體,函式會將此位址舍入到最接近的配置資料細微性倍數。
如果您要認可已保留的記憶體,函式會將此位址舍入到最接近的頁面界限。 若要判斷頁面的大小和主機電腦上的配置細微性,請使用 GetSystemInfo 函式。
如果 lpAddress 為 Null,函式會決定要配置區域的位置。
[in] dwSize
要配置的記憶體區域大小,以位元組為單位。
如果 lpAddress 為 Null,函式會將 dwSize 四捨五入至下一個頁面界限。
如果 lpAddress 不是 Null,函式會將範圍中包含一或多個位元組的所有 頁面配置至(lpAddress+dwSize)
。 例如,這表示跨越頁面界限的 2 位元組範圍會導致函式配置這兩個頁面。
[in] flAllocationType
記憶體配置的類型。 此參數必須包含下列其中一個值。
值 | 意義 |
---|---|
|
針對指定的保留記憶體頁面,配置記憶體費用 (磁片上的整體大小和分頁檔案) 。 函式也保證當呼叫端稍後存取記憶體時,內容會是零。 除非實際存取虛擬位址,否則不會配置實際實體頁面。
若要在一個步驟中保留和認可頁面,請使用 呼叫 函式 除非已保留整個範圍,否則嘗試指定沒有MEM_RESERVE且非NulllpAddress會指定MEM_COMMIT來認可特定位址範圍。 產生的錯誤碼 ERROR_INVALID_ADDRESS。 嘗試認可已認可的頁面並不會讓函式失敗。 這表示您可以認可頁面,而不需要先判斷每個頁面的目前承諾用量狀態。 |
|
保留進程虛擬位址空間的範圍,而不需在記憶體或磁片上的分頁檔案中配置任何實際實體儲存體。
您可以使用 MEM_COMMIT再次呼叫 函式來認可保留的頁面。 若要在一個步驟中保留和認可頁面,請使用 呼叫 函式 其他記憶體配置函式,例如 malloc 和 LocalAlloc,在釋放之前,無法使用保留的記憶體。 |
|
表示 lpAddress 和 dwSize 所指定的記憶體範圍中的資料不再感興趣。 頁面不應該讀取或寫入至分頁檔案。 不過,稍後會再次使用記憶體區塊,因此不應予以認可。 此值不能與任何其他值搭配使用。
使用此值不保證以 MEM_RESET 運作的範圍會包含零。 如果您想要範圍包含零,請取消認可記憶體,然後重新認可它。 當您使用 MEM_RESET時,函式會忽略 fProtect的值。 不過,您仍必須將 fProtect 設定為有效的保護值,例如 PAGE_NOACCESS。 如果您使用 MEM_RESET ,而且記憶體範圍會對應至檔案,則函式會傳回錯誤。 只有在共用檢視對應至分頁檔案時才可接受。 |
|
MEM_RESET_UNDO 應該只在先前成功套用 MEM_RESET 的位址範圍上呼叫。 它表示 lpAddress 和 dwSize 所指定記憶體範圍中的資料對呼叫端感興趣,並嘗試反轉 MEM_RESET的效果。 如果函式成功,這表示指定位址範圍中的所有資料都保持不變。 如果函式失敗,則位址範圍中至少有一些資料已取代為零。
此值不能與任何其他值搭配使用。 如果在先前未MEM_RESET的位址範圍上呼叫MEM_RESET_UNDO,則行為未定義。 當您指定 MEM_RESET時, VirtualAllocExNuma 函式會忽略 flProtect的值。 不過,您仍必須將 flProtect 設定為有效的保護值,例如 PAGE_NOACCESS。 Windows Server 2008 R2、Windows 7、Windows Server 2008 和 Windows Vista: 在 Windows 8 和 Windows Server 2012 之前,不支援 MEM_RESET_UNDO 旗標。 |
此參數也可以依指示指定下列值。
值 | 意義 |
---|---|
|
使用 大型頁面支援來配置記憶體。
大小和對齊方式必須是大頁最小值的倍數。 若要取得此值,請使用 GetLargePageMinimum 函式。 如果您指定此值,您也必須指定 MEM_RESERVE 和 MEM_COMMIT。 |
|
保留可用來對應 位址視窗延伸 模組的位址範圍, (AWE) 頁面。
此值必須與 MEM_RESERVE 搭配使用,且沒有其他值。 |
|
以最高可能位址配置記憶體。 |
[in] flProtect
要配置之頁面區域的記憶體保護。 如果認可頁面,您可以指定任何一個 記憶體保護常數。
保護頁面時指定的保護屬性無法與配置頁面時所指定的屬性衝突。
[in] nndPreferred
實體記憶體應該所在的 NUMA 節點。
只有在配置新的 VA 區域 (已認可或保留) 時才使用。 否則,當 API 用來認可已存在的區域中的頁面時,會忽略此參數
傳回值
如果函式成功,則傳回值是頁面配置區域的基底位址。
如果函式失敗,則傳回值為 Null。 若要取得擴充的錯誤資訊,請呼叫 GetLastError。
備註
每個頁面都有相關聯的 頁面狀態。 VirtualAllocExNuma函式可以執行下列作業:
- 認可保留頁面的區域
- 保留免費頁面的區域
- 同時保留並認可免費頁面的區域
VirtualAllocExNuma 無法保留保留的頁面。 它可以認可已經認可的頁面。 這表示不論頁面是否已認可,您都可以認可一系列頁面,而且函式不會失敗。
您可以使用 VirtualAllocExNuma 來保留頁面區塊,然後對 VirtualAllocExNuma 進行其他呼叫,以認可保留區塊中的個別頁面。 這可讓程式保留其虛擬位址空間的範圍,而不需要耗用實體儲存體,直到需要為止。
如果 lpAddress 參數不是 Null,函式會使用 lpAddress 和 dwSize 參數來計算要配置的頁面區域。 整個頁面範圍的目前狀態必須與 flAllocationType 參數所指定的配置類型相容。 否則,函式會失敗,且未配置任何頁面。 此相容性需求不會排除認可已認可的頁面;請參閱上述清單。
由於 VirtualAllocExNuma 不會配置任何實體頁面,因此不論該節點上或系統中其他地方是否有可用的頁面,都會成功。 實體頁面會視需要配置。 如果慣用的節點用完分頁,記憶體管理員會使用來自其他節點的頁面。 如果記憶體分頁,則會在將記憶體重新帶回時使用相同的進程。
若要執行動態產生的程式碼,請使用 VirtualAllocExNuma 配置記憶體和 VirtualProtectEx 函式來授 與PAGE_EXECUTE 存取權。
VirtualAllocExNuma函式可用來在指定進程的虛擬位址空間內,保留 AWE) 記憶體的位址視窗延伸模組 (區域。 然後,您可以使用此記憶體區域,將實體頁面對應至應用程式所需的虛擬記憶體和虛擬記憶體外。 必須在AllocationType參數中設定MEM_PHYSICAL和MEM_RESERVE值。 不得設定 MEM_COMMIT 值。 頁面保護必須設定為 PAGE_READWRITE。
VirtualFreeEx函式可以取消認可頁面、釋放頁面的儲存體,也可以同時解除認可並釋放認可的頁面。 它也可以釋放保留頁面,使其成為免費頁面。
若要編譯使用此函式的應用程式,請將 _WIN32_WINNT 定義為0x0600或更新版本。
範例
如需範例,請參閱 從 NUMA 節點配置記憶體。
需求
最低支援的用戶端 | Windows Vista [僅限傳統型應用程式] |
最低支援的伺服器 | Windows Server 2008 [僅限傳統型應用程式] |
目標平台 | Windows |
標頭 | memoryapi.h (包括 Windows.h、Memoryapi.h) |
程式庫 | onecore.lib |
DLL | Kernel32.dll |