2012-08-11 5 views
1

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가 주어진 프로세스에서 스택 공간을 할당하는 방법을 변경할 수 있습니까?

답변

3

스택 공간은 프로세스의 주소 공간 어디에나 할당 할 수 있습니다. 지금은 이에 대한 문서가 없으므로 그러한 문서가 앞으로 나타날 것 같지 않습니다.

스레드 및 가상 할당의 생성이 독립적이라고 가정해도됩니다. 이것이 사실이 아니라면 많은 일이 깨질 것입니다. 할당자는 중복 된 주소 범위를 제공 할 수 없습니다. 이것은 생각할 수 없다. 문제는 다른 곳에서 발생합니다.

상관 관계 - 사용 된 메모리의 양과 가상 주소 공간 조각화와 같이 보일 수있는 유일한 것. 이 경우 최신 요청은 단순히 실패합니다.

저는 메모리 분석 유틸리티에서 일했습니다.

enter image description here

이 사진 할당의 크기에 따라 가상 할당의 수의 분포를 나타낸다.

enter image description here

이 32 비트 프로세스의 주소 공간 내용의 예입니다 (- 최선을 다하고, 마젠타 색 - 블루 예약, 녹색은 사용 가능한 메모리입니다).

여기에 적힌 글은 실제 경험을 토대로 한 것입니다.

+1

'이것은 생각할 수 없다'- OS가 부팅시 너무 빨리 충돌하여 BSOD에 시간이 없을 수도 있습니다. –

+0

답변 해 주셔서 감사합니다. 아마도 "간섭"은이 질문에 대한 가혹한 한마디였습니다. 내가 묻는 것은 기본적으로'CreateThread'가 스택 공간을 어디서나 할당 할 수 있다면 - 당신이 대답했다는 것입니다. "간섭"에 의해 프로세스의 가상 주소 공간을 조각 낼 수 있는지 묻는 중이었습니다 (그러나 지금 생각하면 다른 곳으로 할당 할 수 있습니까?). 따라서 임의의 스레드 할당이 사용자 지정 할당자가 해결할 수없는 조각화를 일으키는 것처럼 보입니다. – defube

+0

나는 내가 소개 한 개념 "AddrSpaceUtilization"을 좋아한다. 이것은 주소 공간 자체의 크기에 대한 모든'VirtualAlloc' 할당의 크기 합계의 비율입니다. Windows에서의 32 비트 프로세스에 대한 필자의 경험에 따르면,이 값이 85-90 % 미만이면 모든 것이 잘 작동합니다. 90 %를 초과하면 여러 문제가 발생하기 시작합니다. –

1

Windows NT 커널은 스레드 인터럽트 우선 순위가 높고 스레드 안전 방식으로 메모리 할당 작업을 처리합니다.

즉, 프로세스의 한 스레드 만 동시에 메모리를 할당 할 수 있으므로 모든 할당 프로세스는 스레드 안전성이 보장됩니다 (이론상). 스택 할당과 가상 할당간에 간섭이 없어야합니다.

또한 1GB의 공간을 할당 할 수 있어야하지만 프로그램은 여전히 ​​2MB의 RAM 만 사용합니다.

Windows는 가상 공간을 "미리 할당"하지만 사용하기 전까지 할당하지 않습니다.

실제로 메모리 관리는 훨씬 복잡하지만, 할당이 이루어지는 한 Windows가 프로세스를 하나의 코어로 잠그고 다른 모든 스레드 할당 요청을 지연시키기 때문에 할당 작업이 방해 받아서는 안됩니다. 처리됨. (교착 상태)

* EDIT : 수백만 개의 작은 비트를 할당 할 경우 할당 및 할당 취소가 약간의 성능 향상 과정을 의미합니다. 이 교착 상태 때문에 대용량 메모리 영역을 할당/할당 해제하는 것이 항상 좋습니다.

관련 문제