CPU/코어에서 실행 중이던 프로세스/스레드를 다른 것으로 바꾸는 것
멀티프로세싱을 가능하게 해줌
자신에게 주어진 timeslice를 다 사용하여 다른 프로세스/스레드에 넘길 때
I/O 작업을 기다려야해서 다른 프로세스/스레드에 넘길 때
interrupt가 발생하였을 때 등등
먼저 user mode에서 kernel 모드로 변경
레지스터 값들(PC, SP 등)을 PCB나 TCB에 저장
스케쥴러에 의해 다음 작업을 선정하고, 해당 작업의 PCB/TCB에서 레지스터값을 복원
다시 user mode로 바뀌며 작업 진행
스레드는 code, data, heap메모리를 공유하기에 따로 메모리 관련해서 바꿔줘야 하는 것은 없음
프로세스는 각자 독립적인 메모리를 사용하고 있다 생각함. 그래서 가상메모리도 서로 따로 사용. 그래서 MMU가 현재 보고 있는 Paget Table도 스위칭하면서 해당 프로세스의 PT로 바꿔줘야함.
Page Table은 커널 메모리에 프로세스 개수만큼 존재. PCB에서 Page Table 찾아서 바꿈.
그리고 MMU의 TLB도 수정해야하는데 전통방식은 아예 flush해서 싹 지움. 그래서 초반에 캐시 히트가 0%여서 성능 안 좋음. 요즘은 TLB에 주소랑 프로세스 ID를 같이 입력해서 태그가 있으니 어떤 프로세스의 PT 캐시인지를 알음. 그래서 flush비용이 안 듦
대신에 태그넣으니까 안 그래도 부족한 TLB양이 더 부족해짐. 또 한 프로세스가 메모리 해제하면 코어별로 있는 MMU의 TLB에서 다 찾으면서 수정해줘야함. 동기화 문제도발생하는 단점이 있음.
둘 다 그냥 캐시는 안 바꿔서 context swithcing 발생하면 cache pollution(대량의 캐시 미스)이 발생할 수 있음. 물론 프로세스 context swithcing이 훨씬 발생 가능성 높음
프로세스가 메모리를 혼자 사용하게 하는 것처럼 보여주는 기법
한정된 자원인 RAM에 여러 프로세스가 동시에 load되어 사용할 수 있게 해줌
프로세스 가상 메모리를 page 단위로 쪼개고, 이를 RAM의 frame에 load하여 사용 (external fragmentation 예방)
CPU가 가상주소를 읽으려 하면, MMU(Memory Management Unit)가 페이지 테이블을 통해 물리 주소로 매핑
페이지 테이블 역시 메모리에 있으므로, 메모리에 2번 접근하게 됨. 따라서 MMU 부에 TLB 캐시를 사용하여 TLB에 없으면 페이지 테이블 가능 방식으로 오버헤드를 줄임
필요한 페이지만 RAM(프레임)에 그때 그때 로딩하자라는 개념이 demand paging
이 개념을 통해 읽으려고 하는 가상메모리가 RAM에 없을 시 디스크에서 다시 가져오는게 페이지 폴트
스와핑으로 덜 사용된 페이지를 디스크로 내쫓아 공간을 확보
프로세스가 참조한 가상 메모리 페이지가 현재 물리 메모리(RAM)에 적재되어 있지 않을 때 발생 (TLB, Page Table로 확인)
OS가 인터럽트 발생하고 Storage에서 해당 페이지를 읽어 와 RAM에 올린 뒤, 다시 명령을 재실행
I/O 작업이므로 오버헤드가 발생
메모리가 꽉차서 더 이상 RAM에 페이지를 적재 불가능한 상황
RAM에 적재된 페이지 중에 하나 골라 Storage의 스왑 영역으로 이동(swap-out)
그리고 Storage에서 페이지를 RAM에 로드(swap-in)
성능 하락
RAM크기가 부족해 OS가 계속 디스크와 램사이에서 페이지를 나르기만(swap)하는 현상
성능 하락
메모리 크기를 늘리면 해결됨
멀티태스킹 지원, 메모리 보안, 부족한 RAM을 효율적으로 사용, 외부 단편화 방지, 개발 용이함
내부 단편화 발생, 페이지 폴트로 인한 오버헤드
페이지테이블에 보안 비트를 사용하여, 해당 코드 또는 데이터가 읽기전용 영역인지를 알 수 있어, 보안을 제공