가상 주소 공간이란?
- 두 프로세스 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 |
댓글