Memory Management

Haiseong Jeong·2022년 11월 1일
1
post-thumbnail

메모리 관리가 필요한 이유

프로그램의 실행(프로세스)을 위해서는 메모리를 할당해야 한다. 메모리는 한정된 자원이기 때문에 멀티 프로그래밍 시스템에서는 여러 프로세스들이 메모리를 효율적으로 이용할 수 있도록 관리가 필요하다.

Contiguous Memory Allocation

각 프로세스가 하나의 연속된 메모리 공간에 포함된다. 쉽게말해 통으로 올린다. 각 프로세스가 필요로 하는 메모리 요구량을 미리 분석해서 결정해 놓고 그 프로세스의 메모리를 하나의 덩어리로 설정여 실제 메모리에 할당 해준다는 원리다.

장점은 간단하는 것이다. 프로세스를 RAM에 적재할 때 프로세스가 올라간 시작주소만 알고 있다면 프로세스가 사용하는 모든 코드나 함수 또는 변수들의 위치를 쉽게 바인딩할 수 있다.

최초 적합 (First - fit)
요청한 크기를 만족하는 첫 번째 가용 공간을 할당하는 방법.
검색 속도가 빠르다.
최적 적합 (Best - fit)
요청한 크기를 만족하는 가용 공간 중에서 가장 작은 것을 할당한다.
분할되어 남는 가용 공간 크기를 최소화 한다.
최악 적합 (Worst - fit)
가장 큰 가용 공간을 할당하는 방법이다.
분할되어 남는 가용 공간이 커서 활용 가능성이 높다.
검색 속도가 느리고 메모리 이용 효율이 좋지 않다.

Swapping

메모리가 한정되어있기 때문에 어떤 프로세스가 생성되어야 하는데 공간이없어 생성되지 못하는 일이 있을 수 있다. 이를 위해 스와핑이라는 기법이 존재한다.

CPU에서 실행되지 않는 프로세스 중 일부를 메모리가 아닌 디스크에 저장하는 기법이다. 메모리의 프로세스를 디스크에 저장하는것을 swap out, 디스크의 이미지를 다시 프로세스로 복귀시키는것을 swap in 이라고 한다. 이는 마치 하드디스크 일부 공간을 메모리처럼 사용한다는 점에서 가상 메모리 기법의 핵심이다. 하드 디스크를 활용하여 더 큰 메모리가 있는 것처럼 효율적으로 사용할 수있다.

하지만 Context Switching 비용이 크다. 따라서 디스크 내 별도의 스왑 공간을 사용하거나 실제로 사용하는 부분만 스왑하도록 최적화 필요하다.

fragmentation

위의 두 방법을 이용해 메모리를 할당 받다 보면 짜투리가 계속 발생한다. 이 짜투리들이 점점 작아져 어떤 프로세스에게도 할당되지 않는 메모리의 낭비가 발생하된다. 이것을 단편화 라고 한다.

내부 단편화 (internal fragmentation)

메모리를 할당할때 고정된 크기 단위로 할당을 한다면 프로세스가 사용하는 메모리 공간 안에 빈공간이 생긴다. 이를 내부 단편화라 한다.

외부 단편화(external fragmentation)


프로세스들이 메모리를 차지하는 과정에서 외부에 여러 개로 작게 나누어진 공백이 생겨서 메모리를 할당할 수 없는 상태가 되는 것이다.

단편화를 해결하는 방법

메모리 압축

디스크 조각 모음을 예로 들 수 있다. 짜투리 메모리들을 하나로 합쳐 큰 메모리로 확보한다. 이를 이용해 외부 단편화 해결 가능하다. 하지만 꽤 시간이 필요한 작업이기 때문에 비효율적이다.

페이징(paging)

메모리 공간이 연속적이어야 한다는 제약이 없다. 한 프로세스의 논리 주소 공간을 여러 개로 분할하여 비연속적인 물리 메모리 공간에 할당한다. 이를통해 외부 단편화 해결하지만 내부 단편화 해결하지 못한다.

세그먼테이션(Segmentation)

논리, 물리 메모리를 서로 다른 크기의 논리적 단위인 세그먼트로 분할한다. 내부 단편화 해결하지만 외부 단편화 해결하지 못한다.

메모리 풀(Memory Pool)

필요한 메모리 공간을 필요한 크기, 개수만큼 사용자가 직접 지정하여 미리 할당받고 필요할 때마다 사용, 반납하는 기법이다. 메모리 할당, 해제가 잦은 경우 효과적이다. 외부 단편화 문제와 내부 단편화 문제를 모두 해결한다. 하지만 메모리 풀을 만들었지만 쓰지 않았을 때도 계속 할당된 상태이므로 메모리 누수가 발생한다.

profile
나는 개발자다. 5000만큼 코딩한다.

0개의 댓글