[CS - OS] 메모리 관리 전략

링딩·2023년 12월 7일
0

다시 공부하는 CS

목록 보기
4/4



1. 메모리 관리 전략

📕 메모리 관리 배경

각각의 프로세스는... 독립된 메모리 공간을 갖고, 운영체제 혹은 다른 프로세스의 메모리 공간에 접근할 수 없는 제한이 걸려있다.**
단지, 운영체제만이 운영체제 메모리 영역과 사용자 메모리 영역의 접근에 제약이 ❌


◽ Swapping

다중 프로그래밍 환경에서 스케줄링 후 CPU의 할당 시간이 끝난 '프로세스'의 메모리를 '보조기억장치(ex 하드디스크)'로 내보내고, '다른 프로세스'의 메모리를 불러들일 수 있다.

  • Swap - in : 주 기억장치(RAM)으로 불러들임
  • Swap - out : 보조 기억장치(하드디스크)로 내보냄
    => 디스크 전송시간이 많이 필요해서 현재는 메모리 공간 부족시 이용한다

◽ 단편화

프로세스들이 메모리에 적재되고 제거되는 일이 반복되다보면, 프로세스들이 차지하는 메모리 틈 사이사용 하지 못할 만큼의 작은 자유공간들이 늘어나게 되는데, 이것이 단편화 이다.

(단편화의 종류)

  • 외부 단편화: 메모리 공간 중 사용하지 못하게 되는 일부분.
    • 다양한 크기의 메모리 블록들이 할당 및 해제되며 그로 인해 메모리 공간 사이에 작은 조각들이 분산
    • 물리 메모리(RAM)에서 사이사이 남는 공간들을 모두 합치면 충분한 공간이 되는 부분들이 분산되어 있을때 발생한다고 볼 수 있다.
  • 내부 단편화: 프로세스에 할당된 공간이 실제 필요한 공간보다 큰 경우 발생.
    -> 이로 인해 메모리 공간에서 낭비되는 부분.
    ex) 메모리 분할 자유 공간이 10,000B 있고 Process A 가 9,998B 사용하게되면 2B 라는 차이가 존재하고, 이 현상을 내부 단편화라 칭한다.



1-2. 메모리 관리 기법


1. 연속 메모리 관리

  • 고정 분할 기법 : 주기억장치가 고정된 파티션으로 분할 (내부 단편화 발생)
  • 동적 분할 기법 : 파티션들이 동적 생성되며 자신의 크기와 같은 파티션에 적재 (외부 단편화 발생)



2. 불연속 메모리 관리

프로세스가 '연속 메모리 관리' 때처럼 연속적인 블록으로 할당하지 않는다. 서로 다른 주소 공간에 할당되게하여 분산된 여러 작은 메모리 영역에 할당하는 메모리 관리 방법이다

1. 페이징(Paging) 방식

  • 외부 단편화 & 압축 작업을 해소하기 위해 만듦
    -> 물리 메모리의 남는 '프레임'에 적절히 배치됨으로 '외부 단편화' 해결

  • 물리 메모리 : 고정 크기(Frame)로 분리

  • 논리 메모리[프로세스 점유] : 고정크기 ( Page)로 분리

    페이지들은 물리적인 메모리에 연속적으로 할당되지 않고, 여러 개의 물리적인 프레임(Frame)에 흩어져 저장됩니다. 페이지 테이블을 통해 가상 주소와 물리 주소 간의 매핑을 관리합니다.

  • (단점) : 내부 단편화 문제 발생



2. 세그멘테이션(Segmentation) 방식

  • 논리∙물리 메모리 : 서로 다른 크기인 세그먼트(Segment) 단위로 분리
    • 세그먼트: 논리적인 단위
  • 세그먼트는 물리적인 메모리에 여러 개의 분산된 메모리 영역에 저장
  • 페이징 방식처럼 세그멘테이션도 '세그먼트 테이블'을 통해 가상주소-물리주소 간의 매핑을 통해 관리한다.
  • (단점) : 외부 단편화 문제 발생

    이렇게 서로 다른 크기의 세그먼트들이 적재되고 제거되는 일이 반복되다 보면, 자유공간이 어쩔 수 없이 수많은 조각으로 나뉘어져 못 쓰게 될 수도 있다.






'페이지의 부재 발생' 이란 것은...
1. 페이지 부재 발생 → 2. 새로운 페이지를 할당해야 함 → 3.현재 할당된 페이지 중 어떤 것 교체할 지 결정하는 방법
=> 왜냐면 필요한 페이지를 적재해도 '가상 메모리'에 계속 쌓여있으니 안 쓰는 애들은 자리에서 제거를 해줘야 한다.(=> 해당 공간을 현재 필요한 다른 페이지로 교체)






가상 메모리 (Virtual Memory System)

다중 프로그래밍을 실현하기 위해서는 많은 프로세스들을 동시에 메모리에 올려두어야 한다.

  • 가상메모리프로세스 전체가 메모리 내에 올라오지 않더라도 실행이 가능하도록 하는 기법
  • 요구 페이징을 이용해 실행과정에서 필요할 때 페이지를 적재한다.
  • 프로그램이 물리 메모리보다 커도 된다는 주요 장점이 있다.
    • 프로세스를 실행할 때 필요한 일부만 메모리에 로드하고 나머지는 디스크에 두는 것
      => 결과적으로 메모리에 작은 양의 주소 공간만 있으면 충분히 프로세스를 수행할 수 있고, 그에 따라 더 많은 프로그램을 동시에 실행할 수 있게 된다.
      => 응답시간은 유지되며 'CPU 이용률'/'처리율'은 상승한다
      => Swap에 필요한 입출력이 줄어든다

1-1. 가상메모리의 단점

  • '요구 페이지 기법'을 통해 필요한 페이지만 메모리에 적재하고 현재 사용하지 않더라도 정리를 안하고 그대로 둔다.
    -> 그래서 안쓰는 페이지(victim page)는 out, 현재 필요한 페이지는 in 시켜야 한다.

(구성)

가상 메모리는 1. 실제 메모리(RAM)와 2. 보조 기억 장치의 Swap 영역으로 구성되며, OS는 메모리 관리자(MMU)를 통해 메모리 관리하며 프로세스는 사용하는 메모리가 실제 메모리인지 Swap의 영역인지는 알 수 없음.




1. 가상 메모리가 하는 일

  • 실제의 물리 메모리 개념사용자의 논리 메모리 개념을 분리한 것으로 정리할 수 있다
    -> 그래서 얼마든지 큰 '가상 주소 공간'을 (작은 메모리를 가졌음에도 불구하고) 제공이 가능했던 것이다.
  • 프로그램에 실제 메모리 주소가 아닌 가상 메모리 주소를 할당하는 방법
  • 물리 메모리에 의해 다른 프로세스들 간의 공유를 가능하게 한다.
    -> 프로세스들이 메모리를 공유하게끔 해주며, 이 '공유 메모리'를 통해 프로세스들끼리 통신할 수 있다.(프로세스들은 인식하진 못하겠지만)

    <가상 주소 공간>

  • 현재 직접 필요치 않은 메모리 공간은 '실제 물리 메모리'에 올리지 않고, 프로세스가 요구하는 '메모리 공간'은 '가상 메모리'에 제공
    => 물리 메모리 절약




2. 페이징 교체 알고리즘

1. 요구 페이징(Demand Paging)

프로그램 실행 시작 시초기에 필요한 것들만 적재하는 전략을 요구 페이징이라고 한다.
=> 한 번도 접근하지 않은 페이지(가상 메모리 관리단위)는 물리 메모리에 적재될 일이 없다.
=> 프로세스 동작에 필요한 페이지를 요청해야 하는데 '페이지 부재(Page Fault)'가 발생할 수 있다.



2. 페이지 교체

요구 페이징 기법에서 초기 적재가 안된 페이징의 경우, 만일 프로세스 동작 중 물리 메모리에 해당 페이지가 안되서 '페이지 부재'가 발생할 수 있다.
이렇게 되면 원하는 페이지를 '보조 저장장치'에서 데려와야 하는데... 그렇다 해도 '물리 메모리'가 모두 사용 중이라면 '페이지 교체'를 시켜줘야 한다.

<페이지 교체의 기본흐름>

물리 메모리가 모두 사용중인 상황에서의 메모리 교체 흐름이다.

  1. 디스크에서 필요한 페이지의 위치를 찾는다
  2. 빈 페이지 프레임을 찾는다.
    1. 페이지 교체 알고리즘을 통해 희생될(victim) 페이지를 고른다.
    2. 희생될 페이지를 디스크에 기록하고, 관련 페이지 테이블을 수정한다.
  3. 새롭게 비워진 페이지 테이블 내 프레임에 새 페이지를 읽어오고, 프레임 테이블을 수정한다.
  4. 사용자 프로세스 재시작



2-1. 페이징 교체 알고리즘들

  • FIFO 페이지 교체
    메모리가 할당된 순서대로 페이지를 교체

    • 장점 : 프로그램하기 쉽다.
    • 단점
      • 처음부터 자주 사용되는 페이지를 교체하여 페이지 부재율을 높이는 부작용을 초래할 수 있다.
  • OPT 페이지 교체(최적 페이지 교체)
    앞으로 가장 오랫동안 사용하지 않을 페이지 교체

    • 장점 : 알고리즘 중 가장 낮은 페이지 부재율을 보장
    • 단점 : (실현 가능성 희박)-> 어떻게 미래를 내다보겠는가
  • LRU 페이지 교체
    가장 오랫동안 사용하지 않은 페이지를 교체
    • FIFO 보단 우수, OPT 보단 아니다.
      => 실제 사용할 수 있는 것들 중엔 best다
  • LFU 페이지 교체
    사용 빈도가 가장 적은 페이지를 교체
    • 최적(OPT) 페이지 교체를 제대로 근사하지 못하기 때문에, 잘 쓰이지 않는다.
  • MFU 페이지 교체
    참조 회수가 가장 작은 페이지를 교체
    • 최적(OPT) 페이지 교체를 제대로 근사하지 못하기 때문에, 잘 쓰이지 않는다.

+) 페이지의 교체방식 2종류

  • Global 교체
    (메모리 상의 모든 프로세스 페이지에 대해 교체)
  • Local 교체
    (메모리 상의 자기 프로세스 페이지에서만 교체)

실제 페이지를 교체할 때 알고리즘 선택 후 어떤 방식으로 할거냐 했을 때는 '전체'를 기준으로 교체하는게 더 좋다고 함.
-> 각각 교체하면 다중 프로그래밍 시, 프로세스 별 각각 모두 교체를 해야하기에...

자바에서는...

Swap 영역을 잡아주자! 😮

만약 Swap 영역을 잡아주지 않는다면 'OOM'이 발생할 수 있다.
-> Swap은 실제 메모리가 아니다. 이 때문에 지연시간이 발생하여 가급적이면 Swap 메모리를 쓰지 않는게 좋으며 쓰더라도 양이 증가한다면 '메모리 누수'를 의심해볼만 하다.




3. 캐시의 지역성

Q. 캐시는 무엇인가?

자주 사용하는 데이터나 값을 미리 복사해 놓는 임시 장소를 가리킨다. 캐시는 저장 공간이 작고 비용이 비싼 대신 빠른 성능을 제공

그러나...

원하는 데이터가 캐시에 존재하지 않을 경우 DBMS 또는 서버에 요청을 해야한다(Cache Miss).

  • 왜?
    캐시는 저장공간이 작기 때문에, 지속적으로 Cache Miss가 발생하는 데이터의 경우 캐시 전략에 따라서 저장중인 데이터를 변경해야 한다.



3-1. 캐시 메모리

  • 주기억장치에 저장된 내용의 일부를 임시로 저장해두는 기억장치
  • CPU와 주기억장치의 속도 차이로 성능 저하를 방지하기 위한 범용 메모리이다.
  • CPU가 이미 본 것을 다시 재접근할 때, 메모리 참조나 인출과정에서 비용을 줄이기 위해 여기서 저장한 데이터를 활용한다.
  • DRAM보다 빠르다.

3-2. 캐시의 지역성

이렇게 CPU의 데이터로 잘 활용되는데 더 잘 활용하려면 '적중률(예측)'을 높여야 한다.
-> 캐시에 많이 활용되는 쓸모 있는 정보가 들어 있을 수록 좋다.
=> 데이터의 지역성의 원리를 잘 사용해야 한다.

📕 지역성

기억 장치 내의 정보를 균일하게 액세스 하는 것이 아니라 한 순간에 특정부분을 집중적으로 참조하는 특성


<지역성의 종류>

¹시간 지역성과 ²공간 지역성으로 나뉜다

  • 시간 지역성: 최근에 참조한 주소의 내용은 곧 다음에도 다시 참조하는 경향
  • 공간 지역성: 실제 프로그램이 참조된 주소와 인접한 주소의 내용을 다시 참조하는 경향



3-3. 캐싱 라인(Caching line)

캐시(cache)는 프로세서 가까이에 위치하면서 빈번하게 사용되는 데이터를 놔두는 장소이다. 빈번하게 사용되는 데이터들을 캐시에 저장했더라도, 내가 필요한 데이터를 캐시에서 찾을 때 모든 데이터를 순회하는 것은 시간 낭비다.
=> 즉, 캐시에 목적인 데이터가 저장되어 있다면, 바로 접근하여 출력할 수 있어야 캐시가 의미 있어진다는 것이다.

  • 캐싱라인 : 이렇게 캐시에 데이터를 저장할 때부터, '자료구조'를 활용해 묶어서 저장하는 것을 뜻한다.



프로세스 관련 용어들 💬

  • PCB: 프로세스 제어 블록, 프로세스에 대한 중요한 정보를 저장합니다.

  • PC: 프로그램 카운터, 프로세스 실행을 위한 다음 명령의 주소를 표시합니다.

  • 캐시메모리: 자주 사용되는 데이터가 저장되는 공간으로 CPU의 레지스터와 메모리 사이에서 병목 현상을 완화하는 장치

profile
초짜 백엔드 개린이

0개의 댓글