운영체제#6-1 가상 메모리

성찬홍·4일 전

Computer Science

목록 보기
16/17

연속 메모리 할당

: 프로세스에 연속적인 메모리 공간을 할당

스와핑

  • 현재 사용되지 않는 프로세스들을 보조기억장치의 일부 영역으로 쫒아내고
  • 그렇게 생긴 빈 공간에 새 포르세스에 적재

  • 프로세스들이 요구하는 메모리 공간 크기 > 실제 메모리 크기

스왑 영역

: 스왑은 RAM(메모리)이 부족할 때, 디스크 공간을 임시 메모리처럼 사용하는 기능이다.

  • 메모리가 꽉 차면, 덜 중요한 데이터를 RAM → 디스크(Swap 공간)으로 잠시 옮겨두는 기능

단점

  • 디스크는 RAM보다 매우 느리다
  • 스왑을 많이 사용하면 시스템이 느려진다(스왑팅, Thrashing)

& 필요한 이유

상황스왑 역할
메모리가 모자랄 때프로세스의 일부를 디스크로 옮겨 RAM 공간 확보
갑자기 메모리 사용량 증가시스템 다운 방지
백그라운드 프로세스RAM 대신 Swap에 저장하여 RAM 여유 확보

메모리 할당

  • 프로세스는 메모리의 빈 공간에 할당되어야 한다. 빈 공간이 여러 개 있다면?
  • 최초 적합 , 최적 적합 , 최악 적합

최초 적합 (first-fit)

  • 운영체제가 메모리 내의 빈 공간을 순서대로 검색하다 적재할 수 있는 공간을 발견하면 그 곤간에 프로세스를 배치하는 방식
  • 검색 최소화 , 빠른 할당

최적 적합 ( best -fit )

  • 운영체제가 빈 공간을 모두 검색해본 뒤 , 적재 가능한 가장 작은 공간에 할당

최악 적합

  • 운영제체가 빈 공간을 모두 검색한 뒤 , 적재 가능한 가장 큰 공간에 할당

→ 이 프로세스를 연속적으로 메모리에 할당하는 방식은 메모리를 효율적으로 사용하는 방법이 안디ㅏ.

→ 이유는 외부 단편화라는 문제가 발생하기 때문이다.

외부 단편화

  • 프로세스들이 실행되고 종료되길 반복하며 메모리 사이 사이에 빈 공간 발생
  • 이게 외부 단편화다
    • 프로세스를 할당하기 어려울 만큼 작은 메모리 공간들로 인해 메모리가 낭비되는 현상이다.

외부 단편화 해결

(1) 메모리 압축

  • 여기저기 흩어져 있는 빈 공산들을 하나로 모으는 방식 , 프로세스를 적당히 재배치시켜 흩어져 있는 작은 빈 공간들을 하나의 큰 빈 공간으로 만드는 방법
  • 외부 단편화는 메모리가 전체적으로는 충분히 남아 있지만, 연속된(Contiguous) 메모리 공간이 부족해서프로세스를 적재하지 못하는 현상을 말한다.

(2) 페이징

  • 메모리를 똑같은 크기의 페이지로 나눔
  • 프로세스도 동일 크기 페이지로 나눔
  • 연속된 공간 필요 없음 → 외부 단편화 없음
  • 다만 마지막 페이지 일부가 남는 내부 단편화는 발생 가능

페이징을 통한 가상 메모리 관리

  • 연속 메모리 할당의 두 가지 문제점
    • 외부 단편화
    • 물리 메모리보다 큰 프로세스 실행 불가

가상 메모리

  • 실행하고자 하는 프로그램을 일부만 메모리에 적재하며 실재 물리 메모리 크기보다 더 큰 프로세스를 실행할 수 있게 하는 기술
  • 페이징, 세그멘테이션

페이징이란

  • 운영체제가 메모리를 고정된 크기의 블록으로 나누어 관리하는 기법으로, 외부 단편화를 완전히 해결하기 위해 도입된 메모리 관리 방식입니다.

  • 프로세스의 논리 주소 공간을 페이지라는 일정 단위로 자른다.

  • 메모리의 물리 주소 공간을 프레임이라는 페이지와 동일한 일정한 단위로 자른 뒤

  • 페이지를 프레임에 할당하는 가상 메모리 관리 기법

페이징에서의 스와핑

  • 프로세스 단위의 스왑 인 , 스왑 아웃이 아닌 페이지 단위의 스왑 인 , 스왑 아웃
  • 메모리에 적재될 필요가 없는 페이지들은 보조기억장치로 스왑 아웃
  • 실행에 필요한 페이지들은 메모리로 스왑 인

페이지 테이블

→ 프로세스를 이루는 페이지가 어느 프레임에 적재되어 있는지 CPU가 일일이 알기란 어렵다. 프로세스가 메모리에 불연속적으로 배치되어 있다면 CPU 입장에서 이를 순차적으로 실행할 수가 없다. CPU 입장에서 ‘다음에 실행할 명령어 위치’를 찾기가 어려워진다.

  • 위의 문제를 해결하기 위해 페이지 테이블을 사용한다.
  • ( 실제 메모리 내의 주소인 ) 물리 주소에 불연속적으로 배치되더라도
  • ( CPU가 바라보는 주소인 ) 논리 주소에는 연속적으로 배치되도록 하는 방법
  • 페이지 번호와 프레임 번호를 짝지어 주는 일종의 이정표이다.

→ 물리적으로는 분산되어 저장되어 있더라도 CPU 입장에서 바라본 논리 주소는 연속적으로 보인다.

→ CPU는 그저 논리 주소를 순차적으로 실행하면 될 뿐

내부 단편화

→ 마지막 페이지에 사용되지 않는 공간이 생김

PTBR

  • 프로세스마다 페이지 테이블이 있고,
  • 각 페이지 테이블은 CPU 내의 프로세스 테이블 베이스 레지스터(PTBR)가 가리킨다

  • 그런데 , 페이지 테이블 메모리에 있다면 ? 메모리 접근 시간 두 배로
  • 페이지 테이블 참조하기 위해 한 번
  • 페이지 참조하기 위해 한 번
  • TLB : CPU 곁에 페이지 테이블의 캐시 메모리
    • 페이징 시스템의 성능을 크게 올려주는 핵심 하드웨어 캐시입니다.
    • TLB Hit (캐시 히트) , TLB에 페이지 번호가 존재함 ,바로 물리 프레임 번호 획득,속도 매우 빠름
    • TLB Miss (캐시 미스) ,TLB에 해당 매핑 없음 ,페이지 테이블을 RAM에서 찾아야 함,
      찾은 뒤 → 그 결과를 TLB에 저장 (교체 정책 적용)
  • 페이지 테이블의 일부를 가져와 저장

페이징에서의 주소 변환

  • 특정 주소에 접근하고자 한다면 어떤 정보가 필요할까?
    • 어떤 페이지/프레임에 접근하고 싶은지
    • 접근하려는 주소가 그 페이지 혹은 프레임으로부터 얼마나 떨어져 있는지

  • 페이징 시스템에서의 논리 주소

    • 페이지 번호와 변위
  • < 페이지 번호 , 변위 >로 이루어진 논리 주소는

  • 페이지 테이블을 통해

  • < 프레임 번호 , 변위 >로 변환된다.

페이지 테이블 엔트리

: PTE는 가상 페이지가 실제 물리 메모리의 어느 프레임에 있는지, 그리고 그 페이지의 상태를 설명하는 정보(메타데이터)를 담고 있는 구조체(레코드)

  • 유효 비트
    • 현재 해당 페이지에 접근 가능한지 여부
  • 유효 비트가 0인 페이지에 접근하려고 하면?
    • 페이지 폴트라는 인터럽트 발생

      ( 1 ) CPU는 기존의 작업 내역을 백업한다.
      ( 2 ) 페이지 폴트 처리 루틴을 실행한다.
      ( 3 ) 페이지 처리 루틴은 원하는 페이지를 메모리로 가져온 뒤 유효 비트를 1로 변경해준다
      ( 4 ) 페이지 폴트를 처리했다면 이제 CPU는 해당 페이지에 접근할 수 있게 됩니다.

  • 보호 비트

    • 페이지 보호 기능을 위해 존재하는 비트
  • 참조 비트

    • CPU가 이 페이지에 접근한 적이 있는 지 여부
  • 수정 비트 ( = dirty bit )

    • CPU가 이 페이지에 테이터를 쓴 적이 있는지 여부
    • 수정 비트가 왜 필요한지?
      • 변경된 페이지의 내용을 보조기억장치에 반영할지 여부 판단을 위해

쓰기 시 복사

  • 이론적인 fork()

: 프러세스는 기본적으로 자원을 공유하지 않는다

→ 부모 프로세스가 적재된 별도의 공간에 자식 프로세스가 통째로 복제되어 적재

( 프로세스 생성 시간 지연, 메모리 낭비 )

계층적 페이징

→ 페이징 방식에서 페이지 테이블이 너무 커지는 문제를 해결하기 위해 페이지 테이블 자체를 여러 단계로 나누어 계층 구조로 만든 방식입니다.

  • 프로세스 테이블의 크기는 생각보다 작지 않다
  • 프로세스를 이루는 모든 페이지 테이블 엔트리를 메모리에 두는 것은 큰 낭비이다.
  • 프로세스를 이루는 모든 페이지 테이블 엔트리를 항상 메모리에 유지하지 않을 방법
    • 페이지 테이블을 페이징하여 여러 단계의 페이징 페이지를 두는 방식이다.

  • 계층적 페이징을 이용하는 환경에서의 논리 주소
    • 바깥 페이지 번호를 통해 페이지 테이블의 페이지를 찾기
    • 페이지 테이블의 페이지를 통해 프레임 번호를 찾고 변위를 더함으로서 물리 주소 얻기

장점

  • 메모리 절약 → 필요할 때만 하위 테이블 생성
  • 큰 주소 공간을 효율적으로 관리
  • 실제 현대 CPU 구조와 유사 (x86은 4단계, 최근 x86_64는 4~5단계)

단점

  • 주소 변환 단계가 늘어남 → 메모리 접근이 느려짐
  • 그래서 TLB(Translation Lookaside Buffer)가 필수로 사용됨
    (TLB가 캐시 역할을 해서 속도 감소 해결)
      

정리

연속 메모리 할당은 프로세스에 연속된 물리 메모리 공간을 배정하는 방식으로, 스와핑을 통해 사용되지 않는 프로세스를 디스크로 옮겨 RAM 공간을 확보할 수 있지만 속도가 느린 디스크를 사용하기 때문에 성능 저하(스래싱)가 발생할 수 있다. 메모리에는 여러 빈 공간이 생기기 때문에 최초 적합, 최적 적합, 최악 적합 같은 전략으로 프로세스를 배치하지만, 실행과 종료가 반복되면서 작은 빈 공간이 흩어져 생기는 외부 단편화 문제가 발생한다. 이를 해결하는 방법으로는 메모리 압축(빈 공간 재배치)과 연속된 공간이 필요 없도록 메모리를 동일 크기의 블록으로 나누는 페이징 기법이 있다.

페이징은 프로그램과 메모리를 페이지·프레임 단위로 나누어 외부 단편화를 제거하고, 필요한 페이지만 메모리에 올려 더 큰 프로그램도 실행할 수 있도록 하는 가상 메모리 기반 기술이다. 프로세스의 페이지가 실제 메모리의 어떤 프레임에 위치하는지는 페이지 테이블이 관리하며, CPU는 PTBR과 TLB를 이용해 빠르게 주소 변환을 수행한다. 논리 주소는 <페이지 번호, 변위> 형태이며 페이지 테이블을 통해 <프레임 번호, 변위>로 변환된다. 페이지 테이블 엔트리(PTE)에는 유효 비트, 보호 비트, 참조 비트, 수정 비트 등이 포함되어 페이지 상태를 관리하며, 유효 비트가 0인 페이지에 접근하면 페이지 폴트가 발생해 필요한 페이지를 메모리로 불러오는 방식으로 동작한다.


참고

https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

profile
꾸준한 개발자

0개의 댓글