본문 바로가기
IT

프로그래머가 알면 좋은 Windows system memory 윈도우즈 시스템 메모리 이야기

by 신림83 2021. 7. 14.
반응형

프로그래머가 알면 좋은 Windows system memory 윈도우즈 시스템 메모리 이야기

윈도우즈 프로그래밍을 할때, 가벼운 프로그램을 제작한다면 메모리 관련 문제에 신경을 안 쓰실 수 있지만, 예를 들어 써버와 같은 다중 접속자를 위한 처리를 하는 프로그램을 개발한다면 메모리 사용량이 매우 많을 수 있고 이로 인해 문제를 가질 수 있습니다. 여러 가지 프로그램이 존재하니까요, 그래서 프로그래머 위주로 보면 좋은 윈도즈 메모리 관련 내용을 가져다 두려 합니다.

 

프로그램의 메모리 사용량은 어떻게 확인할 수 있을까요? 작업 관리자, 리소스 모니터 등을 활용하는 걸 상상할 수 있겠죠.

작업 관리자의 메모리를 보는 것은 의미가 있나? 어느 정도만!

작업관리좌를 보면 메모리 할당양을 확인할수 있다.

틀린 접근은 아닙니다. 일반 사용자 유저로 접근한다면 이걸 보는 게 좋습니다. 하지만 프로그램 제작자 입장에서는 좀 더 알면 좋습니다. 작업 관리자에서 보여주는 메모리 학명은 Private Working Set입니다. Ram에만 할당되어 있는 Page들의 크기입니다. 종종 프래그램을 최소화하여 쓰지 않고 나두다 보면 사용 중인 메모리가 PageOut 되는 경우가 생기고 어느새 메모리 사용량일 팍 줄어 버립니다. 실제 지워진 메모리가 아니더라도 요. 

 

그래서 작업 관리자를 보며, 내가 만든 프로그램이 메모리를 어떻게 사용하는가를 분석하는 것은 많이 부적절해 보입니다. 

 

Virtual Memory 란 무엇인가?

순수 Ram을 활용한 메모리뿐만 아니라, 유연하게 하드 디스크 등을 이용하여 프로그램 메모리 자원으로 활용하는 기술입니다. 주소 공간은 한차례 매핑되어 접근됩니다. 모드 빠른 램으로 사용하면 참 좋겠지만, 비싸죠... 여러 가지 문제가 있습니다.

 

페이징 Paging 이란 무엇인가?

Ram 이외의 저장소 가상 메모리로 사용되는 하드디스크라던지 등의 녀석들을 메모리로 사용할 수 있게 해주는 기술입니다. 윈도를 이용하시다 보면 페이징파일 용량 큰 녀석이 있는데, 바로 이 녀석도 여기에 사용됩니다. SSD에 만들면 더욱 효율이 좋습니다.

 

Page Fault

특정 메모리를 찾을 때 램에 없어 다음으로 넘어가는 현상

 

Pagg Out

램에서 하드디스크

 

Page In

하드디스크에서 램으로

 

Working Set

윈도즈에서는 Ram에 올라와 있는 메모리를 가르치는 용어이지만, 일반적으로는 프로세스가 사용하는 메모리를 지칭하기도 함

 

Paging Pool

Ram에 있는 메모리이며, 읽기 전용으로 사용되는 메모리, PageOut 필요 없는 메모리 영역

 

Non Paged Pool

늘 Ram에 있으며, 절대 PageOut 되지 않는 영역

일반적으로는 드라이버에서 사용된다. 하드웨어로부터의 입력은 바로 교신하지 않으면 로스트 될 수도

NP Pool을 마구 사용하면, 가용 Ram이 적어지면서 thrashing 심해지고, 시스템 자체에 무리가 올 수 있다. 

 

Paging Pool, Non Paged Pool 서로 반대 계념이 아니다.

 

process memory

Heap

프로그램 내에서 메모리를 할당하는 데 쓰이는 영역

Stack

전역 변수, 콜스택, 함수 파라메터, 등이 대표적, 컴파일러에 따라 내용이 다르다.

Code

기계어 코드가 올라가는 영역

Global Variables

전역변수 영역

그 외

TLS, 아이콘, exe, Virtual Function Table... 

 

Stack, Heap 메모리 영역, 데이터 구조

Stack 메모리 영역

지역변수, 함수 관련 정보, 파라미타, 리턴 값 등을 위해 할당된 메모리 영역

 

Stack 데이터 구조

FILO 형태

 

Heap 메모리 영역

프로그램 실행 시 메모리를 할당하기 위한 영역 new xxx

 

Heap 데이터 구조

상위 노드가 하위 노드 최대 값을 갖는 구조, heap sort, priority queue 등으로 구현되어 있다.

 

프로세스의 가상 메모리 할당 용량과 실제 사용량?

하나의 윈도 프로세스, 프로그램에서 할당 가능한 메모리는 얼마일까?

32bit = 4GB, 64bit = 16eb, 이론적인 이야기이다. 프로그램이 플랫폼 지원 여부와 운영체제 버전에 따라 가상 메모리 한계는 정해진다.

 

32bit로 보도록 하자. 요즘 이런 환경이 잘 없지만, 당신에게 월급을 주는 직장에서는 이런 환경에서 일할 가능성이 여전히 존재한다. 32bit 4GB, 이것도 적어 보인다. 하지만 실제 프로그램 제작자가 사용할 수 있는 공간은 2GB라고 봐야 한다. 나머지 2GB는 커널 모드에서 사용한다. 2GB 이상을 사용하고 메모리를 당기면 여러 문제를 경험할 수 있을 것이다.

 

추가적으로 한 번에 많은 메모리 할당 시 커밋 오류가 있을 수도 있다. 처음 가상 메모리에 할당된 공간은 2GB가 아닐 수 있다. 이는 64bit에서도 마찬가지이다. 

 

프로세스가 사용하는 메모리를 측정하기 위해서는?

다음과 같은 툴들을 고려해볼 수 있다.

  • Process Explorer
  • VMMap
  • UMDH
  • Visual Studio Memory Snapshot

혹은 풀덤프를 이용한 분석

 

참고한 페이지들

https://www.slideshare.net/innover/windows-system-memory

https://www.slideshare.net/seao/ndc18-95258747

 

살짝 관련 내용들을 볼일이 생겨서 보는 김에 정리해보았습니다. 도움이 되시면 좋겠네요, 감사합니다.

반응형

댓글