Windows     via    C/C++15장.애플리케이션에서가상 메모리 사용 방법16장.스레드 스택                      이영권    whiletrue0222@gmail.com            ...
15장. 애플리케이션에서 가상 메모리 사용 방법      가상 메모리 관리 함수들      의 사용법을 알아봅니다.
가상 메모리 함수들을 사용하면• 주소 공간 내에 직접적으로 영역을 예약• 예약된 영역에 물리적 저장소를 커밋• 필요한 보호 특성을 설정
1. 주소 공간 내에 영역 예약하기LPVOID                       예약된 메모리 주소VirtualAlloc(                가상 메모리를 예약하는 함수   LPVOID lpAddress,...
LPVOID                       대부분의 경우 NULL값을 전달.VirtualAlloc(                시스템이 프리 주소 영역 중 가장 적절                         ...
LPVOID                       시스템은 항 상 CPU의 페이지 크기의VirtualAlloc(                배수로 영역을 예약   LPVOID lpAddress,         4KB,...
LPVOID                       MEM_RESERVE:VirtualAlloc(                • 영역 예약                             MEM_TOP_DOWN:   ...
LPVOIDVirtualAlloc(                13장 section6 보호특성을 참조. P501   LPVOID lpAddress,         PAGE_NOACCESS   SIZE_T dwSize, ...
LPVOID                         NUMA(Non-Uniform Memory Access) 머신에서VirtualAllocExNuma(            수행되는 경우 성능 개선을 위해 특정   H...
2. 예약 영역에 저장소 커밋하기메모리에 접근하기 위해    커밋커밋이 필요함.        할당된 물리적 저장소에                메모리 영역을 매핑하는커밋은 페이지 크기 단위   것.로 수행된다.     ...
커밋 방법LPVOID                       MEM_RESERVE 대신VirtualAlloc(                MEM_COMMIT을 사용한다.   LPVOID lpAddress,        ...
3. 영역에 대한 예약과 저장소 커밋을       동시에 수행하는 방법LPVOID                       MEM_RESERVE와VirtualAlloc(                MEM_COMMIT을 동...
큰 페이지 단위(Laarge-Page Granularity)를 사용하게 되면 성능을 개선할 수 있다.‘큰 페이지’의 최소 크기를 얻어오는 함수GetLargePageMinimum                        ...
4. 언제 물리적 저장소를 커밋하는가            가상 메모리 기법의 유일한 문            제점은            언제 물리적 저장소를            커밋할지 판단해야 한다는 것.
커밋되었는지 확인하는 방법1. 항상 커밋해 본다. –   가장 쉽지만 느려진다.2. VirtualQuery로 확인한다. –   1번보다 느리다.3. 페이지 커밋 여부를 따로 기록한다. –   복잡한 작업이 될 수 있다.
4. 구조적 예외 처리(SEH)를 사용한다.• 코드가 적고• 가장 빠르다.SEH는 23, 24, 25장에서 자세히 다뤄진다.
5. 물리적 저장소의        디커밋과 영역 해제하기BOOL                   해제할 때 MEM_RELEASE를 사용.VirtualFree(           해제 시에는   LPVOID lpAddre...
BOOL                   디커밋할 때 MEM_DECOMMIT을 사용.VirtualFree(           페이지 단위로 가능   LPVOID lpAddress,                      ...
6. 보호 특성 변경하기VirtualProtect로 변경 가능.잘 활용하면 잠재적인 버그로부터 보호할 수 있다.예) 메모리를 사용할 때만 PAGE_READWRITE사용하지 않을 때 PAGE_NOACCESS로 변경해서접근...
7. 물리적 저장소의 내용 리셋하기물리적 저장소 리셋:N개의 페이지 내용이 수정되지 않았다고 시스템에게 알려주는 것.수행 성능을 향상 시킨다.
예) 페이지를 로드할 때물리적 저장소가 꽉 차있고 4번 페이지를 사용할 경우.           1   2   3              1   4   31. 2를 저장               2. 4를 로드    1...
예) 리셋을 사용하면시스템은 2번이 수정되지 않았다고 알기 때문에 2를 저장 안함.      1   2    3             1      4     3               1. 바로 4를 로드       ...
주의!                할당할 때             리셋할 때시작주소            내림                올림할당크기            올림                내림위와 같이 다른...
주소 윈도우 확장• AWE (Address Windowing Extension)• 32비트 윈도우에서 더 많은 메모리를 사용  하기 위한 방법.
AWE 특징•   디스크로 스왑되지 않는다.•   주소 공간보다 더 큰 램에 접근할 수 있다.•   프로세스 주소 공간에 보여지지 않는다.•   주소 윈도우 (Address Window)를 통해 접    근한다.    ...
주의• SQL Server 2012부터 AWE를 지원 안함.• http://msdn.microsoft.com/ko-  kr/library/ms143179(v=sql.110).aspx
16장. 스레드 스택• 시스템에서 직접 주소 공간을 예약한다.• 스레드 생성시 스택 메모리 공간 – 기본적으로 1MB의 주소 공간을 예약 – 두 개의 페이지만 커밋• 스택 영역은 모두 PAGE_READWRITE 특  성
스레드 스택의 페이지 상태메모리 주소           페이지 상태0x080FF000   커밋된 페이지 (최상위)0x080FE00    커밋된 페이지 (가드 특성)    00x080FD00       예약된 페이지   ...
모두 사용하였을 경우메모리 주소            페이지 상태0x080FF000     커밋된 페이지 (최상위)0x080FE00        커밋된 페이지    0                    …0x0800100...
최하위 페이지를 예약 상태로만 유지하는 이유메모리 주소            페이지 상태0x080FF000    커밋된 페이지 (최상위)0x080FE00        커밋된 페이지    0                  ...
스택 크기 변경 방법• IDE에서 변경 – VC++ 컴파일러 /F 옵션 – 링커 /STACK 옵션• 코드에서 변경 – CreateThread, _beginthreadex 호출 시 지정
1.   C/C++ 런타임 라이브러리의 스택 확인 함수스택을 주소 공간에 할당하더라도사용 전까지는 물리적 저장소에커밋하지 않는다.
스택 확인 함수오른쪽 함수는            void SomFunction(){4KB 페이지 크기 시스템에서     int nValue[4000]; // 16,000바이트4개의 페이지가 필요함         nVal...
• 스택 확인 함수는 사용되는 영역이 커밋되  었는지 확인.• 컴파일러는 스택 확인이 필요한 곳에 자동  적으로 스택 확인 함수 호출 코드를 포함.
1. Summation 예제 애플리케이션StackOverFlow 발생시 SHE를 사용하여 우아하게 종료한다.
감사합니다.
Upcoming SlideShare
Loading in …5
×

Windows viac cpp_15장_16장

2,285 views

Published on

15장.
애플리케이션에서
가상 메모리 사용 방법

16장.
스레드 스택

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,285
On SlideShare
0
From Embeds
0
Number of Embeds
690
Actions
Shares
0
Downloads
13
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Windows viac cpp_15장_16장

  1. 1. Windows via C/C++15장.애플리케이션에서가상 메모리 사용 방법16장.스레드 스택 이영권 whiletrue0222@gmail.com 아꿈사 2012-02-11
  2. 2. 15장. 애플리케이션에서 가상 메모리 사용 방법 가상 메모리 관리 함수들 의 사용법을 알아봅니다.
  3. 3. 가상 메모리 함수들을 사용하면• 주소 공간 내에 직접적으로 영역을 예약• 예약된 영역에 물리적 저장소를 커밋• 필요한 보호 특성을 설정
  4. 4. 1. 주소 공간 내에 영역 예약하기LPVOID 예약된 메모리 주소VirtualAlloc( 가상 메모리를 예약하는 함수 LPVOID lpAddress, 예약하고자 하는 메모리 주소 SIZE_T dwSize, 영역의 크기 DWORD flAllocationType, 예약할 것인지 커밋할 것인지 DWORD flProtect 보호 특성 );가상 메모리를 예약하는 함수
  5. 5. LPVOID 대부분의 경우 NULL값을 전달.VirtualAlloc( 시스템이 프리 주소 영역 중 가장 적절 한 공간을 찾아낸다. LPVOID lpAddress, SIZE_T dwSize, 주소를 지정할 때에는 DWORD flAllocationType, 꼭 프로세스의 유저 모드 파티션을 가리 키는 값을 전달해야 한다. DWORD flProtect ); 주소는 할당 단위어야 한다. (13장 sec3 참조)
  6. 6. LPVOID 시스템은 항 상 CPU의 페이지 크기의VirtualAlloc( 배수로 영역을 예약 LPVOID lpAddress, 4KB, 8KB, 16KB 페이지 크기를 사용하 SIZE_T dwSize, 는 머신에서 DWORD flAllocationType, 62KB를 예약하려 하면 64KB로 예약한다. DWORD flProtect );
  7. 7. LPVOID MEM_RESERVE:VirtualAlloc( • 영역 예약 MEM_TOP_DOWN: LPVOID lpAddress, • 단편화를 피하기 위해 높은 주소 공 SIZE_T dwSize, 간 상에 영역을 예약하기 원할 때. DWORD flAllocationType, 다른 값들은 나중에 살펴봅니다. DWORD flProtect );
  8. 8. LPVOIDVirtualAlloc( 13장 section6 보호특성을 참조. P501 LPVOID lpAddress, PAGE_NOACCESS SIZE_T dwSize, PAGE_READONLY DWORD flAllocationType, PAGE_READWRITE … DWORD flProtect );
  9. 9. LPVOID NUMA(Non-Uniform Memory Access) 머신에서VirtualAllocExNuma( 수행되는 경우 성능 개선을 위해 특정 HANDLE hProcess, 노드에 탑재된 램으로부터 가상 메모리 를 확보할 때 사용한다. LPVOID lpAddress, SIZE_T dwSize, 참조 DWORD flAllocationType, 14.3 NUMA 머신에서의 메모리 관리 DWORD flProtect, DWORD dwPreferredNumaNode );
  10. 10. 2. 예약 영역에 저장소 커밋하기메모리에 접근하기 위해 커밋커밋이 필요함. 할당된 물리적 저장소에 메모리 영역을 매핑하는커밋은 페이지 크기 단위 것.로 수행된다. 13장 section4 물리적 저 장소를 영역으로 커밋하 기. p496
  11. 11. 커밋 방법LPVOID MEM_RESERVE 대신VirtualAlloc( MEM_COMMIT을 사용한다. LPVOID lpAddress, dwSize 전달하여 전체를 커밋하지 않을 SIZE_T dwSize, 수 있다. DWORD flAllocationType, DWORD flProtect );
  12. 12. 3. 영역에 대한 예약과 저장소 커밋을 동시에 수행하는 방법LPVOID MEM_RESERVE와VirtualAlloc( MEM_COMMIT을 동시에 사용한다. LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect );
  13. 13. 큰 페이지 단위(Laarge-Page Granularity)를 사용하게 되면 성능을 개선할 수 있다.‘큰 페이지’의 최소 크기를 얻어오는 함수GetLargePageMinimum MEM_LARGE_PAGE를 사용하면 메모리 공간을 페VirtualAlloc을 호출할 때 이징 불가능 영역으로 설정 하여 항상 렘에 유지된다.MEM_LARGE_PAGE 플래그를 사용. 성능↑
  14. 14. 4. 언제 물리적 저장소를 커밋하는가 가상 메모리 기법의 유일한 문 제점은 언제 물리적 저장소를 커밋할지 판단해야 한다는 것.
  15. 15. 커밋되었는지 확인하는 방법1. 항상 커밋해 본다. – 가장 쉽지만 느려진다.2. VirtualQuery로 확인한다. – 1번보다 느리다.3. 페이지 커밋 여부를 따로 기록한다. – 복잡한 작업이 될 수 있다.
  16. 16. 4. 구조적 예외 처리(SEH)를 사용한다.• 코드가 적고• 가장 빠르다.SEH는 23, 24, 25장에서 자세히 다뤄진다.
  17. 17. 5. 물리적 저장소의 디커밋과 영역 해제하기BOOL 해제할 때 MEM_RELEASE를 사용.VirtualFree( 해제 시에는 LPVOID lpAddress, lpAddress는 시작 주소 dwSize는 0이어야 한다. SIZE_T dwSize, DWORD dwFreeType 예약했던 영역을 한번에 해제해야 함. );
  18. 18. BOOL 디커밋할 때 MEM_DECOMMIT을 사용.VirtualFree( 페이지 단위로 가능 LPVOID lpAddress, lpAddress 시작주소, dwSize 0이면 SIZE_T dwSize, 전체를 디커밋. DWORD dwFreeType lpAddress + dwSize가 페이지 중간쯤이면 ); lpAdress ~ lpAdress + dwSize까지 모든 페이지 디커밋
  19. 19. 6. 보호 특성 변경하기VirtualProtect로 변경 가능.잘 활용하면 잠재적인 버그로부터 보호할 수 있다.예) 메모리를 사용할 때만 PAGE_READWRITE사용하지 않을 때 PAGE_NOACCESS로 변경해서접근 위반 에러를 발생하게 하는 것.
  20. 20. 7. 물리적 저장소의 내용 리셋하기물리적 저장소 리셋:N개의 페이지 내용이 수정되지 않았다고 시스템에게 알려주는 것.수행 성능을 향상 시킨다.
  21. 21. 예) 페이지를 로드할 때물리적 저장소가 꽉 차있고 4번 페이지를 사용할 경우. 1 2 3 1 4 31. 2를 저장 2. 4를 로드 1 2 3 4 5
  22. 22. 예) 리셋을 사용하면시스템은 2번이 수정되지 않았다고 알기 때문에 2를 저장 안함. 1 2 3 1 4 3 1. 바로 4를 로드 성능 향상! 1 2 3 4 5
  23. 23. 주의! 할당할 때 리셋할 때시작주소 내림 올림할당크기 올림 내림위와 같이 다른 이유는 실수로 페이지를 리셋해 버리는 것을 막기 위함.또한 MEM_RESET은 항상 단독으로 사용되어야 한다.MemReset예제 실행하지 말자. 컴퓨터 왕 느려짐.
  24. 24. 주소 윈도우 확장• AWE (Address Windowing Extension)• 32비트 윈도우에서 더 많은 메모리를 사용 하기 위한 방법.
  25. 25. AWE 특징• 디스크로 스왑되지 않는다.• 주소 공간보다 더 큰 램에 접근할 수 있다.• 프로세스 주소 공간에 보여지지 않는다.• 주소 윈도우 (Address Window)를 통해 접 근한다. – 코드양이 많아진다.
  26. 26. 주의• SQL Server 2012부터 AWE를 지원 안함.• http://msdn.microsoft.com/ko- kr/library/ms143179(v=sql.110).aspx
  27. 27. 16장. 스레드 스택• 시스템에서 직접 주소 공간을 예약한다.• 스레드 생성시 스택 메모리 공간 – 기본적으로 1MB의 주소 공간을 예약 – 두 개의 페이지만 커밋• 스택 영역은 모두 PAGE_READWRITE 특 성
  28. 28. 스레드 스택의 페이지 상태메모리 주소 페이지 상태0x080FF000 커밋된 페이지 (최상위)0x080FE00 커밋된 페이지 (가드 특성) 00x080FD00 예약된 페이지 0 …0x08000000 예약된 페이지 (최하위)가드 페이지에 접근하면 현재 가드페이지를 해제다음 페이지를 가드페이지로 지정.
  29. 29. 모두 사용하였을 경우메모리 주소 페이지 상태0x080FF000 커밋된 페이지 (최상위)0x080FE00 커밋된 페이지 0 …0x08001000 커밋된 페이지0x08000000 예약된 페이지 (최하위)최하위 영역은 항상 예약 상태로만 두고 커밋하지 않는다.0x08001000에 물리적 저장소를 커밋할 때EXCEPTION_STACK_OVERFLOW 예외를 발생시킨다.
  30. 30. 최하위 페이지를 예약 상태로만 유지하는 이유메모리 주소 페이지 상태0x080FF000 커밋된 페이지 (최상위)0x080FE00 커밋된 페이지 0 …0x08001000 커밋된 페이지0x08000000 예약된 페이지 (최하위)0x07FFF00 다른 용도로 커밋된 페이지 00x08001000 영역을 다 사용하고 0x08000000을 사용하면 접근 위반이 발생.최하위 영역을 커밋한다면 0x07FFF000에 접근할 수 있다.
  31. 31. 스택 크기 변경 방법• IDE에서 변경 – VC++ 컴파일러 /F 옵션 – 링커 /STACK 옵션• 코드에서 변경 – CreateThread, _beginthreadex 호출 시 지정
  32. 32. 1. C/C++ 런타임 라이브러리의 스택 확인 함수스택을 주소 공간에 할당하더라도사용 전까지는 물리적 저장소에커밋하지 않는다.
  33. 33. 스택 확인 함수오른쪽 함수는 void SomFunction(){4KB 페이지 크기 시스템에서 int nValue[4000]; // 16,000바이트4개의 페이지가 필요함 nValue[0] = 0; // 할당 작업 수행 }스택은 2개만 커밋되어 있음스택을 확인하는 함수가 필요.
  34. 34. • 스택 확인 함수는 사용되는 영역이 커밋되 었는지 확인.• 컴파일러는 스택 확인이 필요한 곳에 자동 적으로 스택 확인 함수 호출 코드를 포함.
  35. 35. 1. Summation 예제 애플리케이션StackOverFlow 발생시 SHE를 사용하여 우아하게 종료한다.
  36. 36. 감사합니다.

×