堆栈——Windows核心编程学习手札之十八
堆棧
——Windows核心編程學習手札之十八
堆棧可以用來分配許多較小的數據塊,可以不考慮分配粒度和頁面邊界之類的問題,但分配和釋放內存塊的速度比其他機制要慢,并且無法直接控制物理存儲器的提交和回收。堆棧是保留的地址空間的一個區域,開始時,保留區域中的大多數頁面沒有被提交物理存儲器,當從堆棧中進行越來越多的內存分配時,堆棧管理器將把更多的物理存儲器提交給堆棧,物理存儲器總是從系統的頁文件中分配的,當釋放堆棧中的內存塊時,堆棧管理器將收回這些物理存儲器。
進程初始化時,系統在進程的地址空間中創建一個堆棧,稱為進程的默認堆棧,默認大小是1MB,但系統可以擴大進程的默認堆棧,使它大于其默認值,當創建應用程序時,可以使用/HEAP鏈接開關,改變堆棧的1MB默認區域大小。/HEAP鏈接開關的句法:
?????? /HEAP:reserve[.commit]
可通過調用GetProcessHeap函數獲取進程默認堆棧的句柄:
?????? HANDLE GetProcessHeap();
除進程的默認堆棧外,可以在進程的地址空間中創建輔助堆棧,基于保護組件、更加有效地進行內存管理、進行本地訪問、減少線程同步的開銷、迅速釋放等原因,需要創建輔助堆棧。線程調用HeapCreate函數可創建輔助堆棧:
?????? HANDLE HeapCreate(
????????????????????? DWORD fdwOptions,
????????????????????? SIZE_T dwInitialSize,
????????????????????? SIZE_T dwMaximumSize);
第一個參數fdwOptions用于修改如何在堆棧上執行各種操作,可以設定0、HEAP_NO_SERIALIZE、HEAP_GENERATE_EXCEPTIONS或者組合標志。按照默認設置,堆棧將順序訪問自己,這樣多個線程就能夠分配和釋放堆棧中的內存塊而不至于破壞堆棧,但試圖從堆棧中分配一個內存塊時,HeapAlloc函數必須執行下列操作:
1)遍歷分配的和釋放的內存塊的鏈接表;
2)尋找一個空閑內存塊的地址;
3)通過將空閑內存塊標記為“已分配”分配新內存塊;
4)將新內存塊添加給內存塊鏈接表;
從堆棧中分配內存塊,調用HeapAlloc函數:
?????? PVOID HeapAlloc(
??????????????????? HANDLE hHeap,
?????? ?????????????DWORD fdwFlags,
??????????????????? SIZE_T dwBytes);
第一個參數hHeap用于標識分配的內存塊來自的堆棧的句柄,dwBytes參數用于設定從堆棧中分配的內存塊的字節數。
調用HeapReAlloc函數來改變內存塊的大小:
?????? PVOID HeapReAlloc(
???????????????????? HANDLE hHeap,
??????????????????? DWORD fdwFlags,
?????????????? ?????PVOID pvMem,
??????????????????? SIZE_T dwBytes);
當內存塊分配后,可調用HeapSize函數來檢索內存塊的實際大小:
?????? SIZE_T HeapSize(
?????????????????? HANDLE hHeap,
?????????????????? DWORD fdwFlags,
?????????????????? LPCVOID pvMem);
參數hHeap用于標識堆棧,參數pvMem用于指明內存塊的地址,參數fdwFlags既可以是0,也可以是HEAP_NO_SERIALIZE。
當不再需要內存塊時,可以調用HeapFree函數將其釋放:
?????? BOOL HeapFree(
????????????????? HANDLE hHeap,
????????????????? DWORD fdwFlags,
????????????????? PVOID pvMem);
HeapFree函數用于釋放內存塊,如運行成功,則返回TRUE。
如果應用程序不再需要它創建的堆棧,可通過調用HeapDestroy函數將其撤消:
?????? BOOL HeapDestroy(HANLDE hHeap);
調用HeapDestroy函數可以釋放堆棧中包含的所有內存塊,也可以將堆棧占用的物理存儲器和保留的地址空間區域重新返回給系統。
總結
以上是生活随笔為你收集整理的堆栈——Windows核心编程学习手札之十八的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内存映射文件——Windows核心编程学
- 下一篇: DLL基础——Windows核心编程学习