본문 바로가기
Computer Science

가상 메모리

by 개발자 데이빗 2022. 1. 1.

가상 메모리 (Virtual Memory System)

실제 각 프로세스마다 충분한 메모리를 할당하기에는 메모리 크기가 한계가 있음

폰노이만 구조 기반이므로 코드는 메모리에 반드시 있어야 한다.

 

실제 특정시간에 특정 프로세스에서 참조하는 메모리는 한정적이다.

실제로 프로세스가 필요로 하는 공간만 물리 메모리(RAM)에 넣고 해당 주소를 참조하고 있는다.

 

가상메모리 기본 아이디어

프로세스는 가상 주소를 사용하고 실제 해당 주소에서 데이터를 읽고 쓸때만 물리주소로 바꿔준다.

virtual address(가상 주소) - 프로세스가 참조하는 주소

physical address(물리 주소) - 실제 메모리 주소

 

MMU(Memory Management Unit)

CPU에 코드 실행시 가상 주소 메모리 접근이 필요할때 해당 주소를 물리 주소값으로 변환해주는 하드웨어 장치

하드웨어 장치를 이용해야 주소 변환이 빠르기 때문에 별도의 장치를 둔다.

CPU는 가상 메모리를 다루고 MMU를 통해 물리 메모리로 접근한다.

CPU -> MMU -> Memory

 

페이징 시스템

페이징 개념

크기가 동일한 페이지로 가상 주소 공관과 이에 매칭하는 물리 주소 공간을 관리

하드웨어 지원이 필요하다 (intel x86 32bit 에서는 4kb, 2mb, 1gb를 지원한다.)

리눅스에서는 4KB로 페이징 한다.

페이지 번호를 기반으로 가상 주소, 물리 주소 매핑 정보를 기록하고 사용한다.

 

프로세스의 PCB에 Page Table 구조체를 가리키는 주소가 들어 있다.

Page Table에는 가상 주소와 물리 주소간 매핑 정보가 있다.

 

page 또는 page frame은 고정된 크기의 block

가상 주소 v 는

가상 메모리 페이지 p와 -  페이지 번호

p안에서 참조하는 위치 d (page 내부에서 참조하는 변위)로 구성된다. - 페이지 처음부터 얼마 떨어진 위치인지

해당 프로세스에서 특정 가장 주소에 액세스 하려면 해당 프로세스의 page table에 해당 가상 주소가 포함된 page 번호가 있는지 확인

page 번호가 있으면 이 page가 매핑된 첫 물리 주소(p')를 알아내고 p' + d가 실제 물리 주소가 된다.

 

프로세스 생성 시 페이지 테이블 정보 생성

  • PCB 등에서 해당 페이지 테이블 접근이 가능하고, 관련 정보는 물리 메모리에 적재된다.
  • 프로세스 구동시, 해당 페이지 테이블 base 주소가 별도 레지스터에 저장 된다. (CR3)
  • CPU가 가상 주소 접근 시 MMU가 페이지 테이블 base 주소를 접근해서, 물리 주소를 가져온다.

 

다중 단계 페이징 시스템

32bit 시스템에서 4KB 페이지를 위한 페이징 시스템은

하위 12bit는 오프셋 (변위)

상위 20bit가 페이징 번호이므로 2의 20승 개의 페이지 정보가 필요하다

 

페이징 정보를 단계를 나누어 생성

필요없는 페이지는 생성하지 않으면 공간 절약이 가능하다.

페이지 디렉토리를 만들어 필요없는 페이지 디렉토리의 경우 페이지 테이블을 만들지 않는다.

 

CR3 레지스터 -> 페이지 디렉토리의 시작 주소 -> 페이지 디렉토리 -> 페이지 테이블의 시작 주소 -> 페이지 테이블 -> 물리 메모리 프레임 주소

 

MMU와 TLB (컴퓨터 구조)

 

cpu -> virtual address 요청 -> mmu -> cr3(base address) -> 프로세스 페이지 테이블 -> 물리 주소 요청 -> mmu -> 물리 주소 접근 

한번 접근(변환)이 된 물리주소는 TLB (Translation Lookaside Buffer)에 캐시된다.

 

페이징 시스템과 공유 메모리

  • 프로세스간 동일한 물리 주소를 가리킬 수 있음 (공간 절약, 메모리 할당 시간 절약)
  • 프로세스 생성시간이 줄어들고 공간 절약이 가능하다.

예시

  • fork()로 생성된 자식 프로세스와 부모 프로세스는 다른 페이지 테이블을 갖지만 같은 물리 주소를 가리킬 수 있음
  • (4GB를 복사 하는 것이 아닌 같은 물리 주소를 가리키게 된다.)
  • 부모 프로세스가 물리 메모리에 데이터를 write 하는 경우에만 물리 메모리에 올라간 데이터를 복사 한 다음 페이지 포인터를 변경해준다.
  • 프로세스의 커널 영역 (운영체제 코드)는 다른 페이지 테이블을 갖지만 같은 물리 주소를 가리킨다.

 

선행페이징과 요구 페이징

선행 페이징

미리 프로세스 관련 모든 데이터를 메모리에 올려놓고 실행한다.

 

요구 페이징

프로세스 모든 데이터를 메모리로 적재하지 않고 실행 중 필요한 시점에만 메모리로 적재한다.

선행 페이징의 반대 개념

더 이상 필요하지 않은 페이지 프레임은 다시 저장매체에 저장 (페이지 교체 알고리즘 필요)

 

페이지 폴트 (page fault interrupt)

어떤 페이지가 실제 물리 메모리에 없을때 일어나는 인터럽트

운영체제가 page fault가 일어나면 해당 페이지를 물리 메모리에 올리고 cpu는 mmu에 가상 주소를 다시 요청한다.

 

페이지 폴트가 자주 일어나면 시간이 오래 걸린다

향후 실행, 참조될 코드 및 데이터를 미리 물리 메모리에 올리는 방법으로 해결 

그러나 앞으로 있을 일을 예측해야 해서 해결하기 어려움

 

스레싱

반복적으로 페이지 폴트가 발생해서 과도하게 페잊 교체 작업이 일어나 실제로는 아무일도 못하는 상황

 

페이지 교체 정책

페이지 교체 알고리즘

FIFO

가장 먼저 들어온 페이지를 내린다.

 

최적 페이지 교체 알고리즘 (OPTimal Replacement Algorithm)

  • 앞으로 가장 오랫동안 사용하지 않을 페이지를 내린다.
  • 일반 OS에서는 구현 불가능하다.

 

LRU (Least Recently Used) Page Replacement Algorithm

  • 가장 오래 전에 사용된 페이지를 내린다.
  • OPT가 구현 불가능 하므로 과거 기록을 기반으로 구현
  • 메모리 지역성에 의해 가장 오래 전에 사용된 페이지의 경우 사용되지 않을 가능성이 높다.

 

페이지 스왑 알고리즘

LFU (Least Frequently Used) Page Replacement Algorithm

가장 적게 사용된 페이지를 내린다.

 

NUR(Not Used Recently) Page Replacement Algorithm

  • LRU와 마찬가지로 최근에 사용하지 않은 페이지부터 교체하는 기법
  • 각 페이지마다 참조비트(R), 수정비트(M)을 둔다. (R, M)
    • (0, 0), (0, 1), (1, 0), (1, 1) 순으로 페이지 교체

 

세그멘테이션 기법

가상 메모리를 서로 크기가 다른 논리적 단위인 세그먼트로 분할

 

세그먼트 가상주소

v = (s, d): s는 세그먼트 번호, d는 블록 내 세그먼트의 변위

 

 

단편화

내부 단편화 (페이지 기법)

페이지 블록만큼 데이터가 딱 맞게 채워져 있지 않은 경우의 공간 낭비

 

외부 단편화 (세그멘테이션 기법)

물리 메모리가 원하는 연속된 크기의 메모리를 제공해주지 못하는 경우

 

세그멘테이션, 페이징 모두 하드웨어 지원이 필요하다

다양한 컴퓨터 시스템에 이식성을 중요시하는 리눅스는 페이징 기법을 기반으로 구현

'Computer Science' 카테고리의 다른 글

시스템 프로그래밍 - 리눅스  (0) 2022.01.03
파일 시스템  (0) 2022.01.03
스레드 (Thread)  (0) 2021.12.29
프로세스간 커뮤니케이션 (IPC)  (0) 2021.12.28
프로세스의 구조와 컨텍스트 스위칭  (0) 2021.12.27

댓글