TLB ( Translation-Lookaside Buffer)
TLB는 칩의 메모리 관리 유닛(MMU)의 일부로서 자주 참조되는 가상주소 - 물리주소 변환 정보를 저장하는 하드웨어 캐시를 의미한다. 주소 변환에 있어서 빠른 엑세스를 제공하여 시스템 성능을 향상 시킨다.
기본 알고리즘
- 가상 주소에서 가상 페이지 번호(Virtual Page Number) 를 추출한 후, 해당 VPN의 TLB 존재 여부를 검사한다.
- 존재하는 경우 TLB 히트이며, TLB항목에서 페이지 프레임 번호(Page Frame Number)를 추출할 수 있다. 추출 단계에서는 페이지 접근 권한 검사가 완료되면 기존 가상 주소의 오프셋과 페이지 프레임 번호를 합쳐 물리주소(PA)를 구성한다. 해당 물리 주소를 통해 메모리에 접근할 수 있다. → 프로세싱 코어와 가까이 있고 매우 빠른 하드웨어로 구성되기 때문에 주소 변환에 대한 비용이 적다.
- 존재하지 않는 경우, TLB 미스이며, 하드웨어가 변환 정보를 찾기 위해 페이지 테이블에 접근한다. 프로세스가 생성한 가상 메모리 참조가 유효하고 접근 가능하면 해당 변환 정보를 TLB로 읽는다. TLB 갱신 이후 명령어를 재실행한다. → 페이지 미스가 발생하는 경우 페이지 테이블에 접근하여 주소를 파악해야하기 때문에 페이징 비용이 증가한다.
Demad Paging
작동 원리
- 프로그램 실행 시작:
- 프로그램이 실행되면, 운영체제는 해당 프로그램의 전체 주소 공간을 메모리에 로드하지 않고, 필요한 최소한의 페이지 테이블 항목만 설정
- 페이지 폴트 발생:
- 프로그램이 실행되면서 어떤 페이지에 접근하려고 할 때, 해당 페이지가 아직 물리 메모리에 로드되지 않은 경우 페이지 폴트(page fault)가 발생
- 페이지 폴트 처리:
- 운영체제는 디스크(보통은 스왑 공간 또는 프로그램의 바이너리 파일)에서 필요한 페이지를 읽어와서 물리 메모리의 빈 프레임에 로드
- 페이지 테이블을 업데이트하여, 해당 가상 주소가 이제 물리 메모리의 특정 프레임을 가리키도록 설정
- 프로그램 실행 재개:
- 페이지가 메모리에 로드되고 페이지 테이블이 업데이트되면, 운영체제는 중단된 프로그램의 실행을 재개. 프로그램은 방금 로드된 페이지에 정상적으로 접근할 수 있음.
장점
- 유연하게 메모리 관리가 가능하고, 초반에 적은 메모리에 대해서만 로드하기 때문에 초기 로딩 시간이 짧음.
- 모든 리소스를 올렸을 때보다 적은 메모리를 사용하기 때문에 그 공간에 대해서 다른 프로그램을 동시에 사용할 수 있음.
단점
- 페이지 폴트 처리에 대한 오버헤드를 감수해야한다.
- 페이지 테이블, 페이지 폴트 처리, 페이지 교체 알고리즘 적용 등 구현 부분에 있어 번거로움이 있다.
Demand Paging은 Lazy Loading 기법의 형태로서 운영체제의 가상 메모리 관리에 적용한 예시로 볼 수 있다. Demanding Paging을 통해서 자원을 효율적으로 사용할 수 있다.
Palloc 흐름
Palloc
VM에서의 단위가 Page기 때문에 이제까지 모르고 사용하고 있었던 Palloc이 어떤 식으로 구성되어있는지 확인해보았다.
main 함수에서 초기 PintOS 부팅시 palloc_init()
이라는 함수를 호출하는 것을 확인할 수 있다.
그렇다면 palloc에서는 어떻게 페이지를 할당할까.
tid_t process_create_initd(const char *file_name)
{
...
fn_copy = palloc_get_page(0);
...
}
위 코드처럼 단일페이지 할당의 경우 palloc_get_page()
를 호출하여 할당한다.
palloc_get_page에서는 페이지 개수 인자를 1로 설정하여 page_get_multiple()
를 호출하고 있었다.
palloc_get_multiple()
내부에서는 flag 인자에 따라 사용자 풀 또는 커널 풀의 페이지를 가져와서 반환한다.
palloc 관련 코드를 따라가면서 pintOS의 동적할당 방식을 이해할 수 있었다. 더불어 Project 3에서 페이지를 할당할때 palloc_ge_page(PAL_USER)
로 사용자 풀에서 할당받으라는 텍스트를 봤는데, 유저 풀에서 할당 받게끔해서 만약 메모리가 가득찼을 때 커널 풀의 페이지를 할당받지 않고 사용자 풀의 페이지와 페이지 교체가 일어나게끔해서 커널 풀의 메모리를 보호하기 위해 강조한 것이 아닐까하는 생각을 할 수 있었다.