메모리 관리

최정은·2022년 11월 1일
0

Backend Roadmap

목록 보기
19/23
post-thumbnail

어떤 프로그램이든 프로세스가 되기 위해 메모리에 적재되어야 실행 가능하다. 따라서 메모리는 중요한 작업 공간이고, 한정된 메모리를 다중 프로그래밍 환경에서 여러 프로세스가 함께 메모리를 사용하므로 효율적인 관리가 필요하다.

메모리 관리는 운영체제를 비롯해 여러 작업을 동시에 처리할 때 메모리를 어떻게 관리하는가에 대한 문제다. 복잡한 메모리 관리는 메모리 관리 시스템(Memory Management System, MMS)이 담당한다.

메모리 관리자의 역할

메모리 관리는 메모리 관리자가 담당한다. 메모리 관리자는 메모리 관리 유닛(Memory Management Unit)이라는 하드웨어인데 일반적으로 메모리 관리자라고 부른다. 메모리 관리자의 작업은 가져오기, 배치, 재배치이다.

각 작업에 정책을 수립하여 그 정책에 따라 메모리를 관리한다.

가져오기 정책

  • 가져오기 정책은 필요로 하는 데이터를 언제 메모리로 가져올지 결정하는 정책이다.
  • 프로세스가 요청할 때 메모리로 가져오는 것이 일반적이지만, 필요하다고 예상되는 데이터를 미리 가져오는 방법(prefetch)도 있다.

배치 정책

  • 배치 정책은 가져온 프로세스를 메모리의 어떤 위치에 올려놓을지 결정하는 정책이다.
  • 메모리를 같은 크기로 자르는 것을 페이징(paging)이라고 하며, 프로세스의 크기에 맞게 자르는 것을 세그먼테이션(segmentation)이라고 한다.
  • 배치 정책은 각각의 장단점을 파악하여 메모리를 효율적으로 관리할 수 있도록 정책을 만드는 것이다. 이는 한정된 메모리를 효율적으로 사용하기 위한 것으로, 시스템의 효율을 좌우하는 매우 중요한 기준이다.

재배치 정책

  • 재배치 정책은 메모리가 꽉 찼을 때, 메모리 내에 있는 어떤 프로세스를 내보낼지 결정하는 정책이다.
  • 앞으로 사용하지 않을 프로세스를 내보내면 시스템의 성능이 올라가지만 자주 사용할 프로세스를 내보내면 성능이 떨어진다.

메모리 관리 기법

1) 스와핑 (Swapping)

부족한 메모리 공간을 효율적으로 관리하기 위해 사용되는 메모리 관리 기법 중 하나다. CPU에서 실행되지 않는 프로세스 (준비 또는 대기 상태) 중 일부를 메모리 안에 보관하지 않고 하드디스크와 같은 저장장치에 저장한다.

메모리에 있는 프로세스를 하드디스크로 내보내는 것을 swap out, 하드디스크의 이미지를 다시 메모리로 불러오는 것을 swap in 이라고 한다.

스와핑은 하드디스크를 활용하여 마치 큰 메모리가 있는 것처럼 더 많은 프로세스를 실행할 수 있다는 장점이 있다. 하지만 문맥 교환(Context Switching) 시간이 많이 증가한다는 문제가 있다. 메모리의 동작 속도와 저장장치의 동작 속도가 매우 큰 차이를 가지고 있기 때문이다. 따라서 스와핑을 구현할 때에는 디스크 내에 별도의 스왑 공간을 사용하거나 실제로 사용하는 부분만 스왑하도록 최적화가 필요하게 된다.

2) 비연속 메모리 할당 (Noncontiguous Memory Allocation)

고정 분할 방식의 메모리 할당 방식으로, 프로세스의 크기에 상관없이 메모리가 같은 크기로 나뉜다. 큰 프로세스가 메모리에 올라오면 여러 조각으로 분산되어 배치된다.

3) 연속 메모리 할당 (Contiguous Memory Allocation)

가변 분할 방식의 메모리 할당 방식으로, 프로세스의 크이에 맞게 메모리가 분할되므로 메모리의 영역이 각각 다르다. 프로세스를 메모리에 연속적으로 할당하는 기법이다. 각 프로세스가 요구하는 메모리 크기를 분석해서 결정해놓고, 그 프로세스의 메모리를 하나의 덩어리로 설정하여 실제 메모리에 할당해준다.

여러 개의 프로세스가 있을 때, 각각의 프로세스가 요구하는 메모리의 크기가 다를 것이다. 실제로 프로세스를 메모리에 적재할 때 프로세스가 올라간 시작주소만 알고 있다면 프로세스가 사용하는 코드나 함수 또는 변수들의 위치를 손쉽게 바인딩해서 쓸 수 있다.

다음은 프로세스를 새로 실행했을 때, 이 프로세스가 들어갈 수 있는 메모리 영역을 찾아내는 방법이며, 3가지 동적 메모리 할당 기법이 있다.

  • 최초 적합 (First-Fit)

    • 단편화를 고려하지 않는 방법
    • 프로세스를 메모리의 빈 공간에 배치할 때 메모리에서 적재 가능한 공간을 순서대로 찾다가 첫번째로 발견한 공간에 프로세스를 배치하는 방법이다.
    • 검색 속도가 빠르다.
  • 최적 적합 (Best-Fit)

    • 메모리의 빈 공간을 모두 확인한 후 적당한 크기 가운데 가장 작은 공간에 프로세스를 배치하는 방법이다.
    • 분할되어 남는 가용 공간의 크기를 최소화한다.
  • 최악 적합 (Worst-Fit)

    • 빈 공간을 모두 확인한 후 가장 큰 공간에 프로세스를 배치하는 방법이다.
    • 분할되어 남는 가용 공간이 커서 활용 가능성이 높다.
    • 검색 속도가 느리고 메모리 이용 효율이 좋지 않다.

4) 단편화 (Fragmentation)

동적 메모리 할당에서의 문제점은 메모리에 짜투리가 계속 발생한다는 것이다. 즉, 사용 가능한 메모리가 충분히 존재하지만 작은 공간으로 나누어져 프로세스 할당이 불가능한 상태를 말한다.

  • 내부 단편화
    고정 분할 방식에서 일정하게 나뉜 메모리보다 크기가 작은 프로세스가 배치될 경우 낭비되는 공간이 생긴다. 이처럼 각 메모리 조각에 프로세스를 배치하고 공간이 남는 현상을 내부 단편화(internal fragmentation)이라고 한다. 동일하게 분할되는 공간의 크기를 조절하여 내부 단편화를 최소화할 수 있다.

  • 외부 단편화
    프로세스가 메모리를 할당받고 해제될 때 빈 공간이 생긴다. 이후에 빈 공간보다 큰 프로세스가 들어오면 적당한 메모리를 배정받지 못하는데, 가변 분할 방식에서 발생하는 이러한 작은 빈 공간을 외부 단편화(external fragmentation)이라고 한다.

4-2) 외부 단편화 문제 해결

  • 메모리 압축 (또는 조각 모음)
    연속 메모리 할당을 진행하면서 발생한 짜투리 메모리들을 하나로 합쳐 큰 공간을 만드는 것이다. 하지만 압축을 하려면 현재 할당되어 있는 프로세스들의 메모리 위치를 옮겨줘야만 한다. 이러한 작업이 OS에서 꽤 시간이 필요한 작업이기 때문에 효율적이지 않다.

  • 메모리 풀 (Memory Pool)
    필요한 메모리 공간을 필요한 크기, 개수만큼 사용자가 직접 지정하여 미리 할당받아 놓고 필요할 때마다 사용하고 반납하는 기법이다. 메모리의 할당, 해제가 잦은 경우에 효과적이다. 미리 할당해놓고 사용하지 않는 순간에도 계속 할당해놓기 때문에 메모리 누수가 있는 방식이다. 내부 단편화와 외부 단편화가 발생하지 않는다.

정리

구분가변 분할 방식고정 분할 방식
메모리 단위세그먼테이션페이징
특징연속 메모리 할당비연속 메모리 할당
장점프로세스를 한 덩어리로 관리 가능메모리 관리가 편리
단점빈 공간의 관리가 어려움프로세스가 분할되어 처리
단편화외부 단편화내부 단편화

현대 OS에서 메모리 관리는 기본적으로 고정 분할 방식을 사용하면서 일부분은 가변 분할 방식을 혼합하고 있다.

Reference

메모리 관리
메모리 관리 기법

profile
https://dolmeng22.tistory.com 로 이전했습니다~

0개의 댓글