Computer Science/운영체제

[운영체제] 가상 메모리, 스와핑, 페이지 폴트

하다보면 되겠지 2023. 3. 13. 15:23

페이지 폴트

정의 및 특징

  • 가상 메모리(프로세스의 주소 공간)에는 존재하지만 실제 메모리인 RAM에는 없는 데이터/코드에 접근할 경우 페이지 폴트가 발생함
  • 페이지 폴트 발생 시 운영체제는 해당 데이터를 메모리로 가져와 마치 페이지 폴트가 발생하지 않은 것처럼 계속해서 동작하게 해줌
  • 스와핑: 각 프로세스의 전체를 가져와 실행하고 다시 디스크에 넣는 방식
  • 가상 메모리: 프로그램의 일부분만이 메모리에 존재해도 실행할 수 있음

 


가상 메모리(virtual memory)

정의 및 특징

  • 한정된 메모리를 효율적으로 활용하기 위해 운영체제가 메모리를 관리하는 기법 중 하나
  • 컴퓨터가 실제로 이용 가능한 메모리 자원을 추상화하여 이를 사용하는 사용자들에게 매우 큰 매모리로 보이게 만드는 것
  • 가상적으로 주어진 주소를 가상 주소(logical address)라고 하며, 실제 메모리 상에 있는 주소를 실제 주소(physical address)라고 함
  • 가상 주소는 메모리 관리 장치(MMU)에 의해 실제 주소로 변환되며, 이 덕분에 사용자는 실제 주소를 의식할 필요 없이 프로그램을 구축할 수 있게 됨
  • 가상 메모리는 가상 주소와 실제 주소가 매핑되어 있고 프로세스의 주소 정보가 들어있는 ‘페이지 테이블’로 관리되며, 속도 향상을 위해 TLB를 사용함

 

메모리 추상화가 없다면

  • (a)와 (b)는 각각 하나의 프로그램이며, 둘이 함께 메모리에 올라간 상황(c)
  • JMP 명령어에서 주소 재배치가 필요해지면서, 결국 여러 프로그램을 함께 실행하기 어려워짐
  • 프로그램이 모든 메모리 바이트에 접근할 수 있고, 운영체제를 포함한 다른 프로그램을 쉽게 지워버릴 수 있다는 점에서 안정성 문제가 존재
  • 가상 주소는 물리적인 저장 위치에 대해서 독립적이기 때문에 주소를 재배치하지 않아도 됨

 


논리/물리주소 변환

BASE/LIMIT 레지스터

  • 각 프로세스의 주소 공간을 물리 메모리의 서로 다른 공간으로 연속적으로 매핑하는 방식
  • 우선 논리 주소와 limit register값(프로그램의 크기)를 비교하여 범위를 벗어난다면 에러가 발생
  • limit보다 작다면 base register값(프로그램의 시작 위치)를 더해 물리 주소를 만듦
  • 일련의 과정은 모든 메모리 접근에서 일어나며, 매번 덧셈과 비교 연산이 요구된다는 단점이 있음(덧셈은 캐리 전파 때문에 시간이 많이 걸림)
  • 이 방식은 초기 컴퓨터에서 많이 사용되었으나 최근에는 CPU가 제공하는 보다 효율적인 방법으로 교체되어 현재는 거의 사용되고 있지 않음

 

페이징 기법

https://lordofkangs.tistory.com/211

  • 이후에 알아볼 페이징 기법은 데이터를 비연속적으로 저장하기 때문에 관리하는 테이블이 필요
  • 비연속적인 물리주소를 연속적인 논리주소로 표현한 것
  • 이러한 변환 과정을 MMU가 수행해주어, 비연속적으로 메모리가 할당되었어도 임의접근(Random-Access)이 가능해짐

 

  • 논리주소의 페이지 번호를 통해 물리주소의 프레임 번호를 파악함
  • 페이징 기법은 주기억장치의 프레임과 프로세스의 페이지를 동일한 크기로 자르기 때문에, 논리주소의 오프셋을 그대로 물리주소로 받아오면 됨
  • 오프셋은 10bit로 되어있으므로 1024가지 주소를 표현할 수 있으며, 이것을 1K라 부름

 


스와핑(swapping)

정의 및 특징

  • 실제로는 모든 프로세스를 메모리에 적재할 수는 없음
  • 페이지 폴트가 발생했을 때 메모리에서 당장 사용하지 않는 영역에 하드디스크의 일부분을 불러와 사용하여 마치 페이지 폴트가 일어나지 않은 것처럼 만드는 것이 스와핑임

 

페이지 폴트와 스와핑의 과정

페이지 vs 프레임
- 페이지: 가상 메모리를 사용하는 최소 크기 단위
- 프레임: 실제 메모리를 사용하는 최소 크기 단위
  1. CPU가 물리 메모리를 확인하여 해당 페이지가 없으면 트랩을 발생해서 OS에 알림
  2. OS는 CPU의 동작을 잠시 멈춤
  3. OS가 페이지 테이블을 확인하여 가상 메모리에 페이지가 존재하는지 확인
    • 없으면 프로세스를 중단하고 현재 물리 메모리에 비어 있는 프레임이 있는지 찾음
    • 물리 메모리에도 없다면 스와핑이 발동됨
  4. 비어 있는 프레임에 해당 페이지를 로드하고, 페이지 테이블을 최신화함
  5. 중단되었던 CPU를 다시 시작함

 


메모리 관리

메모리 조각

  • 빗금 부분은 현재 사용되지 않는 메모리 공간을 나타내며, 이것들을 메모리 조각(Memory Compaction)이라 함
  • 메모리 할당은 프로세스가 새로 메모리에 들어오거나 없어질 때마다 바뀜
  • 흩어져있는 메모리 조각들을 모아 큰 공간으로 합칠 수 있음

 

비트맵을 통한 메모리 관리

  • (b)는 메모리 할당 단위가 1k일 때, 1k 당 1bit로 사용 여부를 표현한 것
  • (c)는 동일한 정보를 linked list로 표현한 것으로, 공간들의 정보를 저장함
  • 만약 프로그램이 4.1kb를 사용한다면 5k를 차지하므로 여전히 메모리 낭비가 존재
  • 할당 단위를 더 작게 한다면 더 많은 메모리를 활용 가능하나, 그만큼 bitmap은 커지게 됨
  • 이러한 검색은 시간이 많이 걸린다는 단점이 있음

 

연결 리스트를 통한 메모리 관리

  • 링크드 리스트를 활용한 방식은 프로세스가 종료되거나 swap out될 때 관리를 쉽게 해줌
  • 그림은 프로세스 X가 제거될 경우, 이웃의 상태에 따른 4가지 종류를 나타냄
  • 단순히 엔트리의 키값을 변경하거나(a), 전체 리스트 엔트리 개수가 줄어듦(b, c, d)으로서 이중 연결 리스트로 구현하는 것이 더 편리하다는 것을 알 수 있음

 


References