가상 메모리 도입의 필요성
저번 글에서 연속 메모리 할당 방식의 문제점에 대해 알아보았습니다.
연속 메모리 할당 방식에서 가장 큰 문제점은 다음과 같습니다.
1. 외부 단편화(메모리 공간이 충분한데도, 연속적으로 프로세스를 배치하지 못하여 프로세스를 실행하지 못하는 문제)
2. 물리 메모리 보다 큰 프로세스 실행 불가
이러한 문제들을 가상 메모리의 페이징 기법을 활용하여 해결이 가능합니다.
<이전글>
https://pjh0805.tistory.com/68
연속 메모리 할당의 문제점은?
연속 메모리 할당이란? 연속 메모리 할당이란 아래 그림과 같이 프로세스에 연속적인 메모리 공간을 할당하는 방식을 뜻합니다. 연속 메모리 할당 방식 프로세스는 메모리의 빈 공간에 할당되
pjh0805.tistory.com
가상 메모리란?
가상 메모리는 실행하고자 하는 프로그램을 일부만 메모리에 적재하여 실제 메모리 크기보다 더 큰 프로세스를
실행할 수 있게 하는 기술을 말합니다.
가상 메모리의 관리 기법으로는 페이징과 세그멘테이션이 있는데, 현대 운영체제의 대부분이 사용하는
페이징 기법에 대해서만 다루도록 하겠습니다.
가상 메모리에 대해 자세히 이해하려면, 먼저 페이징과 스와핑에 대한 개념을 알아야 합니다.
이에 대하여 차례대로 살펴보도록 하겠습니다.
페이징
외부 단편화가 발생한 이유는 각기 다른 크기의 프로세스가 메모리에 연속적으로 할당되었기 때문에 발생하였습니다.
만약 메모리에 적재되는 프로세스의 크기가 전부 일정했더라면, 외부 단편화 문제는 발생하지 않았을 겁니다.
페이징은 이것을 가능케 합니다. 프로세스를 일정한 크기로 자르고 이를 메모리에 불연속적으로 할당하기 때문입니다.
페이징이란
프로세스의 논리 주소 공간을 페이지라는 일정 단위로 자르고 , 메모리의 물리 주소 공간을 프레임이라는 페이지와 동일한
일정한 단위로 자른 뒤 페이지를 프레임에 할당하는 가상 메모리 기법을 뜻합니다.
말이 조금 어렵죠?
위의 그림과 같이 논리 주소를 페이지라는 단위로 자르고 해당 페이지를 물리 주소에 할당하는 방식을 페이징이라고 합니다.
스와핑
현재 사용되지 않는 프로세스들을 보조기억장치 일부 영역으로 쫒아내고 그렇게 생긴 빈 공간에 새 프로세스를 적재하는
방식을 스와핑이라고 합니다.
여기서 중요한 키워드 들이 있는데 다음과 같습니다.
스왑 영역 - 프로세스들이 보조기억장치로 쫒겨나가서 형성된 일부 영역
스왑 아웃 - 현재 실행되지 않는 프로세스가 메모리에서 스왑영역으로 옮겨지는 것을 의미
스왑 인 - 스왑 영역에 있던 프로세스가 다시 메모리로 옮겨오는 것을 의미
이러한 스와핑을 활용하면 메모리 주소 공간의 크기에 실제 메모리 크기보다 더 큰 경우에도 프로세스들을
동시 실행할 수 있습니다.
위 그림과 같이 프로세스 A B C D E 를 동시에 실행시키고 싶은데, 그렇게 되면 실제 메모리 공간보다 더 큰 공간이
필요한 경우가 있을 수 있습니다.
다시 말하면 프로세스들이 요구하는 메모리의 공간 크기가 실제 메모리 공간의 크기를 넘어서는 경우인 것이죠.
스와핑을 활용하면 이런 경우에도 프로세스를 동시에 실행시킬 수 있습니다.
메모리 공간을 넘어서지 않을 만큼 프로세스를 적재한 다음, 지금 당장 실행되지 않는 프로세스를 스와핑하여
보조기억장치에 넣어두고, 다른 프로세스를 적재하는 방식을 활용하면 실제 메모리 공간의 크기를 넘어서는
프로세스들을 동시에 실행할 수 있습니다.
페이징에서의 스와핑
스와핑은 페이지 단위로도 일어날 수 있습니다.
이떄 보조 기억 장치에서 메모리로 이동하는 스왑 인을 페이지 인 이라고 부르고
메모리에서 보조기억장치로 이동하는 스왑 아웃 을 페이지 아웃이라고 부릅니다.
페이징에서의 스와핑이 가능하다는 말은 어떤 프로세스가 실행되기 위하여 필요한 모든 페이지가 메모리에 저장될 필요가
없다는 것을 의미합니다.
사용하지 않는 페이지는 보조기억장치에 위치해두고 필요할 때 메모리로 불러들여 사용하면 되기 때문이죠.
이를 활용하여 물리 메모리 보다 큰 프로세스도 실행할 수 있게 되는 것입니다.
페이징의 문제점
페이징은 아까 말했듯이, 프로세스를 일정한 크기로 자르고 실제 메모리에 불연속적으로 할당하는 방식입니다.
하지만 이렇게 되면 CPU입장에서 실행할 프로세스가 어디에 위치해있는지 알기 어렵습니다.
연속 메모리 할당 방식에서는 시작점부터 순차적으로 실행하기만 됬었는데, 페이징에서는 이것이 불가능한 것입니다.
이러한 문제를 해결하기 위해 나온 개념이 페이지 테이블입니다.
페이지 테이블
페이지 테이블은 페이지 번호와 프레임 번호를 매핑해주는 테이블을 뜻합니다.
페이지 테이블을 통해서 CPU는 불연속적으로 할당된 물리 메모리를 순차적으로 실행할 수 있게 됩니다.
페이지 테이블은 프로세스 마다 존재합니다.
위 그림과 같이 물리적으로 프로세스들이 프레임 단위로 잘려서 불연속적이고 분산되어 저장되어 있더라도,
페이지 테이블을 통해서 CPU입장에서 바라본 논리주소는 연속적으로 보이게 됩니다. 즉 논리주소를
순차적으로 실행하게 되면 모든 프로세스들을 순차적으로 실행할 수 있게 되는 것이죠.
내부 단편화 문제
페이지 테이블을 통해서 비연속적인 메모리의 순차적인 실행을 할 수 있지만, 해결할 수 없는 문제가 있습니다.
바로 내부 단편화 문제입니다. 외부 단편화와 달리 내부 단편화는 일정한 단위로 자르는 페이지로 인해 생겨납니다.
위의 그림을 보면, 일정한 단위로 페이지가 나뉘어지고 이를 실제 메모리에 할당하고 있는 것을 볼 수 있습니다.
하지만 마지막 페이지 n을 보면, 프로세스의 크기가 페이지의 크기를 채우지 못하고 있는 것을 확인할 수 있습니다.
전체 프로세스의 크기가 42KB이고 페이지가 10KB이면 총 5개의 페이지가 필요하고 이는 50KB가 될 것입니다.
50 - 42 = 8KB 정도의 메모리가 내부단편화 문제로 인하여 낭비되게 되는 것이죠.
내부 단편화를 해결하려면, 페이지의 크기를 작게 설정하면 됩니다. 하지만 페이지의 크기를 너무 작세 설정하면
이에 따라 페이지가 많이 생겨나게 되고, 페이지 테이블의 크기도 커지게 됩니다.
내부 단편화로 인한 메모리 낭비를 피하려고 하다가, 과도한 페이지 테이블의 크기로 인한 메모리 낭비가 발생할
수 있는 것이죠. 따라서 내부 단편화를 방지하면서, 너무 큰 페이지 테이블이 만들어지지 않도록 페이의 크기를
조정하는 것이 중요합니다.
PTBR (Pabe Table Base Register)
이전에 페이지 테이블은 프로세스 마다 존재한다고 했습니다. 각각의 페이지 테이블 또한 어딘가에 저장이 될 것입니다.
그래야 CPU가 각각의 프로세스의 페이지 테이블이 어디에 저장되어 있는지 파악할 수 있기 때문입니다.
각각의 페이지 테이블이 한곳에 저장되는 장소가 바로 프로세스 테이블 베이스 레지스터(PTBR)입니다.
PTBR은 다시말하자면, 각각의 프로세스가 가지고 있는 프로세스 테이블에 대한 주소를 저장하는 저장소입니다.
최종적으로 페이지를 통해 메모리에 접근하는 과정을 다음과 같을 것입니다.
1. 페이지 테이블 베이스 레지스터를 통해서 실행하려고 하는 프로세스의 페이지 테이블이 저장되어 있는 곳을 찾는다.
2. 페이지 테이블을 활용하여 접근하려는 페이지가 저장되어 있는 물리 공간 주소를 알아낸다 (메모리 접근 1번)
3. 페이지 테이블을 통해 알아낸 물리 메모리 주소를 CPU에 반환하고 다시 메모리에 접근하여 데이터를 가져온다
(메모리 접근 2번)
이를 다시말하면, 페이지를 활용하게 되면 메모리 접근을 두번을 해야되는 것을 의미합니다. 이렇게 되면 메모리 접근
시간이 페이지를 활용하지 않았을 때와 비교하여 2배로 길어지는 단점이 생기게 됩니다.
이러한 단점을 해결하기 위해 나온 것이 TLB 입니다.
TLB(Translation Lookaside Buffer)
TLB는 CPU옆에 있는 페이지 테이블의 캐시 메모리를 뜻합니다. 페이지 테이블의 일부로 가져와서 캐시 처럼 활용하는
것이죠. 만약 캐시한 페이지 테이블이 TLB에 존재하게 된다면, 페이지 테이블 참조를 할 필요가 없이 바로 물리 메모리에
접근하면 되서 1번의 메모리 접근으로 데이터를 가져올 수 있습니다..
하지만 TLB 또한 캐시의 성격을 띄기 때문에 접근하려는 논리 주소가 TLB에 있을 경우, 없을 경우에 따라 메모리
접근 횟수가 달라지게 됩니다.
여기서 TLB 히트와 TLB 미스라는 개념이 등장합니다.
TLB 히트는 CPU가 접근하려는 논리 주소가 TLB에 있어서 한번의 메모리 접근으로 데이터를 가져올 수 있는 상황을 말합니다.
TLB 미스는 CPU가 접근하려는 논리 주소가 TLB에 없어서 페이지 테이블에 한번, 물리 주소 메모리에 한번, 총 2번의
메모리 접근을 해야되는 상황을 말합니다.
페이징의 주소변환
페이징을 사용하는 시스템에서 특정 주소에 접근하고자 한다면, 두 가지 정보가 필요합니다.
1. 어떤 페이지 혹은 프레임에 접근하고 싶은지 - <페이지 번호>
2. 접근하려는 주소가 해당 페이지로 부터 얼마나 떨어져 있는지 - <변위 >
이를 다시 말하자면, 메모리의 논리 주소 (페이지 주소, 변위)는 페이지 테이블을 통해서 물리 주소 (프레임 번호, 변위) 로
변환되는 것을 의미합니다.
이 떄 논리주소상의 변위와 물리 주소상 변위는 같습니다. 논리 주소나 물리 주소나 페이지, 프레임 단위는 동일하기 때문입니다. 만약 페이지와 프레임의 크기가 서로 상이하다면, 각각의 변위가 달라지게 되고 주소 변환이 불가능해지게 됩니다.
페이지 테이블 엔트리
페이지 테이블에 대해서 자세히 살펴보도록 하겠습니다. 사실 페이지 테이블에는 페이지 번호와 프레임 번호 이외에도
다양한 정보들이 있습니다. 또한 페이지 테이블의 각각의 행을 페이지 테이블 엔트리 라고 부릅니다.
페이지 테이블에 다양한 정보들이 담길 수 있겠지만, 대표적인 것들이 유효 비트, 보호 비트, 참조 비트, 수정 비트가 있습니다. 각각에 대해서 자세히 살펴보도록 하겠습니다.
유효비트
유효비트는 현재 해당 페이지에 접근 가능한 여부를 아렬줍니다. 이전에 페이징에서도 스와핑이 가능하다고 했습니다.
이를 다시 말하면, 일부 페이지는 보조 기억 장치(스왑영역)에 위치하는 경우가 있다는 의미이기도 합니다. 유효 비트는
현재 페이지가 메모리에 적재되어 있는지 보조 기억 장치에 있는지를 알려주는 비트입니다.
페이지가 메모리에 적재 되어있으면 유효 비트가 1이되고, 메모리에 적재 되어 있지 않다면 0의 값을 갖게 됩니다.
만약 CPU가 유효비트가 0인 페이지에 접근하려고 하면, 페이지 폴트(Page Fault)라는 예외가 발생합니다.
페이지 폴드가 발생하면 CPU는 인터럽트를 발생하여, 페이지 폴트처리 루틴을 실행하게 됩니다. 보조기억장치에 있는
페이지를 메모리로 가져와서 유효 비트를 1로 변경해주고, 메모리에 있는 페이지에 접근하게 되는 것이죠.
보호비트
보호 비트는 페이지 보호 기능을 위해 존재하는 비트입니다. 비트가 0인 경우 이 페이지는 읽기만 가능한 페이지를 나타내고 1인 경우 일기 쓰기가 모두 가능한 페이지임을 나타냅니다.
보호비트를 조금 더 복잡하고 구현하려면 읽기(R) 쓰기(W) 실행(X)의 조합으로 구현하기도 합니다.
참조비트
참조비트는 CPU가 페이지에 접근한 적이 있는지 여부를 나타냅니다. 적재 이후 읽거나 쓴 페이지는 참조비트가 1로 설정되고 적재 이후 읽거나 쓴적이 없는 페이지는 0으로 유지됩니다.
수정비트
수정 비트는 해당 페이지에 데이터를 쓴 적이 있는지 없는지 수정 여부를 알려줍니다. 1이면 변경된 이력이 있는지 페이지,
0이면 변경된 적이 없는 페이지를 나타냅니다.
수정 비트가 필요한 이유는 페이지가 메모리에서 사라지고 페이지 아웃되어 보조기억장치로 갈 때 보조기억장치에
쓰기 작업을 해야하는지, 할 필요가 없는지 판단하기 위해 존재합니다. 수정할 필요가 없으면 페이지를 보조기억장치에
그대로 두면 되고, 만약 수정할 필요가 있따면, 보조 기억장치에 기록하는 추가적인 작업이 필요합니다. 이를 파악 하기 위하여 페이지 테이블 엔트리에 수정 비트를 두는 것입니다.
이상으로 가상메모리의 페이징 기법에 대해 살펴보았습니다.
긴 글 읽어 주셔서 감사합니다.
해당 글은 [ 혼자 공부하는 컴퓨터 구조 + 운영체제 ] 책과 유튜브 영상을 보고 정리한 글입니다.
참고 자료
https://www.youtube.com/watch?v=8ufliWkgqMo&list=PLYH7OjNUOWLUz15j4Q9M6INxK5J3-59GC&index=41&loop=0
혼자 공부하는 컴퓨터 구조+운영체제 | 강민철 - 교보문고
혼자 공부하는 컴퓨터 구조+운영체제 | 혼자 해도 충분합니다! 1:1 과외하듯 배우는 IT 지식 입문서42명의 베타리더 검증으로, ‘함께 만든’ 입문자 맞춤형 도서이 책은 독학으로 컴퓨터 구조와
product.kyobobook.co.kr
'CS > 운영체제' 카테고리의 다른 글
동기/비동기 블로킹/논블로킹에 대하여 (0) | 2023.08.31 |
---|---|
페이지 교체와 프레임 할당이란? (0) | 2023.05.16 |
연속 메모리 할당의 문제점은? (0) | 2023.05.03 |
교착 상태 (0) | 2023.04.07 |
프로세스 동기화란 (0) | 2023.03.15 |