- 1216 토요일 - 10시 30분 출근 (점심 2시간)
- [O] Keywords 정리
- kaist gitbook Project3 FAQ, Appendix Memory Allocation, Virtual Address, Page Table 읽기
- ostep or concepts 읽으면서 키워드 보충하기
- TIL
메모리 크기
프로그램이 더이상 물리메모리의 크기에 제약을 받지 않는다.
시스템 성능 향상 (better CPU Util, throughput)
각 프로그램은 물리메모리에 크기를 적게 차지하기 때문에 더 많은 프로그램들이 동시에 실행될 수 있게되어 CPU 활용도와 처리량이 증가하게 된다. 이로 인해 응답시간, 반환 시간은 증가하지 않으면서도 시스템 성능 향상.
시스템 속도 향상
프로그램이 메모리에 로드하고 스왑하는 I/O 작업이 적게 필요하게 되어 각 프로그램은 더 빠르게 실행될 수 있다.
투명성(transparency)
운영체제는 실행 중인 프로그램이 가상 메모리의 존재를 인지하지 못하도록 가상 메모리 시스템을 구현해야 한다.
효율성(eiciency)
운영체제는 가상화가 시간과 공간 측면에서 효율적이도록 해야 한다. 시간적으로는 프로그램이 너무 느리게 실행되서는 안되고, 공간적으로는 가상화를 지원하기 위한 구조를 위해 너무 많은 메모리를 사용해서는 안된다.
보호(protection)
운영체제는 프로세스를 다른 프로세스로부터 보호해야하고 운영체제 자기 자신도 보호해야 한다. 프로세스가 탑재, 저장, 혹은 명령어 반입 등을 실행할 때 어떤 방법으로든 다른 프로세스나 운영체제의 메모리 내용에 접근하거나 영향을 줄 수 있어서는 안 된다.
우리가 c언어를 작성할 떄 볼 수 있는 주소는 물리주소일까 가상주소일까? 정답은 가상주소.
그렇다면 우리는 물리주소를 프로그래밍을 통해 볼 수 있을까? 정답은 NO. 오로지 운영체제 뿐이 명령어와 데이터가 탑재되어 있는 물리 메모리의 주소를 알 수 있다.
논리 메모리와 물리 메모리를 나눔으로써 두개 이상의 프로세스들이 파일(standard C library)과 메모리를 공유할 수 있게 한다.
프로세스 생성 중에 fork() 시스템콜을 사용함으로써 페이지들을 공유함으로써 프로세스의 생성을 더 빠르게 한다.
페이지테이블 관리 코드 @ threads/mmu.c
페이지 테이블은 CPU가 가상 주소를 물리 주소로 변환하는 데 사용하는 데이터 구조. 페이지에서 프레임으로 변환하는 도구. Virt Addr -> Phys Addr
특수한 작은 고속 룩업 하드웨어 캐시를 사용함. (기능도 캐시랑 거의 비슷)
히트율이 높은 이유
시간 지역성(temporal locality) 으로 인해 TLB의 히트율이 높아진다. 시간 지역성이란 한번 참조된 메모리 영역이 짧은 시간 내에 재 참조되는 현상을 일컫는다. 다른 캐시와 마찬가지로 TLB의 성공 여부는 프로그램의 공간 지역성과 시간 지역성 존재 여부에 달려 있다. 만약 프로그램이 공간 혹은 시간 지역성을 보이는 경우, TLB 사용 효과가 더욱 두드러지게 나타날 것이다.
TLB가 가득 차 있으면 어떡하나?
기존 내역을 하나 골라서 새로 넣을 걸로 교체해야함(LRU, RR, or Random 정책들 중에서 골라서. tmi: LRU연산은 너무 비싸서 잘 안한다고 하고, 랜덤 정책은 은근 hit ratio가 평균값 나오기 때문에 자주 쓰인다고 함)
TLB miss 를 누가 처리하나? -> either hardware or software depends on the operating system.
multi-level page table
)[하드웨어가 TLB miss를 처리하는 경우]
case(1) cpu ➡️ TLB @MMU ➡️ HIT! ➡️ Phys Addr
case(2) cpu ➡️ TLB @MMU ➡️ MISS! ➡️ Page Table @MainMemory ➡️ HIT! ➡️ Phys Addr
case(3) cpu ➡️ TLB @MMU ➡️ MISS! ➡️ Page Table @MainMemory ➡️ MISS! ➡️ Page Fault
Supplemental Page Table
의 vip 손님은 page fault handler 임.
프로젝트 2 에서는 페이지 폴트는 항상 커널이나 유저 프로그램의 버그를 나타냄.
프로젝트 3 에서는 더이상 저것만을 의미하지는 않는다. (좀 더 명확해졌다)
이제 페이지 폴트는 단순히 파일이나 스왑슬롯에서 페이지를 가져와야 한다는 뜻, 아니면 단순히 모든 비트가 0인 페이지 라거나. (페이지 폴트가 의미하는 경우의 수는 줄어들었지만 이제 이렇게 바뀌기 위해서는 우리(학생)가 page fault handler를 좀 더 손봐야 한다.)
내부 테이블(보통 PCB, Process Control Block)을 확인해서 해당 프로세스의 메모리 참조가 유효한지 아닌지 결정하기 위해 확인한다.
유효하지 않은 참조라면 프로세스를 종료시킨다. 유효한데 해당 페이지에 가져오지를 못한거라면 이제 가져온다.
free-frame list에서 하나의 free frame을 찾는다.
원하는 페이지를 새로 할당된 프레임으로 읽어오기 위해 보조 저장 장치 작업을 스케줄한다.
저장소로부터 읽어오는게 끝났다면 내부 테이블을 새로 메모리에 적재된 페이지를 가르킬 수 있도록 업데이트한다.
인스트럭션을 재시작해서 프로세스가 이제 해당 페이지에 접근할 수 있게한다. 마치 항상 메모리에 있었던 것처럼.
userprog/exception.c
에 있는 page_fault()
가 vm/vv.c
에 있는 vm_try_handle_fault()
라는 이름을 가진 페이지 폴트 핸들러를 호출한다.
supplemental page table
에서 부재가 발생한 페이지 찾기.보통 lazy loading이라고 하면 웹에서 사용하는 기술을 이야기 하는데 OS에서도 virtual memory에서 비슷한 개념이 쓰이는데 Demand paging이라고 한다.
Demand-paged virtual memeory
에서는 프로그램 실행 중에 페이지가 요구될 때만 로드된다. 이는