가상 메모리
- 물리 메모리 (RAM)는 한정적이고 비싸기 때문에 HDD를 사용한다.
- 필요할 때는 HDD에서 물리 메모리로 다시 불러온다. (보관 -> 복구를 반복)
- HDD 안에 물리 메모리를 보관하는 공간을 페이징 파일이라고 한다.
- 가상 메모리는 실제 설치된 물리 메모리보다 더 큰 공간을 사용할 수 있다.
Physics Storage란?
=> 물리 메모리 + 페이징 파일
=> 실행 파일과 DLL을 일컫는다.
페이지
- 운영체제가 메모리를 관리할 때 사용하는 최소 단위
- CPU별로 크기가 다르다 ( 인텔 CPU는 32/64bit 모두 4K )
- 메모리를 관리할 때 페이지 단위로 관리한다.
- 예를 들어 10바이트 메모리를 요청하면 OS는 4K (1페이지) 를 할당한다.
- malloc 같은 메모리 할당 함수들이 할당받는 메모리는 그 4K에서 나눠주는 것.
프로세스 가상 주소 공간
- 프로세스는 자기만의 가상 주소를 사용하고 OS가 실제 주소에 매핑한다.
#include <iostream>
#include <Windows.h>
int main()
{
SYSTEM_INFO si = { 0 };
GetSystemInfo(&si);
printf("PAGE SIZE : %d\n", si.dwPageSize); // 페이지 크기
MEMORYSTATUSEX mse = { 0 };
mse.dwLength = sizeof(mse);
GlobalMemoryStatusEx(&mse);
printf("Total Phy Mem : %lld\n", mse.ullTotalPhys); // 물리 메모리 크기
return 0;
}
- 물리 메모리 크기 구하는 예제
가상 주소 공간
- 32bit OS는 32bit 프로그램만 실행 가능하다.
- 64bit OS는 32bit 뿐만 아니라 64bit 프로그램 둘 다 실행 가능하다.
32비트 어플리케이션의 한계점
32비트 어플리케이션은 포인터 크기가 32비트인데,
32비트로 표현할 수 있는 크기는 4G이고 0x0000'0000 ~ 0xFFFF'FFFF까지다.
그래서 아무리 물리 메모리가 많아도 4GB밖에 사용할 수 없다.
그래서 DB같이 큰 용량의 프로그램을 만드려면 64비트로 개발해야 한다.
64비트 어플리케이션은 16EB 가상 주소 공간을 사용할 수 있으니까.
가상 주소 공간의 파티션
- OS 코드나 디바이스 드라이버는 가상 주소의 윗부분에 매핑됨 (0x8000'0000 ~ 0xFFFF'FFFF, 2GB)
- 이 상위 2GB를 커널 모드 파티션이라고 한다. (일반 프로그램으로는 접근 불가 영역)
- 그 아래 영역을 유저 모드 파티션이라고 하는데, 온전히 다 쓸 수 있는 것은 아님
- 널 포인터 접근 금지 영역이 있음 (0x0000'0000 ~ 0x0001'0000, 64KB)
- nullptr을 0으로 쓰려면 실제로 그 주소가 사용할 수 없는 주소여야 하기 때문
- 커널 메모리 접근 금지 영역이 또 있음 (0x7FFF'0000 ~ 0x8000'0000, 64K)
- 이 부분은 커널 모드 파티션에 접근할 수 없도록 하는 펜스 같은 역할
유저모드 파티션에서 사용 가능한 최소/최대 주소 확인하기
- SYSTEM_INFO 구조체를 만든다.
- GetSystemInfo 함수를 통해 시스템 정보를 받아옴
- 그 구조체에 접근해서 lpMaximumApplicationAddress 멤버에 접근하면 사용 가능 최대 주소가 나옴
- lpMinimumApplicationAddress 멤버는 반대로 최소 주소
'운영체제 > [ecourse] Windows Programming' 카테고리의 다른 글
5-3. Heap Memory (0) | 2022.09.18 |
---|---|
5-2. Virtual Memory Allocation (0) | 2022.09.18 |
4-2. Process ID & Handle (0) | 2022.09.13 |
4-1. Kernel Object (0) | 2022.09.13 |
3-3. 가상 주소 공간과 DLL (0) | 2022.09.12 |
댓글