https://www.youtube.com/watch?v=82h8ndWuaXk&list=PLVsNizTWUw7E2KrfnsyEjTqo-6uKiQoxc&index=57 

 

.

 

 

가상 메모리가 물리 메모리에 매핑될 때 페이지 단위(4kb)로 할당이 되는데

 

기준이 되는 가상 메모리 페이지에 윈도우즈는 상태를 부여한다.

 

Commit - 할당되어있는 상태(malloc)

Reserve - 할당을 예약해둔 상태

Free - 할당되어있지 않은 상태(Free)

 

 

 

근데 실제로 사용되는건 페이지 1~2개 정도인데, 가끔 사용량이 높아질 때를 대비해 몇 배 크게 할당해준다는건 메모리 낭비라는 것이다.

 

문제1. 연결된 메모리 공간 필요

문제2. 메모리를 미리 할당하면 너무 낭비

 

그래서 Reserve 상태라는게 나왔다.

 

 

주로 실제 사용되는 페이지만 Commit하고, 나머지 예비 페이지는 Reserve 상태로 두자는 것이 그 개념이다.

 

 

아무튼 그렇다 치고, 메모리 할당에 관련해 더 살펴보면

 

Allocation Granularity Boundary라는 것이 있다.

 

이건 메모리를 할당할 때 페이지 크기의 몇 배수 크게 할당하겠다는 의미인데

 

페이지 단위 그 자체로 메모리에 할당해버리면 메모리 단편화가 생길 가능성이 크다.

 

메모리를 할당해서 ABAB같이 자료가 떨어져서 할당되면 문제가 된다.

 

그래서 AABB처럼 뭉쳐서 할당하자는 취지다.

 

 

그 크기는 최소 1페이지부터 시작된다.

 

기본값은 64kb이다.

 

(기본 페이지 4kb)

 

 

4kb를 할당해달라고 하면 64kb번지부터 4kb를 할당하고,

 

그 뒤 8kb를 할당해달라고 하면 다음 번지인 128kb번지부터 8kb를 할당한다.

 

만약 6kb를 할당해달라고 한다면(잘못된 값이다. 기본 페이지 단위는 4kb이다) 윈도우는 지가 알아서 8kb로 바꿔서 할당하기도 한다

 

 

이 함수는 메모리를 데이터 스택 디폴트 힙, 다이나믹 힙 밖의 다른 동적 메모리 영역에 할당한다

 

 

 

VirtualAlloc & VirtualFree는 Reserve 상태를 지원해주는 시스템 함수다

 

3번째 인자를 잘 보면 나온다.

 

 

VirtualFree는 Free 하거나 Release(Reserve 상태로 변환) 시킨다.

 


 

 

 

힙엔 두가지 힙이 있는데 하나는 디폴트 힙이고 나머지 하나는 다이나믹 힙이다.

 

기존 디폴트 힙에서 리스트와 같은 자료구조로 메모리를 할당하면

 

할당 해제시 리스트를 다 순회하며 하나씩 지워야 하는데

 

다이나믹 힙에 이러한 할당을 하게 되면

 

굳이 힙 내부에 들어가서 하나씩 할당을 해제할 필요가 없이

 

힙 자체를 삭제시켜버린다.

 

 

 

메모리 단편화 해소

 

사용자가 직접 메모리를 할당해주면 디폴트 힙처럼 윈도우 맘대로 할당하느라 생긴 단편화를 피할 수 있다.

 

그 결과로 로컬리티가 괜찮아 진다는 것이다

 

동기화 문제에서 자유

 

쓰레드별로 힙을 생성해 메모리 침범이 일어나지 않는다

 

다이나믹 힙은 데이터 스택 디폴트 힙을 벗어난 다른 메모리 공간에 할당한다.

 

HeapCreate 함수를 사용하면 핸들이 나온다. 그 핸들로 HeapAlloc을 사용하면 다이나믹 힙에 할당이 되는 것이다.

 

HeapFree를 하면 할당된 메모리 힙을 통채로 날려버린다. 리스트로 하나씩 순회하면서 메모리를 지울 필요가 없는 것이다.

 


 

메모리를 파일에 매핑시키겠다는 개념이다.

파일의 일부 메모리 공간을 프로세스의 가상메모리에 연결시킨다

연결이 일단 되면 프로세스의 가상메모리에 내용을 쓰면 그 위치만큼 이동하여 파일에 데이터를 대신 써준다

이점은 일단 성능 이슈도 있지만, 프로그램의 편리성에 이슈를 둘 수 있다

만일 데이터를 sorting 해야 한다고 치면 파일에 있는 데이터를 메인메모리로 불러들여 sorting하고 다시 저장해야한다.

하지만 이 기능을 사용한다면, 데이터가 파일에 매핑이 됐으므로 그 자리에서 sorting만 하면된다.

 

 

편하다!

 

데이터 매핑을 시켜버리면 데이터 write시, 알아서 파일에 저장된다.

파일에 매번 데이터를 쓸때마다 반영해야 할 필요가 있을까?

메모리에 데이터를 write, read 하므로 실질적인 최신의 데이터는 메모리가 가지고 있다.

즉, 데이터가 변경되었을 때, 파일에 정보를 반영할 필요가 없다는 것이다.

주기적으로, 또는 특별한 상황이 됐을 경우에만 파일에 반영해도 된다.

 

 

ㅁㅁㅇㄴㄹ

'운영체제 > 윈도우 시스템' 카테고리의 다른 글

윈도우 프로시저  (0) 2020.05.15
I/O와 CPU 클럭의 관계  (1) 2019.10.16
파일 I/O와 디렉터리 컨트롤  (0) 2019.10.15
예외처리(SEH)  (0) 2019.10.15
메모리 계층  (0) 2019.10.15

+ Recent posts