ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 7. 메모리 관리 기법(2) - 스와핑, 연속 메모리 할당
    전공공부/운영체제 2019. 12. 25. 22:41
    728x90
    반응형

    메모리 관리 기법

    메모리 관리의 목적

    제한된 물리 메모리의 효율적인 사용이 목적 (할당) - 여러개의 프로세스에게 효율적으로 할당 해야 한다.

    효율적인 메모리 참조 (논리 - 물리 주소 변환) - 프로세스가 메모리 주소를 직접적으로 첨조하는 것이 아니라 프로세스의 주소 공간이란 것과 메모리의 주소공간이란 것을 구분하고 있기 때문에 좀 더 빠르게 메모리 주소를 참조할 수 있는 관리 방법도 추가적으로 필요하다.

     

    주요 메모리 관리 기법

    스와핑 (Swapping)

    연속 메모리 할당 (Contiguous memory allocation)

    페이징 (Paging)

    세그멘테이션 (Segmentation)

     

    스와핑 

    부족한 메모리 공간을 좀 더 효율적으로 관리하려는 메모리 관리 기법. CPU에서 시행되지 않는 프로세스 즉 ready상태이거나 waiting상태에 있는 프로세스들 중 일부를 메모리 안에 보관하지 않고 하드디스크 같은 저장장치에 보관한다는 뜻이다.

    하드디스크로 이동시킨다고 해서 원래 프로세스의 상태가 아닌 프로그램의 상태로 다시 되돌아온다는 뜻이 아니라 이 경우에 프로그램은 별도의 파일시스템 영역에 그대로 남아있는 것이고 메모리 상태에 존재하고 있던 프로세스의 이미지 즉 텍스트, 데이터, 힙, 스텍 등으로 구별되어 있는 이러한 상태 그대로를 하드디스크에 저장한다는 것이다. 그래서 다음에 준비 혹은 대기상태인 프로세스가 running상태로 스케줄링이 됐을 때 이 하드디스크에 저장되어 있던 데이터를 새로 적재하는 로딩과정을 거치는 것이 아니라 이 이미지만 그대로 메모리에 대해 복사해 넣기만 하면 스케줄링 되어서 CPU에서 시행될 수 있도록 한다는 것이다. 결국 이 방법은 다음에 다룰 가상메모리 기법의 핵심이 된다. 이와같이 스와핑은 각각의 프로세스에 어떤 스케줄링 상태에 의존해서 동작하게 된다.

     

    스케줄러의 동작에 따라 작동

    이전에는 CPU에서 실행을 하고 있다가 입출력 요청이나 인터럽트를 받게 되면 ready queue 또는 I/O waiting queue 들어가서 상태가 바뀌게 되었다. 이때 스와핑을 고려하게 되면 바로 ready queue 상태로 들어가는 것이 아니라 swap out되면서 하드디스크에 저장하게 된다. 즉 cpu실행이 끝났고 다음번에 다시 실행 상태로 들어올려면 앞에 기다리고 있던 여러개의 프로세스가 실행을 마쳐야 하기 때문에 시간이 오래 걸릴것이라고 예상을 하고 메모리( ready queue)에 저장하는 것이 아니라 저장장치에 저장하는 방식으로 스케줄링을 할 수 있게 되는 원리이다. 

     

    스왑되어 들어오는 주소 - 실행 시간 바인딩 활용

    또한 한번 하드디스크로 빠져나간 이 프로세스는 실제 프로세스의 이미지 그대로 나가긴 했지만 어쨌든 메모리상에 존재하는 데이터가 아니기 때문에 다시 필요에 의해서 메모리상에 올라올때는 주소의 바인딩이 일어나야 하고 바로 이때 앞전에서 다룬 실행시간에 동적으로 주소 바인딩이 일어나야 한다.

     

    스와핑과 문맥교환

    디스패처(dispatcher)의 동작

    Ready queue의 메모리상에 모든 프로세스가 들어있지 않기 때문에  디스패처가 선택한 프로세스가 메모리상에 존재하지 않을 수도 있다. 그렇다면 디스패처는 상태를 바로 바꿔줄 수 있는 것이 아니라 저장장치에 있는 프로세스 이미지를 메모리로 Load하는 swap in 동작을 먼저 해야하고 이때 메모리상에 공간이 부족할 수도 있다. 그렇게 된다면 ready queue 혹은 waiting 상태인 프로세스들 중 하나를 선택해서 swap out 하여 메모리를 비우고 그 자리에 swap in 할 수 있도록 디스패처의 동작이 약간 변형이 돼야 할 것이다.  즉 Ready queue의 다음 프로세스가 메모리에 없다면 swap in, 메모리 공간이 부족하다면 다른 프로세스를 swap out 후 swap in을 하게 된다.

     

    문맥 교환 (Context Switch) 시간 증가

    스와핑은 하드디스크를 활용하여 마치 큰 메모리가 있는 것처럼 메모리를 아주 효율적으로 사용할 수 있는 좋은 메모리 관리기법이라고 할 수 있지만 아주 치명적인 단점이 있다. 바로 문맥 교환 시간이 아주 많이 증가한다는 문제가 있다. 그 이유는 메모리의 동작 속도와 저장 장치의 동작 속도가 매우 큰 차이를 가지고 있다는 것에 기인하게 된다. 예를 들어 100MB 프로세스가 50MB/s 인 HDD에 스왑을 하면 2초가 걸린다고 한다고 했을 때 메모리상에서 같은 양의 데이터를 읽고 쓰고 처리하는 데는 밀리sec 내지는 마이크로sec 정도의 시간이 걸리기 때문에 SSD라고 할지라도 1000 배 내지 10만 배 가까운 속도차이가 발생하게 된다. 따라서 스케줄링을 얘기할 때에 문맥 교환이 오버헤드를 야기하여 프로그램의 실행속도를 늦춘다고 했는데 이 문맥교환에 스와핑동작까지 포함된다면 프로그램의 실행이 너무 느려져서 실용적으로 프로그램을 실제 컴퓨터 시스템에 적용할 수가 없다. 그래서 스와핑을 실제로 구현할 때에는 디스크 내에 별도의 스왑 공간을 사용하거나 (일반 파일 시스템과 분리) 실제로 사용하는 부분만 스왑하도록 최적화가 필요하게 된다.

     

    반응형

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

    각 프로세스가 하나의 연속된 메모리 공간에 포함된다. 각 프로세스가 필요로 하는 메모리 요구량을 미리 분석해서 결정해 놓고 그 프로세스의 메모리를 하나의 덩어리로 설정여 실제 메모리에 할당 해준다는 원리다.

     

    간단한 메모리 할당 방법 중의 하나이다. 여러 개의 프로세스가 있을 때 각각의 프로세스가 요구하는 메모리의 크기가 다를것이다. 그래서 실제로 프로세스를 RAM에 적재할 때 프로세스가 올라간 시작주소만 알고 있다면 프로세스가 사용하는 모든 코드나 함수 또는 변수들의 위치를 우리가 손쉽게 바인딩해서 쓸 수가 있게 된다.

     

    동적 메모리 할당

    어떤 프로세스를 새로 실행했을 때 이 프로세스가 들어갈 수 있는 메모리 영역을 즉 적당한 곳을 찾아내는 방법이며 다음과 같이 세가지 동적 메모리 할당 기법이 있다.

     

    최초 적합 (First - fit)

    요청한 크기를 만족하는 첫 번째 가용 공간을 할당하는 방법.

    검색의 시작점은 알고리즘에 따라 다르며, 검색 속도가 빠르다.

    최적 적합 (Best - fit)

    요청한 크기를 만족하는 가용 공간 중에서 가장 작은 것을 할당

    분할되어 남늠 가용 공간 크기를 최소화 한다.

    최악 적합 (Worst - fit)

    가장 큰 가용 공간을 할당하는 방법

    분할되어 남는 가용 공간이 커서 활용 가능성이 높다.

    검색 속도가 느리고 메모리 이용 효율이 좋지 않다.

     

    단편화 (Fragmentation)

    동적 메모리 할당에서의 가장 큰 문제점은 메모리에 짜투리가 계속 발생한다는 것이다. 그리고 이 짜투리들이 어느정도 크기 이하로 떨어지게 되면 어떤 프로세스에게도 할당되지 않는 메모리의 낭비가 발생하게 되고 이를 단편화라고 한다. 

     

    외부 단편화 (external fragmentation)

    이와 같이 프로세스들의 메모리 영역 내부에서가 아니라 프로세스가 메모리를 할당 받고 해제될 때 그 밖에 있는 메모리에서 사용하지 못하는 단편화라는 뜻에서 외부 단편화라고 한다. 아래 예시의 (e)의 상황을 보자. 새로운 프로세스 P6가 600K라고 한다면 메모리의 총 가용공간이 650K임에도 불구하고 바인딩 할 수 없는 외부 단편화 문제가 생기게 된다. 

     

    내부 단편화 (internal fragmentation)

    그런데 메모리를 할당하는 단위가 정확히 바이트 단위로 할당되는 것이 아니라 기본적인 할당량의 덩어리가 있다라고 하면 예를들어 어떤 메모리를 10MB단위로만 할당할 수 있다고 한다면 105MB짜리 프로세스가 있을 때 이 프로세스에게는 10MB 짜리 11개가 할당되어야 하고 마지막에 있는 10MB짜리 메모리에서는 5MB가 비어있는 것이 된다. 그런데 이것은 다른 프로세스가 사용할 수 있는 메모리 공간이 아니라 내 프로세스가 사용하는 메모리 공간 안에 비어있는것이라 할 수 있고 이를 내부 단편화라 한다.

     

     

    외부 단편화 문제의 해결

    이중에서 특히 외부 단편화 문제는 메모리 공간에 낭비를 초래하는 심각한 문제이기 때문에 간단한 할당방법이었던 연속메모리 할당은 실제 운영체제에는 그대로 적용할 수 없다. 

    메모리 압축

    이 문제를 해결하기 위한 첫번째 방법이 메모리 압축 방법이다. 압축 방법은 하드디스크의 조각 모음 방법과 유사한 방법이라고 할 수 있다. 연속 메모리 할당을 계속 진행하면서 발생한 짜투리 메모리들을 하나로 합쳐 큰 메모리 공간을 만드는 것이다. 하지만 이 압축방법은 쉽게 이룰 수 있는 것이 아니며 압축을 하려면 현재 할당되어 있는 프로세스들의 메모리 위치를 옮겨줘야만 한다. 이러한 작업이 운영체제에서는 꽤 시간이 필요한 작업이기 때문에 이것을 프로세스가 실행되는 중간중간에 동적으로 진행하는것은 효율적이지 않다.

    페이징 (Paging)과 세그멘테이션 (segmentation)

    그래서 이 메모리 압축보다 조금 더 효율적인 방법이 고려되었다. 외부 단편화 문제 원인을 다시 한번 생각해 보면 프로세스들의 이미지를 한 덩어리로 연속적으로 할당하여 한 번에 할당되는 덩어리가 크기 때문에 발생하는 문제라고 할 수 있다. 그래서 한 프로세스의 논리 주소 공간을 여러 개로 분할하여 비연속적인 물리 메모리 공간에 할당하는 페이징과 세그멘테이션 메모리 할당 방법이 생겨났다.

     

    그래서 다음 차시에서 페이징과 세그멘테이션 기법에 대해 다뤄보고자 한다.

    728x90
    반응형

    댓글

Designed by Tistory.