ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 메모리 관리(Memory Management)
    Computer Engineering/운영체제 2019. 8. 18. 00:42

    안녕하세요 dely입니다:)

    오늘은 메모리 관리(Memory Management)에 대해 정리해보겠습니다.

     

    기존에 디스크에 있던 이진 형태의 파일들이

    논리메모리(logical memory)에 있다가 물리메모리(physical memory)로 이동 할 때(즉, 디스크 파일->프로세스가 될 때)

    주소 변환을 해야하는데 그 주소 변환은 하드웨어가 해주게 됩니다.

    (주소 변환은 논리적인 주소를 물리적인 주소로 맵핑하는 것으로 다음 포스팅인 가상 메모리에 정리할 예정입니다.)

     

    메모리에 프로세스를 올릴 시점, 즉 주소 변환의 시점에 따라

    Compile time인지, Load time인지, run time인지에 따라 각자 다른 특징들을 갖게 됩니다.

     

    1. 주소의 할당(Address Binding)

      1) 컴파일 시간(compile time) :논리적인 주소를 compile time에 binding을 하기 때문에 항상 물리적인 위치 0번지에 올라가게 됩니다.

         0번지는 현대적인 운영체제에서는 OS가 올라가게 되는 위치로, 매우 비효율적인 방법입니다.

         이 때 만들어진 코드를 절대적인 코드(absolute code)라고도 합니다.

     

      2) 적재 시간(load time) : 실행 시 논리적인 주소가 물리적인 주소로 변환됩니다. 그리고 그 이후에는 변환되지 않습니다.

          물리적인 주소에서 논리적인 주소 변환 시에 주소 위치가 변경되기 때문에 재배치가능코드(relocatable code)라고도 합니다.

     

      3) 실행 시간(execution time)실행 시 논리적인 주소가 물리적인 주소로 변환됩니다. 그리고 그 이후에도 메모리 위치가 이동될 수

          있습니다. 그렇기 때문에 CPU가 주소를 참조할 때마다 binding을 점검해야합니다.

          이를 위한 하드웨어 지원으로 MMU(Memory Management Unit)가 있습니다.

     

    2. MMU(Memory Management Unit)

    위에서 언급한 MMU는 CPU가 요청하는 논리적인 주소를 가지고 해당 물리적인 주소에 접근하기 위한

    일종의 변환기라고 할 수 있습니다.

    이 MMU에서는 논리적인 주소에서 물리적인 주소로 변환하기 위한 relocation register와

    논리적인 주소의 범위 limit register 두가지를 갖게 됩니다.

     

    3. 동적 적재(Dynamic Loading)

    프로세스가 메모리에 올라갈 때 프로그램 전체가 올라가는 것이 아니라

    부분적으로 해당 루틴이 불려질 때 올라가는 것을 말합니다.

    사용되지 않은 루틴들은 미리 적재되지 않기 때문에 메모리 이용성이 높아지게 됩니다.

    예전에는 Overlay로 프로그래머가 직접 수작업으로 메모리에 올려서 이용했다고 합니다.

     

    4. 스와핑(Swapping)

    프로세스를 일시적으로 메모리에서 backing store로 쫒아내는 것을 말합니다.

    예를들어 라운드로빈 스케쥴링처럼 다중 프로그램 환경에서 CPU 할당 시간이 끝나면

    프로세스를 스와핑 시킬 수 있습니다.

     

    스와핑에서는 backing store에 있던 프로세스를 다시 메모리에 올릴 때

    항상 같은 주소에 올려야하는 Load time binding 보다

    동적으로 적합한 주소를 사용하는 execution time binding이 더 적합합니다.

     

    5. 동적 연결 및 공유 라이브러리(Dynamic Linking & Shared Library)

      1) 동적 연결(Dynamic Linking)

        : 동적 연결은 동적 적재의 개념과 유사합니다. 동적 적재에서는 로딩을 실행시기까지 미루는 것이었지만,

          동적 연결에서는 연결을 실행시기까지 미루는 것입니다.

          이는 또 두 가지로 나뉘게 되는데, Static linking과 Dynamic linking입니다.

     

          (1) Static linking

              라이브러리가 프로그램 실행파일 코드에 포함되어 있는 것을 말합니다.

              동일한 라이브러리를 반복해서 올리기 때문에 메모리 낭비가 생깁니다.

              Static linking을 하는 라이브러리는 Static Library입니다.

     

          (2) Dynamic linking

               라이브러리가 프로그램 실행파일 코드 밖에 있어서 실행 시 연결되는 것을 말합니다.

               라이브러리 호출 부분에 단지 연결을 위한 호출 위치가 담긴 스텁(stub)을 두고, 라이브러리가 메모리에 있다면 바로 접근하고

               없다면 디스크에서 가져오게 됩니다.

               Dynamic linking을 하는 라이브러리는 Shared Library라고 합니다.(ex, Linux: .so / windows: .dll)

              

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

    메모리에서 OS 영역이 아닌 사용자 프로세스 영역을 관리하기 위한 방법에 대한 내용입니다.

    프로그램이 쪼개어지지 않고 통째로 메모리에 올라가게 되는 것입니다.

     

      1) 고정 분할 방식(Fixed partition)

         미리 파티션을 나누어서 프로세스를 실행시키는 것입니다.

         만약 파티션의 크기보다 프로세스의 크기가 크다면 들어갈 수 없어 외부 조각으로 남게 되고,

         파티션의 크기보다 프로세스의 크기가 작다면 들어갈 수는 있지만 그 안에 공간이 남게 되어 내부 조각으로 남게 됩니다.

     

      2) 가변 분할 방식(Variable partition)

         프로세스를 그대로 메모리에 올려서 실행시키는 것입니다.

         파티션을 쪼개두지 않았기 때문에 낭비되는 공간 없이 실행되어 내부 조각이 없게 됩니다.

         그러나 여러 프로세스가 실행 중에 가운데에 있던 프로세스 실행이 종료된다면

         가운데는 공간이 비어있게 되는데 그에 맞는 크기의 프로세스가 없다면 외부 조각으로 남게 됩니다.

     

      3) 동적 메모리 할당 문제(Dynamic Storage allocation problem)

         위의 연속 메모리 할당에서 가변 분할 방식을 하다보면 비어있는 메모리 공간이 생기게 됩니다.

         이를 Hole이라고 하는데, 여러 개의 Hole 중에서 어떤 공간을 할당할 것인지에 대한 방법들입니다.

     

          1) 최초 적합(First-fit) : 첫번째 사용 가능한 가용 공간을 할당합니다. 

          2) 최적 적합(Best-fit) : 사용 가능한 공간들 중에서 가장 작은 것을 할당합니다.

             전체 리스트를 검색해야 하고, 아주 작은 Hole들이 생성되게 됩니다.

          3) 최악 적합(Worst-fit) : 가장 큰 가용 공간을 할당합니다. 이 역시도 전체 리스트를 검색해야 합니다.

             First-fit과 Best-fit이 Worst-fit보다 속도와 공간이용률 측면에서 효과적입니다.

     

          계속해서 작은 가용 공간들이 생길 때 메모리 낭비가 생기게 되는데, 이를 해결하는 방법으로

          압축(compaction)이 있습니다.

          외부 조각들을 모두 모아서 큰 Hole을 만들게 됩니다.

          매우 비용이 많이 들게 되므로, 최소한의 메모리 이동으로 압축하게 됩니다.

          또한 프로그램의 메모리 주소가 동적으로 바껴야 하기 때문에 runtime binding에서만 가능합니다.

     

    7. 불연속 메모리 할당

    불연속 할당은 프로세스가 조각으로 잘라져서 메모리에 올려지게 됩니다.

    따라서 조각으로 잘라진 각 프로세스가 메모리 어디에 위치해 있는지 알려주는 역할을 하는 MMU(페이지 테이블)이 필요하게 됩니다.

       1) 페이징(Paging)

           (1) 기본 페이징 기법

                물리 메모리는 프레임이라고 하는 같은 크기로 잘라져 있고,

                논리 메모리는 페이지라고 하는 같은 크기의 블록으로 나누어집니다. (프레임, 페이지 둘 다 같은 크기)

                따라서 외부 조각이 생기지 않습니다.

                그러나 항상 메모리의 크기가 프레임 크기의 배수가 아니기 때문에 내부조각은 생기게 됩니다.

     

                페이징에서는 위에서 언급했듯 페이지 테이블이 필요하게 됩니다.

                그런데 만약 페이지의 수가 많아지게 된다면 페이지 테이블 엔트리가 많아져 큰 공간이 필요합니다.

                이런 상황을 위해 페이지 테이블은 메인 메모리에 들어갑니다.

                또한 PTBR(Page Table Base Register)과 PTLR(Page Table Length Register)을 두어 시작점과 테이블 크기를 갖고 있습니다.

     

                페이징 테이블이 메인 메모리에 들어가면 속도가 느려지게 되는데,

               (페이징 테이블접근, 실행을 위한 메모리 접근으로 일이 두 배가 됨)

                이를 해결하기 위해 translation look-aside buffer(TLB)(=associative register) 캐시를 사용합니다.

     

             (2) 2단계 페이지 테이블 기법

                 기존 페이지 테이블은 메모리 조각이 많아질 수록 공간낭비가 심해지는데 이를 해결하기 위한 기법입니다.

                 주소 변환을 위한 페이지 테이블 접근을 할 때 2번 테이블을 접근해서 찾게 되는데,

                 시간적으로는 효율적이지 못하지만 공간적으로는 효율적입니다.

     

             (3) 역 페이지 테이블(Inverted Page Table)

                  물리 메모리에서 프레임을 사용하여 논리 메모리에서 바로 알 수 있도록 만든 것입니다.

                  페이지 테이블에서 어디에 있는지 모두 찾아봐야하는 오버헤드가 생기게 됩니다.

     

             (4) 공유 페이지(Shared Pages)

                  프로세스가 다르지만 동일한 코드가 있을 때 메모리에 하나를 올리고 공유를 하는 기법입니다.

                  read-only이고 동일한 논리주소를 갖고 있어야 합니다.

     

       2) 세그먼테이션(Segmentation)

          코드, 데이타, 스택과 같은 의미 단위로 잘라서 물리 메모리에 올리게 됩니다.

          공유나 보안과 같은 일들에서는 세그먼테이션이 유리합니다.

          여기서도 Hole이 너무 작아지기 때문에 외부 조각이 발생할 수 있습니다.

          세그먼테이션은 동적 재배치 알고리즘이라 필요시 공간을 압축시킬 수 있습니다.

     

       3) 페이지 세그먼테이션(Segmentation with Paging)

         세그먼트가 여러개의 페이지로 구성되어 세그먼트가 페이지 길이의 배수가 됩니다.

         그래서 페이지 단위로 물리 메모리에 올라가게 됩니다.

    반응형

    댓글

Designed by Tistory.