서론
페이징 기법에 관한 지식들을 공부하고, 정리했던 내용을 바탕으로 글을 작성해 보았습니다
혹시나 틀린 내용이 있다면 지적해 주시면, 바로 반영하도록 하겠습니다
Paging ?
모든 프로세스를 일정 크기로 잘라서 메모리에 불연속적으로 배치하는 것
- Process 의 논리 주소 공간을 Page 라는 일정 단위로 자름
- Memory 의 물리 주소 공간을 Frame 이라는 페이지와 동일한 Size 로 자름
왜 Paging 을 하는가?
- Process 들의 크기는 모두 제각각이다
- 프로세스들은 실행되는 시점에 메모리에 배치되어 있어야 실행이 가능하다
- 프로세스들을 메모리에 탑재하다 보면, 중간 중간에 실행이 끝나 메모리에서 삭제되어 빈 공간이 나타난다
- 새로 메모리에 배치할 프로세스의 크기가 빈 공간의 크기보다 크다면 배치할 수 없다
- 이를 외부 단편화(external fragmentation) 이라고 한다
따라서, 프로세스의 논리 공간을 쪼갠 Page 를 메모리의 물리 공간을 쪼갠 Frame 이라는 공간에 할당하여 각기 다른 크기의 프로세스를 효율적으로 메모리 내에 배치할 수 있게 된다
Page swapping
- 실행에 필요한 부분(Page) 만 메모리에 적재하고, 실행되지 않는 부분은 보조 기억장치에 저장해 둔다
- 메모리에 적재될 필요가 없는 Page 를 보조 기억장치로 보내는 것을 Swap Out(Page Out) 이라고 한다
- 실행에 필요한 페이지를 메모리로 가져오는 것을 Swap In(Page In) 이라고 한다
이는 프로세스를 이루는 모든 Page 가 메모리에 적재되어 있지 않아도 되는 것을 의미하며,
이렇게 되면 물리 메모리보다 큰 프로세스도 실행할 수 있게 된다
문제점
- 프로세스의 각 Page 들이 실제 메모리에 어디에 저장되어 있는지를 CPU가 알기 어렵다 (어느 Frame 에 적재되어 있는지)
- 해당 프로세스를 메모리 내부에서 순차적으로 실행이 어렵다 (불연속적으로 배치되어 있기 때문)
- 따라서, Page Table 을 두어 해당 프로세스의 Page가 메모리 물리 공간 어디에 저장되어 있는지에 대한 정보를 저장한다
Page Table
프로세스의 어떤 Page 가 어떤 Frame 에 적재되어 있는지 알 수 있도록 하는 것
- 실제로는 물리 주소 내에 불연속적으로 배치되어 있지만, CPU 입장에서는 연속적으로 배치되어 있는 것처럼 보이도록 함
위 사진에서, CPU 는 각 프로세스의 페이지 테이블을 참조하여 해당 프로세스를 연속적으로 참조할 수 있다
- 페이지 0 → 프레임 3 / 페이지 1 → 프레임 5 / 페이지 2 → 프레임 2
발생할 수 있는 문제점
Internal Fragmentation (내부 단편화)
- 프로세스의 크기가 Page Size 로 딱 나누어 떨어진다는 보장은 없음
- Process 의 size 가 97이고 Page size 가 10인 경우 마지막 페이지는 3의 공간이 남음
- 하나의 페이지 크기보다 작은 크기로 발생하는 메모리 낭비 문제 발생
PTBR (Page Table Base Register)
CPU는 각 프로세스의 페이지 테이블이 어디에 있는지 알기 위해, PTBR 레지스터를 참고한다
발생할 수 있는 문제점
메모리에 페이지 테이블이 전부 저장되어 있다면?
- 실제 물리 주소에 접근하는 시간이 2배로 늘어난다
- 페이지 테이블을 참조하기 위하여 PTBR 에 접근
- 실제 Frame 을 참조하기 위하여 Page Table 에 접근
TLB
현재 자주 참조되고 있는 페이지 테이블을 일부 저장하는 캐시 메모리
- 위에 언급했던 발생할 수 있는 문제점을 일부 해결한다
- TLB 에 페이지 테이블이 저장되어 있다면, 바로 실제 Frame(물리 주소) 을 참조할 수 있다
- (= 불필요한 메모리 접근을 줄일 수 있다)
내부적인 로직
TLB hit
- CPU가 접근하고자 하는 논리 주소가 TLB 내부에 존재한다면? → TLB Hit
- CPU는 1번의 참조로 실제 물리 주소를 참조할 수 있음
TLB Miss
- 논리 주소가 TLB 내부에 없다면? → TLB Miss
- CPU는 2번의 참조로 실제 물리 주소를 참조할 수 있다
Paging 에서의 주소 변환
CPU가 실제 접근할 물리 주소를 알아내기 위해서는 다음과 같은 정보를 알아야 한다
- 어떤 Page / Frame 에 접근하고 싶은지 → page number
- 접근하려는 주소가 Page / Frame 으로부터 얼마나 떨어져 있는지 → offset
Page 는 Process 를 Page Size 로 쪼개 놓았기 때문에, 각 Page 내부에는 다양한 정보들이 들어있을 것이다
CPU가 원하는 정보를 얻기 위해서는 각 Page의 시작 위치에서 얼마나 떨어진 곳에 내가 원하는 정보가 있는지를 알고 있어야 한다
세부 설명
- 논리 주소는 page number + offset 쌍으로 구성되며
- 물리 주소(실제 주소)는 frame number + offset 쌍으로 구성된다
- 위 그림에 나와있는 것처럼, page size = frame size 이므로 offset 은 논리 주소와 물리 주소에서 같다
- page 는 그대로 frame 에 적재되기 때문이다
Page Table Entry
페이지 테이블 내부에는 page number, offset 을 제외하고도 다양한 정보들을 가지고 있다
유효 비트
현재, 해당 페이지에 접근이 가능한 지를 나타내는 비트를 유효 비트라고 한다
- 이는 다시 말하면, 메모리에 적재되어 있는지에 대한 여부를 나타낸다
만약 0(메모리에 적재되어 있지 않다면?)
- Page Fault 가 일어난다 (Interrupt)
어떤 일이 일어나는가? (Page Fault Routine)
- CPU가 기존 작업을 백업한다
- Interrupt Service Routine 을 실행한다
- 원하는 페이지를 메모리에 적재하고 유효 비트를 1로 변경한다
- CPU는 원하는 페이지에 접근할 수 있게 된다
보호 비트
페이지를 보호하기 위하여 설정하는 비트이다
- 읽기 전용인지, 읽기/쓰기 전용인지와 같은 정보를 저장할 수 있다
참조 비트
해당 페이지에 CPU가 접근한 적이 있는지에 대한 여부를 나타낸다
수정 비트(Dirty Bit)
해당 페이지에 데이터를 쓴 적이 있는지(수정된 적이 있는지) 를 나타낸다
- 이는 Swapping 시에 중요하게 작용한다
메모리에 적재했던 페이지는 더 이상 사용되지 않는다고 판단되면, 보조 기억장치로 Swap Out 이 이루어진다
이때, 만약 메모리에서 해당 내용이 수정되었다면 이를 반영하여 보조 기억장치에 반영해 주어야 한다
댓글