[OS] 메모리 Ⅱ - Continuous Memory Allocation

rg.log·2022년 5월 16일
0
post-thumbnail

메모리 관련 여러 개념에 이어서 메모리를 실제 사용하는 process가 메모리를 할당받는 방법을 알아보았다.

Memory allocation

메모리를 process에 할당하는 방법은 크게 2가지로, 연속할당과 비연속 할당으로 나뉜다.

Continuous Memory Allocation (연속할당)

연속할당은 process를 하나의 연속된 메모리 공간에 할당하는 정책으로

  • 메모리에 동시에 올라갈 수 있는 프로세스의 수
  • 각 프로세스에 할당되는 메모리 공간의 크기
  • 메모리 분할 방법

을 고려해서 여러 방법을 택한다.

Uni-programming

가장 간단한 메모리 관리 기법으로 하나의 process만 메모리 상에 존재하는 것이다. 이는 문제점이 존재한다.

  1. 직관적으로 생각이 드는 문제점인 프로그램의 크기가 메모리 크기를 넘어설 때이다.
    이는 Overlay structure로 해결한다. Overlay structure는 메모리에 전체 프로그램 중 현재 필요한 영역만 적재하는 방법으로 사용자가 프로그램의 흐름 및 자료구조를 모두 알고 잘라서 올려줘야 하는 어려움이 있다.

  2. 커널(kernel)을 보호해야 한다. kernel 영역까지 침범하면 안 된다는 것이다.
    이는 boundary register라는 경계 레지스터를 사용해 해결할 수 있다. boundary register 안에 kernel과 user program의 경계가 되는 boundary address를 적어놓음으로써 kernel로 못 넘어가게 막아주는 것이다.

  3. 시스템 자원 활용도가 낮다.
    메모리에 하나의 process만 올라가기에 남는 메모리는 사용되지 못하고 낭비되는 것이다. 이는 Multi-programming으로 해결할 수 있다.

Multi-programming

  1. Fixed Partition Multiprogramming
    메모리 공간을 고정된 다양한 크기로 미리 분할해놓고, 각 프로세스를 하나의 partition에 적재하는 방법이다. 이 또한 Uni-programming 처럼 각 partition의 경계마다 boundary register를 두어 kernel 영역과 서로의 partition을 침범하지 않도록 한다. 아래는 이를 구현하는 자료구조이다.

    여기서 그 유명한 Fragmentation(단편화)이 등장한다.

    • Internal fragmentation (내부 단편화)
      partition의 크기가 process의 크기보다 커서 낭비되는 메모리 공간이 생기는 현상이다.
    • External fragmentation (외부 단편화)
      partition별로 남은 메모리 공간을 다 합친 크기가 process의 크기보다 크지만, 그 공간이 연속된 공간이 아니기에 메모리가 낭비되는 현상을 말한다.
  2. Variable Partition Multiprogramming
    process를 처리하는 과정에서 메모리 공간을 동적으로 분할한다. 하여 Internal fragmentation(내부 단편화)이 발생할리 없다. 아래는 VPM 예시 상황 속에서 이를 구현하는 자료구조이다.

    시간이 지날수록 process가 일을 끝내고 나가 빈 공간들이 발생한다. 이때, 다음에 들어오는 processs를 어디에 배치할까?

    • First-fit (최초 적합)
      충분한 크기를 가진 첫 번째 partition을 선택하는 것이다. 그러나 만약, 그다음 partition을 선택했을 때 남는 메모리가 더 적은 상황이라면 공간 활용률이 떨어진다.

    • Best-fit (최적 적합)
      process가 들어갈 수 있는 partition 중 가장 작은 곳 즉, process가 partition에 들어갔을 때 남는 공간이 적은 곳을 선택하는 것이다. 그러나 이는 모든 partition을 살펴봐야 하기에 탐색시간이 오래 걸리고, 활용률이 낮은 작은 크기의 partition이 많이 발생할 수 있다는 단점이 존재한다. 반면에 장점은 크기가 큰 partition을 유지할 수 있는 것이다.

    • Wortst-fit (최악 적합)
      process가 들어갈 수 있는 partition 중 가장 큰 곳을 선택하는 것인데, 이 방법을 택한다면 Best-fit과 반대로 작은 크기 partition 발생을 줄일 수 있으나 큰 크기의 partition 확보가 어렵다.

    • Next-fit (순차 최초 적합)
      First-fit과 유사하나 State table에서 마지막으로 탐색한 위치부터 순차적으로 탐색하여 메모리 영역의 사용 빈도를 균등화하는 것이다.

      위의 4가지 배치 전략은 process가 들어갈 수 있는 공간이 많을 때 어디에 배치할까? 하는 것이라면,
      이번에는 메모리 공간은 충분한데 연속되지 않아서 process를 넣을 수 없는 External fragmentation(외부 단편화) 이슈가 발생했을 때에는 어떻게 해결할 수 있을까?

    • Coalescing holes (공간 통합)
      process가 memory를 release 하고 나갔을 때 인접한 빈 영역을 하나의 partition으로 통합하는 것이다.

    • Storage Compaction (메모리 압축)
      모든 빈 공간을 하나로 통합하는 것이다. 이는 모든 process를 재배치하면서 process를 중지해야 하므로 overhead가 크다. 때문에 자주 하지 않고 가끔 해줘야 하는 것이고, 이는 OS의 선택 전략에 따라 달라진다.

Continuous Memory Allocation을 왜 공부해야할까?

알고리즘에서 1GB 메모리 공간을 a-z변수들이 사용한다고 가정할 때, program 짠다면 new 또는 malloc으로 동적할당을 사용할 것이다. 동적할당은 단순 연산에 비해 비싼 연산이어서 많이 호출하면 프로그램이 느려진다. 이 때, Memory pool을 사용하여 OS에 10GB를 한 번에 받는다면, a라는 변수가 1GB를 요청할 때 pointer를 copy해 전달해주기만 하면 되기에 수시로 메모리 공간을 요청하고 반납해도 시간이 오래 걸리지 않을 것이다. 이 때 Memory pool을 VPM 방식 등 선택하여 나만의 Memory pool을 만들 수 있기에 공부해놓으면 좋다. 나중에 성능이 중요한 프로그램을 만들 때에 여기 참고하기로 !!☝🏻

0개의 댓글