초보 개발자의 성장기

컴퓨터 구조 파헤치기 ... (가상 메모리, 메모리 분할, 메모리 관리, 페이지 교체,) 본문

BackEnd 지식

컴퓨터 구조 파헤치기 ... (가상 메모리, 메모리 분할, 메모리 관리, 페이지 교체,)

개발자 김케빈 2023. 10. 13. 15:52
절대 주소 지정 & 상대 주소 지정

절대 주소 지정은 데이터가 위치한 메모리의 실제 주소를 활용하는 방식 입니다.

  • 장점
    1. 주소가 명확하고 간단합니다.
    2. 프로그램의 실행 속도가 빠릅니다.
    3. 주소 변환 과정이 필요 없습니다.
  • 단점
    1. 프로그램의 크기가 변경되면 다시 컴파일 해야 합니다.
    2. 메모리 공간의 낭비가 발생할 수 있습니다.
    3. 데이터가 다른 메모리로 이동하거나 프로그램이 다른 컴퓨터로 이동하게 되면 주소가 달라지는 문제가 있습니다.

상대 주소 지정은 메모리가 지정한 메모리의 상대적인 위치를 활용하는 방식 입니다.

  • 장점
    1. 프로그램의 크기가 변경되어도 컴파일할 필요가 없습니다.
    2. 메모리 공간의 활용도가 높습니다.
    3. 데이터가 다른 메모리로 이동하거나 프로그램이 다른 컴퓨터로 이동하게 되도 주소가 자동으로 조정됩니다.
  • 단점
    1. 주소가 명확하지 않고 복잡합니다.
    2. 프로그램의 실행 속도가 절대 주소 지정보다 느리고, 주소 변환 과정이 필요합니다.

메모리 분할

메모리 분할이란 컴퓨터의 물리적 혹은 가상 메모리를 목적에 따라 분할하는 것을 말합니다.

분할 방법으로는 고정 분할, 가변 분할이 있습니다.

  • 고정 분할 : 메모리의 크기를 일정 단위로 분할하여 고정시키는 방법
    • 장점
      • 관리가 쉬움
    • 단점
      • 메모리의 낭비가 많음
  • 가변 분할 : 프로그램이 필요한 만큼 메모리를 분할하여 사용하게 하는 방법
    • 장점
      • 지속적으로 관리가 필요함
    • 단점
      • 메모리를 효율적으로 사용 가능

메모리 배치 기법

메모리 배치 기법이란 새로 적재해야할 데이터를 주 기억 장치 중 어느 위치에 배치할 것인지를 결정하는 기법입니다.

대표적으로 3가지 종류가 있습니다.

  • 최초 적합
    • 가용 공간 중 수용 가능한 첫 번째 기억 공간을 선택하는 기법
    • 장점
      • 가용 공간 정렬할 필요가 없음
    • 단점
      • 큰 공간을 쪼개어 사용할 수 도 있음
  • 최적 적합
    • 모든 공간 중 수용 가능한 가장 작은 곳을 선택하는 기법
    • 장점
      • 큰 공간을 쪼개어 쓰는 일이 적음
    • 단점
      • 정렬이 필요하고, 작은 틈새 공간이 많이 발생
  • 최악 적합
    • 모든 공간 중 수용 가능한 가장 큰 곳을 선택하는 기법
    • 장점
      • 남은 공간이 큼. 1순위에 할당하므로 선택이 빠름
    • 단점
      • 기억 공간 정렬 필요, 공간 낭비가 큼
  • 3가지 기법 성능 비교
    • 공간효율성: 최적적합 > 최초적합 ≫ 최악적합
    • 시간효율성: 최초적합 > 최적적합 ≒ 최악적합

메모리 단편화

메모리 단편화란 메모리의 공간이 작은 조각으로 나뉘어져 사용 가능한 메모리가 있지만 할당이 불가능한 상태를 의미합니다.

메모리 단편화는 2가지 개념이 있습니다.

  • 외부 단편화 : 메모리가 할당 및 해제 작업의 반복으로 생긴 작은 메모리가 사용하지 않는 메모리가 되어
    총 메모리 공간은 충분하지만 실제로 할당할 수 없는 현상을 말합니다.
  • 내부 단편화 : 메모리를 할당할 때 프로세스가 필요한 양보다 더 큰 메모리가 할당되어서
    프로세스에서 사용하는 메모리 공간이 낭비되는 현상을 말합니다.

단편화 해결 방법으로는 통합 (colascing), 압축 (compasction)이 있습니다.

  • 통합 : 주 기억 장치 내에 인접해 있는 단편화된 공간을 하나의 공간으로 통합하는 방법입니다.
  • 압축 : 주 기억 장치 내에서 분산되어 있는 단편화된 빈 공간을 결합하여 하나의 공간으로 통합하는 방법입니다.

메모리 관리 기법

메모리 관리 기법은 정말 다양한 기법이 존재합니다.

이번 글에서는 대표적인 몇 가지 기법에 대해 소개해 드리려고 합니다.

  • 페이징 (Paging)
    페이징은 프로세스가 사용하는 메모리를 같은 크기로 잘라 비연속적으로 실제 메모리에 할당하는 기법입니다.
    페이징은 물리 주소 관리 기법으로 외부 단편화 문제를 해결하기 위해 사용합니다.
    페이징 방식으로 메모리를 할당하게 되면 실제 프로세스가 실행될 때는
    각각의 페이지들이 실제 메모리의 어디에 위치하고 있는지를 빠르게 알 수 있어야 합니다.
    그래서, 프로세스가 바라보는 메모리의 주소 공간과 실제 메모리의 주소 공간을 논리 주소와 물리 주소라는 것으로 구분을 하고
    그들 사이의 변환을 통해서 메모리 참조를 효율적으로 하고자 하는 참조 기법까지도 포함하고 있습니다.

  • 세그멘테이션 (Segmentation)
    세그멘테이션은 메모리를 작은 단위 쪼갠 뒤 프로세스 크기에 맞게 메모리르 할당하는 기법입니다.
    페이징과의 차이점은 프로그램의 논리적인 단위에 따라 프로세스의 메모리 공간을 구분한다는 점입니다.

  • 스와핑 (Swapping)
    Swapping은 필요한 주소 공간 전체를 메모리에 올려 두는 것이 아니라 그때그때 필요한 것들만 메모리에 올리고,
    필요 없어지면 하드디스크로 내보내는 과정을 의미합니다.
    즉, 메모리에 있는 데이터를 디스크에 있는 데이터와 바꾸는 작업으로 말할 수 있습니다.

스와핑 (Swapping)

위에서 설명한 스와핑에 대해 조금 더 자세히 알아보겠습니다.

먼저 스와핑이 어떻게 실행되는지 과정을 살펴보겠습니다.

  1. 메모리 부족 상황: 실행 중인 여러 프로세스나 프로그램이 메모리를 필요로 하는데,
    물리적 메모리(RAM)에 충분한 공간이 없는 경우 메모리 부족 상황이 발생합니다.

  2. 페이지 교체 정책 선택: 운영 체제는 어떤 페이지(메모리의 고정된 크기 단위)를 디스크로 스왑할지 결정하기 위해 페이지 교체 정책을 선택합니다. 일반적으로 사용되는 교체 정책에는 LRU(Least Recently Used), FIFO(First-In-First-Out),
    LFU(Least Frequently Used) 등이 있습니다.

  3. 페이지 선택 및 디스크로 스왑: 선택된 페이지나 프로세스를 디스크로 스왑합니다.
    이는 해당 페이지의 데이터를 디스크의 스왑 파일 또는 페이징 파일에 저장하고 해당 메모리 공간을 해제하는 것을 의미합니다.

  4. 물리적 메모리 확보: 스왑된 페이지의 공간을 물리적 메모리에 확보합니다.
    새로운 페이지나 프로세스를 메모리로 로드하여 실행할 수 있도록 합니다.

  5. 프로세스 계속 실행: 다른 프로세스나 페이지를 처리하고 나중에 필요한 경우 스왑된 페이지를 다시 불러와
    메모리로 로드하여 실행을 계속합니다.

  6. 주기적인 스와핑: 스와핑은 메모리 부족 상황이 계속 발생할 때 주기적으로 수행됩니다.
    이 과정은 필요할 때 자동으로 운영 체제에 의해 수행됩니다.

그렇다면 스와핑을 사용했을 때 장점과 단점은 어떤 것이 있을까요?

  • 장점
    • 디스크의 공간을 활용하여 메모리의 한계를 극복할 수 있습니다. 이를 통해, 더 많은 프로세스나 데이터를 다룰 수 있습니다.
    • 우선순위가 낮은 프로세스가 메모리를 점유하는 것을 방지하고, 높은 우선순위 프로세스가 메모리에 접근할 수 있도록 합니다.
    • 현재 실행 중인 프로세스나 데이터가 아닌 것은 디스크로 이동하므로 물리적 메모리의 공간을 효율적으로 활용할 수 있습니다.
  • 단점
    • 디스크 I/O 작업을 많이 발생시켜, 시스템에 성능을 저하시킬 수 있습니다.
    • 스와핑 중 디스크에서 데이터를 읽거나 쓰는 동안 해당 데이터에 엑세스가 불가능합니다.
    • 메모리 관리가 복잡해져 디스크 관리가 필요하고, 데이터 손실이나 오류가 발생할 수도 있습니다.

페이지 교체 정책

페이지 교체란 메모리를 관리하는 운영체제에서 페이지 부재가 발생하여 새로운 페이지를 할당하기 위해
현재 할당된 페이지 중 어느 것과 교체할지를 결정하는 방법입니다.

페이지 부재(Page Fault)는 실행중인 프로그램이 가상 메모리에 맵핑되었지만 실제 물리적 메모리에 로드되지 않은 메모리 페이지에 접근할 때 오류가 발생합니다. 물리적 메모리는 가상 메모리보다 작기 때문에 이러한 오류가 발생할 가능성이 높습니다.
이때 기존 페이지를 희생(Victim Page)하여 새로운 페이지를 교체하는 것이 페이지 교체 알고리즘입니다.

운영체제 특징에 맞게 정말 다양한 페이지 교체 알고리즘이 사용되고 있습니다.

그 중 대표적인 페이지 교체 알고리즘은 FIFO, LFU, LRU 등이 있습니다.

  • FIFO
    FIFO 페이지 교체 알고리즘은 가장 먼저 들어온 페이지를 교체하는 알고리즘입니다. 들어온 시간을 저장하거나 들어온 순서를 큐를 이용해 저장할 수 있습니다.
    •  장점
      • 구현이 간단함
    •  단점
      • 성능이 좋지 않음
      • Belady’s Anomaly 현상이 발생할 수 있음
        (프레임의 개수가 많아져도 page-fault가 줄어들지 않고 늘어나는 현상)
  • LRU
    LRU 페이지 교체 알고리즘은 가장 오랫동안 사용하지 않은 페이지를 교체하는 알고리즘입니다.
    •  장점
      • 성능이 좋습니다.
      • 성능이 좋아 많은 운영체제가 채택하는 알고리즘 입니다.
    • 단점
      • 프로세스가 주기억장치에 접근할 때 마다 참조된 페이지 시간을 기록해야 하므로 막대한 오버헤드가 발생합니다.
      • 카운터나 큐, 스택과 같은 별도의 하드웨어가 필요합니다.
  • LFU
    LFU 페이지 교체 알고리즘은 참조 횟수가 가장 적은 페이지를 교체하는 알고리즘입니다.
    • 장점
    • 단점
      • 가장 최근에 불러온 페이지가 교체될 수 있어 구현이 복잡합니다.
      • LRU와 마찬가지로 막대한 오버헤드가 발생합니다.
쓰레싱 (Thrashing)

쓰레싱은 메모리 영역에 접근하게 될 때, 메모리에 페이지 부재(=페이지 폴트(Page fault)율이 높은 것을 의미하며,
CPU 이용률이 급격하게 떨어져 심각한 성능 저하를 초래합니다.
스레싱이 발생하는 이유는 프로세스를 처리하는 시간보다 메모리에 적재되지 못한 페이지로 인하여
페이지 교체에 드는 시간이 증가하게되고 그로 인해 CPU이용률이 떨어지게 됩니다.

활발하게 사용되는 페이지 집합을 지원해 줄 만큼 자원을 충분히 할당 받지 못한 프로세스에서
페이지 부재(Page fault)가 발생하게 됩니다.

이 때, 페이지 교체가 필요하지만 이미 활발히 사용되는 페이지들만으로 이루어져 있으므로
어떤 페이지가 교체되던 바로 다시 페이지 교체가 필요하게 될 것입니다.

결과적으로 바로바로 반복해서 페이지 폴트가 발생하며, 교체된 페이지는 또 다시 얼마 지나지 않아 읽어올 필요가 생기게 됩니다.
이렇게 과도한 페이징 작업으로 인해 CPU 사용 시간보다 페이지 교체하는 시간이 많아져 Thrashing(쓰레싱) 이 발생합니다.

쓰레싱은 2가지 방법으로 해결이 가능합니다.

  1. Working set
    지역성의 원리를 이용하여 지역성 집합이 메모리에 동시에 올라갈 수 있도록 보장하는 메모리 관리 방법이다.
    즉, 프로세스는 일정 시간 동안 특정 주소를 집중적으로 참조하는 경향이 있는데,
    프로세스가 일정 시간 동안 자주 참조하는 페이지들의 집합을 워킹셋이라고 합니다.
    자주 참조되는 워킹셋을 주 기억 장치에 상주시킴으로써 페이지 부재 및 페이지 교체를 줄일 수 있습니다.
    시간이 지남에 따라 자주 참조하는 페이지들의 집합이 변화하기 때문에 워킹셋은 시간에 따라 바뀌게 됩니다.
    ✓ 지역성의 원리: 프로세스가 일정 시간 동안 집중적으로 특정 주소 영역을 참조하는 경향

  2. Page Fault Frequency(페이지 부재 빈도)
    프로세스의 페이지 부재율을 주기적으로 조사하고 이 값에 근거하여
    각 프로세스에 할당할 메모리 양을 동적으로 예측하고 조절하는 방법입니다.
    현재 페이지 부재와 직전 페이지 부재 사이의 시간을 관찰하여 상한 값(upper bound)을 초과하거나
    하한 값(lower bound) 미만이 되면 운영체제가 메모리에 올라가 있는 프로세스의 수를 조절한다.
Comments