본문 바로가기
컴퓨터공학/운영체제

메모리 관리 전략(1)

by Daniel.kwak 2018. 10. 27.

목표

1.메모리 관리 전략의 배경에 대해 알아본다.

2.스와핑에 대해 이해한다.

3.연속 메모리 할당 기법에 대해 이해한다.

4.내부 단편화와 외부 단편화에 대해서 이해한다.




메모리 관리 전략

그동안 CPU가 여러 프로세스에 의해 어떻게 공유되고 스케쥴링 알고리즘이 어떻게 동작하는지 살펴보았다. 그러나 성능을 향상시키기 위해서는 주 메모리에 여러개의 프로세스가 올라와 있어야 한다. 즉, 여러 프로세스들이 동시에 주 메모리를 공유해야 하는 상황이다. 메모리 관리 알고리즘은 단순 하드웨어 방식, 페이징, 세그먼트 등 다양하며 장, 단점이 있다. 

메모리 관리 전략의 배경에 대해서는 여러가지가 있지만 논리 대 물리주소 공간은 짚고 넘어가자.


논리 대 물리주소 공간

CPU가 생성하는 주소를 논리 주소, 메모리가 취급하는 주소를 물리 주소라 한다.  프로그램 실행 중에는 이와 같은 가상 주소를 물리 주소로 바꿔줘야 하는데, 이 매핑 작업은 메모리 관리기(Memory Management Unit)에서 실행된다.



앞으로 다룰 기법들은 이러한 매핑 작업에 대해서 알아보는 것이다. 



Swapping(스와핑)

프로세스가 실행되기 위해서는 메모리에 있어야 하지만, 프로세스는 실행 중에 임시로 예비저장장치(backup store)에 내보내여 졌다가 실행을 계속하기 위해 다시 메모리로 돌아올 수 있다. 보통 예비저장장치는 속도가 빠른 디스크를 사용한다. 저장장치의 크기는 모든 사용자 메모리 이미지를 저장할 수 있을정도로 커야하며, 메모리 이미지에 대한 직접 접근이 가능하다. 스와핑의 대략적인 순서를 살펴보자.




1.시스템은 실행 준비가 끝난 프로세스들을 준비완료 큐에 대기시킨다.

2.CPU스케쥴러는 다음 프로세스를 고를 때 Dispatcher(디스패처)를 호출한다.

3.Dispatcher는 이 큐에 있는 다음 프로세스가 메모리에 적재되어있는지 확인하고, 만약 올라와 있지 않다면 디스크에서 불러들여야 한다. 

4.만약 프로세스를 불러들이기 위한 공간이 메모리에 부족하다면 현재 메모리에 적재된 프로세스들을 내보내고(swap out) 원하는 프로세스를 불러들인다(swap in)

5,그 후 CPU의 모든 레지스터를 실행해야 할 프로레스의 것으로 다시 적재 후 제어를 프로세스에게 넘긴다. 


보다시피, 상당한 Context-switching time이 발생한다. 또한 스와핑을 위해서는 현재 메모리의 프로세스가 완전히 휴지상태(idle)임을 확인해야 한다. 입출력 장치에 관한 작업을 진행중이라면 스와핑을 해서는 안될 것이다. 

 현대 운영체제들은 이러한 비효율성으로 기본 스와핑은 사용하지 않지만, 변형하여 사용하기도 한다. 평상시에는 작동하지 않다가, 자유 메모리가 임계량 보다 부족하게 될 경우 작동을 시작하는 경우도 있다. 혹은 프로세스 전체를 스와핑 하지 않고, 일부만 스와핑 하여 Context-switching time을 줄일 수도 있다. 




연속 메모리 할당(Contigous Memory Allocation)

대개의 경우 여러 프로세스가 동시에 메모리에 올라와 있는것이 바람직하기 때문에 메모리에 올라오고자 input queue에서 기다리는 중인 프로세스들에게 메모리를 얼마큼씩 할당하는것이 좋은지를 고려할 필요가 있다. 연속 메모리 할당 시스템에서는 각 프로세스는 다음 프로세스를 포함하는 영역과 연속된 하나의 영역을 차지하게 된다.


메모리 보호

메모리 보호에 대해 잠깐 짚고 넘어가자. 프로세스가 자신이 소유하지 않는 메모리를 접근 할 수 없게 만들수는 없을까? 재배치 레지스터는 가장 작은 물리 주소의 값을 저장하고, 상한 레지스터는 논리 주소의 범위 값을 저장한다. 따라서 각 논리 주소는 상한 레지스터가 지정한 범위 내애서만 존재할 수 있다. MMU는 동적으로 논리 주소에 재배치 레지스터(물리 주소)의 값을 더하여 주소를 변환하는데, 이렇게 변환된 주소가 메모리로 보내진다. 



CPU 스케쥴러가 다음 프로세스를 선택할 때 디스패처는 문맥 교환의 일환으로 재배치 레지스터와 상한 레지스터에 정확한 값을 적재한다. CPU에서 생성되는 모든 주소들은 이러한 루틴을 거쳐 확인 작업을 거치기 때문에, 운영체제와 다른 사용자 프로세스를 현재 수행중인 사용자 프로세스의 접근으로부터 보호할 수 있게 된다. 재배치 레지스터는 향후 운영체제가 안쓰는 장치가 생긴다면, 해당 장치와 관련된 코드를 삭제하여 운영체제의 크기를 유연하게 관리할 수도 있다.


메모리 할당

가변 분할 기법에서 OS는 메모리의 어떤 부분이 사용되고, 사용되지 않는가를 파악하는 테이블을 유지한다. 초기의 경우엔 모든 메모리 공간은 한 개의 큰 사용 가능한 블럭(hole)으로 간주된다. 순서를 살펴보자.

1.프로세스가 시스템에 들어와서 입력 큐에 넣는다.

2.OS는 각 프로세스가 메모리 요구량과 사용 가능한 메모리 공간이 어디에, 얼마나 있는지를 고려하여 메모리 공간을 할당한다.

3.프로세스가 메모리를 할당 받게 되면, 이후에는 CPU를 할당 받기 위해 경쟁한다. 

4.프로세스가 작업을 끝내면 메모리를 반납하고 OS는 입력큐의 다른 프로세스로 이 공간을 채운다. 


 OS는 항상 놀고있는 공간의 크기들과 입력 큐를 유지해야 한다. 일반적으로는, 메모리에는 다양한 크기의 자유 공간이 여기저기 산재하게 된다. 프로세스가 공간을 필요로 할 때 OS에서는 이 자유 공간들의 집합에서 적절한 공간을 찾아야 하는 것이다. 만약 찾은 자유 공간이 요청한 공간보다 약간 크면 두 개로 나누어 한 조각은 프로세스에게 할당하고, 남은 조각은 자유 공간으로 다시 소속시킨다. 프로세스가 작업이 끝나면 되돌아온 공간이 자유 공간 블럭과 인접해있다면 합쳐서 하나의 자유 공간 블럭으로 만들 수도 있다. -> 일련의 자유 공간들-리스트로부터 크기 n-바이트 블록을 요구하는 것을 어떻게 만족시켜 줄 것이냐를 결정하는 문제이다. 


-First-fit(최초 적합):첫 번째 사용 가능한 가용 공간을 할당한다. 검색 시작은 처음부터 하거나, 마지막 탐색 위치에서 할 수도 있다.

-Best-fit(최적 적합):사용 가능한 공간들 중에서 가장 작은 것을 택한다. 다만 리스트가 정렬되어 있지 않으면 가장 작은 리스트를 찾아야 한다. 

-Worst-fit(최악 적합):가장 큰 가용 공간을 택한다. 할당해주고 남는 자유 공간이 충분히 커서 다른 프로세스가 유용하게 사용할 수도 있다. 크기순으로 정렬되어 있지 않으면 가장 큰 공간을 찾아야 한다.


실험 결과, 최적과 최초 적합이 항상 최악 적합보다 메모리 이용 효율 측면에서 낫다는 것이 입증되었다. 일반적으로는 최초 적합이 속도 면에서는 빠르다. 




Fragmentation(단편화)

외부 단편화

그러나 앞에서 기술한 알고리즘은 External fragmentaion(외부 단편화)를 발생한다. '단편화'란 공간 중 일부가 사용 못하게 되는 부분을 말한다. 

프로세스들이 메모리에 적재되고 반환되는 일이 반복되면, 어떤 자유 공간은 너무 작은 조각들이 되어버리고 외부 단편화는 이러한 작은 공간들을 합치면 의미있는 공간이 되지만 현재는 너무 작은 조각들로 여러곳에 분산될 때 발생한다. 즉, 메모리가 너무 많은 수의 매우 작은 조각들로 단편화 되어 있는 것이다.

최초 또는 최적 적합 전략 중 어떤것을 사용할 것인지, 어느 쪽 빈 공간을 할당할 것인지에 대한 요소들은 단편화의 크기에 영향을 미친다. 


내부 단편화

예를 들어 18,464B 크기의 자유 공간이 있을때, 한 프로세스가 18,462B의 크기를 요구한다고 가정해보자. 자유공간은 고작 2B가 남는데 이 공간을 놓치지 않기 위해 더 큰 비용이 발생할 후 있다. 따라서 보통 메모리를 먼저 아주 작은 공간들로 분할하고, 프로세스가 요청하면 분할된 크기의 정수 배수만큼 할당해준다. 이 때 할당된 공간은 요구된 공간보다 약간 over할 수 있다. 이들 두 크기 사이의 남는 부분이 내부 단편화이고, 역시 사용이 못되는 부분이다.


외부 단편화 문제를 해결하는 방법으로 압축(Compaction)이 있을 수 있다. 메모리 모든 내용들을 한 군데로 몰고, 모든 자유 공간들을 다른 한 군데로 몰아서 큰 블록을 만드는 것이다. 그러나 압축은 프로세스들의 재배치가 실행 시간에 동적으로 이루어지는 경우에만 가능하다. 또한 비용도 꽤 소모된다. 

세그멘테이션과 페이징 기법이 외부 단편화의 또 다른 해결책이다.




참고

Operating System:Concepts 9th Edition

'컴퓨터공학 > 운영체제' 카테고리의 다른 글

메모리 관리 전략(2)  (0) 2018.10.28
프로세스 동기화(뮤텍스,세마포어,임계구역)  (0) 2018.10.26
DeadLock(교착상태)  (0) 2018.10.25
CPU 스케쥴링 알고리즘  (0) 2018.10.24
프로세스와 쓰레드의 차이점  (0) 2018.10.24
쓰레드  (0) 2018.10.24