이번글은 주기억 장치인 메모리에 프로세스를 연속적으로 공간을 할당하는 방식인 "연속 메모리 할당"을 할경우 고려해야할 사항중 "스와핑"이라는 부분에 대해서 알아보도록 하겠습니다.
스와핑이란?
메모리에 적재된 프로세스들 중에서는 현재 실행중인 프로세스가 있을 수 있고 실행되지 않는 프로세스들이 있을 수 있습니다. 실행되지 않는 것의 예로는 입출력 요구로 대기상태에 빠진 프로세스들이라던지 아니면 오랫동안 사용되지 않은 프로세스들 등등이 여기에 포함됩니다.
이러한 실행되지 않는 프로세스들을 임시로 보조기억장치 일부 영역을 "쫒아내고" 그렇게 해서 생긴 "빈 공간"에 또 다른 프로세스를 적재하여 실행하는 방식을 "스와핑"이라고 합니다.
쫒겨나는 보조기억장치의 일부 영역을 "스왑 영역(swap space)"이라고 하며
보조기억장치의 일부로 쫒겨나는 상황을 "스왑 아웃(swap out)", 스왑영역에 있던 프로세스가 다시 메모리로 옮겨오는 것을 "스왑 인(swap in)"이라고 합니다.
요로 코롬 실행하지 않는 프로세스 B는 보조기억장치의 일부 영역인 스왑영역으로 옮기고 실행할 프로세스를 스왑 인하여 메모리에 다시 적재 시킵니다.
스왑 아웃을 할때 메모리에 "빈 공간"이 생기는데 이곳에 적재해야 겠죠??
이때 적재하는 방법이 '최초 적합', '최적 적합', '최악 적합'이 있습니다.
최초 적합은 현재 메모리에 빈공간이 생겨 스왑 인을 해야할 때 OS가 적재할 프로세스의 크기가 빈공간을 찾다가 딱 들어맞는(같거나 작은 메모리 공간)이 있다면 바로 적재하는 방식이고(적재했을때 빈공간이 많이 남든 아니든 상관없이 공간만 되면 바로 적재)
최적 적합은 현재 메모리에 스왑 인을 할 때 OS가 모든 빈공간을 탐색후에 최적의 조건을 찾아 적재합니다.
가령 프로세스의 크기가 10MB이고 현재 메모리의 빈공간이 30MB, 10MB가 끊어져서 빈공간이 있을 때
이들을 다 탐색후에 10MB가 있는 곳에 적재합니다.
최악 적합은 OS가 메모리 쭉 훑어보고 가장 큰 빈공간에 적재를 해버리는 방식입니다
자세한 예시는 아래르 참고해주세요!
https://jhnyang.tistory.com/284
근데 최초 적합의 경우 스왑 인하여 적재할 프로세스A의 크기가 10MB이라 가정할 경우
먼저 발견한 부분이 가장 상단의 30MB일 경우 여기다가 바로 적재를 해버립니다. 그러면 초록색 부분처럼 빈공간이 생겨납니다.
그리고 프로세스B 30MB짜리 프로세스를 적재할려고 하는데 빈공간의 총합이 30MB이긴 하지만 프로세스B를 분리해서 적재는 할 수 없습니다.
이러한 짜투리 빈공간으로 인해 발생하는 문제를 "외부 단편화"라고합니다.
이런 외부 단편화 문제는 반드시 해결해야하는 문제입니다.
어떻게 해결할 까요?
그레서 이 외부 단편화를 "어느정도" 해결해주는 방법이 "메모리 압축"이라는 방법이 있습니다.
이곳 저곳에 흩어져 있는 메모리의 빈공간들을 하나로 모아 하나의 큰 빈 공간으로 만드는 방식입니다.
이렇게 외부 단편화 문제를 어느정도 해결할 수는 있지만 이 역시 "단점"이 존재합니다.
바로, 작은 빈 공간들을 하나로 모으는 동안 시스템은 하던 일을 중지해야 하고, 메모리에 있는 내용을 옮기는 작업을 해야합니다. 메모리에 있는 내용을 옮기는 과정에서 많은 오버헤드가 발생합니다. 또한 어떤 프로세스를 어떻게 움직여야 오버해드를 최소화하며 압축할 수 있는지에 대한 명확한 방법또한 결정하기 어렵습니다.
그래서!! 다른 좋은! 이런 문제를 해결하는 아주아주 중요한 방법이 등장했는데 바로 "가상 메모리 기법"입니다!!
그중에서도 "페이징" 기법이 사용됩니다.
(페이징은 다른글에 정리를 하도록 하겟습니다)
정리하지면 메모리에 프로세스를 적재할 때 스와핑이라는 방법을 사용할 수 있다.
이때 적재하는 방법이 세가지가 있는데 최초, 최적, 최악이 있다. 근데 이때 "외부 단편화"라는 문제가 발생하여
메모리 압축이라는 기법을 사용해서 문제를 어느정도 "보완"할 수는 있지만 해결하지는 못한다.
그래서 이 외부 단편화를 해결하는 기법이 등장했는데, 이 기법이 가상 메모리기법 중에서도 페이징 기법이다.
감사합니다 :)
'CS' 카테고리의 다른 글
Stack Frame과 함수 호출 규약(__stdcall) (1) | 2024.04.28 |
---|---|
[CS] 가상 메모리와 페이징 (0) | 2023.08.15 |
[CS] 논리주소와 물리주소 (0) | 2023.08.07 |
[CS] Context Switching(문맥 교환) (0) | 2023.08.05 |
[CS] Mutex Lock과 Semaphore (0) | 2023.08.02 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!