본문 바로가기
책/혼공 컴퓨터구조+운영체제

운영체제 - 가상메모리, 페이징, 페이지 테이블, PTBR, TLB

by 코딩하는 돼징 2024. 2. 26.
반응형

연속 메모리 할당의 두 가지 문제점

외부 단편화와 물리 메모리보다 큰 프로세스 실행 불가

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

 


가상메모리(Virtual Memory)

실행하고자 하는 프로그램을 일부만 메모리에 적재하여 실제 물리 메모리 크기보다 더 큰 프로세스를 실행할 수 있게 하는 기술이다. 이를 가능하게 하는 가상 메모리 관리 기법에는 크게 페이징과 세그멘테이션이 있다.


페이징이란?

외부 단편화가 생긴 근본적인 이유는 각기 다른 크기의 프로세스가 메모리에 연속적으로 할당되었기 때문이다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard


프로세스를 일정 크기로 자르고 이를 메모리에 불연속적으로 할당할 수 있다면 어떨까?

외부 단편화가 발생하지 않는다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard


페이징(Paging)

프로세스의 논리 주소 공간을 페이지(page)라는 일정 단위로 자르고 메모리의 물리 주소 공간을 프레임(frame)이라는 페이지와 동일한 일정한 단위로 자른 뒤 페이지를 프레임에 할당하는 가상 메모리 관리 기법이다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

01 페이징에서의 스와핑

프로세스 단위의 스왑 인, 스왑 아웃이 아닌 페이지 아웃(page out), 스왑인은 페이지 인(page in)이라고 부른다. 메모리에 적재될 필요가 없는 페이지들은 보조기억장치로 스왑아웃, 실행에 필요한 페이지들은 메모리로 스왑인 된다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

이는 다르게 말하면 프로세스 실행하기 위해 모든 페이지에 적재될 필요가 없다는 말과 같다. 달리 말해 물리 메모리보다 더 큰 프로세스를 실행할 수 있다는 말이다. 

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

여기서 문제!

프로세스를 이루는 페이지가 어느 프레임에 적재되어 있는지 CPU가 일일이 알기 어렵다. 그리고 프로세스가 메모리에 불연속적으로 배치되어 있다면 CPU입장에서 이를 순차적으로 실행할 수가 없다. 또한 CPU입장에서 '다음에 실행할 명령어 위치'를 찾기가 어려워진다.

이러한 문제들을 해결하기 위해 사용하는 것이 페이지 테이블이다.


페이지 테이블

(실제 메모리 내의 주소인)물리 주소에 불연속적으로 배치되더라도 (CPU가 바라보는 주소인)논리 주소에는 연속적으로 배치되도록 하는 방법이다. 페이지 번호와 프레임 번호를 짝지어 일종의 이정표 역할을 한다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

프로세스마다 페이지 테이블이 있다. CPU가 페이지번호를 통해 프레임에 접근할 수 있다. 그러므로 CPU는 논리 주소를 순차적으로 실행하면 된다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

외부 단편화는 해결할 수 있지만 내부 단편화 문제가 발생할 수 있다. 

내부 단편화(Internal fragmetation)

페이징은 프로세스의 논리 주소 공간을 페이지라는 일정한 크기 단위로 자른다. 근데 모든 프로세스가 페이지 크기에 딱 맞게 잘리지 않는다. 그러므로 모든 프로세스 크기가 페이지의 배수가 아니다. 페이지 크기가 10KB인데 프로세스의 크기가 108KB라면 마지막 페이지는 2KB가 남는다. 이 메모리 낭비가 내부 단편화이다. 

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard


PTBR(Page Table Base  Register)

프로세스마다 페이지 테이블이 있고 각 페이지 테이블이 적재된 주소를 CPU내의 PTBR가 가리킨다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

페이지 테이블을 메모리에 두면 문제가 있다. 메모리 접근 시간이 두배로 늘어난다는 점이다.

첫번째로 메모리에 있는 페이지 테이블을 보기 위해 한 번, 그렇게 알게 된 프레임에 접근하기 위해 한 번 총 두 번의 메모리 접근이 필요하다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard


TLB(Translation Lookaside Buffer)

CPU곁에는 TLB가 있다. TLB는 페이지 테이블의 캐시이기 때문에 페이지 테이블의 일부 내용을 저장한다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

01 TLB 히트

CPU가 접근하려는 논리 주소가 TLB에 있다면 메모리에 한 번 접근한다.

02 TLB 미스

CPU가 접근하려는 논리 주소가 TLB에 있다면 메모리에 두 번 접근한다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard


페이징에서의 주소 변환

하나의 페이지 혹은 프레임은 여러 주소를 포괄하고 있다. 그렇기에 특정 주소에 접근하려면 아래와 같은 두 가지 정보가 필요하다.

어떤 페이지 혹은 프레임에 접근하고 싶은지, 접근하려는 주소가 그 페이지 혹은 프레임으로부터 얼마나 떨어져 있는지이다.

그렇기 때문에 페이징 시스템에서는 모든 논리 주소가 기본적으로 페이지 번호(page number)와 변위(offset)로 이루어져 있다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

페이지 번호(page number)

말 그대로 접근하고자 하는 페이지 번호이다. 페이지 테이블에서 해당 페이지 번호를 찾으면 페이지가 어떤 프레임에 할당되었는지 알 수 있다.

변위(offset)

접근하려는 주소가 프레임의 시작 번지로부터 얼만큼 떨어져있는지를 알기 위한 정보이다.

그러므로 논리 주소 <페이지 번호, 변위>는 페이지 테이블을 통해 물리 주소<프레임 번호, 변위>로 변환된다.

(논리 주소의 변위와 물리 주소의 변위 값은 같다)

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard


페이지 테이블 엔트리(PTE, Page Table Entry)

페이지 테이블의 각각의 행들을 페이지 테이블 엔트리라고 한다.

01 유효 비트(valid bit)

현재 해당 페이지에 접근 가능한지 여부를 알려준다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

유효비트가 0인 페이지에 접근하려고 하면 어떻게 될까?

페이지 폴드(page fault)라는 예외가 발생한다.


02 보호 비트(protection bit)

페이지에 접근할 권한을 제한하여 페이지를 보호하는 비트이다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard


03 참조 비트(reference bit)

CPU가 이 페이지에 접근한 적이 있는지 여부

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard


04 수정 비트(modified bit)

해당 페이지에 데이터를 쓴 적이 있는지 없는지 수정 여부를 알려준다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

수정 비트가 왜 필요한가요?

아래 그림과 같이 읽기만 한 페이지 같은 경우 보조기억장치에 저장된 해당 페이지의 내용과 메모리에 저장된 페이지 내용이 같다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

하지만 쓰기 작업을 한 페이지의 경우 보조기억장치에 저장된 페이지의 내용과 메모리에 저장된 페이지 내용은 서로 다른 값을 가지게 된다.

출처 : https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

그러므로 수정된 적이 있는 페이지가 스왑 아웃될 경우 변경된 값을 보조기억장치에 기록하는 작업이 필요하다. 이 작업이 필요한 페이지인지 아닌지를 판단하기 위해 페이지 테이블 엔트리에 수정비트를 두는 것이다.

 

 

 

 

 

 

 

참고 :  본 내용은개발자를 위한 컴퓨터공학 1: 혼자 공부하는 컴퓨터구조 + 운영체제강의를 수강하여 작성하였습니다. https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

 

 

 

반응형

댓글