안녕하세요!
오늘은 [운영체제 11편] 메모리 할당I (연속할당 방식)에 대해서 배워보려고 합니다 !!
저번주 포스팅에서 제가 내부 단편화와 외부 단편화에 대해서 언급했습니다 ㅎㅎ
이 주제의 포스팅을 읽다보면 내부/외부 단편화가 무엇인지 확실히 이해될 것이라고 생각합니다:)
들어갑시다!!
제가 물리적 메모리는 두개의 영역으로 나뉜다고 했었던 거 기억나시나요??
물리적 메모리(램)은 운영체제 영역과 사용자 프로세스 영역으로 나뉘게 됩니다.
[운영체제 6편] 에서 언급을 했었습니다. 기억 안나시는 분들은 아래 링크 참고하세요!
운영체제의 영역은 메모리의 낮은 주소에 위치하고 사용자 프로세스 영역은 메모리의 높은 주소 영역을 사용합니다.
오늘 저희가 배워 볼 주제는 사용자가 사용하는 프로세스들은 어떻게 메모리에 할당 되는지 알아볼려고 합니다.
즉, 사용자 프로세스 영역(유저영역)에서 프로세스들은 어떻게 할당 시키는지에 대해서 배워보는 것이 이번 학습 목표랍니다.
메모리 할당 방식에는 크게 두가지가 있어요!
크게 연속할당과 불연속 할당 방식으로 나뉘는데, 이번 주 포스팅에서는 연속할당에 대해서 배워 보려고 해요!
연속할당 방식
연속할당 방식이라는 것을 들었을 때 뭔가 연속적으로 올려놓는 느낌이 드실거에요!
이처럼 연속할당 방식은 프로세스를 메모리에 올릴 때 그 주소 공간을 여러개로 분할하지 않고 물리적 메모리의 한 곳에 연속적으로 적재하는 방식입니다~
연속할당 방식에는 크게 고정분할 방식과 가변분할 방식이 있습니다.
1. 고정분할방식
고정 분할 방식은 물리적 메모리를 주어진 개수만큼의 영구적인 분할로 미리 나누어두고 각 분할에 하나의 프로세스를 적재해 실행시킬 수 있게 하는거에요. (분할의 크기는 모두 동일하게 할 수도 있고 서로 다르게 할 수도 있습니다.)
따라서 고정 분할 방식은 동시에 메모리에 올릴 수 있는 프로그램의 수가 고정되어 있으며 수행 가능한 프로그램의 최대 크기 또한 제한된다는 점에서 가변분할 방식에 비해 융통성이 떨어져요.
또한 고정 분할 방식에서는 외부 단편화와 내부 단편화가 발생할 수 있어요.
외부 단편화란 프로그램의 크기보다 분할의 크기가 작은 경우에는 해당 분할이 비어 있는데도 불구하고 프로그램을 적재하지 못하기 때문에 발생하는 현상을 의미합니다.
위의 그림을 보시면 프로그램이 메모리에 분할된 공간보다 크니까 못들어가잖아요? 이렇게 메모리 공간은 비어있지만 프로세스를 적재시키지 못해서 낭비되는 것을 말합니다.
내부 단편화는 프로그램의 크기보다 분할의 크기가 큰 경우 해당 분할에 프로그램을 적재하고 남는 현상을 뜻합니다.
즉, 하나의 분할 내부에 사용되지 않는 메모리 조각이 생기는 현상을 말해요.
위의 그림을 보시면 P4 프로그램이 6등분의 크기로 분할된 하나의 공간에 충분히 들어가고도 메모리 공간이 남는게 보여요. 그 남는 공간을 내부 단편화라고 하는거죠. 그치만 이렇게 남는 공간이 있다고 해도 하나의 분할 공간에는 하나의 프로세스만 들어가기 때문(고정분할방식 특징)에 다른 프로그램이 들어갈 수 없어요.
그래서 메모리가 낭비되는 것이죠!
2. 가변 분할 방식
가변 분할 방식은 고정분할 방식과 달리 메모리에 적재되는 프로그램의 크기에 따라 분할의 크기, 개수가 동적으로 변하는 방식을 뜻해요 ~
위의 그림을 보시면 가변분할 방식에서 분할의 크기를 프로그램의 크기에 맞게 할당하기 때문에 내부단편화는 발생하지 않아요. 그렇겠죠? 왜냐하면 A 프로세스가 만약 300MB 의 크기를 가지고 있다면 메모리에서 미리 메모리 공간을 분할시키지 않고 바로 그 크기만큼 넣어버리는거에요
자! 만약에 프로그램들의 크기대로 메모리 공간에 차례대로 P1, P2, P3, P4, P5를 적재시켰어요. 근데 여기서 만약 프로세스 P2와 P4가 종료가 돼서 이제 메모리에서 삭제된거에요. 그러면 종료된 프로세스가 사용된 메모리 공간이 뻥! 하고 비겠죠?ㅎㅎ
즉, 프로세스가 종료되면 위의 그림처럼 빈공간 A와 빈공간 B 처럼 메모리 내의 여러 곳에 산발적으로 메모리 가용공간(빈공간)이 생겨버려요.
그렇기 때문에 새로운 프로그램을 적재시키기 위해서는 가용공간 중 어떤 위치에 올릴 것인지 결정하는 문제가 생깁니다. 이러한 문제를 "동적 메모리 할당 문제"라고 불러요.
동적 메모리 할당 문제를 해결하는 대표적인 방법으로는 3가지가 있습니다.
"최초 적합, 최적 적합, 최악 적합"이 있습니다.
* 위의 그림에서 크기가 N인 P6 프로세스가 어떤 가용공간으로 넣어할 지 고민하고 있네요.
위에서 언급했던 "최초 적합", "최적 적합" 그리고 "최악 적합" 이 3가지를 적용해서 적재시켜보겠습니다~
1) 최초 적합
첫번째는 크기가 N 이상인 가용 공간 중 가장 먼저 찾아지는 곳에 프로그램을 할당하는 최초 적합(FIRST-FIT) 방법이에요.
이 방법은 메모리에 존재하는 가용 공간을 차례대로 살펴보면서 가용 공간이 프로그램 크기보다 작으면 건너뛰고, 그렇지 않은 가용공간이 최초로 발견되면 그 공간에 프로그램을 올립니다!!
위에 보시면 빈공간 A는 프로그램 P6을 적재할 수 있는 충분한 크기를 가지고 있네요ㅎㅎ
그렇기 때문에 프로그램 P6을 해당공간에 적재시키고 끝내는거에요! 즉, 빈공간 B라던지 또는 그림에 나와있진 않지만 더 많은 가용공간이 있다한들 볼 필요가 없겠죠? 그래서 시간적인 측면에서 효율적이에요.
2) 최적 적합
두번째 방법은 크기가 n 이상인 가장 작은 가용공간을 찾아 그곳에 새로운 프로그램을 할당하는 최적적합(best-fit) 방법입니다.
이 방법은 모든 가용공간 리스트를 탐색을 해서 현재 프로그램 P6을 넣을 수 있는 공간 중에 가장 작은 공간에 적재시키는 거에요. 빈공간 A에도 P6을 넣을 수 있고 빈공간 B에서도 P6을 넣을 수 있는데 그 중에서 더 딱 맞는 공간인 빈공간 B에다가 넣는 거죠!
하지만 모든 가용공간 리스트를 탐색해야 하니까 시간적 오버헤드가 발생하겠죠? 또한 가장 딱 맞는 공간을 찾다보니 매우 작은 가용공간들이 생성될 수 있어요. 그치만 프로그램 크기와 가장 딱 맞는 공간들을 골라서 찾아서 넣기때문에 공간적인 측면에서는 효율적인거죠.
3) 최악 적합
세번째는 가용 공간 중에서 가장 크기가 큰 곳에 새로운 프로그램을 할당하는 최악적합 방법이에요! 이 방법은 최적적합 방법과 마찬가지로 모든 가용 공간 리스트를 탐색해야 하는 오버헤드가 발생합니다.
위의 그림을 보시면 P6 은 빈공간 A와 빈공간 B에 적재시킬 수 있지만 그 중에서 가장 큰 공간에다가 적재하는 거에요!
그래서 빈공간 A가 더 크니까 빈공간 A에 적재하는거죠!
위의 세가지 방법에 대해 실제 시스템에서 실험한 결과에 따르면 최초적합과 최적적합 방식이 최악적합 방식에 비해 속도와 공간 이용률 측면에서 효과적인 것을 알려져있답니다 ㅎㅎ
자! 이러한 가변분할 방식에서 발생하는 외부조각 문제를 해결하기 위한 방법으로
메모리 컴팩션(Memory Compaction)이라는 것이 있어요
이게 무엇이냐면!
프로세스가 종료된 자리에 생겨난 가용공간을 없애기 위해서 적재된 프로세스들을 한쪽으로 몰고 가용 공간들을 다른 한쪽으로 모아서 하나의 큰 가용 공간으로 만드는거에요!
아래 그림을 볼게요~~
위의 그림을 보시면 빈공간 위의 주소에 위치한 프로세스들을 한쪽으로 이동시키는거에요! 그렇게 되면 현재 수행중인 프로세스들은 메모리 한 곳에 따닥따닥 붙어있고 가용 공간들도 또 뭉쳐져서 하나의 큰 가용 공간으로 바뀌게 되겠죠!
하지만 이와같은 방법은 현재 수행중인 프로세스의 메모리상의 위치를 상당 부분 이동시켜야 해서 비용이 매우 많이 드는 작업입니다.
메모리 컴팩션은 해당 용어와 개념 정도 알고 있으면 될 거 같습니다 :)
고생하셨습니다!
이번 포스팅의 주제가 쉬웠을 진 모르겠지만 중요한 개념에 대해서 배웠습니다.
외부 단편화와 내부 단편화, 메모리 컴팩션 그리고 최악, 최적, 최초 적합 등 많이 배워봤네요 ㅎㅎ
이번 시간에 배웠던 연속할당 기법은 다음 포스팅 주제인 불연속할당 기법에 비해 상대적으로 쉬운 주제에요!
그 말은.. 불연속 할당 기법이 더 복잡하다는 거겠죠???
왜냐하면 페이징 기법과 세그먼트라는게 있는데 이건 포스팅하기 정말 까다로운 내용이라 저도 막막하네요... ㅠ
암튼! 다음 포스팅에서 이번 포스팅에서 배웠던 용어들이 언급될 수 있으니 잘 익혀두시고 머릿속에 넣어버립시다!!
감사합니다 :)
'남이 읽는 CS > 운영체제' 카테고리의 다른 글
[운영체제 12편] 페이징 세그먼테이션 (불연속 할당 방식) (5) | 2022.05.27 |
---|---|
[운영체제 10편] 메모리 접근 (3) | 2022.05.08 |
[운영체제 9편] 스케줄링 종류 (5) | 2022.04.13 |
[운영체제 8편] IPC란 무엇인가 (4) | 2022.04.13 |
[운영체제 7편] 인터럽트가 무엇인가 (5) | 2022.04.04 |
댓글