진짜보다 큰 기억
프로세스가 여럿 동시에 돈다고 했죠(2강). 그 프로그램들은 저마다 기억할 자리, 메모리가 필요해요. 그런데 진짜 메모리(램)는 양이 딱 정해져 있어요. 다들 진짜 자리를 직접 차지하면 금세 동나고 부딪치죠. 그래서 운영체제는 저마다에게 '가짜로 큰 메모리'를 줘요.
모두가 메모리를 원해요
동시에 도는 프로그램은 저마다 기억할 자리가 필요해요.
그런데 진짜 메모리는 한정된 작은 공간이에요.
다들 진짜 자리를 직접 가지려 들면,
금세 자리가 모자라고 서로 영역이 부딪쳐요.
메모리를 두고 다툼이 벌어지는 셈이죠.
프로그램을 더 올려 보세요. 진짜 메모리 막대가 금방 가득 차 넘쳐요.
진짜 메모리만으론 다 감당이 안 되죠.
그렇다고 프로그램더러 '메모리 양보해' 할 순 없어요.
저마다 넉넉히 쓸 수 있어야 하니까요.
운영체제는 여기서 영리한 속임수를 써요.
저마다 '저만의 큰 메모리'를 줘요
운영체제는 프로그램마다 가짜 메모리를 하나씩 줘요.
넓고, 0번부터 깔끔하게 시작하고, 저 혼자 쓰는 것처럼 보이죠.
A의 '0번 칸'과 B의 '0번 칸'은 사실 서로 다른 자리예요.
각자 자기 메모리만 보고, 남의 건 보이지도 않아요.
이 저만의 가짜 메모리를 가상 메모리라고 해요.
프로그램 A와 B를 번갈아 보세요. 둘 다 0번부터인 '내 메모리'를 따로 가져요.
둘 다 0번부터 깔끔하게 쓰니 참 편하죠.
근데 가짜 주소는 진짜 자리가 아니잖아요?
프로그램이 '내 3번 칸'이라고 하면,
그 말을 누가, 어떻게 진짜 자리로 바꿔 줄까요?
가짜 주소를 진짜 자리로 옮겨줘요
프로그램이 '내 3번'을 쓸 때마다,
운영체제와 하드웨어가 몰래 진짜 자리로 바꿔요.
작은 지도 하나가 '내 3번 → 진짜 27번'처럼 이어 주죠.
A의 '내 0번'은 진짜 5번, B의 '내 0번'은 진짜 40번.
같은 가짜 번호라도 진짜 자리는 다르니, 부딪칠 일이 없어요.
가짜 주소를 눌러 보세요. 지도를 거쳐 진짜 자리로 이어져요. A와 B는 같은 번호라도 다른 곳에 닿아요.
지도가 가짜를 진짜로 바꿔 주니, 각자 안전하게 따로 살죠.
그런데 모두의 가짜 메모리를 합치면
진짜 메모리보다 훨씬 클 수도 있어요.
그 많은 걸 작은 진짜 메모리에 어떻게 다 담을까요?
진짜보다 크게, 안 쓰는 건 디스크로
운영체제의 비밀은 이거예요.
지금 안 쓰는 부분은 느린 디스크에 잠깐 내보내요.
그리고 그 자리에 지금 필요한 부분을 올리죠.
나중에 내보냈던 게 다시 필요하면 도로 불러와요.
그래서 진짜 메모리보다 더 큰 메모리를 쓸 수 있어요.
새 부분을 불러와 보세요. 진짜 메모리가 꽉 차면, 안 쓰던 게 디스크로 나가고 필요한 게 들어와요.
내보냈다 불러왔다 하니 진짜보다 큰 기억이 가능해졌어요.
근데 디스크는 진짜 메모리보다 한참 느리잖아요?
매번 디스크까지 다녀오면 답답할 텐데요.
운영체제는 마지막으로 한 가지를 더 챙겨요.
자주 쓰는 건 가까이 둬요
운영체제는 자주 쓰는 부분을 가까운 진짜 메모리에 남겨 둬요.
어쩌다 한 번 쓰는 것만 멀고 느린 디스크로 보내죠.
구조에서 만난 캐시와 똑같은 생각이에요. '자주 쓰는 건 가까이.'
그래서 대부분은 빠른 진짜 메모리에서 바로 끝나고,
디스크까지 가는 일은 가끔뿐이라, 느림을 거의 못 느껴요.
여러 번 꺼내 보세요. 자주 쓰는 건 진짜 메모리(가까이)에, 가끔 쓰는 건 디스크(멀리)에 머물러요.
정리하면, 가상 메모리는 가짜 주소를 진짜 자리로 옮기고,
안 쓰는 건 디스크로 보내고, 자주 쓰는 건 가까이 두는 솜씨예요.
그 덕에 저마다 진짜보다 큰 메모리를 혼자 쓰는 것처럼 느끼죠.
그런데 저마다 '저만의 자리'만 보고 남의 건 못 본다는 것,
이게 사실 내 것과 네 것을 갈라 지켜 주는 벽이 돼요. 다음 이야기예요.