Paging and Segmentation

HunkiKim·2022년 8월 30일
0

가상메모리

가상 메모리 개념

컴퓨터마다 물리 메모리, 즉 실제 메모리의 크기가 다르다. 가상 메모리(virtual memory)는 크기가 다른 물리 메모리에서 일관되게 프로세스를 실행할 수 있는 기술이다. 예를들어 2GB 메모리에서 동작하는 프로그램이 1GB 메모리에서는 동작하지 않을 수 있다.

즉 가상 메모리는 물리 메모리 크기와 상관없이 프로세스에 커다란 메모리 공간을 제공하는 기술이다. 프로세스는 운체가 어딨는지, 물리 메모리 크기가 어느정도인지 신경쓰지 않고 마음대로 사용한다.

가상 메모리 크기,주소

가상 메모리 시스템의 프로세스는 물리 메모리와 별개로 어디있든지 0번지부터 시작하는 연속된 메모리를 가진다. 논리주소와 유사하지만 논리 주소는 물리 메모리의 주소 공간에 비례하지만, 가상 주소는 물리 메모리가 아니라 진짜 가상의 주소 공간이다.

가상 메모리에서 메모리 관리자가 사용할 수 있는 메모리의 전체 크기는 물리 메모리(실제 메모리)와 스왑 영역을 합한 크기이다. 메모리 관리자는 물리 메모리와 스왑 영역을 합쳐서 프로세스가 사용하는 가상 주소를 실제 메모리의 물리 주소로 변환하는데 이러한 작업을 동적 주소 변환(Dynamic Address Translation, DAT)라고 한다. 동적 주소 변환을 거치면 프로세스가 아무 제약 없이 사용자의 데이터를 물리 메모리에 배치할 수 있다. 이 과정에서 메모리 관리자는 물리 메모리를 어떤 방법으로 나눌지, 사용자 프로세스를 어디에 배치할지, 부족한 물리 메모리를 어떻게처리할지 등의 복잡한 문제를 처리한다.

가상 메모리 분할 방식

메모리 분할 방식은 가변 분할 방식과 고정 분할 방식으로 나뉜다고 했는데 가상 메모리 시스템도 마찬가지다. 가상 메모리 시스템에서 가변 분할 방식을 이용한 메모리 관리 기법은 세그먼테이션, 고정 분할 방식을 이용한 메모리 관리 기법은 페이징이라고 한다.

이 중 세그멘테이션 기법은 외부 단편화 등의 문제로 잘 사용되지 않는다. 또한 페이징 기법은 페이지 관리에 어려움이 있다. 따라서 가상 메모리 시스템에서는 두 기법의 단점을 보완한 세그먼테이션-페이징 혼용 기법을 주로 사용한다.

정리

구분가상 메모리물리 메모리
최대 메모리 크기CPU의 비트 값에 의존CPU의 비트 값에 의존
메모리 분할 방식세그먼테이션가변 불항 방식
페이징고정 분할 방식
세그먼테이션-페이징 혼용 기법
주소 지정 방식가상 주소절대 주소, 상대 주소

매핑 테이블

메모리 관리는 매핑 테이블을 사용한다. 가상 메모리 시스템에서 가상 주소는 실제로 물리 주소나 스왑 영역 중 한 곳에 위치하며, 메모리 관리자는 가상 주소와 물리 주소를 일대일 매핑 테이블로 관리한다.

예를들어

프로세스(가상 주소 공간)위치(물리 메모리)
A0
B1
C2
D스왑

..
과 같은 형식이다.페이지 매핑 테이블, 세그먼테이션 매핑 테이블(세그먼테이션 테이블)로 나뉜다.

페이징 기법

페이징 기법은 고정 분할 방식을 이용한 가상 메모리 관리 기법이다. 물리 주소 공간을 같은 크기로 나눠 쓴다.

구현

가상 주소의 분할된 각 영역은 페이지라고 부르며 첫 번째 영역은 페이지 0, 두 번째는 1과 같이 번호를 매겨 관리한다. 물리메모리의 각 영역은 가상 주소의 페이지와 구분하기 위해 프레임(frame)이라고 부른다. 프레임도 번호를 매겨 관리한다. 페이지와 프레임의 크기는 같다.

페이지와 프레임의 크기가 같기 때문에 페이지는 어떤 프레임에도 배치될 수 있다. 그래서 매핑하기 쉽다. 모든 페이지의 위치 정보(매핑 정보)는 페이지 테이블에 담겨있다.

페이지 테이블은 하나의 열로 구성된다. 모든 페이지의 정보를 순서대로 가지고 있기 때문에 위에서부터 차례대로 페이지0, 페이지1과 같은 프레임 번호를 가지고 있어 추가열이 필요없다. 즉 그냥 0번부터 숫자 세면 돼서 인덱스가 필요없다. 물리메모리에 없고 스왑영역에 있다면 invalid라고 표시된다.
가상주소 -> 페이지 테이블 -> 물리주소 식으로 되어있다.

변환

그렇다면 저런식으로 할 때 변환은 어떻게 하면될까?
1. 가상 주소 n번지가 테이블에서 어느 페이지인지 찾는다.
2. 가상 주소가 찾은 페이지가 페이지 테이블에서 어느 프레임을 가리키는지 찾는다.
3. 최종적으로 찾은 프레임에 값을 저장한다. 즉 가상 주소를 물리주소로 매핑하게 된다.

페이징 기법에서 가상 주소를 VA(virtual address) = <P(page),D(distance)> 로 표현하는데 VA는 가상 주소, P는 페이지, D는 페이지의 처음 위치에서 해당 주소까지의 거리를 나타낸다.(D를 offset(변위)라고 정의하기도 한다.)

예를들어 페이지3이 30~39의 주소를 저장하고(페이지 하나의 크기를 10B로 한다고 했을때) 가상 주소 30번지를 접근한다고 하면 VA = <3,0> , 즉 페이지3에 0번째 주소라는 의미이다. 물리 주소는 PA(physical address) = <F(frame),D>로 표현한다.

페이징 기법에서의 주소 변환은 가상 주소 VA = <P,D>를 물리 주소 PA = <F, D>로 변환하는 것이다.

즉 VA = <P, D> -> PA = <F,D>로 정의된다.

페이지와 프레임의 크기가 같기 때문에 D는 그대로 사용한다. 이처럼 페이지 테이블에서 번호를 찾아 해당 프레임의 번호를 쫓아 가면 간단하게 가상 주소를 물리 주소로 변환할 수 있다. 페이지 테이블은 페이지 번호, 프레임 번호로 구성되며, 각각의 한 줄은 페이지 테이블 엔트리(Page Table Entry, PTE)라고 부른다.

P = 가상주소/한페이지의크기의 몫
D = 가상주소/한페이지의크기의 나머지

VA = <P,D>만 구한다면 매핑하는 것은 P로 프레임을 찾은 뒤 해당 프레임에서 D만큼 떨어진 곳에 접근하여 데이터를 가져오면 된다.

관리

페이지 테이블 관리가 복잡한 이유는 시스템에 여러 개의 프로세스가 존재하고 프로세스마다 페이지 테이블이 하나씩 있기 때문이다. 그리고 페이지 테이블관리의 가장 큰 문제는 페이지 테이블의 크기가 작지 않다는 것이다. 만약 CPU에 한 페이지가 512B인 페이징 시스템이 있다고 하자. 만약 물리 메모리의 최대 크기가 4GB라면 , 512B로 페이지를 나누면 최대 24MB가 나온다. 즉 페이지 테이블당 최대 24MB가 나올수 있다는 말이다. 프로세스가 40개라면 1GB가 되는데 이는 1/4에 해당하는 메모리이다. 따라서 페이지 테이블의 크기를 적당하게 유지하는 것이 페이지 테이블 관리의 핵심이다. 이러한 문제 때문에 물리 메모리의 크기가 작을때 프로세스 뿐만 아니라 페이지 테이블의 일부도 스왑영역으로 옮겨진다.

그리고 페이지 테이블에 빠르게 접근하기 위해 레지스터가 존재한다. 각 프로세스가 메모리에 접근하려고 할 때 메모리 관리자는 페이지 테이블의 위치를 빠르게 파악해야한다. 그래서 각 페이지 테이블의 시작 주소를 페이지 테이블 기준 레지스터(Page Table Base Register, PTBR)에 보관한다.이는 각 PCB에 저장되는 데이터로, 물리 메모리 내에 페이지 테이블의 시작 주소를 가지고 있다.

매핑 방식

페이지 테이블 전체를 메모리에서 관리하냐, 일부를 스왑 영역에서 관리하느냐에 따라 가상 주소를 물리 주소로 변환하는 방법이 달라진다.

페이지 테이블 매핑 방식에는 직접 매핑, 연관 매핑, 집합-연관 매핑, 역매핑이 있다.

  • 직접 매핑(direct mapping) : 페이지 테이블 전체가 물리 메모리의 운영체제 영역에 존재하는 방식이다. 별다른 부가작업 없이 주소 변환이 가능하다.
  • 연관 매핑(associative mapping) : 페이지 테이블 전체를 스왑 영역에서 관리하는 방식이며 물리 메모리의 여유 공간이 작을 때 사용하는 방식으로, 모든 페이지 테이블을 저장장치의 스왑영역에 저장하고 그중 일부만 물리 메모리에 가지고 있다. 일부 내용만 무작위로 배치하기 때문에 페이지 번호와 프레임 번호 둘 다 표시한다. 주소 변환 시 직접 매핑은 원하는 프레임 번호를 한 번에 얻지만 연관 매핑은 검색을 통해 얻는다(무작위라). 그리고 물리 메모리에 없으면 또 스왑 영역 페이지 테이블을 검색한다. 시간낭비가 심하다.
  • 집합-연관 매핑(set-associative mapping) : 연관 매핑의 문제를 개선한 방식이다. 연관 매핑과 기본적으로 동일하지만, 물리 메모리가 무작위가 아니라 페이지 테이블을 일정한 집합으로 자르고, 자른 덩어리 단위로 물리 메모리에서 가져온다. I(invalid)와 주소로 나뉘어 모든 페이지 테이블을 검사할 필요 없어 주소 변환 시간이 단축된다.
  • 역매핑(invert mapping) : 세 가지 매핑과 반대로 페이지 테이블을 구성하는 방식이다. 앞의 세가지는 페이지 테이블을 기준으로 테이블 구성을 하지만 역매핑은 물리 메모리의 프레임 번호를 기준으로 테이블을 구성한다.가장 큰 특징은 프로세수의 수와 관계 없이 테이블이 하나만 존재한다. 물리 메모리를 기준으로 프레임 테이블을 만들기 때문이다. 테이블의 크기가 매우 작다는 장점이 있다. 하지만 프로세스가 가상 메모리에 접근할 때 프로세스 아이디와 페이지 번호를 모두 찾아야 하는 단점이 있다. 즉<PID , page>를 모두 찾아야 한다. 또한 모든 페이지를 검색한 후 해당 페이지가 스왑에 있는걸 알 수 있어 매우 느리다.

TLB(Translation Lock-aside Buffer, 변환 색인 버퍼) : 페이지 번호와 프레임 번호로 구성된 작은 크기의 테이블이다.
Associate Register : 연관 버퍼

동작 방식

  • 직접 매핑
    • 테이블 전체가 물리 메모리에 저장되기 때문에 페이지 테이블의 P번째 위치에서 원하는 프레임값을 얻을 수 있다.
  • 연관 매핑
    • 캐시 시스템과 유사하다.
    • 캐시 시스템에서 원하는 데이터가 캐시에 있는 경우 캐시 히트, 없는 경우 캐시 미스라고 한다. 연관 매핑도 변환 색인 버퍼를 찾아보고 있으면 TLB hit이라고 하며, 바로 물리 주소로 변환된다.
    • 없으면 TLB miss라고 하며, 스왑 영역에 저장된 직접 매핑 테이블을 사용하여 프레임 번호로 변환된다.
  • 집합-연관 매핑
    • 페이지 테이블을 같은 크기의 여러 묶음으로 나누고, 각 묶음의 시작 주소를 가진 디렉터리 테이블을 새로 만들어 관리.
    • 연관 매핑과 마찬가지로 스왑 영역에 있으며, 일부 테이블을 묶음 단위로 메모리로 옮긴다.
    • 따라서 해당 묶음이 현재 메모리에 있는지, 스왑 영역에 잇는지를 표시하는 디렉터리 테이블을 새로 만든다.
    • 디렉터리 테이블을 살펴보면 원하는 테이블 묶음이 어디에 있는지 알 수 있으므로 전체 테이블을 찾지 않고 TLB미스를 알 수 있다.
    • 일정 크기 묶음으로 나뉘기 때문에 가상 주소 VA = <P1, P2, D>로 바꾸어 표시한다. P1은 디렉터리 테이블에서의 위치 정보를, P2는 묶음 내에서의 위치 정보를 나타낸다. 집합-연관 매핑 방식에서는 두 단계를 거쳐 물리 주소로 변환된다.
    • 즉 집합-연관 매핑 방식은 페이지 주소를 세분화한다. 여기서 P1은 P2 테이블 덩어리가 메모리 영역에 있는지, 스왑 영역에 있는지에 대한 위치정보를 나타낸다. 그래서 집합-연관 매핑을 멀티페이지 매핑(multi-page mapping)이라고도 한다.
    • 디렉터리 페이지 테이블의 시작 주소는 페이지 테이블 기준 레지스터(PTBR)가 가지고 있다.I는 TLB 미스가 발생한 것이다.
    • 크기가 큰 페이지 테이블을 같은 크기의 묶음으로 나누어 관리함으로써 효율적이다. 또한 일부 페이지 테이블만 메모리에서 관리하여 물리 메모리를 낭비하지 않는다.
  • 역매핑
    • 역매핑은 물리 메모리의 프레임 번호를 기준으로 테이블을 작성한다.
    • 페이지 테이블의 행 수는 실제 프레임의 수와 같다. 그래서 페이지 테이블이 작다.
    • PID,페이지 번호가 물리 메모리에 있는지 역매핑 테이블에서 검색한다.
    • 원하는게 없으면 스왑영역에서 가져온다. 따라서 연관 매핑과 마찬가지로 검색시간 오래걸리는 단점이 있다.

세그먼테이션 기법

가변 분할 방식을 이용한 가상 메모리 관리 기법으로, 물리 메모리를 프로세스 크기에 따라 가변적으로 나누어 사용한다.

구현

마찬가지로 매핑 테이블을 사용하는데 이를 세그먼테이션 테이블(segmentation table) or 세그먼테이션 매핑 테이블(segmentation mapping table) 이라고 한다. 세그먼테이션 테이블에는 세그먼테이션의 크기를 나타내는 limit와 물리 메모리상의 시작 주소를 나타내는 address가 있다.

세그먼테이션도 물리 메모리가 부족하면 스왑 영역을 사용한다. 스왑영역에 있으면 address에 I로 표시한다.

세그먼테이션 기법은 가변 분할 방식의 장점과 단점을 모두 가지고 있다. 장점은 메모리를 프로세스 단위로 관리하기 때문에 페이지 테이블이 작고 단순하고, 단점은 물리 메모리의 외부 단편화로 인해 물리 메모리 관리가 복잡하다.

변환

세그먼테이션 기법은 가상 주소를 VA=<S,D>로 표현한다.S는 세그먼트 번호(segment number),D는 세그먼트 시작 지점에서 해당 주소까지의 거리(distance)를 의미한다. 가상 메모리 시스템에서 사용자에게 보이는 메모리는 항상 0부터 시작하므로 D는 사용자가 지정한 주소 그 자체이다.
만약 프로세스 A의 32번지에 접근할 때 주소 변환 과정이 있다고 하자. VA=<0,32>라고 하자.
1. 가상 주소를 구한다. VA=<0,32>
2. 세그먼테이션 테이블에서 세그먼트 0의 시작 주소를 알아낸 후 시작 주소(세그먼테이션 테이블의 address) 120에 거리 32를 더하여 물리 주소 152를 구한다. 이때 메모리 관리자는 거리가 세그먼트의 크기보다 큰지 점검해야 한다. 크다면 메모리 오류, 작다면 물리 주소를 구한다.
3. 물리주소 152번지에 접근하여 원하는 데이터를 읽거나 쓴다.

세그먼테이션 테이블의 limit는 메모리를 보호하는 역할을 한다. A의 크기보다 더 큰 주소에 접근하려고 하면 메모리 관리자는 프로세스를 강제 종료하는데, 이를 이 오류를 트랩(trap)이라고 한다. 트랩은 의도치 않게 일으키는 인터럽트를 말한다. 트랩 발생시 segmentation fault를 보낸다. 따라서 VA=<S,D>에서 D는 메모리 보호의 의미가 있다.

세그먼테이션-페이징 혼용 기법

앞에서 본 기법들은 각각 장단점을 가지고 있다. 페이징은 같은 크기로 관리해 메모리 관리가 쉽운 반면 테이블의 크기가 크다. 반대로 세그먼테이션은 관리는 어렵지만 테이블의 크기가 작다. 이러한 장점만 취한게 이 기법이다.

메모리 접근 권한

메모리 접근 권한은 읽기(read), 쓰기(write), 실행(execute), 추가(append) 권한이 있다. 일반적인 데이터는 읽기 및 쓰기 권한, 상수나 읽기 전용파일에는 읽기 권한이 적용된다. 따라서 메모리 제어 방식(access control modes)가 나오는데 아래와 같다.

구분읽기쓰기실행비고
모드0XXX접근 불가
모드1XXO실행만 가능
모드2XOX실제로 사용하지 않음
모드3XOO실제로 사용하지 않음
모드4OXX읽기 전용
모드5OXO읽고 실행 가능
모드6OOX읽고 쓰기 가능
모드7OOO제한 없음
  • 프로세스의 코드 영역 : 자기 자신을 수정 못하기 때문에 읽기 및 실행 권한을 가진다.
  • 데이터 영역 : 데이터는 크게 읽거나 쓸 수 있는 데이터와 읽기만 가능한 데이터로 나뉜다.

메모리 접근 권한 검사는 가상 주소에서 물리 주소로 주소 변환이 일어날 때마다 시행된다. 만약 읽기만 가능한 메모리 영역에서 쓰기를 하려고 하면 트랩이 발생한다. 어떤 기법이든 메모리 접근 권한에 대한 정보를 가지고 있으며, 주소 변환이 일어날 때마다 유용한 접근인지 아닌지 검사한다.

도입

페이지마다 접근 권한이 다르기 때문에 메모리 페이지 테이블의 모든 행에는 접근 권환과 관련된 권한 비트(right bit)가 추가된다. 주소 변환마다 유용한 접근인지 확인한다. 이런 권한이 추가되면 당연하게 페이지 테이블의 크기가 커진다. 이러한 문제를 완화하려면 반복되는 권한 비트를 줄여아 한다.

이는 세그먼테이션 테이블을 이용하여 해결 가능하다. 페이지로 분할된 가상 주소 공간에서 서로 관련 있는 영역을 하나의 세그먼트로 묶어 세그먼테이션 테이블로 관리하고, 각 세그먼트를 구성하는 페이지를 해당 테이블로 관리하는 방식이다. 각 세그먼테이션 테이블은 자신과 연결된 페이지 테이블의 시작 주소를 가진다. 현재 대부분의 운영체제는 이 방식을 사용하고 있다.

세그먼테이션-페이지 혼용 기법을 사용함에 따라 줄어드는 데이터는 권한 비트만 있는것이 아니다. 유닉스는 소유 권환과 접근 권한이 같이 명시되어 있다. 어떤 파일이든 소유자가 지닌 권한 외에 자신이 속한 그룹이 지닌 권한, 자신의 그룹에 속하지 않은 다른사람이 지닌 권한이 명시되어 있다. 순수 페이징 기법은 이러한 특성을 모든 페이지 테이블에 새로운 속성 필드를 추가하지만, 혼용 기법은 세그테이블에서 관리함으로 추가되는 데이터의 양을 줄일 수 있다.

변환

가상 주소를 VA = <S,P,D>로 표현한다. S는 세그먼트 번호, P는 페이지 번호, D는 페이지의 처음 위치에서 해당 주소까지의 거리이다.
1. 사용자가 어떤 주소에 있는 데이터를 요청하면 해당 주소가 몇 번째 세그먼트의 몇 번째 페이지로부터 얼마나 떨어져 있는지 계산하여 가상 주소 VA = <S,P,D>를 구한다.
2. 세그먼테이션 테이블의 해당 세그먼트 번호로 가서 자신의 영역을 벗어나는 불법 접근이 아닌지, 권한이 없는지 등을 확인한다. 만약 비정상적인 접근이면 트랩을 발생시킨다.
3. 페이지 테이블에서 해당 페이지가 어느 프레임에 저장되었는지 찾는다. 없으면 스왑영역에 가서 해당 페이지를 물리 메모리로 가져온다.
4. 물리 메모리에 있는 프레임의 처음 위치에서 D만큼 덜어진 곳에 접근하여 데이터를 읽거나 쓴다.

0개의 댓글