[운영체제] 7. 가상 메모리

nnm·2020년 6월 13일
0

운영체제

목록 보기
7/10
post-thumbnail
post-custom-banner

OS? Oh Yes! 책을 바탕으로 학습한 내용입니다.

가상 메모리

가상메모리는 제한된 크기의 메모리를 다양한 프로세스들이 분할, 적재, 반납을 통해서 실제의 크기보다 더 크게 활용할 수 있도록 하는 방법이다.

  • 프로그램을 같은 크기(페이지)나 논리 단위로(세그먼트) 나누어 메모리에 적재
  • 컴파일 시에 정해지는 참조 주소를 실제 메모리의 주소가 아닌 가상의 주소로 설정
    • 실제 메모리 주소로 한다면 항상 같은 메모리 공간에 적재해야 한다.
  • 프로그램 실행시 가상주소를 실주소로 맵핑한다.

페이징(Paging)

모든 프로세스를 같은 크기의 조각들로 나눈다. 그 조각들을 페이지라고 하며 메모리 또한 페이지와 같은 크기로 나누며 프레임이라고 한다. 페이징 테이블은 메모리의 커널에 존재한다.

  • 기본적인 페이징 시스템에서의 진행

    • 가상 주소의 페이지 번호에 기준 레지스터의 값을 더하여 페이지 테이블에서 엔트리를 찾는다.
      • 가상 주소 [p, d]는 각각 페이지 번호와 페이지 내 오프셋을 나타낸다.
      • 기준 레지스터의 값은 실제 메모리에서 페이지 테이블의 시작 주소 값을 나타낸다.
      • 엔트리는 페이지 테이블의 한 행이다.
    • 존재(Residence) 비트를 통해 메모리 적재 여부를 파악한다.
      • 1일 경우 메모리에 적재되어 있으며, 엔트리에 프레임 번호(f)를 가지고 있다.
      • 0일 경우 메모리에 적재되어 있지 않으며, 디스크의 주소를 나타내는 필드를 가지고 있다.
    • 메모리에 적재되어 있는 경우, 프레임 번호(f)와 가상주소에 있던 오프셋(d)을 통해 실제 주소를 맵핑한다.
    • 메모리에 적재되어 있지 않는 경우, 디스크에서 페이지를 가져와 메모리에 적재하고 페이지 테이블을 업데이트한 후 맵핑이 진행된다.
  • TLB(Translation Lookaside Buffer)
    고속 캐시의 일종으로 주소값이 아닌 키 값으로 찾고자하는 워드에 동시 접근한다. 최근에 빈번하게 접근한 엔트리들을 TLB에 저장함으로써 페이지 테이블을 참조하지 않고 빠르게 맵핑이 가능하다.

    위의 기본적인 페이징 시스템에서의 진행 과정에서 페이징 테이블을 살펴보기 전에 TLB를 먼저 살펴본다. TLB에 존재하는 엔트리들은 최근 접근했던 것들이기에 메모리에 모두 적재되어있다. 따라서 TLB에 있는 엔트리들은 존재 비트를 가지지 않는다.

  • 페이지의 보호

    • 페이지 테이블의 엔트리에 해당 페이지에 대한 보호 비트를 두어 접근을 관리한다.
    • 다른 프레임을 침범하지 않기 위해 오프셋의 크기는 페이지의 크기를 넘지 않도록 한다.
  • 페이지의 공유

    • 프로세스간 공유하는 페이지는 각 프로세스의 페이지 테이블에서 같은 엔트리 번호를 가지도록 한다.
      • 공유 페이지에 자신으로 분기하는 코드가 있을 때 만약 프로세스별로 엔트리 번호가 다르다면 맵핑이 제대로 이루어질 수 없다.
  • 페이징 테이블의 구성

    • 계층구조
      전체 페이지 테이블을 모두 메모리에 두기에는 부담이 크기 때문에 필요한 부분만을 메모리에 두고 계층적으로 구성한다. 계층의 크기만큼 가상주소는 필드를 갖게 된다. ex) 2계층 -> [루트 테이블 엔트리 번호(p1), 페이지 테이블 엔트리 번호(p2), 페이지 내 오프셋(d)]
    • 역 페이지 테이블
      메모리에 고정 크기의 페이지 테이블 하나만 두며 메모리의 프레임 수 만큼 엔트리를 가지고 엔트리의 순서는 프레임의 순서와 같다. 이 때 가상주소는 프로세스 번호를 추가적으로 가지게 된다. ex) [pid, p, d]

페이징은 대부분의 시스템에서 채택하고 있는 방식이지만 마지막 페이지는 내부 단편화가 있을 수 밖에없다.

세그먼테이션(Segmentation)

논리적인 단위별로 프로그램의 조각을 다른 크기로 나누어 메모리 관리를 수행한다. 세그먼트 테이블의 엔트리는 존재 비트, 세그먼트의 길이, 실주소, 접근 제어 키 등으로 구성되어있다. 페이징과 다르게 실주소를 계산하는데 쓰이는 프레임 번호를 저장하는 것이 아니라 실주소를 저장하고 있다.

모든 과정은 페이징과 동일하게 진행되지만 논리적인 단위별로 나누어 분할의 크기가 다르기 때문에 외부 단편화가 발생한다.

  • 세그먼트의 보호와 공유

    • 접근 제어 키를 사용하여 보호
    • 페이징과 같은 방식으로 공유
      페이징에서는 공유할 부분이 페이지 사이즈보다 작을 경우 필요없는 부분까지 공유되는데 세그먼테이션은 그럴 경우가 없다. 또한 공유할 부분이 페이지 사이즈보다 큰 경우에 여러 개의 페이지의 엔트리 번호를 같게하여 공유해야 하지만 세그먼트는 실제 공유하고자하는 논리적 단위와 일치하기에 부담이 덜하다.
  • 페이징을 사용하는 세그먼테이션
    페이징과 세그먼테이션의 장점을 함께 가지기 위한 기법으로 세그먼트를 다시 페이지로 쪼개는 것이다. 맵핑을 위한 테이블의 크기가 커지고 실주소로의 접근까지 메모리 접근이 더 요구되는 단점이 있다.

profile
그냥 개발자
post-custom-banner

0개의 댓글