- 물리 메모리는 제한되어 있지만, 많은 프로세스들은 물리 메모리를 사용하고 싶어한다. 물리 메모리는 매번 모든 프로세스들의 페이지를 저장하기엔 크기가 충분하지 않습니다.
- 만약 페이지가 물리메모리가 필요하지 않다면, "Paged out(swap table이나 file system에 쓰여진)"을 얻게 됩니다.
- 프로세스가 페이지가 필요하거나 물리 메모리에 없다면, "page in("paging out"의 또다른 페이지)"을 얻게 된다
- Supplmental page table
- Physical frame management
- Lazy loading(demand paging)을 위한 page fault handler를 변경한다. - Stack growth, file-maped etc
- mmap, munmap
- Swap in/out
- Page : 가상 메모리의 연속적인 영역
- Frame : 물리 메모리의 연속적인 영역
- Page Table : 가상 주소를 물리 주소로 변환해주는 자료 구조(page to frame)
- Eviction : 페이지의 프레임으로 부터 페이지를 지우고 잠재적으로 이것을 스왑 테이블이나 파일 시스템에 써준다.
- Swap Table : 제거된 페이지가 Swap partition에 기록되는 위치
- Supplemental page table : 각 페이지를 위한 supplemental data를 추적하는 프로세스별 데이터 구조 / 예를 들어 데이터(frame / disk / swap)의 위치, 커널 가상 주소를 가르키는 포인터 active, inactive 등등
- Frame table : 할당되거나 free되어 있는 Physical frame의 추적을 유지하고 있는 전역 자료 구조
- Swap table : Swap slot들의 추적을 유지한다
- File mapping table : 각각의 페이지에 매핑된 메모리가 매핑된 파일들의 추적을 유지하는 것
- Arrays : 가장 간단하게 구현이 가능하지만, 메모리를 낭비하는 밀도가 낮다
- Lists : 꽤나 심플한 편이지만 리스트를 순회하는데 시간을 많이 소모한다
- Bitmaps : true 또는 false가 될 수 있는 비트 배열, 동일한 리소스 집합에서 사용량을 추적할 때 유용
- Hash Tabbles : key-value 1 대 1 매칭 구조이기 때문에 삽입, 삭제, 검색 시간복잡도가 O(1)을 가진다. 하지만 순서를 보장하지 않고, 같은 인덱스에 모든 키값과 데이터가 저장되어(전부 충돌한 경우) O(n)의 시간 복잡도를 가진다.
- 가상 주소가 만들어질 때(mmap), pintos는 구조체 페이지를 가상 주소에 연결한다.
- 각 가상 주소는 다양한 목적으로 사용되곤 한다.
(1) anonymous memory, (2) file-backed memory
- 구조체 페이지는 정보를 반영한다(구조체 페이지로 이동)
- 구조체 페이지가 할당되는 것은 physical frame이 가상주소에 할당된 것을 의미하지는 않다. 실제 physical frame은 ()안에 할당된다
- frame이 할당되고 나서 contents를 어떻게 채울 것인가?
- 페이지는 처음에 uninit_page로 시작한다
- anonymouse memory를 위한 페이지 -> anon_initializer 사용
- file-backed memory를 위한 페이지 -> file_map_initializer 사용
- 어떤 함수가 각각의 페이지 타입에 따른 initializer와 연관이 되어있을까?
- 각각의 페이지에 대한 추가적인 정보를 담은 page table을 보충한다
- page table을 바로 바꾸지 않는 이유는 page table 형식의 제한 때문이다
- spt_find_page : spt와 가상주소로 부터 구조체 페이지를 찾는다
- 두 가지 목적
- page fault 시 커널은 어떤 그리고 어디에 데이터가 있는지 찾기 위해 supplemental page table을 참고한다
- 프로세스가 종료되었을 때 커널은 어떤 리소스를 free 시켜줄지 결정한다
아래의 정리글은 반효경 선생님의 운영체제 강의를 듣고 작성하였습니다.
운영 체제 강의 <- 관련 영상
📒 Logical Address (=Virtual Address)
- 프로세스마다 독립적으로 가지는 주소 공간
- 각 프로세스마다 0번지부터 시작
- CPU가 보는 주소는 Logical Address
📒 Physical Address
- 메모리에 실제 올라가는 주소
📒 Address Binding
- Symbolic Address -> Logical Address -> Physical Address
- Logical Address에서 Phsical Address로 변환되는 시점은 언제일까??
📝 Compile time binding
- 물리적 메모리 주서가 컴파일 시 알려짐
- 시작 위치 변경시 재 컴파일
- 컴파일러는 절대코드를 생성
📝 Load time binding- Loader의 책임하에 물리적 메모리 주소 부여
- 컴파일러가 재배치가능코드(relocatable code)를 생성한 경우 가능
📝 **Execution time binding(=Run time binding)- 수행이 시작된 이후에도 프로세스의 메모리 상 위치를 옮길 수 있음
- CPU가 주소를 참조할 때마다 binding을 점검(address mapping table)
- 하드웨어적인 지원 필요
- 페이징 기법(pagind)은 컴퓨터가 메인 메모리에서 사용하기 위해 2차 기억장치로부터 데이터를 저장하고 검색하는 메모리 관리 기법
- 즉, 가상기억장치는 모두 같은 크기의 블록으로 편성하여 운용하는 기법
- 일정한 크기의 블록을 페이지(page)라고 한다.
📒 Frame & Page
- 프레임(Frame) : 물리 메모리를 일정한 크기로 나눈 블록
- 페이지(Page) : 가상 메모리를 일정한 크기로 나눈 블록
- 페이지가 하나의 프레임을 할당 받으면, 물리 메모리에 위치하게 된다. 프레임을 할당 받지 못한 페이지들은 외부 저장장치에 저장되며, 이 때도 프레임과 같은 크기 단위로 관리된다.
📒 Page table
- 페이지 테이블은 프로세스의 정보를 저장하고 있으며, 하나의 프로세스는 하나의 페이지 테이블을 가진다. 테이블은 다음과 같은 색인과 내용으로 구성
- 색인 : 페이지 번호
- 내용 : 해당 페이지에 할당된 물리 메모리(프레임)의 시작 주소, 이 시작 주소와 페이지 주소를 결합하여 물리 메모리 주소를 알 수 있다.
📒 Page table entry
- 페이지 테이블의 레코드, PTE의 각 필드에는 일반적으로 다음 내용이 기록 된다
- 페이지 기본주소(Page base address)
- 플래그 비트
- 접근 비트(Accessed bit) : 페이지에 대한 접근이 있었는지를 나타낸다.
- 변경 비트(Dirty bit) : 페이지 내용의 변경이 있었는지를 나타낸다.
- 현재 비트(Present bit) : 현재 페이지에 할당된 프레임이 있는지를 나타낸다.
- 읽기/쓰기 비트(Read/Write bit) : 읽기/쓰기에 대한 권한을 표시한다.