CreateThread
分配的堆棧空間是否可能干擾VirtualAlloc
的使用?我找不到在哪裏堆棧空間允許被分配的精確解釋任何討論或文檔...CreateThread是否會影響VirtualAlloc的使用?
下更精確地說明了我的問題:
uint8_t *baseA = (uint8_t*)VirtualAlloc(NULL,1,MEM_RESERVE,PAGE_NOACCESS);
// Create a thread with the default stack size
HANDLE hThread = CreateThread(NULL,0,SomeThreadProc,NULL,NULL,NULL);
// Possibly create even more threads here.
// Can this ever fail in the absence of other allocators? It doesn't here...
uint8_t *baseB = (uint8_t*)VirtualAlloc(NULL,1,MEM_RESERVE,PAGE_NOACCESS);
// Furthermore, in this test, baseB-baseA == 65536 (unless the debugger did something),
// so nothing appeared between baseA and baseB... not even enough space for the
// full 64kb of wastage, as baseA points to 4096 bytes by itself
如果確實其實使用一些模擬VirtualAlloc
,有沒有辦法改變Windows如何在給定的進程中分配堆棧空間?
+1這是不可想象的 - 操作系統在啓動時會很快崩潰,甚至沒有時間來藍屏。 – 2012-08-11 05:20:05
謝謝你的回答。也許「干涉」對於這個問題來說是一個嚴厲的話。我所要求的基本上是,如果'CreateThread',可以在任何地方分配堆棧空間 - 並且你回答了這個問題。通過「干涉」,我問是否可以將流程的虛擬地址空間分割出來(但是,現在我想到了它,還有什麼地方可以分配它?)。所以,看起來好像隨機線程分配會導致沒有自定義分配器可以解析的碎片。 – defube 2012-08-11 05:58:38
我喜歡我自己介紹的「AddrSpaceUtilization」概念。這是所有'VirtualAlloc'分配的大小總和與地址空間本身大小的比率。我在Windows上使用32位進程的經驗表明,當此值小於85-90%時,所有工作都或多或少地正常。當它超過90%時,出現各種問題。 – 2012-08-11 06:46:33