7장 - 메모리관리

CHO·2022년 12월 24일
0

OS(운영체제)

목록 보기
8/18

메모리의 구성과 관리
단일프로그래밍
고정분할에서의 다중프로그래밍
가변분할에서의 다중프로그래밍

7.1 메모리의 구성은? 메모리, 어떻게 구성할거냐

시간에서의 크기, 공간에서의 크기가 있음
메모리 : 공간에서의 크기를 중심으로 볼 것(용량 중심)

메모리 구성에서 정해져야할 것들 : 동시에 메모리에 저장되는 프로세스의 개수 어케 될거냐? (하나씩? 혹은 여러개 동시에 올릴까?)
+메모리 분할을 미리해서 고정적으로 운영할거?(고정분할)
+아님 프로세스 크기, 개수에 따라 변동시킬거야?(가변동적분할)
+메모리 할당할 때 연속적으로 할거? (7장은 연속적인 할당만 다룸)

7.2 메모리의 관리는?

1) 적재기법 : 어떤 프로세스를 언제 메모리에 올릴거냐?
-요구적재 : 실제로 올라가야할 때 올림 (이거 주로 써)
-예상적재 : 추측되는 프로세스를 미리~올려두는 거! (이건 잘 안씀)

2) 배치기법 : 프로세스들을 메모리 어디에 올려줄거냐
3) 교체기법 : 메모리 공간이 부족할 경우, 기존에 적재된 프로세스 제거하고 새로 올릴 프로세스 올리는거에 대한 방법론(9장에서 다룸!)
4)할당기법 : 프로세스에게 할당할 메모리 공간의 양을 결정

7.3 단일프로그래밍

메모리에 하나의 프로세스만 올리겠다는 소리

문제! 적재할 프로그램의 크기가 메모리보다 클 경우?
답) 오버레이(overlay)를 사용함! 프로그램 일부만 적재시켜 실행. 그 다음 나무지 부분 다시 적재시켜 실행시킴
+프로그램 실행 중에 커널영역(운영체제)을 침범하지 못하게 보호기법이 필요 - 경계레지스터에 경계주소를 넣어서 여길 침범시 트랩 중지(프로그램 실행중지)
한계 : 자원낭비 심함(메모리, cpu, 다른 자원), 시스템 성능 떨어짐 -> 다중프로그래밍 필요함

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

메모리를 여러개의 분할로 나눔, 각 분할에는 하나의 프로세스만 수용하도록 한다

분할의 크기보다 작은 프로세스가 올라가야함!
분할 1,2에는 프로그램이 올라가있음! 분할3은 비어있음

경계레지스터를 설정해서 b,c값에 넣어둔다!

문제점은?
1) 메모리단편화(fragmentation)의 문제
-내부단편화 : 분할에서 프로세스가 차지하고 남는 공간이 존재. 여기서 낭비 발생 ㅠ
-외부단편화 : 프로세스가 분할된 메모리 크기보다 큰거임...그래서 적재되지 못해서 생기는 메모리낭비

장단점 : 관리 용이하고 오버헤드 작음, 다중 프로그래밍의 정도가 고정됨, 단편화에 따른 메모리낭비

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

빈 공간을 찾을 때 어떤 노드를 선택할 것인지? 배치기법들 여러개가 있다

최초적합 (first-fit) - 이거 자주 쓴다
: free 리스트의 첫 노드부터 시작. 제일 먼저 발견되고 요구되는 크기보다 더 큰 빈공간을 가진 노드에서 할당해주고 탐색을 마친다. 이때 free에서 해당 노드에 대한 크기 조정과 used에서의 새 노드 추가가 필요하다!!

최적적합(best-fit) - 잘 안씀
: free 리스트를 끝까지 탐색해 요구되는 크기보다 더 크되, 그 차이가 제일 작은 노드를 찾아 할당해주는 방법이다

최악적합(worst-fit) - 잘 안 씀
: free 리스트를 끝까지 탐색해 요구된느 크기보다 더 크게한다. 그 차이가 제일 많이 나는 노들를 찾아 할당해주는 방법이다.

최초적합 : 시간이 지날수록 앞의 작은 노드들(홀)이 드ㅇ장하고 탐색시간이 길게 만드는 현상이 생길 수 있다. 항상 리스트 처음부터 빠져나간다는 사실로 점점 작아지는 노드들이 있다.

이걸 해결하기 위해서는 free 리스트를 순환 구조로 만든다. 그리고 할당 가능한 노드가 선택될 때마다 헤더 포인터에 이 노드 다음으로 옮기게 하는 방법이 있고 이를 next-fit이라고 부른다

노드들 대부분 홀이 되어있을 것이다. 실제로 빈 공간이 많아질거라, 이를 50% 규칙이라고 한다. 실제로 메모리의 1/3이 홀이 되어 사용할 수 없다는 거다!

결국 작은 빈 공가을 합쳐 더 큰 빈공간을 만드는 작업이 필요하다

그걸 언제, 어떠헥 합칠지에 따라 2가지 방법이 있다. (더 큰 메모리공간을 확보하기 위한 발악..!)

1) 인접한 빈 공간의 병합(adjacent coalescing)
: 빈 공간으로 반납될 때 인접한 빈 공간이 있다면 이들을 합쳐 좀 더 큰 빈공간으로 만들어주는 방식이다. 프로세스가 메모리 반납할 때마다 실행된다. 인접한 공간이 비어져있지 않다면 병합하지 않는다.

2) 빈 공간 전부의 통합
: 사용 중인 공간들을 메모리 한쪽 편으로 밀착시키고 흩어져있던 빈 공간들을 전부 합쳐 하나의 큰 빈 공간으로 만든다. 병합과는 달리 사용 중인 공간의 위치 이동이 발생한다. 이걸 메모리에 있는 모든 프로세스들의 주소 재배치를 의미한다.

+) 고정분할도 가변 분할도 아닌 그 절충안 = 버디 메모리관리!!!

버디시스템에서 메모리는 가변분할과 마찬가지로 최초에 큰 빈공간 하나로 시작한다. 2의 승수 크기로 분할되어 할당되며 이때 같은 크기로 분할된 인접공간을 버디라 부른다. 버디시스템은 분할 내 프로세스 차지하고 남는 빈 공간인 내부단편화 발생하지만 고정분할보다 좋아진다. 반납되느 빈 공간은 분할시 젖ㅇ해진 자신의 버디가 빈 공간일 때 병합된다. 크기를 2의 배수로 늘려나간다.

그때그때 나누고 그때그때 데이터를 합친다.

내가 128k짜리고 위, 이래에도 모두 128k 비어있다면? 내가 쪼개진 내 단짝 128k가 있을거임. 걔랑만 깨붙 하는거임.

내 버디가 되는 공간의 메모리 시작주소 : x mod 2^k+1

profile
매일 개념 익히고 적용합니다

0개의 댓글