왜 논리주소 -> 물리주소로 바로 매핑하지 않느냐고 질문했는데,
그거 설명한 자료들 널렸다.
그냥 개념만 간단히 설명하마 (슥 읽고 이해한 것들인데 다시 찾아보기 귀찮으니)
먼저 win32 운영체제의 특성은 "가상 보호 모드" 다.
커널은 물리적인 메모리(램)가 얼마 있는지 상관없이
실행중인 각 프로세스에게 4기가의 어드레스를 통해 메모리에 억세스할 수 있게 해준다.
물론 이중에 2기가정도는 (OS버전마다 크기가 조금씩 다르지만) 커널이 운용하고,
나머지 2기가를 사용자 프로세스가 접근하게 허용한다.
이걸 이해하려면 당연히 프로세스(이에 더해 쓰레드) 에 대해 알아야하지,
이걸 질문 따위로 해결할 생각은 버려.
객관적인 단어선별을 디씨에서 익명인들에게 강요하는건 바람직하지 않다고 본다.
그러다 보니 A 프로세스도 4기가의 메모리에 접근하고,
B 프로세스도 4기가의 메모리에 접근해야 한다.
단순히 논리주소->물리주소(램 + 하드디스크) 로 매핑하는 것 만으로는,
A, B 프로세스간 isolation 이 가능하지 않게 된다.
그렇다는건 A 프로세스가 실행중인 동안, B 프로세스 역시 A와 같은 메모리에 억세스할 수 있어서,
좀전에 참조한 페이지의 내용과 이후의 페이지 내용이 바뀌어 있는 엿같은 상황이 벌어질 수 있다는거다.
그리고 이에 더해, 여러 프로세스를 통해 자주 사용되는 메모리 주소에 대한 캐싱(하드디스크가 아닌 램에 옮겨놓기)이 있어야
제대로 된 성능을 낼 수 있겠지.
그렇다는건 자주 사용되는 페이지를 물리주소에 지정하기 위해,
기존에 물리주소에 있던 페이지를 논리주소로 돌리고, 그렇게 새로 확보된 물리주소의 페이지에
새롭게, 혹은 자주 접근된 페이지를 돌려주는게 필요하겠지. (LRU, MRU, FIFO, Random 등의 캐시 정책에 대해 알아보거라)
그러다보니 메모리를 주소가 아닌 핸들 개념으로 다룰 수 밖에 없는거다.
Java 의 Garbage Collector 가 Memory Compaction 의 기능을 수행하기 때문에 Java 에 포인터가 존재할 수 없는 것과 같은 이치지.
댓글 0