서론
대충 개략적으로 정리하자면, 메모리 사용의 효율성을 높이고, 더 큰 메모리를 사용하기 위하여 페이징 기법이 등장했다. 이를 통하여 더욱 효율적인 사용을 위하여 교체 알고리즘, 할당 알고리즘 등이 등장했다. 아래 같은 환상적인 콜라보로 운영체제에서 가상메모리와 메모리관리를 공부하다 보면 산으로 갈 수 밖에 없는 것 같다. 필자가 이걸 공부하면서 가장 크게 느낀점은 제발 하나로 통일하면 안될까? 라는 의문이었다. 물론 안되겠지만 이런 개념이 실제 서비스 아키텍처에도 많이 녹아 있다는 것을 좀 느끼게 되는 계기가 되었다.
본론
그래서 현대에 메모리 관리는 어케하는데?
환상적인 콜라보 (큰 그림)
1.
MMU(Memory-management Unit) - Logical address to physical address
2.
TLB(Translation Look-aside Buffer) - 일종의 캐시 자주 사용되는 page table entry 저장
3.
paging system - page로 프로그램을 나누고, frame이라는 memory 단위에 할당
a.
page table - page와 frame의 가교역할
4.
Swapping - 안쓰는 frame은 swap device로 보내버리는거 반대로도 되겠지?
5.
second chance algorithm - swap을 어떻게 할 것인가? 반대로 말하면 어떻게 해야 가장 좋은 swap이라 말할 수 있는가?
6.
PFF(Page Fault Frequency) - 멀티프로그램에 대한 frame 할당을 어떻게 할 것인가?
위의 내용들이 짬뽕된 것이 현대의 운영체제에서 메모리를 관리하는 방법이다. 여기서 말하는 관리란, 할당, 제거 등을 말한다. 이런 위의 개념을 다 섞어버려서 비전공자들은 공부할 때 골이 많이 아플 것이다. 나도 그랬다.
알고 있어야 이해할 수 있는 개념
1.
메모리의 계층 구조
a.
왜? 느림과 빠름을 이해해야 왜 TLB를 써야하는지 이해할 수 있음
2.
symbolic | logical | physical Address의 변환
a.
왜? app관점, cpu관점, memory관점에서 주소가 다름을 인지해야 MMU에서 물리 주소로의 변환 과정을 이해할 수 있음
3.
Address Binding time
a.
왜? Compile time, Load time, Run time의 주소 할당이 다르다. 2.과 같은 맥락이다.
4.
swapping
a.
왜? 어차피 물리적으로 존재하는 건 정해져 있다. 그래서 내보낸다는 개념을 이해하고 있어야 한다.
5.
Fragmentation(단편화)
a.
왜? 이게 발생해서 paging이라는 걸 한다. 외부, 내부
6.
page fault
a.
왜? 결국 최종적으로는 이게 성능에 영향을 가장 많이 준다. 그래서 개념을 알아야함
7.
Locality (지역성)
a.
왜? page fault를 줄이기 위한 초석 같은 개념.
b.
시간적 : 최근 참조된 데이터는 다시 참조될 가능성 높다.
c.
공간적 : 참조된 데이터 근처의 데이터는 참조될 가능성이 높다.
알고 있으면 좋은 개념
1.
연속할당
a.
uni
b.
multi
i.
고정 분할
ii.
가변 분할
1.
최초, 최적, 최악, 순차 최초 적합 → 단편화를 줄이기 위한 노력
2.
메모리 통합, 압축 → 단편화를 없애기 위한 노력
2.
비연속할당 | 불연속할당
a.
block
i.
disk ←→ main memory의 이동 단위
b.
paging
i.
고정 단위 분할
ii.
분할된 메모리 단위 frame
iii.
PMT : page mapping table
c.
segmentation
i.
논리 단위 분할
ii.
분할된 메모리 단위 segment
iii.
SMT : segment mapping table
d.
segmentation + paging
i.
프로그램은 segment로 분할 → 분할된 segment를 다시 page단위로 분할
그림으로 보는 변천사
결론
결국 메모리 관리는 가상 메모리를 통해 이루어지고 있다는 것을 알았다. 이걸 이해하기 위해서 위의 키워드를 모두 알아야 했다. 머리가 깨질뻔 했다. 이유는 공통적인 부분을 찾기가 매우 힘들었기 때문이다. 설명하는 사람마다 차이가 있어서 공통적이고 중요하다 생각하는 부분이 달라서 그런지 좀 아리송하게 설명이 된 부분도 있었다. 뭐 한 예로 반도체 공부하시는 분은 정말 하드웨어 관점으로 설명하시더라. 하여튼 이걸 공부하고 내린 나의 결론은 무조건 이걸 공부해야 한다는 것이다. 필요없는게 아니다. 절대로 aws에서 인스턴스를 늘리는 방식도 PFF와 매우 유사하게 닮아 있다. 그래서 이걸 이해하면 다른거 쉽게 이해할 수 있을 것 같다.