36
Windows System 개개개개 Memory 개개 3 개개 devCAT Studio 개개개

Windows system - memory개념잡기

Embed Size (px)

Citation preview

Windows System 개념잡기Memory

개발 3 본부 devCAT Studio

송창규

들어가며 ..

넥슨 신입 프로그래머 교육은 여러분이 게임 프로그래머로서 ,

나아가 프로그래머로서더 깊이 탐구하고 공부할 세상을 헤메이지 않고 탐험할 수 있는

큰그림의 간략한 “지도”를 제시하고 “ 왜”라는 질문을 통해

그 사이의 연결점을 찾는데 도움을 주기위한 자리입니다

이 강의는 ..

넥슨 신입 프로그래머을 대상으로 한 강의이미 프로그래밍 기본은 하는 사람을 대상경력자도 Win32 프로그래머라면 도움됨

32bit Windows 를 기준으로 설명됨대학강의 / 학원강의 / 인강 스타일 아닙니다

공부시켜주는 강의 아님공부는 여러분이 하세요

“ 더 깊게 공부할 수 있게 하는 지도”

발표자 소개

송창규 (80 년생 , 잡캐프로그래머 )[email protected] @innovari

Personal History한스타 개발 (2000)

넥슨 입사 (2002)

크레이지 아케이드 BnB (2002)

크레이지 아케이드 Tetris (2002)

디지팡 (2002~2003)

빅샷 (2004~2006)

버블파이터 (2006~2010)

마비노기 2 (2010~)

이 강연에서 짚어볼 것들

“Memory 그거 뭔가요 ? 먹는거임 ?”

32bit Windows System 에서 사용되는메모리 관련 개념들

Virtual MemoryPagingMemory Mapped FileCache MemoryProcess MemoryModule

XP 작업관리자의 “메모리사용” 항목 ?

무슨 의미일까 ?“ 프로세스가 사용하는 메모리 양”Lev1 Answer

정확히 무슨 의미일까 ?

작업관리자의 “메모리” 항목 ?

무슨 의미일까 ?A. 프로세스에게 할당된 가용 Virtual Memory 전부B. 프로세스에게 할당된 주소공간 크기C. 프로세스가 쓰고있는 RAM 크기

어떤게 포함되고 어떤게 안될까 ?Heap , Stack, Data (globals) 는 왠지 들어갈것 같은 느낌이지만 ..1.Code 는 포함되나 ?2.Paged out memory? 는 포함되나 ?3.Reserved page 는 포함되나 ?

Memory?

Virtual Memory 란 무엇일까 ?

Virtual Memory 를 왜 쓸까 ?( Virtual Memory 를 안쓰면 어떻게 될까 ? )

Memory?

Virtual Memory 란 무엇일까 ?• Physical Memory(RAM) 과 대비• 주소공간이 Phys. Memory 에 바로 대응하지않고• 한차례 매핑 (Paging) 을 거쳐 사용됨

Virtual Memory 를 왜 쓸까 ?( Virtual Memory 를 안쓰면 어떻게 될까 ? )

• RAM 은 비싸고 , 용량이 크지 않으니유연하게 하드디스크도 프로그램의 메모리 자원으로 활용

• MP3 를 틀었는데 작업하던 PPT 가 날아가는 불상사를 방지(Protected Memory 의 구현 . 예전엔 이런게 흔한 일이었다 !)

Paging?

Paging?Page Table?Page Size?Page File / Paging File SizePage Fault / Page In / Page Out?Working Set?Free / Committed / ReservedPaging PoolNon-Paged Pool

Paging?

Paging• RAM 외의 저장소(대부분의 경우 하드디스크 . 그냥 하드디스크라 칭하겠습니다)도

응용프로그램이 사용하는 메모리로 이용할 수 있게 해주는 개념• 같은 크기 블럭인 Page 를 주소공간에 매핑

Page Table• Page 와 주소공간을 매핑해주는 테이블• 사실 프로그래머는 거의 신경쓸 필요 없다

Page Size4096 Bytes

Paging File(Page File) / Paging File Size• 응용프로그램이 Paging 을 통해 메모리로 쓸 영역• 일반적으로 부트디스크에 , 하드상에 연속적인 공간을 갖는 일정 크기 파일로 만들어짐• SSD 에 만들면 효과가 좋다

Paging:Page Fault / Page In / Page Out

Page Fault메모리에 접근하려고 했는데 , RAM 에 있지 않을 경우 발생하는 이벤트

Page OutRAM 하드디스크

Page In하드디스크 RAM

Working Set일반적인 의미는 프로세스가 사용하는 메모리를 지칭윈도우에서는 RAM 에 올라와있는 메모리를 지칭함

Paging:Free/Committed/Reserved

페이지 상태Free

해당 주소의 페이지가 할당되지 않은 상태

Committed해당 주소의 페이지가 할당된 상태RAM 에 있을수도 , 하드디스크에 있을수도 있음

Reserved해당 주소의 페이지가 예약된 상태왜 필요한가?ex)

스택의 늘어나지 않은 영역은 Reserved 상태였다가 실제 사용시에 RAM 이 할당돼 사용된다쓰레드당 1MB 스택에서 쓰레드 1000 개 만들었다고 1000MB 할당되지 않음

페이지 권한도 있다PAGE_READONLY, PAGE_READWRITE, PAGE_EXECUTE, PAGE_WRITECOPY, ..

Paging:Paging Pool / Non Paged Pool

Paging Pool현재 RAM 에 있지만 , 읽기 전용으로 사용되는 메모리이기 때문에Page Out 이 필요 없는 메모리 영역

Non-Paged Pool (NP Pool)• 늘 RAM 에 있으면서 절대 Page Out 을 하지 않는 영역• 일반적으로 드라이버에 의해 사용된다

HW 로부터 인터럽트를 받았는데 바로 교신하지 않으면 놓칠 수 있음• 게임 서버 프로그래머 라면 알아두자 :

IOCP 는 고성능을 위해 만들어졌기에애플리케이션에서 할당한 소켓버퍼가 NP Pool 로 할당 되어 드라이버가 바로 저장한다

• NP Pool 이 커지면가용 RAM 이 없어 thrashing 이 심해지고 ,너무 커지면 시스템 전체가 작동불능상태에 빠질 수 있다크게 고려하지 않고 대용량 서버를 만들면 겪을 수 있는 문제

Paging Pool 과 Non-Paged Pool 은 반대기념이 아니다 .

Memory Mapped File

Memory Mapped File 란 무엇일까 ?

왜 Memory Mapped File 를 쓸까 ?( Memory Mapped File 를 안쓰면 어떻게 될까 ? )

Memory Mapped File

Memory Mapped File 란 무엇일까 ?파일을 주소공간에 매핑하여 ,메모리처럼 쓸 수 있다

왜 Memory Mapped File 를 쓸까 ?( Memory Mapped File 를 안쓰면 어떻게 될까 ? )

• 편하니까 ( 버퍼 잡고 Read Write 안해도 된다 )• 사실 근본적인 MMF 의 존재 이유 는 애플리케이션을 위해서가 아니

라 ..OS 가 EXE/DLL (Code) 를 효율적으로 메모리에 올리기 위해서 이다 .

일반 메모리로 로드하면 , 불필요한 Page Out 을 수행• 공간낭비 – 어차피 EXE 파일로 있는데 PageFile 로 또 써야함• 시간낭비 – 하드 긁느라 버벅임

Memory Mapped File:Copy On Write

Code Memory 는 변경 불가능한가요 ?• 일반적으로 변경 불가능하지만 (access violation)

페이지 권한 설정으로 변경 가능• 실시간바이러스백신 등 후킹 프로그램 상당수는

Code Memory 를 조작해서 동작

그럼 Code 변경하면 실행파일도 바뀌나요 ?...of course not

Copy On Write 란 ?직역 : Write 할때 Copy 한다변경시에 복사본을 만들어서 원본을 보존한 채 변경 수행Memory Mapped File 외에 많은곳에서 쓰이는 기법 (String처리 등 )

Cache Memory?

L1 CacheL2 CacheLocality

Spatial LocalityTemporal Locality

Cache Coherence

Cache Memory?

L1 Cache(보통)코어마다 붙어있는 캐시

L2 Cache(보통)프로세서마다 붙어있는 캐시

LocalityPrinciple of locality

한번 참조한 데이터는 인근이나 근래에서 다시 참조될 가능성이 매우 높다

Spatial Locality (공간적 지역성)Temporal Locality (시간적 지역성)

Cache Coherence (캐시 일관성)Core 0 쓰레드가 100 번지에 2라고 썼다면L1 Cache 에 일차적으로 저장된다.이때 Core 1 쓰레드가 100 번지의 값을 읽는다면?캐시에서 이럴 경우의 처리가 없으면 오류 발생할 수 있다.이런 오류가 생기지 않도록 캐시 시스템이 일관성을 지켜주어야 함게임 서버에서의 캐싱 및 네트워크 동기화에서 신경써야할 부분과 일맥상통

Process Memory

Process Memory 에는 무엇이 있을까 ?HeapStackCodeGlobal variables

Uninitialized dataInitialized data

일반적으로 프로그래밍하는데 가장 도움되는 지식

Process Memory?

Heapmalloc, new 로 할당한 동적 데이터

Stack전역변수 , 콜스택 (함수 파라메터 /리턴 어드레스 )이 들어감컴파일러마다 추가 정보를 넣기도 함 (buffer overflow 방지용 태그 등 )

-- 여기까지 모르면 프로그래밍 면접 불합격

Code프로그램의 기계어 코드가 올라가는 영역 . 모듈 (DLL)마다 추가된다 .win32 프로그램은 일반적으로 0x400000~ 의 영역

Global Variables전역변수 영역 . Uninitialized data, Initialized data

이것들이 전부는 아니다TLS(thread-local storage), Resources (아이콘 등 exe에 포함되는 데이터들 )Virtual Function Tables, Handles, SEH, ...일반적으론 알필요 없지만 ..

Process Memory:Stack? Heap?

헷갈려 !

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

Process Memory:Stack? Heap?

Stack 메모리 영역local var, function call(argument/retaddr) 를 위해프로세스에 할당된 메모리 영역

Stack 데이터 구조FILO 형태의 데이터 구조

Heap 메모리 영역프로세스에 new 와 malloc 를 위해 할당된 메모리

영역

Heap 데이터 구조상위노드가 하위노드의 최대 (최소 )값을 갖는 구조heap sort, priority queue 등을 구현

Process Memory:Stack? Heap?

Stack 은 아래로 자라고 Heap 은 위로 자란다그러다가 둘이 마주치면 Out of memory?

Process Memory:Stack? Heap?

Stack 은 아래로 자라고 Heap 은 위로 자란다그러다가 둘이 마주치면 Out of memory?

잘못된 상식아직도 면접때 이렇게 말하는 사람이 적지않다

DOS 시절 얘기아직 많은 책에서 이렇게 설명하고 있어서지금 시대에도 많은 사람들이 착각

Process Memory:Heap? Heap?

Heap 은 프로세스에 몇 개 ?

Process Memory:Heap? Heap?

Heap 은 프로세스에 몇 개 ?1 개 (Lev1 Answer)

HeapCreate API 를 여러 번 수행하면 ?

Windows Heap?CRT Heap?

Process Memory:Heap? Heap?

Heap 은 프로세스에 몇 개?1개 (Lev1 Answer) 하나라고 볼 수 있지만 , 실제론 여러개

HeapCreate API를 여러 번 수행하면?할때마다 생긴다Module(DLL) 을 로드할때도 별로도 추가 Heap 이 생긴다

Windows HeapWindows OS 에서 제공하는 HeapAPI: HeapAlloc, HeapFree, HeapCreate, HeapDestroy, ..

CRT HeapC Run time (C컴파일러군에 제공되는) 에서 제공하는 Heapnew, malloc, ..Visual C++ CRT Heap 은 사실 Windows Heap 의 wrapper

Module

Module = EXE + DLLs

Module:

Module = EXE + DLLs• 일반적으로 Module 별로

Heap, Globals 를 따로 갖는다ex)

soundlib.dll 의 자료구조인 사운드 테이블은 soundlib.dll 의 고유 Heap 에 저장됨

• Thread, Stack 은 모듈 구분없이 프로세스 안에서 공유ex)

Main Thread 에서 soundlib.dll 의 LoadSound 를호출해도 MainThread 가 MainThread 의 스택을 이용하여LoadSound 함수의 코드를 수행한다

• 즉 , 새 모듈 (DLL) 이 로드될때마다 • DLL 의 Heap, Globals 도 같이 생성됨• Thread 나 Stack 이 생성되지는 않는다

짚어본 것들 돌아보기

“Memory 그거 뭔가요 ? 먹는거임 ?”

32bit Windows System 에서 사용되는메모리 관련 개념들

Virtual MemoryPagingMemory Mapped FileCache MemoryProcess MemoryModule

작업관리자의 “메모리” 항목 ?

무슨 의미일까 ?A. 프로세스에게 할당된 가용 Virtual Memory 전부B. 프로세스에게 할당된 주소공간 크기C. 프로세스가 쓰고있는 RAM 크기

어떤게 포함되고 어떤게 안될까 ?Heap , Stack, Data (globals) 는 당연히 당연히 들어갈거라 생각되지만1. Code 는 포함되나 ?2.Paged out memory? 는 포함되나 ?3.Reserved 영역은 포함되나 ?

작업관리자의 “메모리” 항목 ?

프로세스의 Private Working Set 이다RAM 으로 할당된 Page 들의 크기 (4KB단위 )실행파일은 RAM 에 로드되지만 들어가지 않는다 (not private, shared)

이런일이 가능하다 :new 로 데이터를 500MB 할당최소화하고 컴퓨터를 쓰다보니 거의 Page out 되어 어느새 메모리 사용이 10MB 로 나옴

따라서 ‘내 프로그램이 메모리를 얼마나 할당해서 쓰는지를 평가하는데’는 부적절

( 근사하긴 하지만RAM 에비해 메모리를 많이 쓸수록 ,오래 띄워둘수록 오차가 커진다 )

메모리 계량의 기준

메모리 계량의 기준은 한 가지가 아니다• 내 프로그램이 메모리를 얼마나 할당해서 쓰는지를 평가하려면 ,

작업관리자의 메모리 사용량을 보지 말고 직접 계량하라• 여러가지 메모리 프로파일링 기법 / 도구 로 계량가능• 메모리 사용량이 많다는것을 아는데는 도움되나 ,

메모리 사용량을 파악하고 줄이는데는 별 도움이 되지 않는다• Private Bytes 등의 수치를 보는 방법도 있긴 하지만 단편화나 Pooling 등에 의한 차이가 생길 수 있음 .둘다 병행해서 보면 좋다

• 작업관리자의 메모리 사용량 (Private Working Set) 은프로그램이 유저 컴퓨터의 얼마나 RAM 자원을 소모하는지 , 얼마나버벅임 없는 쾌적한 클라이언트 경험에 기여하는지를 평가하는데 적절하다

마무리 , 당부

• 영어 열심히 • 용어 / 어휘는 언제나 도메인과 함께 익혀라• 차이를 알 수 있어야 깊이 알 수 있다

윈도우 Critical Section 일반명사 Critical Section

윈도우 Event 일반명사 Event

윈도우 Mutex 일반명사 Mutex

윈도우 Working Set 일반명사 Working Set

윈도우 Module 일반명사 Module

Cache Cache Memory

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

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

감사합니다http://innover.tistory.com

twitter @innovari