[운영체제(OS)] 스와핑(swapping), 가상메모리(virtual memory) 란?
resilient
·2022. 3. 3. 16:47
저번 시간에는 페이징과 세그멘테이션 방법에 대해서 살펴봤습니다. 모두 메모리를 어떻게 효율적으로 쓸 것이냐에 대한 고민을 바탕으로 나온 방법들이었는데요. 그렇다면 페이징 + 세그멘테이션 방법을 사용하면 모든 프로세스를 효율적으로 실행시킬 수 있을까요? 정답은 아닙니다. 바로 메인 메모리 크기가 한정되어있기 때문인데요. 이번 시간에는 메모리 크기가 다 찼을 때, 프로세스를 실행시킬 수 있도록 도와주는 스와핑(swapping) 방법과, 메모리 크기보다 크기가 큰 프로세스를 실행시킬 수 있게 해주는 가상 메모리(virtual memory)에 대해서 알아보려고 합니다.
0. 스와핑(swapping) 이란?
swap이란 단어는 두 개의 값을 맞바꾼다, 교환한다 의 의미를 가지고 있습니다. 운영체제에서도 의미가 비슷하게 사용되죠.
프로세스가 실행되려면 반드시 메모리에 올라가야 합니다. 프로세스가 스와핑(swapping) 한다 라는 것은 현재 메모리에서 잠깐 다른 저장공간(HDD나 SSD)으로 옮겨졌다가, 돌아왔다가 이런 식으로 실행에 따라 교체될 수 있다는 걸 의미합니다.
예를 들어보겠습니다.
먼저 어떤 10개의 프로세스가 유저 공간에 있다고 가정해보겠습니다. 이 메모리는 최대 10개의 프로세스만을 실행 시킬 수 있죠. 꽉 차 있는 상태에서 11번째 프로세스가 실행되었습니다. 그렇다면 10개의 프로세스 중 하나를 잠깐 빼고 11번째 프로세스를 넣어야 할 텐데요. 어떤 프로세스를 잠깐 빼야 할까요? 당연히 가장 안 쓰는(이벤트를 가장 오래 기다리고 있는 2번이라고 가정하겠습니다.) 프로세스를 잠깐 빼야겠죠? 아예 없애버리는 것이 아니라 잠깐 어디 빼놔야 다음에 또 실행시킬 수 있을 텐데요.
잠깐 어디 빼놓는 공간을 보조기억장치(secondary storage,Backing storage)라고 합니다. 그리고 잠깐 2번 프로세스를 빼놓는 일을 Swap-out 한다고 표현하죠.
1시간이 지나고 방금 빼놨던 2번 프로세스에서 이벤트 요청이왔습니다. 그렇다면 다시 메모리로 복귀시켜줘야겠죠? 다시 메모리에 올려서 실행시키는 작업을 Swap-in이라고 하고, Swap-out, Swap-in 하는 과정을 스와핑(Swapping)이라고 합니다.
0-1. 스와핑(Swapping)과 가상메모리관리(Virtual Memory Managemnet)의 관계
사실 스와핑은 현재는 사용하지 않습니다. 이전에 게시물에서 페이징을 설명하면서 언급했었지만 프로세스 단위로 스와핑을 하면 비효율적이기 때문이죠.(외부 단편화 문제 기억하시죠?) 그렇다면 앞으로 살펴볼 가상 메모리(Virtual Memory) 와는 어떤 관계가 있을까요?
애초에 가상 메모리라는 개념은 메인 메모리 보다 더 큰 메모리가 필요한 프로세스를 실행할 때 도와주는 역할을 하는 방법입니다. 그렇다면 스와핑 방법처럼 현재 사용하지 않는 프로세스를 뺐다가 다시 실행시켰다가 해야겠죠? 하지만 아래에서 설명할 가상 메모리를 관리하는 과정에서는 위에서 언급했듯이 프로세스 단위로 스와핑하지 않고, 페이징 단위로 스와핑을 실행합니다.
간단하게 정리하면 스와핑(Swapping)이란 주기억장치에 적재한 하나의 프로세스를 보조기억장치에 잠시 적재했다가 필요할 때 다시 꺼내서 사용하는 메모리를 교체하는 기법이라고 할 수 있겠네요.
1. 가상메모리(Virtual Memory) 란?
위에서도 설명했지만 간단하게 짚고 넘어가겠습니다. 가상 메모리는 메인 메모리의 크기는 한정되어 있으므로 물리적인 메모리 크기보다 크기가 큰 프로세스를 실행시킬 수가 없죠. 그렇다면 메인 메모리보다 크기가 큰 프로세스를 실행시키고 싶으면 어떻게 해야 할까요? 비효율적으로 메인 메모리를 교체해야 할까요? 아닙니다. 여기서 나온 방법이 바로 가상 메모리죠.
생각해보면 프로세스의 모든 코드가 항상 필요한 것이 아닙니다. 필요 없는 배열이나 함수 등 실제로 프로세스가 잘 동작한다면 필요 없는 부분이 반드시 있기 마련이죠. 따라서 프로세스는 필요한 부분만 메모리에 올려서 실제로 메모리에 올라가는 프로세스의 크기를 최소화 시키면 됩니다. 유연하게 메모리에 적재하는 것이죠.
그러면 이제 실제로 가상 메모리를 구현하는 방법 중 하나인 디멘드 페이징(Demand Paging)방법을 한번 알아보겠습니다.
2. 디멘드 페이징(Demand Paging)
디멘드 페이징(Demand Paging)은 이름 그대로 필요한 부분의 페이지 영역만 물리적 메모리에 할당하는 방법입니다. 여기서 페이지 영역이라고 했는데요. 위에서 설명했듯이 디멘드 페이징에서 스와핑의 개념은 프로세스 단위로 뺐다가 재배치하는 과정이 아닌 페이지 단위로 뺐다가 재배치하는 과정이죠.
위와 같은 스와핑의 개념을 가지고 디멘드 페이징에서는 자주 사용하는 페이지만 물리적 메모리에 적재해서 사용하게 됩니다.
위 그림을 보면 맨 왼쪽 프로세스가 가지는 여러개의 페이지 중에서 실제 물리 메모리에 올라간 페이지는 A, C, F 밖에 없죠.
프로세스가 실행되면 MMU는 실시간으로 페이지테이블을 확인하고, 필요한 메모리가 물리적 메모리에 적재되어 있는지를 확인합니다. 이때 페이지 테이블의 valid-invalid bit가 v인지 i인지의 차이가 물리 메모리에 해당 페이지가 저장되어 있는지를 알려주는 것이죠.
또한 페이지 테이블 엔트리에는 해당 페이지가 Swap-out 될 때 Backing Strorage(보조 기억장치)의 어느 위치에 저장되어 있는지에 대한 정보도 저장하고 있죠.
만약 valid-invalid bit가 i이면 지금 사용하려는 페이지가 물리적 메모리에 현재 적재되어 있지 않다는 의미인데, 이런 상황을 Page fault(페이지 부재) 라고 합니다.
3. Page fault handling
Page fault는 왜 발생할까요? 이유는 모든 페이지가 램(RAM)에 존재하는 게 아니기 때문입니다. 당연히 발생할 수밖에 없는 것이죠. 그렇다면 이런 상황을 어떻게 제어해야 할까요? 아래 그림을 보겠습니다.
1. 먼저 물리 메모리에 있는 실행될 프로세스는 자신이 사용하고자 하는 페이지가 페이지 테이블에 있는지 확인합니다.
2. 만약 물리 메모리에서 사용하려는 페이지가 없으면 Page fault exception을 발생시키고 커널 모드로 진입합니다.
3. OS는 페이지 테이블 엔트리 정보 속에서 Backing storage 어느 위치에 페이지가 있는지 확인합니다.
4. 확인한 없었던 페이지를 물리 메모리에 로드 합니다.
5. 페이지 테이블을 업데이트해줍니다.
6. 이제 원래 실행하려고 했던 작업을 실행해줍니다.
하지만 이때, 페이지 테이블을 읽고 Page fault로 인해 커널 모드로 진입하는 과정까지는 괜찮지만, Backing storage에서 페이지를 찾아서 가져오는 과정은 시간이 꽤 걸리게 됩니다. 결과적으로 CPU의 효율성을 낮추게 되죠.
그렇다고 물리 메모리를 키우는 건 위에서도 언급했지만 정말 비효율적인 방법이죠. 때문에 Page fault를 처리하는 과정은 필연적일 수밖에 없습니다. 그럼 Page fault가 발생할 때마다 이렇게 비효율적인 과정을 거쳐야만 하는 걸까요?
여기서 Locality라는 개념을 알아야 합니다. 실제로 우리가 사용하는 코드를 생각해보면 사용하는 코드만 재사용해서 실행이 됩니다. 이를 지역성(Locality)라고 하는데, 지역성 덕분에 한 번 사용하려는 페이지를 페이지 테이블에 넣어놓으면 계속 사용하다가 코드 구역이 넘어가면 Swap-out을 하는 것이죠. 때문에 결과적으로 보면 Page fault는 지역성 덕분에 우리가 예상하는 만큼 많이 일어나지는 않습니다. 그럼에도 불구하고 어느 정도의 Page fault 발생은 감수해야 하는 것이죠.
4. 스와핑(Swapping)의 문제
위에서 설명했던 스와핑을 가상 메모리 관리에도 사용한다고 했는데요. 스와핑은 가장 사용하지 않는 페이지를 Swap-out 해서 Backing storage에 넣어 놓고 다시 필요할 때 Swap-in을 한다고 했습니다. 그렇다면 여기서 어떤 페이지를 선택해서 우선적으로 Swap-out 해야 할까요? 여기서 바로 페이지 교체 정책, 페이지 교체 알고리즘이 등장합니다. 기준을 제시해주는 것이죠. 페이지 교체 정책에 대해서는 다음 시간에 자세히 살펴보겠습니다.
5. 정리
이번 시간에는 스와핑(Swapping), 그리고 가상 메모리를 어떻게 관리하는지를 공부하면서 페이지 요구(Demand Paging) 방법을 알아봤습니다. 다음 시간에는 페이지 교체 정책, 페이지 교체 알고리즘에 대해 살펴보는 시간을 갖겠습니다.
감사합니다.
'CS & Network > 운영체제(OS) & 컴퓨터구조' 카테고리의 다른 글
[운영체제(OS)] 페이징(Paging), 세그멘테이션(Segmentation) 이란? (0) | 2022.02.28 |
---|---|
[운영체제(OS)] 페이징(Paging), Fragmentation(단편화), TLB 란? (0) | 2022.02.17 |
[운영체제(OS)] 메모리관리 - 주소바인딩, Contiguous allocation 그리고 MMU 란? (3) | 2022.01.22 |
[운영체제(OS)] 데드락(DeadLock), 교착상태 해결방법 -2 (0) | 2022.01.16 |
[운영체제(OS)] 데드락(DeadLock), 교착상태 란? - 1 (0) | 2022.01.14 |