OS를 구현한 방식에 따라 달라질 수도 있겠지만
일반적인 경우라면 context switch 시에
TLB의 모든 항목을 invalidate (혹은 flush)시키는 것이 맞을 것 같습니다.
다만 전환되는 두 프로세스가 모두 공유하는 (일부) 주소 공간이 있다면
이 영역은 제외시키는 것이 성능에 도움이 될 것입니다.
(이를 위해선 paging unit에서 global 플래그와 같은 기능을 제공해야 합니다.)
리눅스 커널의 경우는 (제가 아는 한) 다음과 같은 경우들을 고려합니다.
1. 한 process 내의 다른 thread로 switching되는 경우
동일한 주소 공간을 공유하므로 TLB를 invalidate하지 않습니다.
2. user process에서 kernel thread로 switching되는 경우
모든 user process는 kernel 주소 공간을 포함하고
kernel thread는 user 주소 공간에 접근하지 않기 때문에
TLB를 invalidate하지 않습니다. (lazy TLB 모드로 진입)
3. 다른 process로 switching되는 경우
kernel 주소 공간을 제외한 모든 영역을 invalidate합니다.
OS를 구현한 방식에
OS를 구현한 방식에 따라 달라질 수도 있겠지만
일반적인 경우라면 context switch 시에
TLB의 모든 항목을 invalidate (혹은 flush)시키는 것이 맞을 것 같습니다.
다만 전환되는 두 프로세스가 모두 공유하는 (일부) 주소 공간이 있다면
이 영역은 제외시키는 것이 성능에 도움이 될 것입니다.
(이를 위해선 paging unit에서 global 플래그와 같은 기능을 제공해야 합니다.)
리눅스 커널의 경우는 (제가 아는 한) 다음과 같은 경우들을 고려합니다.
1. 한 process 내의 다른 thread로 switching되는 경우
동일한 주소 공간을 공유하므로 TLB를 invalidate하지 않습니다.
2. user process에서 kernel thread로 switching되는 경우
모든 user process는 kernel 주소 공간을 포함하고
kernel thread는 user 주소 공간에 접근하지 않기 때문에
TLB를 invalidate하지 않습니다. (lazy TLB 모드로 진입)
3. 다른 process로 switching되는 경우
kernel 주소 공간을 제외한 모든 영역을 invalidate합니다.
OS 마다 다르지만
OS 마다 다르지만 일반적인 경우엔 모든 TLB 항목을 invalidate 시키는군요..
답변 감사합니다.
- by MyoZen -
- by MyoZen -
댓글 달기