1. 연속 메모리 할당(Continuous Memory Allocation)

  • 프로세스에 연속된 메모리 공간을 할당하는 방식
  • 고려해야할 사항
    • 메모리상에 동시에 적재될 수 있는 프로세스의 갯수
    • 각 프로세스에게 할당할 수 있는 메모리 크기
    • 메모리 분할 방식

 

 

2. 단일 프로그래밍(Uni-Programming)

  • 메모리상에 단 하나의 프로세스만이 적재될 수 있는 시스템

  • 프로그램의 크기가 메모리 전체의 크기보다 큰 경우?
    • 매 순간 필요한 부분만을 메모리상에 적재하도록 해야한다.
    • 운영체제에서 지원할 수 는 없기 때문에 사용자(프로그래머)가 컨트롤해야하는 부분

  • 커널 보호
    • 프로그램을 메모리에 적재할 때 커널 영역을 침범하지 않도록 보호할 필요가 있음
    • 경계 레지스터(Boundary Register) 를 사용하여 보호

  • 문제점
    • 동시에 하나의 프로세스만을 메모리상에 적재하기 때문에 시스템 자원 활용도가 낮음
    • 위의 이유로 시스템의 성능도 낮음

 

 

3. 다중 프로그래밍(Multi-Programming)

  • 메모리상에 동시에 여러개의 프로세스가 적재될 수 있는 시스템

 

  • 각 프로세스마다 분할된 메모리공간, 파티션(partition)을 할당해주기 위한 분할 정책이 필요
    • 고정 분할 방식(Fixed Partition Multi-Programming)
    • 가변 분할 방식(Variable Partition Multi-Programming)

 

  • 단편화(Fragmentation)
    • 내부 단편화(Internal Fragmentation)
      • 파티션의 크기가 적재된 프로세스의 크기보다 크기 때문에 메모리 공간이 낭비되는 상황

    • 외부 단편화(External Fragmentation)
      • 메모리상의 남은 공간의 크기는 적재해야할 프로세스의 크기보다 크지만
        남은 공간이 연속해있지 않아서 프로세스를 적재할 수 없는 상황

 

 

4. 고정 분할 방식(Fixed Partition Multi-Programming)

  • 메모리 공간을 고정된 크기로 미리 분할해두고 각 프로세스에 1:1로 할당하는 방식

  • 각 파티션의 시작 주소와 크기, 어느 프로세스에게 할당됐는지의 등의 정보를 관리하는
    테이블을 작성하여 관리할 수 있음

  • 단일 프로그래밍과 마찬가지로 커널의 영역을 침범하지 않도록 하기 위해 경계 레지스터를
    사용하는데, 여기서는 파티션간의 침범을 막기 위해서도 사용된다. 
  • 단순한 방식이기에 메모리 관리로 인한 오버헤드가 매우 적음

  • 내부, 외부 단편화로 인한 시스템 자원 낭비가 심함

 

 

5. 가변 분할 방식(Variable Partition Multi-Programming)

  • 적재해야할 프로세스의 크기에 맞는 파티션을 만들어 이를 할당하는 방식

  • 고정 분할 방식과 마찬가지로 각 파티션의 시작 주소와 크기, 어느 프로세스에게 할당됐는지
    등의 정보를 관리하는 테이블을 작성하여 관리할 수 있음

  • 프로세스가 필요로하는 크기만큼의 메모리를 할당하기에 내부 단편화는 발생하지 않음
  • 그러나 할당된 프로세스가 메모리에서 해제되는 경우로 인해 외부 단편화는 발생할 수 있음

 

 

6. 배치(Placement)

  • 가변 분할 방식에서 파티션을 할당받았던 프로세스가 실행을 마치고 메모리에서 해제되면 
    처음처럼 연속된 빈 공간이 아닌 사이사이의 빈 파티션이 생김

  • 비어있는 파티션중 어느것을 분할하여 프로세스에게 할당할지 결정하기 위한 정책이 필요
  • First Fit(최초 적합)
    • 프로세스가 필요로하는 크기보다 큰 파티션중 가장 처음 찾아낸 파티션을 사용
    • 단순하고 오버헤드가 적지만 공간 활용률이 떨어질 수 있음

  • Best Fit(최적 적합)
    • 프로세스가 필요로하는 크기와 가장 가까운 크기의 파티션을 사용
    • 크기가 큰 파티션을 최대한 유지할 수 있음
    • 너무 작은 크기의 파티션(거의 사용될 여지가 없는)을 다수 발생시킬 수 있음
    • 최소 파티션을 탐색하기 위해 모든 파티션을 탐색해야하기 때문에 시간이 오래걸림
      크기가 큰 파티션을 최대한 유지할 수 있음
  • Worst Fit(최악 적합)
    • Best Fit과는 반대로 프로세스가 들어갈 수 있는 파티션중 가장 큰 것을 사용
    • 작은 크기의 파티션의 발생을 최소화할 수 있음
    • 크기가 큰 파티션을 확보하기 어려움
    • 최대 파티션을 탐색하기 위해 모든 파티션을 탐색해야하기 때문에 시간이 오래걸림

  • Next-Fit(순차 최초 적합)
    • First Fit과 유사한 방식이지만 이전에 마지막으로 탐색한 위치부터 탐색을 시작
    • 메모리 영역의 사용 빈도를 균등화할 수 있음
    • 모든 파티션을 탐색할 필요가 없기 때문에 오버헤드가 적음

 

 

7. 외부 단편화의 해결

  • 가변 분할 방식에서 프로세스가 필요로하는 크기만큼의 연속된 메모리 공간의 부족(외부단편화)으로
    프로세스를 적재할 수 없게될 경우 이를 해결하기 위한 방안이 필요

 

  • 공간 통합(Coalescing Holes)
    • 다른 프로세스가 실행을 마치고 메모리상에서 해제되어 충분한 크기의 연속된 파티션이
      생길 때 까지 프로세스의 적재를 보류

    • 충분한 크기의 연속된 파티션이 생기면 인접한 두 파티션을 통합하여 프로세스를 적재

    • 파티션 테이블을 조금 수정하는 것만으로 처리 가능한 오버헤드가 적은 방식

    • 오버헤드가 적은 작업인 만큼 프로세스가 메모리상에서 해제될 때마다 실행해줄 수 있다.

 

  • 메모리 압축(Storage Compaction)
    • 모든 빈 공간을 하나의 연속된 빈 파티션으로 통합

    • 외부단편화를 완전히 제거할 수 있지만 모든 프로세스의 메모리상의 위치를 재배치해야 하기 때문에
      프로세스의 작업이 일시적으로 중단되며 오버헤드가 매우 큼

    • 오버헤드가 매우 크기 때문에 적당한 주기를 두고 실행해줘야하는 방식
      => 실행 주기는 OS의 메모리 관리 정책에 따라 달라짐

 

※ OS 레벨에서의 메모리의 할당은 기본적으로 상당히 많은 시간이 걸리는 작업이기에

   메모리의 잦은 할당, 해제가 이루어지는 시스템의 경우 미리 필요한 만큼의 메모리를 할당받아
   메모리 풀(Memory Pool)을 만들고 유저 레벨에서 이를 해결하는 것으로 오버헤드를 줄일 수 있다

+ Recent posts