반응형

운영체제는 한정되어 있는 메모리를 극한으로 활용할 수 있도록 메모리를 관리하는 역할을 합니다.

 

 

📖 가상 메모리 (Virtual Memory)

(1) 가상 메모리란?

  • 메모리 관리 기법 중 하나로 프로세스 전체가 메모리에 올라오지 않더라도 실행이 가능하도록 해주는 기법입니다.
  • 실제의 물리 메모리 개념과 프로그래머의 논리 메모리 개념을 분리합니다.

 

(2) 가상 메모리를 이용하면 좋은 점

  • 물리 메모리(RAM)의 크기의 제약을 받지 않게 됩니다. (알고리즘에 집중할 수 있습니다)
  • 많은 프로그램을 동시에 실행할 수 있게 됩니다. 
  • 프로그램을 메모리에 올리고 Swap(스왑)을 하는데 필요한 입출력(IO) 횟수가 줄어들기 때문에 프로그램을 보다 더 빠르게 실행시킬 수 있습니다.

 

(3) 요구 페이징 (Demanding Paging)

  • 프로세스에서 필요한 것들만 골라서 메모리에 적재할 수 있도록 해주는 전략을 요구 페이징이라고 합니다.
  • 초기에는 필요한 부분만 메모리에 적재하여 프로세스를 실행하고, 필요할 때마다 요청하여 메모리에 적재하는 방법을 사용합니다.
  • 한 번도 접근하지 않은 *페이지는 물리 메모리에 적재되지 않습니다.
  • 해당 페이지가 물리 메모리에 존재하는지 안 하는지에 대한 여부는 유-무효(valid-invalid) 비트를 사용하여 표시합니다.
  • 가상 메모리 공간에는 존재하지만 물리 메모리 공간에는 없는 데이터에 접근했을 때는 페이지 폴트(Page Fault)가 발생합니다.
    • 페이지 폴트가 발생했을 때는 운영체제가 스와핑(Swaping)을 통해서 마치 페이지 폴트가 발생하지 않은 것처럼 프로그램을 작동시킵니다.
*페이지(Page): 가상 메모리를 사용하는 최소 크기 단위를 말합니다.

 

 

# 스와핑 (Swaping)

  • 페이지 폴트를 방지하기 위해서 당장 사용하지 않는 영역을 하드디스크(보조기억장치, 스왑영역)로 옮기고, 필요할 때 다시 하드디스크에서 RAM으로 불러오는 작업을 스와핑이라고 합니다.
  • 하드디스크에서 RAM으로 불러오는 것을 Swap-In이라고 하며, RAM에서 하드디스크로 내리는 작업을 Swap-Out이라고 합니다. 
  • Swap을 하는 데는 큰 디스크 전송시간이 요구되기 때문에 메모리가 부족한 경우에만 Swapping을 진행합니다.

 

 

# 요구 페이징을 통해 페이지 폴트를 처리하는 과정

*프레임(Frame): 물리 메모리를 사용하는 최소 크기 단위를 말합니다.

 

 

 

📖 스레싱 (Thrashing)

  • 너무 많은 프로세스가 동시에 올라오게 되면서 스와핑(Swaping)이 빈번하게 발생하여 생기는 문제가 스레싱입니다.
  • 즉, 페이지 폴드율이 높아짐에 따라서 발생하는 문제입니다. 스레싱은 컴퓨터의 심각한 성능 저하를 발생시킵니다.
  • 다시 정리해 보면 어떤 프로세스가 실행되는 시간보다 더 많은 시간이 페이징 하는 데 사용되고 있다면 스레싱이 발생했다고 할 수 있습니다.
  • OS가 평소에 CPU의 이용률을 감시합니다. 페이지 폴드율이 높아지면 그만큼 CPU의 대기 시간이 길어지기 때문에 CPU 이용률이 감소하게 됩니다. 그래서 OS는 CPU의 이용률이 낮기 때문에 여유롭다고 판단하고 가용성을 높이기 위해서 더 많은 프로세스를 메모리에 올리는 작업을 하게 됩니다.

 

(1) 스레싱을 해결할 수 있는 방법

  • 작업 세트, 작업 집합 (Working Set)
  • 페이지 폴트 빈도 (PFF, Page Fault Frequency)

 

# 작업 세트, 작업 집합 (Working Set)

  • 프로세스가 실행이 될 때, 어떤 특정한 지역에서만 메모리를 참조하게 됩니다. 이것을 *지역성(Locality)라고 합니다.
  • 지역성 특징을 기반으로 하여 어느 일정 시간 동안 활발하게 사용되었던 페이지들을 이용하여 작업 집합을 만들어 미리 메모리에 로드하는 방법을 말합니다.
  • 이렇게 미리 메모리에 로드하게 되면 탐색에 드는 비용을 줄일 수 있고, 스와핑 횟수도 줄일 수 있습니다.
*지역성: 프로세스가 일정 시간 동안 집중적으로 특정 주소 영역을 참조하는 경향을 분석

 

# 페이지 폴트 빈도(PFF, Page Fault Frequency)

  • 페이지 폴트율의 상한과 하한을 지정하여 프로세스에 할당할 메모리의 크기를 동적으로 예측하고 조절하는 방법입니다.
  • 폴트율이 상한을 넘어서면 해당 프로세스에 필요한 프레임이 부족하다고 판단하여 늘려주고, 하한보다 떨어지면 해당 프로세스에 주어진 프레임이 많다고 판단하여 줄여주어 스레싱을 방지합니다.

 

 

 

📖 메모리 할당

(1) 연속 메모리 할당

  • 프로세스에 연속적인 메모리 공간을 할당하는 방법을 말합니다.
  • 연속 메모리 할당 방식에는 최초 적합, 최적 적합, 최악 적합 방식이 존재합니다.

# 최초 적합

  • 운영체제가 메모리 내에서 빈 공간을 순서대로 탐색하다가 적재가 가능한 공간을 발견하면 그 공간에 프로세스를 바로 적재하는 방식을 말합니다.
  • 검색 시간이 최소화되고, 빠르게 할당이 가능합니다.

 

# 최적 적합

  • 운영체제가 메모리의 비어있는 공간을 모두 검색한 뒤에 가장 작은 공간에 적재하는 방식을 말합니다.

 

# 최악 적합

  • 운영체제가 메모리의 비어있는 공간을 모두 검색한 뒤에 가장 큰 공간에 적재하는 방식을 말합니다.

 

 

(2) 연속 메모리 할당의 문제점

  • 연속 메모리 할당 방법은 메모리를 효율적으로 사용하는 방법이 아닙니다. 잠재적으로 외부 단편화가 발생할 수 있습니다.

# 외부 단편화

  • 프로세스들이 실행되고 종료되는 과정이 반복되며 메모리 사이사이에 비어있는 공간이 발생되고, 다음 프로세스를 할당하기 어려울 정도로 작아서 메모리가 낭비되는 문제를 말합니다. 아래 그림으로 간단하게 이해해봅시다.

# 메모리 압축 (Compaction) - 외부 단편화 해결

  • 비어있는 공간들을 하나로 모아서 하나의 큰 비어있는 공간으로 만드는 방법을 말합니다.
  • 여기저기 흩어져 있는 공간들을 합치는 과정은 효율이 떨어질 수 있는 방법입니다.

 

# 내부 단편화

  • 할당하기 위해서 나눴던 메모리 크기보다 프로세스에 필요한 메모리가 작아서 남는 메모리 공간이 생기는 것을 말합니다.

 

 

(3) 불연속 메모리 할당

  • 불연속 메모리 할당 방법은 현대 운영체제가 쓰는 방법인 페이징 기법이 존재합니다.
  • 페이징 기법은 메모리를 동일한 크기의 페이지로 나누고 프로그램(프로세스)마다 페이지 테이블을 두어 이를 통해 실제 메모리에 프로그램을 할당하는 방법입니다.
  • 페이징 기법 이외에도 세그멘테이션, 페이지드 세그멘테이션 방법이 존재합니다.

 

# 페이징 기법 (Paging)

  • 프로세스에게 연속적인 메모리를 할당하지 않고, 메모리를 페이지 단위로 나누어 서로 다른 위치에 프로세스를 할당합니다.
  • 논리적 메모리(가상 메모리)에서는 프로세스를 페이지 단위로 나누어서 관리하고, 물리적 메모리(RAM)는 프레임 단위로 나누어져 있습니다.
  • 하나의 프로세스가 사용하는 메모리 공간은 연속적이어야 한다는 제약을 깨버리는 메모리 할당 방법입니다.

 

# 세그멘테이션

  • 정해진 사이즈의 블록 크기 페이지 단위가 아닌 서로 사이즈가 다른 논리적인 세그먼트(Segment)로 나누는 방법을 말합니다.
  • 하나의 프로세스는 코드, 데이터, 스택, 힙으로 이루어져 있는데, 이를 기반으로 나눌 수도 있고, 함수 단위로 나눌 수도 있는 방법입니다.
  • 메모리에 비어있는 공간의 크기가 균일하지 않다는 문제가 발생될 수 있습니다.

 

 

 

📖 페이지 교체 알고리즘

  • 메모리는 한정되어 있어서 스와핑이 빈번하게 일어납니다.
  • 스와핑이 최대한 적게 일어날 수 있는 구조로 설계되어야 합니다.
  • 페이지 교체 알고리즘을 기반으로 스와핑이 일어나게 됩니다.

 

# 오프라인 알고리즘 (Offline Algorithm)

  • 먼 미래에 참조되는 페이지와 현재 할당하려는 페이지를 바꾸는 알고리즘을 말합니다.
  • 먼 미래에 사용되는 프로세스를 알 수 있는 방법이 존재하지 않기 때문에 사용할 수 없는 알고리즘입니다.
  • 알고리즘 간의 성능 비교에 대한 기준으로 사용됩니다.

 

# FIFO (First In First Out)

  • 페이지 교체 시점이 오면 먼저 메모리에 할당되었던 순서대로 먼저 나가게 되는 간단한 알고리즘입니다.
  • 가장 직관적인 간단한 알고리즘으로 구현하기 쉽다는 장점이 있습니다.
  • 가장 활발한 페이지를 먼저 교체해서 페이지의 부재율을 높이는 부작용이 발생할 수 있습니다.

 

# LRU (Least Recentle Used) : 기간

  • 페이지 교체 시점이 오면 가장 오랫동안 사용되지 않는 페이지를 선택하여 교체합니다.
  • 대체적으로 FIFO 알고리즘보다는 우수한 성능을 갖습니다.
  • 가장 오래됐는지 파악하기 위해서 각 페이지마다 계수기, 스택을 두어야 하는 문제점이 있습니다.

 

# LFU (Least Frequency Used) : 횟수

  • 페이지 교체 시점이 오면 가장 참조 횟수가 적은 페이지를 선택하여 교체합니다.
  • 활발한 페이지는 참조 횟수도 많을 것이라는 가정하에 만들어진 알고리즘입니다.

 

# 최적 페이지 교체 (Optimal Page Replacement, OPR)

  • 앞으로 오랫동안 사용되지 않을 페이지를 선택하여 교체합니다.
  • 프로세스가 앞으로 사용할 페이지를 미리 알아야 한다는 조건이 필요합니다.
  • 앞으로 사용할 페이지를 아는 것은 불가능하기 때문에 구현이 불가능한 알고리즘입니다.
  • 알고리즘 구현의 목적보다는 알고리즘 연구 비교의 목적으로 사용되는 알고리즘입니다.
반응형

+ Recent posts