메모리 관리 및 가상 메모리
42과제를 하며 fork를 제대로 쓸 기회가 있어 여러가지 테스트 해보는 도중 의문이 하나 생겼었다.
fork이전 부모 프로세스에서 가지고 있는 값이 있는데 fork 이후 주소값을 보면 동일한 주소를 가지고 있다.
fork하면 부모를 복사해 자식을 만들기에 여기까진 '그렇지'라고 생각했는데 그러면 자식이나 부모에서 해당 주소의 값을 바뀌면 똑같이 바뀌는 것인가? 라는 생각을 했다.
주소값이 동일하기 때문에 이런 생각을 했다.
실제 c 코드로 테스트 해봤는데 안바뀌었다.
실행 결과
'서로 주소값만 같고 실제로 다른 공간인 것인가?' 정도로 추론만 가능했는데 메모리 개념을 가볍게만 알고 있기 때문이라는 것을 깨달았다.
오랜만에 운영체제 책을 다시 꺼내 공부했다.
메모리는 두가지 관점으로 해석 가능하다.
프로그래머가 프로그래밍에 사용하는 공간으로 보는 논리적 관점의 논리적 주소(가상 주소, 가상 메모리 주소)와 실제 데이터나 프로그램을 저장하는 공간으로 보는 물리적 관점의 물리적 주소이다.
CPU내의 메모리 관리 장치(MMU)가 논리적 주소를 물리적 주소로 매핑시켜 준다.
일반적으로 프로세스별로 페이지 테이블을 가지고 있다. 이 페이지 테이블을 통해 매핑시킨다.
논리적 주소는 가상 메모리에 대해서 알아야한다.
가상 메모리에 대해서는 '메인 메모리보다 더 큰 공간을 가진 보조기억장치를 사용할 수 있게 해주는 기술' 정도로 알고 있었다.
이렇게만 넘어가면 문제가 CPU는 메인 메모리의 데이터를 읽어 프로그램을 돌리는데 보조기억장치에 데이터가 있으면 읽을 수 없다는 점으로 인해 보조기억장치에 있는 데이터를 CPU가 어떻게 사용하는지가 문제다.
가상 메모리는 메인 메모리와 보조기억장치에 프로세스 항목을 분산 적재했다가 프로세스를 실행할 때 메인 메모리로 이동시켜 사용할 수 있게 한다.
위 얘기만 봐도 가상 메모리를 사용하면 효율적인 메모리 관리가 가능하다.
실제로 이러한 것이 가능한 이유 중 일부는 아래와 같다.
- 모든 프로그램을 항상 동시에 사용하지 않음 (다중 프로그래밍, 프로세스 스케쥴링)
- 예외 처리 오류 코드는 자주 필요하지 않으며 발생하지 않을 수 있음
- 배열, 리스트 등 범위가 지정되어 있는 데이터의 경우 실제로 사용하는 크기보다 더 크게 공간을 잡아둘 수 있음
다시 말해 프로세스의 모든 정보를 메인 메모리에 담아두지 않고 필요한 데이터만 보조기억장치에서 가져와 메인 메모리에 적재해두는 것이다.
추후에 필요한 부분이 메인 메모리에 없으면 OS가 필요한 부분을 보조기억장치에서 메인 메모리에 적재시켜 프로세스가 정상적으로 동작하도록 한다.
더 명확한 용어는 '부분' 보다는 '페이지'가 맞다.
여기서 얻은 결론은 프로세스 실행에 필요한 데이터가 보조기억장치에 있든 메인 메모리에 있든 어디에 있는지 알 필요 없이 가상 메모리를 통해 동작할 수 있게 만들 수 있다는 점이고 실제 c에서 보여주는 주소값은 가상 메모리 주소였고 MMU가 이를 매핑시켜 실제 물리적 주소에 접근하도록 동작하고 있었다는 것이다.
메모리에 대해 너무 가볍게만 알고 있었다.
여기선 관리 기법들에 대해서는 얘기하진 않았으나 이에 대해서도 확실히 알아야 더 많은 부분에서 제대로 알 수 있을 것으로 보인다.
참고
Memory Management Unit
This definition explains the meaning of Memory Management Unit and why it matters.
www.techopedia.com