7. 메모리 관리

holim0·2021년 1월 9일
5

Operating System

목록 보기
7/9

오늘은 메모리 관리에 대한 내용에 대해 이야기 하고자 합니다.


프로그램이 실행되기 위해서는 메모리에 올라와 있어야 합니다.
그렇기 때문에 운영체제의 효과적인 메모리 관리가 필요합니다.


1. 메모리 구성

➡️ 각 프로세스에게 얼마큼의 메모리를 줄 것인가에 따라 메모리의 분할(partition)이 결정됩니다.

  • 고정(Fixed) 또는 정적(Static) 분할: 메모리의 분할을 미리 해 두고 고정적으로 운영하는 방식입니다.

  • 가변(Varaible) 또는 동적(Dynamic) 분할: 프로세스의 크기나 개수에 따라 변동시켜 나가는 방식입니다.


2. 메모리 관리

➡️ 효율적인 메모리 관리를 위해 4가지 기법이 사용됩니다.

각각에 대해서 간단하게 살펴보도록 하겠습니다.

2-1. 적재 기법(Fetch Strategy)

✅ 프로세스에게 언제 메모리를 할당해 줄 것인가에 대한 기법입니다.

여기서 2가지 기법이 있습니다.

  1. 적재의 요구가 있을 떄 적재하는 요구(Demand) 적재

  2. 적재의 요구가 있을 것으로 예상하고 미리 적재해 두는 예상(Anticipatory) 적재

대부분의 시스템에서는 요구 적재를 채택하고 있습니다.

2-2. 배치 기법(Placement Strategy)

✅ 프로세스들을 메모리 공간의 어디에 적재할 것인가를 다루는 기법입니다.

배치 기법이 뒤에서 더 자세히 다루겠습니다.

2-3. 교체 기법

✅ 메모리 공간이 부족할 경우 새로 적재돼야 할 프로세스를 위해 이미 메모리에 있는 프로세스 중 어떤 것을 골라 디스크로 내보내고 그 공간을 확보할 것인가에 요구되는 기법입니다.

2-4. 할당 기법

✅ 프로세스에게 메모리 공간을 얼마 정도로 줄 것인가를 결정하는 기법입니다.


3. 단일 프로그래밍

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

이 시스템에는 문제점이 있습니다.

  1. 메모리의 크기가 적재할 프로그램의 크기보다 작을 때 문제가 발생합니다.

-> 이럴 때는 프로그램의 일부분만을 먼저 적재하여 실행시킨 다음 나머지 부분들을 다시 적재하여 실행을 이어가는 **오버레이(Overlay) **방식을 사용해야 합니다.

  1. 빈 공간으로 남는 메모리와 CPU, 다른 자원의 낭비가 많이 시스템의 성능을 매우 떨어트립니다.

[메모리의 보호]

프로그램의 실행 중 커널 영역을 침범하지 못하도록 **경계 레지스터(Boundary Register)**를 사용합니다.

출처: https://starrykss.tistory.com/962


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

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

프로그램들이 컴파일 될 때 주소지정이 이루어지는 경우, 메모리의 할당은 절대(Absolute)로더에 의해 언제나 지정된 분할로 들어갑니다.


[메모리의 보호]

사용자와 커널 사이뿐만 아니라 사용자와 사용자 사이에도 침범하지 못하도록 해야 합니다.


[메모리 공간의 단편화(Fragmentation)]

  • 내부(Interna) 단편화: 프로세스를 수용하고 낭비되는 공간입니다. 분할 내의 낭비 공간이라는 의미를 가지고 있습니다.

  • 외부(External) 단편화: 분할의 크기 자체가 워낙 작아서 프로세스들을 수용하지 못한다면 그 분할은 통째로 낭비될 것입니다. 이를 외부 단편화라고 합니다.


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

➡️ 가변 분할은 프로세스를 수용할 때 그 크기만큼 메모리 공간을 할당해 주는 것입니다.

아래의 그림을 참고하시면 됩니다.

free와 used 이름의 링크드 리스트를 이용해서 메모리가 어떻게 운영되는지 나타나 있습니다.


여기서 배치 기법에 대해 더 자세히 보겠습니다.

  • 최초적합(First-fit): free 리스트의 첫 노드부터 시작하여, 제일 먼저 발견되는, 요구되는 크기보다 더 큰 빈 공간을 가지는 노드에서 할당해 주고 탐색을 마칩니다.

++ Next-fit => free 리스트를 순환 구조로 하고, 할당 가능한 노드가 선택될 때마다 헤더포인터를 이 노드 다음으로 옮기게 하는 방법입니다.

  • 최적적합(Best-fit): free 리스트를 끝까지 탐색하여 요구되는 크기보타 더 크되, 그 차이가 제일 작은 노드를 찾아 할당해 주는 방법입니다.

  • 최악적합(Worst-fit): free 리스트를 끝까지 탐색하여 요구되는 크기보타 더 크되, 그 차이가 제일 많이 나는 노드를 찾아 할당해 주는 방법입니다.


마무리

오늘은 메모리 관리에 대해서 알아보았습니다.

다음 시간에는 가상 메모리에 대해서 알아보겠습니다.🧐

profile
매일 조금씩 성장하고 있는 개발자입니다.

2개의 댓글

comment-user-thumbnail
2021년 1월 14일

안녕하세요, 책에 있는 그림을 그대로 사용하시게 되면 저작권법 위반이랍니다.
따라서 https://app.diagrams.net/ 와 같은 서비스를 통해 그림을 포스트 내용을 설명하기 위한 그림을 직접 넣으시는게 더 좋습니다.

추후 출판사 측에서 신고가 들어오면 포스트가 비공개처리 됩니다.

앞으로 포스트 작성할 때 참고해주세요!

1개의 답글