프로그램이 실행되기 위해서는 메모리에 올라와 있어야 한다. 따라서 메모리를 잘 관리하면 프로그램의 실행 성능을 높여 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 |