7-4.[os] 다중 프로그래밍 환경에서의 메모리 할당

  • 프로세스들의 크기가 달라 메모리를 어떻게 나누어 사용할 것인지가 가장 큰 문제

메모리 분할 방식

  • 메모리 배치 정책: 메모리를 어떤 크기로 나눌 것인가

  • 가변 분할 방식: 프로세스의 크기에 따라 메모리를 나누는 것이다.

  • 고정 분할 방식: 프로세스의 크기와 상관없이 메모리를 같은 크기로 나누는 것이다

image.png

image.png

image.png

  • 흰색 의자는 빈 의자
  • 가변 분할 방식:

    • 손님들이 앉고 싶은 자리에 앉을 수 있다
    • 파티션으로 구분되지 않았기 때문에 함께 온 일행이 나란히 앉을 수 있다
    • 관리가 복잡함
    • ex) B팀의 3명이 식사를 마친 후 손님 4명이 온 경우 -> 4명이 나란히 앉을 수 있는 빈자리가 없기 때문에 10~13번에 앉아 있는 C팀이 옆으로 이동해야 4명을 나란히 앉힐 수 있다. -> 식사 도중 자리를 옮기는 것은 매우 불편한 일
  • 고정 분할 방식:

    • 파티션 단위로 배정
    • 함께 온 일행이 분산해서 앉는다
    • 손님들이 알아서 적당한 파티션에 앉으면 된다

메모리 분할 방식의 구현

image.png

가변 분할 방식:

  • 프로세스의 크기에 맞게 메모리가 분할되므로 메모리의 영역이 각각 다르다 (17 ~ 40 KB 크기 다양함)
    • = 연속 메모리 할당(contiguous memory allocation): 한 프로세스가 연속된 공간에 배치됨

고정 분할 방식:

  • 프로세스의 크기에 상관없이 메모리가 같은 크기로 나뉘며, 큰 프로세스가 메모리에 올라오면 여러 조각으로 나뉘어 배치된다.
  • = 비연속 메모리 할당(noncontiguous memory allocation): 한 프로세스가 분산되어 배치됨

가변 분할 방식의 장점: 프로세스를 한 덩어리로 처리하여 하나의 프로세스를 연속된 공간에 배치

가변 분할 방식의 단점 : 가변 분할 방식은 메모리 관리가 복잡하다.

예시) 프로세스 B와 D가 작업을 마쳤다면 각각 18KB와 17KB의 빈 공간이 생긴다. 이때 19KB가 넘 는 프로세스가 메모리에 올라오려고 한다면 어떻게 될까? 빈 공간이 떨어져 있기 때문에 올라올 수 없다. 19KB가 넘는 프로세스를 실행하려면 비어 있는 공간을 하나로 합쳐야 하며, 이 과정에서 프로세스 C의 자리도 옮겨야 한다. 이처럼 가변 분할 방식은 메모리 통합 등의 부가적인 작업이 필요하므로 메모리 관리가 복잡하다.


고정 분할 방식의 장점: 고정 분할 방식에서는 메모리를 일정한 크기로 나누어 관리하기 때문에 메모리 관리가 수월하다. (가변 분할 방식의 메모리 통합 같은 부가적인 작업을 할 필요가 없다.)

고정 분할 방식의 단점: 쓸모없는 공간으로 인해 메모리 낭비가 발생할 수 있다. 즉 일정하게 나누어진 공간보다 작은 프로세스가 올라올 경우 메모리 낭비가 발생한다.

예시) 프로세스 B: 18KB, 프로세스 D: 17KB -> 메모리의 한 조각: 20KB에 배치하면 공간이 남음. 다른 프로세스가 사용할 수 없는 공간-> 메모리가 낭비


가변 분할 방식의 메모리 관리

  • 의자: 메모리
  • 손님: 프로세스

image.png

image.png

  • D팀 1 명과 A팀 3명이 식시를 마치고 나감
  • 의자 5개가 비지만 4개가 나란히 비지 않아 H팀 4명에게 배정 못함
  • B팀과 C팀에게 오른쪽으로 한 자리씩 옮겨달라하면 문제가 해결?
  • 식사 도중 자리를 옮겨달라고 부탁하긴 어려움
  • 대기 중인 I팀 2명을 먼저 빈자리에 배정?
  • H팀이 오래 기다렸다고 양보 안 해줄 수도 있음
  • 아사 현상: 인원이 많은 팀이 계속 자리를 배정받지 못하는 문제

image.png

  • B팀 2명과 F팀 1명이 식사를 마치고 나감
  • H팀 4명이 자리를 배정
  • 5번, 8번, 13번, 16번 의자가 비어 있지만 I팀 2명은 대기

단편화

  • = 조각화
  • fragmentation
  • 빈 영역이 있어도 서로 떨어져 있으면 프로세스를 배정하지 못해서
  • 작은 조각들이 발생하는 현상

  • 가변 분할 방식과 외부 단편화

image.png

  • 프로세스 A, B, C, D, 표를 순서대로 배치
  • B와 D가 종료 -> 18KB와 17KB의 빈 공간
  • 18KB보다 큰 프로세스가 들어오면 적당한 공간이 없어 메모리를 배정하지 못함

외부 단편화(external fragmentation):

  • 가변 분할 방식에서 발생하는 작은 빈 공간
  • 프로세스의 바깥쪽에 조각이 발생

해결:

  • 메모리 배치 방식(memory placement strategy): 작은 조각이 발생하지 않도록 프로세스를 배치

  • 조각 모음(defragmentation): 조각이 발생했을 때 작은 조각들을 모아서 하나의 큰 덩어리로 만드는 작업


메모리 배치 방식

  • 최초 배치(first fit), 최적 배치(best fit), 최악 배치(worst fit), 버디 시스템(buddy system)

최초 배치:

image.png

  • 최초 배치는 단편화를 고려하지 않는 것으로, 프로세스를 메모리의 빈 공간에 배치할 때 메모리에서 적재 가능한 공간을 순서대로 찾다가 첫 번째로 발견한 공간에 프로세스를 배치하는 방법

최적 배치:

image.png

  • 최적 배치는 메모리의 빈 공간을 모두 확인한 후 적당한 크기 가운데 가장 작은 공간 에 프로세스를 배치하는 방법이다.
  • 예시) D팀 2명이 7〜9번 의자 중 7번, 8번에 앉는다

최악 배치:

image.png

  • 최적 배치와 정반대인 최악 배치는 빈 공간을 모두 확인한 후 가장 큰 공간에 프로세스를 배치하는 방법이다.
  • 예시) D팀 2명이 11~16번의자중 11번, 12번에 앉는다

최초 배치 방식:

  • 빈 공간을 찾아다닐 필요가 없다. 최적 배치 방식:
  • 빈 공간을 모두 확인하는 부가적인 작업이 있지만 딱 맞는 공간을 찾을 경우 단편화가 일어나지 않는다
  • 프로세스를 배치하고 남은 공간이 작아 쓸모없다 최악 배치 방식:
  • 프로세스를 배치하고 남은 공간이 크기 때문에 쓸모있다
  • 빈 공간의 크기가 클 때는 효과적이지만 빈 공간의 크기가 점점 줄어들면 최적 배치처 럼 작은 조각을 만들어냄

image.png


조각 모음

  • 서로 떨어져 있는 여러 개의 빈 공간을 합치는 작업
  • 단편화가 발생하면 이미 배치된 프로세스를 옆으로 옮겨 빈 공간들을 하나의 큰 덩어리로 만듦

image.png

  • 프로세스를 중지시키고, 이동하고, 주소를 바꾸고, 다시 시작하는 작업
  • -> 많은 시간이 걸림
  • 결론: 가변 분할 방식은 외부 단편화로 인해 조각 모음 같은 부가적인 작업이 필요하므로 메모리 관리가 복잡함

고정 분할 방식의 메모리 관리

페이징: 가상 메모리 시스템에서는 고정 분할 방식


프로세스 배치와 외부 단편화

image.png

  • 다른 팀과 파티션을 공유하지 못하기 때문에 빈자리에 다른 팀이 앉을 수 없음 -> 대기자 8명
  • A팀 3명과 D 팀 1명이 식사를 마치고 나감
  • G 팀 2명과 H팀 4명이 자리를 배정

image.png


image.png

  • 40KB -> 20KB & 20KB
  • 30KB -> 20KB & 10KB(메모리에 공간없어서 스왑 영역으로 옮겨짐)

내부 단편화

  • internal fragmentation
  • 일정한 크기로 나뉜 파티션 안쪽으로 작은 조각이 발생
  • 일정하게 나뉜 메모리의 크기보다 작은 프로세스가 배치될 경우 낭비되는 공간이 생긴다

  • 가변 분할 방식의 외부 단편화는 조각 모음으로 조정함

  • 고정 분할 방식에서는 내부 단편화를 해결하기 위해 조각 모음을 할 수 없고 남는 공간을 다른 프로세스에 배정할 수도 없다

  • 동일하게 분할되는 공간의 크기를 조절 -> 내부 단편화를 최소화

  • 예시)

    • 의자 1개씩 파티션으로 나눔 -> 내부 단편화가 발생하지 않지만 각 팀이 여 러 개로 분할되어 관리하기 어려움
    • 의자 4개씩 파티션으로 나눔 -> 대부분의 손님이 같은 파티션에 앉을 수 있으나 내부 단편화가 급격하게 늘어나 낭비되는 공간이 생김

가변 분할 방식과 고정 분할 방식의 비교

image.png


버디시스템

  • 가변 분할 방식의 단점인 외부 단편화를 완화하는 방법
  • 버디 시스템은 가변 분할 방식이지만 고정 분할 방식과 유사한 점이 있다

버디 시스템의 작동 방식

  1. 프로세스의 크기에 맞게 메모리를 1/2로 잘라나가고 프로세스를 메모리에 배치한다.

  2. 나뉜 메모리의 각 구역에는 프로세스가 1개 만들어간다.

  3. 프로세스가 종료되면 주변의 빈 조각과 합쳐서 하나의 큰 덩어리를 만든다.

image.png

  • 버디 시스템은 메모리를 분할할 때는 1/2로 나누고,프로세스가 종료될 때마다 주변을 살펴서 빈 구역을 하나로 합친다

image.png

  • 손님이 A팀 3명, B팀 2명, C팀 2명일 때의 자리 배정
  • 의자 16개를 1/2로 나누고 그 중 오른쪽을 다시 1/2로 나누어 A팀 3명을 9~11 번 의자에 앉힌다. - 맨 오른쪽의 의자 4개를 1/2로 나누어 B팀 2명을 13〜 14번 의자에 앉히고, 맨 오른쪽에 남은 의자 2개에는 C팀 2명을 앉힌다.

image.png

  • D팀 1명이 추가됨
  • 왼쪽의 의자 8개를 1/2로 나누어 7번 의자를 앉힌다
  • E팀 4명, F팀 1명, G팀 2명, H팀 4명, I팀 2명이 추가됨

image.png

  • A팀 3명과 D팀 1명이 식사를 마치고 나감
  • 버디 시스템에서는 9~12번 의자에 H팀 4명을 앉힐 수 있음
  • F팀 1 명이 나가면 7번과 8번 의자가 통합되어 하나의 구역이 됨
  • I팀 2명 앉음

버디 시스템의 특징

  • 가변 분할 방식처럼 메모리가 프로세스 크기대로 나뉨
  • 고정 분할 방식처럼 하나의 구역에 다른 프로세스가 들어갈 수 없음 (내부 단편화 12번 의자)

  • 가변 분할 방식에서는 작은 조각이 큰 조각 사이사이에 있어 조각을 모으려면 큰 덩어리를 옮겨야 한다. 그러나 버디 시스템에서는 비슷한 크기의 조각이 서로 모여 있기 때문에 작은 조각을 통합하여 큰 조각을 만들기가 쉽다.

  • 조각 모음을 하지 않아도 간단히 큰 덩어리를 만들 수 있다.

  • 효율적인 공간 관리 측면에서 보면 고정 분할 방식과 버디 시스템은 비슷함

  • 공간을 1/2로 나누어가면서 메모리를 배분하는 버디 시스템이 고정 분할 방식보다 복잡해서 고정 분할을 더 많이 씀

Did you find this article valuable?

Support Software Engineer at Your Service by becoming a sponsor. Any amount is appreciated!