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

3-3. 가상 주소 공간과 DLL

by 헛둘이 2022. 9. 12.
가상 주소 공간이란?
  • 두 프로세스 A, B가 켜져 있을 때,
  • A가 물리메모리 0x10000000번대 주소를 사용하고,
  • B가 물리메모리 0x20000000번대 주소를 사용하는 경우를 가정해보자.
  • 어쩌다 A가 실수로 0x21000000번대 주소로 접근해서 잘못 참조할 수 있다.
  • 이걸 막으려면 두 프로세스는 가상의 주소공간을 갖고,
  • 실제 물리 메모리는 운영체제가 관리 해주는게 좋을 것 같다.

 

물리 메모리를 직접 사용하면 안되는 이유
  • 프로세스 간 안정성이 떨어짐
  • 사용할 수 있는 주소에 제약이 있음 (다른 프로세스의 주소를 피해야 하므로)

 

 

Page Table
  • 이에 대한 방안으로 Page Table이라는 방안을 통해 해결한다.
  • 페이지테이블은 위와 같은 문제들을 방지하기 위해서
  • 물리 주소와 가상 주소를 매핑해주는 역할을 한다.
  • A는 A에 대한 Page Table / B는 B에 대한 Page Table이 생성된다.
  • 이렇게 하면 같은 주소를 쓰더라도 실제 매핑하는 물리 메모리는 서로 다르다.
  • 이로 인해 하나의 프로세스는 다른 프로세스가 사용하는 메모리에 접근할 수 없게 된다.
  • (정확한 원리는 Memory mapped file이며, 이후에 나옴)

 

 

 

 

 


32bit 운영체제의 가상 주소 표현 범위
  • 32bit 운영체제가 표현할 수 있는 주소는 0x0000'0000 ~ 0xffff'ffff 까지이다.
  • 이 공간은 총 4GB이며, 가상 주소는 4바이트 범위 내에서 표현 가능해야 한다.
  • 보충 설명하자면 4바이트는 32비트고 2^32값을 표현할 수 있다.
  • 2^32는 약 4G(4,294,967,296)의 주소를 표현할 수 있다.
  • 따라서 32bit에서는 아무리 메모리가 많아도 4GB밖에 사용하지 못한다.
  • 왜냐? 그 이상의 메모리 주소를 포인터가 표현할 수 없기 때문에.
  • 32bit 운영체제에서는 데이터를 한 번 읽을 때 4byte만 읽어올 수 있다.
  • 즉, 32bit 컴퓨터에서 한 번 읽을 때 (2^32)개의 주소 중 하나를 읽을 수 있으니
  • 포인터가 2^32bit가 사용된다.

 

 

 

 

 

 

32bit 운영체제와 4GB의 저장공간이 무슨 상관?
  • 컴퓨터 구조를 보면 아래처럼 데이터를 주고 받는다.
  • CPU <-> 레지스터<-> 캐시 <-> 메모리 <-> 하드 디스크 
  • 하드디스크에 32GB 게임이 설치되어 있으면 32GB중 일부 데이터를 메모리에 올려 두고
  • 메모리의 데이터 중 일부 데이터를 캐시에 올려두고 다시 캐시의 일부를 레지스터로 올려두고...
  • CPU는 그것을 사용한다.
  • 고사양 게임일수록 메모리 공간이 부족하면 쓰고 지우고를 반복하므로
  • 이런 과정이 일어나는 것을 줄이기 위해서 메모리를 4GB 가지고 있는 것.

 

 

 

 

 

User Memory VS Kernel Memory
  • 0x0000'0000 ~ 0xffff'ffff 공간이 0x8000'0000을 기점으로 나뉘는데
  • 하위 2GB를 user memory라고 하며 일반 어플리케이션이 사용하는 곳이다.
  • (malloc이나 new 등등 다 이 범위 안에서 사용된다)
  • 상위 2GB를 kernel memory라고 하며 운영체제가 사용하는 곳이다.
  • (이후에 배울 kernel object들이 만들어지는 공간이다)

 

 

 

 

 

 


DLL과 메모리
  • 만약 A.exe와 B.exe가 X.dll을 사용한다고 가정하자
  • 그러면 A.exe와 B.exe가 동시에 실행될 때 X.dll은 2번 호출될까?
  • X.dll은 물리 메모리에 한 번만 로드된다.
  • 이걸 이용해서 dll로 n개의 프로세스가 어떤 데이터를 공유할 수 있다.

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

4-2. Process ID & Handle  (0) 2022.09.13
4-1. Kernel Object  (0) 2022.09.13
3-2 Dynamic Library  (0) 2022.09.11
3-1. Static Library  (0) 2022.09.08
2-3. 라이브러리 개념  (0) 2022.09.07

댓글