[운영체제] 메모리 관리 전략

김성록·2023년 3월 28일
0

운영체제

목록 보기
12/14

메모리 관리 전략에 대해 설명해보세요.


메모리 관리 전략

Swapping(스와핑)

  • CPU에서 실행중이지 않는 프로세스를 저장장치의 Swap 영역으로 이동시켜 메모리를 확보하는 방식이다. 주기억장치(RAM)으로 불러오는 과정을 Swap in, 보조기억장치로 내보내는 과정을 Swap out이라고 한다.
    메모리 공간을 효율적으로 확보할 수 있다는 장점이 있지만, 잦은 스와핑 발생 시 문맥 교환으로 인해 오버헤드가 발생하고 성능이 떨어지게 된다. 또한 단편화 문제가 발생한다.

    • 단편화
      : 프로세스들이 메모리에 적재되고 제거되는 일이 반복되다보면, 메모리 사이에 사용할 수 없는 빈 공간이 생기게 된다. 단편화에는 2가지 종류가 있다.

      • 외부 단편화
        : 메모리 공간 중 사용하지 못하게 되는 부분이 존재해서 전체 메모리 공간은 충분하지만 실제로 사용할 수 없는 상황을 말한다.

      • 내부 단편화
        : 프로세스가 필요한 메모리보다 더 많은 메모리가 할당되어 메모리가 낭비되는 상황을 말한다.

단편화 해결 방법

  • 단편화를 해결하기 위한 몇 가지 방법이 존재한다.

    • 압축
      : 말 그대로 프로세스가 사용하는 공간을 한 쪽으로 몰아서 공간을 마련하는 방법이다. 외부 단편화 문제를 해결할 수 있지만 비용이 많이 들어 비효율적이다.

    • 페이징(Paging)

      : 페이징이랑 논리주소의 메모리를 고정된 크기의 페이지로 나누고, 물리주소의 메모리를 고정된 크기의 프레임으로 나눠, 페이지를 순서와 관계없이 프레임에 할당하여 메모리를 관리하는 기법이다. 페이지(Page)란 가상 메모리를 일정한 크기로 나눈 블록이고, 프레임(Frame)이란 물리 메모리를 일정한 크기로 나눈 블록이다. 페이지와 프레임의 크기를 같게 함으로써 페이지에 대응되는 프레임을 좀 더 쉽게 찾을 수 있다. 외부 단편화 문제는 해결할 수 있지만, 내부 단편화 문제가 여전히 발생할 수 있다.

      • 페이지 테이블(Page Table)
        : 프로세스가 순서대로 메모리에 저장되지 않기 때문에 프로세스를 실행하기 위해서 어느 페이지가 어느 프레임에 들어있는지 알아야 한다. 이에 대한 정보가 저장되어 있는 곳이 페이지 테이블이다. 이를 사용하여 논리주소를 물리주소로 변환한다. 페이지 테이블의 원소 하나하나를 페이지 테이블 엔트리(Page Table Entry)라고 하는데, 여기에 해당 엔트리가 유효한지 나타내는 유효비트(Valid Bit), 페이지가 참조된 적이 있는지 나타내는 참조비트(Reference Bit), 페이지가 사용된 적이 있는지 나타내는 수정비트(Modify Bit), 페이지의 권한 정보(read, write, execute 등)를 저장하는 보호비트(Protection Bit) 그리고 page frame number가 저장되어 있다.

      • 페이지 폴트(Page Fault)
        : 만약 CPU가 메모리에 적재되어 있지 않은 페이지에 접근을 시도한다면(유효비트가 0) Page Fault가 발생하게 된다. CPU는 기존의 작업 내용을 저장한 후에 원하는 페이지를 메모리에 올리고 유효 비트를 1로 바꿔서 해당 페이지에 접근할 수 있도록 한다.

      • PTBR(Page-Table Base Register)
        : 페이지 테이블은 프로세스마다 존재하며 메인 메모리에 유지된다. 페이지 테이블이 대부분 매우 크기 때문에 이를 구현하기 위해 비용이 비싼 register를 사용하는 것은 적절하지 않기 때문이다. 따라서 페이지 테이블의 위치를 가리키기 위해 사용하는 레지스터가 PTBR이다. 다른 페이지 테이블을 사용하려면 PTBR을 변경시키면 된다.

      • TLB(Translation Look-aside Buffer)

        : TLB는 메모리 주소 변환을 위한 별도의 캐시 메모리로, 페이지 테이블에서 빈번히 참조되는 일부 엔트리를 저장해놓는다. 이는 물리주소에 접근하기 위해 메모리를 두 번(페이지 테이블 접근, 실제 주소 접근) 거쳐야 하는 문제를 해결하기 위해 사용된다.
        CPU에 의해 논리주소가 생성될 때, 그 주소의 페이지 번호가 TLB에게 제시된다. 만약 그 번호가 TLB에 발견된다면(TLB Hit) 해당하는 프레임 번호를 사용하여 메모리에 접근할 수 있다. 하지만 만약 번호가 TLB에 발견되지 않았다면(TLB Miss) 그 페이지 테이블에 대한 메모리 참조가 만들어져야 한다. 그림과 같이 페이지 번호에 대응하는 프레임 번호를 TLB에 저장하여 다음에 해당 페이지를 참조할 때 빠르게 메모리에 접근할 수 있도록 한다.

      • 주소 변환(Address Translation)
        : 여러 개로 흩어진 페이지에 CPU가 접근할 수 있도록 페이지 테이블을 통해 주소를 변환해야 한다. 논리 주소(Logical Address)는 2진수로 표현되고, 페이지 번호(Page Number)와 오프셋(Offset)으로 구성되어 있다. 논리 주소를 물리 주소로 변하기 위해서 페이지 테이블을 사용하여 페이지 번호를 프레임 번호로 바꾸고 오프셋은 그대로 사용한다(페이지와 프레임의 크기가 같으므로).

      • 페이지 테이블의 구조
        : 페이지 테이블의 공간을 효율적으로 사용하기 위한 몇 가지 방법이 있다.
        1) Hierarchy Page Table(계층적 페이지 테이블)
        : 페이지 번호를 여러 단계의 페이지 테이블로 나누어 관리하는 방식이다. 사용하는 Outer page table만 하위의 inner page table을 물리적 메모리에 불연속적으로 할당시켜 연속된 페이지 테이블의 크기를 대폭 감소시킬 수 있다. Outer page table만 커널 메모리에 저장하여 공간을 호율적으로 사용할 수 있다.

        2) Hased Page Table(해시형 페이지 테이블)
        : 해시 테이블을 사용하여 논리 주소를 물리 주소에 mapping하는 방식이다. Page Number의 해시값으로 Hash Table에 접근한 뒤 연결 리스트에서 Page Number와 일치하는 원소를 찾는다.

        3) Inverted Page Table(역 페이지 테이블)
        : 메모리에 하나의 고정 크기 페이지 테이블만 두는 방식이다. 프로세스마다 페이지 테이블을 만들지 않고 모든 프로세스는 하나의 페이지 테이블만 참조한다. 페이지 테이블의 크기가 상당히 줄어들지만, 프로세스간 메모리 공유가 불가능하고 페이지 테이블 참조 오버헤드가 심하다는 단점이 있다.

    • 세그멘테이션(Segmentation)
      : 세그먼트(Segment)는 가상 메모리를 서로 크기가 다른 논리적인 데이터 단위로 분할한 것을 말한다. 세그멘테이션은 프로세스를 물리적 단위인 페이지가 아닌 논리적 단위인 세그먼트로 분할해서 메모리에 적재하는 방식이다. 페이징과 마찬가지로 모든 프로세스는 각 세그먼트의 물리적 주소를 저장해주는 세그먼트 테이블(Segment Table)이 필요하다.
      같은 종류의 데이터를 모았기 때문에 보호 비트가 통일되고, 세그먼트 테이블의 base, limit 값으로 세그먼트끼리의 침범을 막을 수 있다. 또한 base값을 같게 설정하면 물리적 주소의 값이 일치하게 되어 서로 다른 프로세스의 세그먼트끼리 공유가 쉽다. 필요한 만큼 메모리 공간을 할당받으므로 내부 단편화 문제를 해결할 수 있지만, 외부 단편화 문제는 발생할 수 있다.

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

  • 각 프로세스들이 연속적인 메모리 공간을 차지하게 되는 것이다. 각 프로세스를 메모리에 담기 위해 미리 공간을 분할해두는데, 크게 두 가지 방식으로 나뉜다.

    • 고정 분할(Fixed Partition)
      : 물리적 메모리를 정해진 개수만큼 영구적으로 분할하고 각 분할에 하나의 프로세스를 적재하는 방식이다. 이 때, 분할의 크기는 모두 동일하거나 서로 다를 수 있다. 따라서 외부 단편화 문제와 내부 단편화 문제가 발생할 수 있다.

    • 가변 분할(Variable Partition)
      : 메모리에 적재되는 프로그램의 크기에 따라 분할의 크기 및 개수가 동적으로 변하는 방식이다. 프로세스에 맞춰 메모리 공간을 사용하기 때문에 내부 단편화 문제는 발생하지 않지만, 외부 단편화 문제는 여전히 발생할 수 있다.
      프로세스를 메모리 공간 중 어디에 적재해야할지 결정(동적 메모리 할당 문제)하기 위한 세 가지 기술적 방법이 있다.

      • 최초 적합(First-Fit)
        : 가용 공간 중에서 가장 먼저 발견한 공간에 프로세스를 할당한다. 속도가 빨라 시간적인 측면에서 효율적이다.

      • 최적 적합(Best-Fit)
        : 가용 공간 중에서 공간의 크기가 프로세스의 크기와 차이가 가장 적은 공간에 프로세스를 할당한다. 공간적인 측면에서 효율적이다.

      • 최악 적합(Worst-Fit)
        : 가용 공간 중에서 공간의 크기가 프로세스의 크기와 차이가 가장 큰 공간에 프로세스를 할당한다.

  • 연속적으로 할당되어 있으므로 MMU가 매우 간단해진다.

profile
예비 개발자

0개의 댓글