[OS/운영체제] 가상 메모리(Virtual Memory) & 페이징, 세그먼테이션

·2021년 7월 28일
0

OS

목록 보기
7/11

1. 가상 메모리(Virtual Memory)란?

실제 메모리 크기와 상관 없이 메모리를 이용할 수 있도록 가상의 메모리 주소를 사용하는 방법이다.


사용하는 이유

메모리의 크기는 한정되어있기 때문에 프로그램을 사용할 때 한정된 메모리의 크기를 고려해야한다.

가상메모리실제 메모리보다 휠씬 큰 용량을 가지고 있다(10~20배).

가상메모리 용량 = 물리메모리(메인메모리) + 스왑영역(디스크 내)

그래서 프로그램 사용자들은 실제 메모리 용량이 아닌 가상 메모리 용량에 맞춰 프로그램을 사용할 수 있다.

프로그램이 실행될 때 반드시 프로그램 전체가 실제 메모리에 있을 필요는 없다. 현재 실행되어야 하는 부분만이 실제 메모리에 옮겨져 있으면 되는 것이므로 실제 메모리용량보다 큰 프로그램이 가상메모리를 통해 실행 가능하다.

예시

컴퓨터공학 공부를 한다고 하자. 필요한 책은 수백권이나 책상에 올려놓을 수 있는 책은 10권에 불과하다. 그러나 책장을 마련해 다른 책들을 꽃아두고 필요할 때 책상으로 옮겨온다면 10권 이상의 책을 볼 수 있다!

  • 책 == 프로그램
  • 책장 == 가상메모리
  • 책상 == 실제 메모리

장점

  • 가상의 주소 공간을 사용하여 논리적인 연속성을 제공해준다.
  • 물리 메모리 주소 공간을 알 필요가 없어진다.
  • 실제 메모리(RAM) 크기 보다 더 큰 공간을 사용할 수 있다. (보조 기억장치 공간 사용)

2. 가상 메모리 관리 기법

대표적인 가상 메모리 기법으로 페이징(paging), 세그멘테이션(segmentation)이 있다. 현대 운영체제에서는 두 가지 방식이 혼용되어 사용된다.

페이징

  • 프로세스는 Page로 나누어지고, 물리적 메모리는 Frame으로 나누어진다. Page와 Frame의 크기는 고정크기이다.
  • 페이지 테이블에는 각 페이지 번호와 해당 페이지가 할당된 프레임의 시작 물리 주소를 저장한다.
  • 사용자는 하나의 주소를 지정한다. (하드웨어에 의해 페이지 번호와 변위로 분할)
  • 내부 단편화가 발생할 수 있다.

세그멘테이션

  • 서로 다른 크기의 논리적 단위인 세그먼트로 분할한다.
  • 사용자가 두 개의 주소로 지정한다. (세그먼트 번호 + 변위)
  • 세그먼트 테이블에는 각 세그먼트의 시작 물리 주소세그먼트의 길이를 저장한다.
  • 프로세스를 Code, Data, Stack으로 나눈다.
  • 외부 단편화가 발생할 수 있다.

페이징 vs 세그멘테이션

공통점

두 방식 모두 매핑 테이블 형태로 관리 된다.

  • 페이징 -> 고정 분할 -> 페이지 테이블
  • 세그멘테이션 -> 가변 분할 -> 세그멘테이션 테이블

차이점

  • 페이징은 고정 크기를, 세그먼테이션은 가변크기를 가진다.
  • 페이징은 내부 단편화가 발생할 수 있고, 세그먼테이션은 외부 단편화가 발생할 수 있다.

페이징과 세그먼테이션을 쓰는 이유

  • 다중 프로그래밍 시스템에서 여러 프로세스를 수용하기 위해 주기억장치를 동적 분할하는 메모리 관리 작업이 필요하기 때문이다.
  • 메모리 단편화의 해결 방법이다!



3. 메모리 단편화

내부 단편화

  • 프로세스가 필요한 양보다 더 큰 메모리가 할당되어서 프로세스에서 사용하는 메모리 공간이 낭비되는 것
  • Ex) 어떤 프로그램에 OS가 10MB만큼의 메모리를 할당하였지만 실제로는 3MB만큼의 메모리를 사용하고 있다면 7MB만큼의 내부 단편화가 발생하는 것

외부 단편화

  • 메모리가 할당 및 해제 작업의 반복으로 중간중간에 사용하지 않는 작은 메모리가 생기는 것
  • 메모리 공간은 충분하지만 실제로 할당할 수 없는 경우
  • 여유 공간이 여러 조각으로 나뉘는 현상



출처

https://vmilsh.tistory.com/384 (가상메모리)
https://gamedevlog.tistory.com/85 (가상메모리)
https://uomustansiriyah.edu.iq/media/lectures/9/9_2019_01_04!09_25_00_AM.pdf (가상메모리 이미지)
https://m.blog.naver.com/dilector/221787085698 (가상메모리 이미지)
https://github.com/gyoogle/tech-interview-for-developer/blob/master/Computer%20Science/Operating%20System/Page%20Replacement%20Algorithm.md
https://github.com/haewon-park/csStudy/blob/main/OS/Paging%EA%B3%BC%20Segmentation.md

profile
당근먹고 자라나는 개발자

0개의 댓글