본문 바로가기

OS

[OS] 메모리 관리

 

프로그램이 실행되기 위해서는 메모리에 올라와 있어야 한다. 따라서 메모리를 잘 관리하면 프로그램의 실행 성능을 높여 CPU의 효율적인 사용과 사용자에게 빠른 응답성을 가능하게 한다. 


메모리의 구성은?

  • 고정(Fixed) 또는 정적(Static) 분할 : 메모리의 분할을 미리 해 두고 고정적으로 운영할 경우
  • 가변(Variable) 또는 동적(Dynamic) 분할 : 프로세스의 크기나 개수에 따라 변동

메모리의 관리는?

  • 적재 기법(Fetch Strategy) : 언제 프로세스를 메모리에 적재할 것인가를 다루는 기법
  • 배치 기법(Placement Strategy) : 프로세스들을 메모리 어디에 적재할 것인가를 다루는 기법
  • 교체 기법(Replacement Strategy) : 메모리 공간이 부족할 때 새로운 프로세스를 위해 어떤 프로세스를 골라 디스크로 내보내고 공간을 확보할 것인지 다루는 기법
  • 할당 기법(Allocation Strategy) : 프로세스에게 메모리 공간을 얼마 정도로 줄 것인지를 다루는 기법

단일 프로그래밍

단일 프로그래밍이란 한 번에 하나의 프로세스만이 메모리에 적재되고 실행이 종료되면 다음 프로세스가 적재되는 시스템을 말한다. 

  • 커널이 차지하는 공간을 제외한 나머지 전부가 하나의 프로세스가 차지하고, 차지하고 남은 공간은 종료할 때까지 낭비가 된다.
  • 메모리의 크기가 적재할 프로그램의 크기보다 크거나 같으면 프로그램의 일부분만을 먼저 적재하여 실행시킨 다음 나머지 부분들을 다시 적재하여 실행을 이어가는 오버레이(overlay) 방식을 사용해야 한다.
  • 프로그램의 실행 중 커널 영역을 침범하지 못하도록 하는 경계 레지스터(Boundary Register)가 필요하다.
  • 빈 공간으로 남는 메모리는 물론 CPU와 다른 자원들의 낭비 또한 많아 시스템의 성능이 떨어지게 된다.

고정 분할에서의 다중 프로그래밍

메모리를 여러 개의 분할로 나누어 놓고 각 분할에는 하나의 프로세스만을 수용하도록 함으로써 다중 프로그래밍을 구현하는 방식이다.

  • 이미 정해진 분할은 고정이므로 크기와 개수는 변하지 않고 다중 프로그래밍 정도의 최대치는 분할의 개수와 같게 될 것이다.
  • 관리가 쉽고 편리하지만, 다양한 상황에 유연하게 대처하지 못하는 단점이 있다.
  • 가장 큰 분할보다 더 큰 프로그램을 수용하려면 오버레이(overlay) 방법으로 해결해야 한다.
  • 사용자와 커널 사이뿐만 아니라 사용자와 사용자 사이 경계를 침범하지 못하도록 해야 한다. (경계 레지스터)
  • 프로세스를 수용하고 남는 공간은 낭비가 된다. (내부 단편화)
  • 분할의 크기가 작아서 프로세스들을 수용하지 못한다. (외부 단편화)
  • 관리가 쉬운 만큼 오버헤드도 적지만, 단편화로 인한 메모리의 낭비를 겪는다.

가변 분할에서의 다중 프로그래밍

분할의 시기와 개수 그리고 크기가 사전에 정해진 바 없이 프로세스를 수용할 때 그 크기만큼 메모리 공간을 할당해 준다.

  • 내부 단편화를 방지할 수 있지만 관리가 복잡해짐으로 오버헤드를 감수해야 한다.
  • 메모리에서 사용 중인 공간과 빈 공간들에 대한 정보가 필요하며 테이블이나 리스트와 같은 자료구조로 표현

 

배치 기법 (used : 사용 중인 공간, free : 빈 공간)

최초 적합(First-fit) :

  • free 리스트의 첫 노드부터 시작하여 제일 먼저 발견되는, 요구되는 크기보다 더 큰 빈 공간을 가지는 노드에게 할당해 주고 탐색을 마친다.
  • free 리스트에 대한 탐색을 중간에 끝낼 수 있다.
  • 할당 후 남은 크기가 어중간하다.

최적 적합(Best-fit) :

  • free 리스트를 끝까지 탐색하여 요구되는 크기보다 더 크되, 그 차이가 제일 작은 노드를 찾아 할당해 주는 방법이다.
  • free 리스트에 대한 탐색을 끝까지 해야 하므로 시간적 부담이 크다.
  • 할당 후 남은 크기가 매우 작아 이런 빈 공간들을 이후에 사용하기 힘들다. (Hole, 외부 단편화)

최악 적합(Worst-fit) :

  • free 리스트를 끝까지 탐색하여 요구되는 크기보다 더 크되, 그 차이가 제일 많이 나는 노드를 찾아 할당해 주는 방법이다.
  • free 리스트에 대한 탐색을 끝까지 해야 하므로 시간적 부담이 크다.
  • 홀(Hole)의 발생을 억제할 수 있는 반면, 큰 빈 공간을 확보하기 어렵다.

 

가변 분할 방식으로 메모리의 관리를 오랫동안 한 후 리스트를 살펴보면 빈 공간이 많음에도 불구하고 대부분이 홀이어서 별로 크지 않은 프로세스의 적재 요구조차 수용할 수 없는 상황이 생길 수 있다. 이런 현상을 "50% 규칙"이라고 하며 결국 작은 빈 공간을 합쳐 더 큰 빈 공간을 만드는 작업이 요구된다.


인접한(Adjacent) 빈 공간의 병합(Coalescing)

메모리상에서 바로 위 또는 아래에 위치한 빈 공간이 있다면 이들을 합쳐 좀 더 큰 빈 공간을 만들어 주는 방식

 

빈 공간 전부의 통합(Compaction)

사용 중인 공간들을 메모리의 한쪽 편으로 밀착시켜 옮기고, 흩어져 있던 빈 공간들을 전부 합쳐 하나의 큰 빈 공간으로 만든다.

  • 병합과는 달리 사용 중인 공간의 위치 이동이 발생하며 이것은 메모리에 있는 모든 프로세스들의 주소 재배치를 의미하므로 상당한 시간을 요구한다. 
  • 통합이 진행되는 동안은 모든 프로세스들의 실행이 중지되므로 시스템에 있는 자원들 역시 상당 부분 낭비가 된다.

버디 시스템의 운영

  • 프로세스 적재 요구가 있을 대 메모리는 요구한 크기보다 크되, 차이가 가장 작게 나는 2의 승수 크기로 분할되어 할당
  • 버디 시스템은 미리 고정된 분할은 아니지만 프로세스의 크기만큼 할당하는 가변 분할도 아니다.
  • 분할 내에 프로세스가 차지하고 남은 빈 공간인 내부 단편화가 발생은 하지만 고정 분할 때보다는 많이 좋아질 수 있다.
  • 반납되는 빈 공간은 분할 시 정해졌던 자신의 버디가 빈 공간일 때 병합되어 크기를 2의 배수로 늘려나간다.

 

참고 자료

  • OS? Oh Yes! , 김주균 지음

 

'OS' 카테고리의 다른 글

[OS] 가상 메모리의 관리  (0) 2020.05.11
[OS] 가상 메모리 : 페이징과 세그먼테이션  (0) 2020.05.10
[OS] 교착 상태(Deadlock)  (0) 2020.05.09
[OS] 병행 프로세스와 동기화  (0) 2020.05.09
[OS] CPU 스케줄링(Scheduling)  (0) 2020.05.08