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