검색결과 리스트
글
메모리를 어떻게 구성할 것이냐의 문제는 어떻게 관리할 것이냐의 문제와 밀접하게 연관이 있다.
메모리 구성과 관련하여 정해져야 할 것들 살펴보자.
1. 다중 프로그래밍의 정도(Multiprogramming Degree)
하나의 사용자 프로그램만이 메모리에 있을 수 있도록 할 것인가? 여러 개의 프로그램이 같이 있도록 할 것인가?
2. 각 프로세스에게 얼마큼의 메모리를 줄 것인가?
3. 메모리 분할을 미리 해 두고 고정적(Fixed or Static)으로 운영할 것인가? 미리 정해두지 않고 프로세스의 크기나 개수에 따라 변동(Variable or Dynamic)시켜 나갈 것인가?
4. 메모리를 할당할 때 연속적으로 할 것인가? 비연속적으로 할 것인가?
<메모리 구성에 따라 효율적인 관리 기법>
1. 적재 기법(Fetch Strategy)
언제 프로세스를 메모리에 적재할 것인가를 다루는 기법
- 요구(Demand) 적재 : 적재의 요구가 있을 때 적재
- 예상(Anticipatory) 적재 : 적재의 요구가 있을 것으로 예상하고 미리 적재
2. 배치 기법(Placement Strategy)
프로세스들을 메모리 공간의 어디에 적재할 것인가를 다루는 것. 고정분할, 가변 분할
3. 교체 기법(Replacement Strategy)
메모리 공간이 부족할 경우 새로 적재돼야 할 프로세스를 위해 이미 메모리에 있는 프로세스 중 어떤 것을 골라 디스크로 내보내고 그 공간을 확보할 것인가에 요구되는 기법
4. 할당 기법(Allocation Strategy) : 프로세스에게 메모리 공간을 얼마 정도로 줄 것인가를 결정하는 것
<단일 프로그래밍>
한번에 하나의 프로세스만이 메모리에 적재되고 실행이 종료되면, 다음 프로세스가 적재되는 시스템
[문제점]
적재할 프로그램의 크기가 메모리보다 클 경우 오버레이(Overlay)를 사용한다.
※ 오버레이란? 프로그램의 일부분만을 먼저 적재하여 실행시킨 다음 나머지 부분들을 다시 적재하여 실행.
프로그램 실행 중 커널 영역을 침범하지 못하도록 하는 보호 기법이 필요 -> 경계 레지스터에 커널과 프로그램의 경계 주소 값을 넣어두고 프로그램이 실행되면서 참조하는 메모리 주소 값이 경계 값을 침범할 경우 트랩으로 싱행을 중지
남는 자원의 낭비가 심해서 시스템 성능 떨어 트린다.
<다중 프로그래밍>
1. 고정 분할에서의 다중 프로그래밍
메모리를 여러 개의 분할로 나누어 놓고, 각 분할에는 하나의 프로세스만을 수용하도록 함으로써 다중 프로그래밍을 구현하는 방식
[장점]
관리가 쉽고 편리함
오버헤드가 작음
[단점]
분할의 크기가 모두 같으면 다양한 상황에 유연하게(Flexible) 대처하지 못함
분할의 크기가 유연함은 복잡도를 동반함
분할된 메모리보다 프로그램이 클 경우 오버레이 방법으로 해결함
2. 가변 분할에서의 다중 프로그래밍
분할의 시기와 개수 그리고 크기가 사전에 정해진 바 없이, 프로세스를 수용할 때 그 크기만큼 메모리 공간을 할당해 줌. 가변 분할의 관리를 위해 메모리에서 사용 중인 공간과 빈 공간들에 대한 정보가 필요하며, 테이블이나 리스트와 같은 자료구조로 표현된다.
단편화는 방지할 수 있지만 관리가 복잡해짐으로 해서 생기는 오버헤드는 감수해야 한다.
예) 사용자 공간이 100Mbyte인 메모리
1. 초기상태
2. A, B, C 적재 후
3. C와 A의 반납 후
4. D와 E의 적재 후
5. B 반납 후
반납되는 빈 공간들은 user에서 빠져 free로 추가되고, 프로세스의 적재를 위해서는 free를 탐색하여 요구되는 크기를 수용할 수 있는 노드를 찾아 그 크기만큼을 할당해준다.
free를 탐색해 적재가 가능한 빈 공간을 찾을 때 어떤 노드를 선택할 것인가가의 기법을 알아보자.
1. 최초적합
free 리스트의 첫 노드부터 시작하여, 제일 먼저 발견되는, 요구되는 크기보다 더 큰 빈 공간을 가지는 노드에서 할당해 주고 탐색한다.
free 리스트에 대한 탐색을 중간에서 끝낼 수 있고, 남은 크기가 어중간해서 사용 못하는 노드가 생길 수 있다.
2. 최적적합(Best-fit)
free 리스트를 끝까지 탐색하여 요구되는 크기보다 더 크되, 그 차이가 제일 작은 노드를 찾아 할당해 주는 방법이다.
가장 들어맞는 노드를 찾음으로써 큰 빈 공간을 가지는 노드들을 그대로 유지시킬 수 있고, 배치 후, 남는 크기가 매우 작을 것이고 이런 빈 공간들은 이 후의 적재에 거의 활용되지 못하는 단점을 가짐(Hole 발생)
3. 최악접합(Worst-fit)
free 리스트를 끝까지 탐색하여 요구되는 크기보다 더 크되, 그 차이가 제일 많이 나는 노드를 찾아 할당해 주는 방법이다.
<병합 기법>
작은 빈 공간을 합쳐 더 큰 빈공간을 만드는 작업구되는데, 언제 어떻게 합칠지에 따라 두가지로 나뉜다.
1. 인접한(Adjacent) 빈 공간의 병합(Coalescing)
- 빈 공간으로 반납될 때 인접한 빈 공간이 있다면 이들을 합쳐 좀 더 큰 빈 공간을 만들어 주는 방식
- 프로세스가 메모리를 반납할 때마다 실행되고, 인접한 공간이 비어 있지 않다면 병합하지 않음
2. 빈 공간 전부의 통합(Compaction)
사용 중인 공간들을 메모리의 한쪽 편으로 밀착시켜 옮기고, 흩어져 있던 빈 공간들을 전부 합쳐 하나의 큰 빈 공간으로 만드는 방법이다.
병합과는 달리 사용 중인 공간의 위치 이동이 발생하며 이것은 메모리에 있는 모든 프로세스들의 주소 재배치를 의미하므로 상당한 시간을 요구된다.
통합이 진행되는 동안은 모든 프로세스들의 실행이 중지
<버디(Buddy) 메모리 관리>
메모리의 관리 역시 고정 분할과 가변 분할을 타협한 절충안이다. 가변 분할과 마찬가지로 최초에 큰 빈 공간 하나로 시작한다.
프로세스의 적재 요구가 있을 때 메모리는 요구한 크기보다 크되, 차이가 가장 작게 나는 2의 승수(Power) 크기로 분할되어 할당되며, 이때 같은 크기로 분할된 인접 공간을 버디(짝)라고 한다.
ex) 사용자 공간이 1MByte라고 할 때,
a b c d e f
a. 초기상태이다.
b. 프로세스 A의 100K를 수용하기 위해 2의 승수값이면서 가장 차이가 적게 나는 128K의 분할을 만든 후 수용한 결과이다. A가 수용된 공간의 버디는 같은 크기의 바로 아래 128K의 공간이다. A가 수용되고 남은 28K의 공간과 같은 것이 내부 단편화이다.
c. B, C ,D가 차례대로 적재된 후의 결과이다.
D가 수용되어 256K 공간과 같은 크기면서 인접한 것으로는 B가 수용되어 있는 공간과 아래의 빈 공간이 있지만, D의 버디는 아래쪽 빈 공간이다.(나눠진 것)
d. B의 반납은 버디가 사용 중이므로 병합이 일어나지 않는다.
e. A의 메모리 반납 후, 128K가 되며 다시 E를 적재하고, C를 반납한 결과이다.
f. E의 메모리 반납 후, 512K가 된다(버디이기 때문에)
Copyrightⓒ2014 By 휴먼사이언스
'OS > Theory' 카테고리의 다른 글
페이징(Paging) (0) | 2016.04.17 |
---|---|
가상 메모리(Virtual Memory) (0) | 2016.04.17 |
교착상태 해결방법 (0) | 2016.04.15 |
상호배제를 위한 하드웨어 기법들(인터럽트 금지, 하드웨어 명령어, 세마포어) (0) | 2016.04.15 |
교착상태와 프로세스 (0) | 2016.04.14 |
RECENT COMMENT