출처: https://technote-mezza.tistory.com/92
우선, 메모리란?
메인 메모리, RAM을 뜻한다. 프로그램 실행 시 주소, 정보들을 저장하고 가져다 사용할 수 있게 만드는 공간으로 작업을 위해 사용되는 공간.
메모리 관리가 필요한 이유는 무엇인가?
각각의 프로세스는 독립된 메모리 공간을 갖고, 운영체제 혹은 다른 프로세스의 메모리 공간에 접근할 수 없는 제한이 걸려있다. 오직 운영체제만이 운영체제 메모리 영역과 사용자 메모리 영역의 접근에 제약을 받지 않기 때문에 운영체제에서 메모리를 관리한다. 또한, 멀티프로그래밍 환경으로 변화하면서 한정된 메모리를 효율적으로 사용해야 하고 운영체제가 이를 관리하는 방법이 중요해졌다고 한다.
운영체제의 역할은 무엇인가?
실행파일이 로더에 의해 메모리에 올라오고 운영체제는 이 실행파일을 메모리에 어느 부분에 올릴지 결정한다.
Java는 OS의 메모리 영역에 직접적으로 접근하지 않고 JVM이라는 가상 머신을 이용해서 간접적으로 접근한다.(GC를 설명하는 듯 하다.)
Swapping이란?
메모리 관리를 위해 사용되는 기법이다. 메모리에 적재되어 있으나 현재 사용되지 않고 있는 프로세스를 관리하는 역할을 한다.
쉽게 말해, 주기억장치에 적재한 하나의 프로세스와 보조기억장치에 적재한 다른 프로세스의 메모리를 교체하는 기법이다.
단편화 현상이란?
메모리의 공간이 작은 조각으로 나뉘어 사용 가능한 메모리가 충분히 존재하지만 할당이 불가능한 상태를 말한다.
내부 단편화 / 외부 단편화로 나눌 수 있다.
내부 단편화는 프로세스가 사용하는 메모리 공간에 포함된 남는 부분. 총 10의 크기 중 9를 사용하면 1이 남는 걸 내부 단편화라고 한다.
외부 단편화는 메모리 공간 중 사용하지 못하게 되는 일부분을 뜻한다. 사이 사이 남는 공간들을 모두 합치면 충분한 공간이 되는 부분들이 분산되어 있을 때 발생한다.
위의 단편화 현상을 줄이고, 적절한 swap을 통해 효율적으로 메모리를 관리하기 위한 방법으로 다음이 있다.
1. 연속 메모리 할당 : 프로세스를 메모리에 연속적으로 할당하는 기법, 할당과 제거를 반복하다 보면 Scattered holes가 생겨나고 이로 인한 외부 단편화가 발생한다. 이를 줄이기 위한 할당 방식으로는
최초 적합(First fit) : 가장 처음 만나는 빈 메모리 공간에 프로세스를 할당하는 방법
최적 적합(Best fit) : 빈 메모리 공간의 크기와 프로세스의 크기 차이가 가장 적은 곳에 프로세스를 할당하는 방법
최악 적합(Worst fit) : 빈 메모리 공간의 크기와 프로세스의 크기 차이가 가장 큰 곳에 프로세스를 할당하는 방법
2. 페이징 기법 : 가상 메모리 사용, 외부 단편화는 해결하지만 내부 단편화는 존재한다.
하나의 프로세스가 사용하는 메모리 공간이 연속적이어야 한다는 제약을 없애는 메모리 관리 방법, 물리 메모리는 Frame 이라는 고정 크기로 분리되어 있고, 논리 메모리 페이지라고 불리는 고정 크기의 블록으로 분리된다. 연속되어 저장될 필요가 없고 물리 메모리의 남는 프레임에 적절히 배치됨으로 외부 단편화를 해결할 수 있는 점이 장점이다.
하지만 내부 단편화 문제의 비중이 늘어나게 된다. 페이지 크기가 10일 경우, 31의 메모리를 요구하는 프로세스를 할당하기 위해서는 4개의 페이지가 필요하기 때문에 내부 단편화 문제가 발생하는 것이다.
3. 세그먼테이션 : 가상 메모리 사용, 내부 단편화 해결, 외분 단편화 존재
페이징 기법처럼 논리 메모리와 물리 메모리를 같은 크기의 블록이 아닌, 서로 다른 크기의 논리적 단위인 세그먼트로 분할, 사용자가 2개의 주소로 지정(세그먼트 번호 + 변위), 세그먼트 테이블에는 각 세그먼트의 기준과 한계를 저장한다.
하지만 서로 다른 크기의 세그먼트들이 메모리에 적재되고 제거되는 일이 반복되다 보면, 자유 공간들이 많은 수의 조각들로 나우어져 못 쓰게 될수도 있다.(외부 단편화)
4. 메모피 풀(Memoery Pool) :
필요한 메모리 공간을 필요한 크기, 개수 만큼 사용자가 직접 지정하여 미리 할당받아 놓고 필요할 때마다 사용하고 반납하는 기법, 미리 공간을 할당해놓고 가져다 쓰고 반납하기 때문에 할당과 해제로 인한 외부 단편화가 발생하지 않고 필요한 크기 만큼 할당을 해놓기 때문에 내부 단편화 또한 생기지 않는다. 하지만 메모리 단편화로 인한 메모리 낭비량보다 메모리 풀을 만들었지만 쓰지 않았을 때 메모리 양이 커질 경우 사용하지 않아야 한다.