본문 바로가기
운영체제/[ecourse] Windows Programming

5-2. Virtual Memory Allocation

by 헛둘이 2022. 9. 18.
가상 메모리를 사용하는 방법
  • 유저 영역엔 다양한 dll, exe 그리고 힙, stack이 할당된다.
  • 그럼 나머지 비어 있는 곳은?
  • VirtualAlloc이라는 함수를 통해 사용이 가능하다.

 

  • lpAddress : 예약을 원하는 주소(64k의 배수), 관례적으로 0을 넘김 (0을 넘기면 사이즈에 맞는 주소를 찾아준다)
  • dwSize : 예약할 주소의 크기 (PAGE 크기(4K)의 배수)
  • flAllocationType : 예약할건지, 예약하고 할당할건지 (MEM_RESERVE : 예약 / MEM_COMMIT : 할당)
  • flProtect : 페이지 보호속성 (PAGE_READWRITE 등)

 

예약과 할당
  • 이 함수의 3번째 인자가 예약인지 할당인지 정하는 옵션이 있는데,
  • MEM_RESERVE는 원하는 가상 메모리 크기만큼 우선 예약해놓는 것이고,
  • MEM_COMMIT은 그 크기에서 요청한 만큼 물리 메모리와 연결되는 것이다.
  • 두 값을 OR 해서 예약과 할당을 동시에 할 수도 있음
  • 예약만 하고 확정은 안 한 상태에서 접근하면 예외 발생함

 

해제

  • 해제는 VirtualFree라는 함수를 사용하며,
  • lpAddress는 해제할 주소임
  • dwSize는 그 주소에서 확정한 일부를 해제하기 위한 사이즈 (3번째 인자 MEM_DECOMMIT)
  • dwFreeType은 MEM_DECOMMIT은 일부만 해제하는 것이고 MEM_RELEASE는 전부 해제하는 것
  • MEM_RELEASE할때 2번째 인자 dwSize는 0을 줘야 한다.

 

가상 메모리를 100바이트만 할당해달라고 요청하면 실제로는 1페이지 (4K의 배수)를 할당해 준다
만약 4091의 크기를 가진 구조체 5개를 할당 받는다고 가정했을 때,
5개를 미리 MEM_RESERVE로 예약하고 MEM_COMMIT으로 인덱스 기준 1번째 메모리를 확정 후 접근했을 때

예약한 가상 메모리 |  4096  |  4096  |  4096  | ...
구조체 배열 메모리 |  4091 |  4091 |  4091 |
                                                  ↑

이렇게 되면 구조체 배열 메모리의 1번 인덱스가 페이지 0~1 사이에 걸리게 된다.
그러면 운영체제는 실제로 페이지 2개를 할당한다 (4096 * 2)
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <Windows.h>
using namespace std;

typedef struct _CELL
{
    char data[4091];
} CELL;

int main()
{
    CELL* pCell = (CELL*)VirtualAlloc(0, sizeof(CELL) * 10, MEM_RESERVE, PAGE_READWRITE);

    int idx = 0;
    char s[4091];


    while (1)
    {
        printf("index >> "); scanf("%d", &idx);
        printf("data >> "); scanf("%s", s);

        __try
        {
            strcpy(pCell[idx].data, s);
        }

        __except(1)
        {
            VirtualAlloc(&pCell[idx], sizeof(CELL), MEM_COMMIT, PAGE_READWRITE);
            printf("%d CELL Commit!\n", idx);
            strcpy(pCell[idx].data, s);
        }
    }
    return 0;
}

 

 

 

'운영체제 > [ecourse] Windows Programming' 카테고리의 다른 글

5-4. Stack Memory  (0) 2022.09.19
5-3. Heap Memory  (0) 2022.09.18
5-1. Virtual Address Space  (1) 2022.09.16
4-2. Process ID & Handle  (0) 2022.09.13
4-1. Kernel Object  (0) 2022.09.13

댓글