티스토리 뷰
페이징(Paging)
프로세스는 생성되면 실제 필요한 데이터를 일정한 특정 단위의 메모리로 조각낸다. 이 조각낸 메모리들은 모두 크기가 같으며, 조각낸 것들을 묶어서 물리 메모리에 넣고 필요할 때 조회하며, 필요없어지면 다시 프로세스에게 반환한다.
프로세스는 작업을 처리하기 위해 가상 주소를 CPU에게 전달하며, CPU는 받은 가상주소를 물리주소로 변환하고 데이터를 가져와야 한다. 이때, 특정 데이터가 들어있는 데이터 조각 묶음을 계산하는 알고리즘을 페이징이라고 한다.
각 페이지들의 크기는 같으며, 생성된 순서대로 순번을 차례대로 부여받는다.
페이지 테이블(Page Table)
페이지 테이블이란 물리 주소(physical address)의 페이지를 실제 물리 주소 정보와 매핑한 표를 담고 있는 테이블이다. 페이지 테이블은 CPU의 PCB(Process Control Block)에 저장된다.
프로세스가 작업을 처리하기 위해 CPU에게 가상 주소를 넘겨주고, CPU는 그 가상 주소를 받아 실제 데이터를 찾아야 한다. CPU는 페이지 테이블에 접근해서 해당 가상 주소의 페이지 번호가 있는지 확인하고, 페이지 번호가 있으면 페이지 번호와 매핑되어 있는 물리 주소를 알아낸다. 이때, 가상 주소와 찾아낸 페이지 번호의 주소값을 계산해서 실제 물리 주소를 알아낸 후 물리 메모리에서 실제 데이터를 가져온다.(이 말이 무슨 말인지는 아래에서 계속 설명한다)
CPU는 PCB에 각종 프로세스 정보 값을 저장한다. CPU에는 CR3라는 레지스터가 있는데, CR3에는 PCB에 저장되어 있는 프로세스의 페이지 테이블 물리 주소를 저장한다. (PCB에는 여러 프로세스들의 정보가 들어있는데, 그 중 현재 실행 중인 프로세스의 페이지 테이블 주소값을 저장하는 곳이 CR3이다) CPU는 CR3에서 이 페이지 테이블 주소를 알아낸 뒤, 페이지 테이블에 접근하는 것이다.
CPU는 프로세스의 데이터를 읽어야할 때, 데이터의 가상주소를 가지고 데이터를 조회한다. 그리고 MMU는 이 가상 주소를 물리 주소로 변환하여 실제 데이터의 위치를 알아내는 역할을 한다. MMU는 CPU의 CR3에 들어있는 프로세스의 페이지 테이블 물리 주소(페이지 테이블이 위치해 있는 주소값)를 알아 낸 뒤, PCB 내부의 페이지 테이블에 접근한다. 페이지 테이블에서 가상 주소와 매핑되어 있는 물리 주소를 알아낸 뒤, 실제 물리 주소 값을 계산해서 데이터를 찾아 CPU에게 전달한다.
그런데 페이지 테이블에는 모든 페이지의 물리 주소값이 저장되어 있는 것은 아니다. 페이지는 데이터별로 같은 크기로 나눌 수 있다고 했는데, 나눠진 데이터별 페이지 중에서도 가장 첫번째로 생성된 페이지의 번호들만 저장되어 있다. 즉, 첫 가상 주소 페이지 번호와 첫 물리 주소 페이지 번호의 쌍만 저장되어 있다.
페이징 동작 순서
① 페이지 단위로 조각 내기
프로세스가 생성되면 PCB(Process Control Block)가 생성되고 프로세스의 데이터는 영역별(code, data, stack, heap...)로 나눠진다. 그리고 영역별로 나눠진 데이터들을 다시 동일한 크기(페이지)로 나눈다. (각 영역별 데이터를 여러개의 페이지로 나눌 때, 가장 첫번째 생성된 페이지 번호만 따로 저장한다.) PCB가 생성되면 PCB의 메모리에 페이지 테이블(Process Page Table)을 만든다. 이 페이지 테이블에는 가상 주소의 첫번째 페이지 주소와 첫번째 물리 주소가 매핑되어 있다. 이때, 페이지 정보는 페이지 테이블에서 저장되기도 하고 삭제되기도 한다.
② 물리 메모리 찾을 때의 예외상황
CPU가 가지고 있는 가상 주소를 물리 주소로 변환하려 MMU를 호출한다. MMU는 페이지 테이블에 접근해서 가상 주소의 첫번째 페이지 번호의 주소와 매핑된 물리 주소 값을 조회한다. 이때, 페이지 테이블에는 물리 주소값이 있을 수도 있고 없을 수도 있다. CPU가 어떤 가상 주소를 호출할지 미래를 예측할 수 없고, 한정된 메모리 공간을 가지고 있기에 물리 주소 값이 없을 수도 있다. 호출한 가상 주소에 대한 값이 페이지 테이블에 없다면, 내부적으로 에러가 발생된다. 이 에러를 페이지 폴트라고 한다.
③ 페이지 폴트
페이지 폴트가 발생하면, 페이지 폴트를 처리하는 코드가 실행된다. 이 코드는 호출한 페이지 번호에 대한 실제 데이터(페이지)를 물리 메모리로 옮기고 페이지 테이블에 물리 주소를 업데이트한다. 물리 메모리에 저장된 페이지들 중 가장 첫번째 페이지의 물리 주소와 호출한 가상 주소의 첫번째 페이지 주소를 매핑하여 페이지 테이블에 업데이트 한다. 이때, 물리 메모리에 값이 저장되어 있음을 표시하려 vaild bit값을 1로 저장한다. 이것은 나중에 MMU가 페이지 테이블에 접근했을 때, 1과 0의 vaild bit 값을 보고 물리 메모리에 실제로 데이터가 있는지 없는지 파악하기 위한 용도이다.
④ 변위 값 찾기
우리는 특정 가상 주소의 실제 데이터를 찾고 싶은데, 페이지 테이블에는 페이지의 첫번째 번호들만 저장되어 있다. 이때, 페이지의 특징을 이용한다.
페이지는 모두 일정한 크기로 나누어져 있다. 각 페이지에 들어있는 주소들도 일정한 크기 만큼의 주소 번호를 부여 받는다. 즉, 일정한 크기만큼 주소들이 나누어져 있다는 뜻이다. CPU는 호출한 가상 주소의 첫번째 페이지 번호의 주소를 찾아서, 해당 가상 주소와 차이가 얼마만큼 나는지 크기를 계산한다. 이 주소 크기값의 차이를 변위라고 한다. 그리고 첫번째 페이지 주소값과 매핑되어 있는 물리 주소를 조회하고, 그 물리 주소에 변위값을 더해주면 원하는 데이터가 있는 실제 물리 주소 값을 찾을 수 있다.
예를 들어, 변위 값이 2라고 했을 때, 실제 물리 메모리(RAM)에서 첫번째 물리 주소값에서 2만큼 차이나는 물리 주소를 찾아 데이터를 조회한다.
페이징의 동작 순서 큰 틀은 위의 내용과 같다. 다음 포스팅에서는 페이징이 어떻게 일어나는지 더 자세하게 설명하도록 한다.
'Basic > ComputerScience' 카테고리의 다른 글
[운영체제] 페이징이란?(2) / 요구 페이징, 페이지 폴트 (0) | 2023.06.29 |
---|---|
[운영체제] 가상 메모리란? (0) | 2023.06.22 |
[운영체제] 스레드란? / 스레드의 장단점 / 멀티 스레드 (0) | 2023.06.20 |
[운영체제] 멀티 태스킹, 멀티 프로그래밍, 멀티 프로세싱 (0) | 2023.06.19 |
[운영체제] IPC란? / 프로세스간 커뮤니케이션 (1) | 2023.06.19 |