컨텍스트 스위치를 자주 할수록 성능이 안 좋아진다고 하니, 그렇다면 컨텍스트 스위치를 최대한 덜하면 되지 않을까요? 하지만 이것도 문제가 될 수 있습니다. 앞서 언급했던 ‘로딩 중에 애니메이션을 뿌리는’ 경우를 봅시다. 컨텍스트 스위치가 어떤 스레드를 일시 정지하고 다시 컨텍스트 스위치로 실행을 마저 진행하는 데 걸리는 시간이 1초라면, 로딩 중에 애니메이션은 1초에 한 번밖에 실행되지 못합니다. 사람 입장에서는 갑갑하겠죠.
그렇습니다. 컨텍스트 스위치 실행은 기본적으로 ‘사람 입장에서 쾌적할 수 있는’ 가급적 긴 시간 단위로 이루어집니다. 이 시간 단위를 타임 슬라이스(time slice)라고 합니다. 운영체제나 CPU 같은 환경에 따라 다르지만, 보통 스레드 하나가 일시 정지했다 다시 시작하는 데까지 걸리는 시간은 약 5밀리초입니다. 사람 입장에서는 갑갑함을 느끼지 않을 만큼 짧은 시간이지만, 컴퓨터 입장에서는 초당 5억 개의 명령어를 처리할 수 있는 CPU라면 5억 * 5밀리초 = 250만 개의 명령어를 처리할 수 있는 시간입니다. 충분히 긴 시간이죠.
CPU가 2개고 스레드가 2개면 어떻게 될까요? 이론적으로는 컨텍스트 스위치를 전혀 할 필요가 없습니다. 실제로는 다른 외부 요인들 때문에 컨텍스트 스위치가 발생하기는 해도요. 여기서 우리가 알아야 할 점은 바로 CPU 개수와 스레드 개수의 관계입니다.
CPU 개수와 스레드 개수가 같거나 스레드 개수가 더 적으면 컨텍스트 스위치가 발생할 이유가 없습니다. 하지만 스레드 개수가 더 많으면 컨텍스트 스위치가 반드시 어느 CPU 안에서는 발생합니다. 비둘기 집의 원리로 표현하자면, 비둘기 집 = CPU, 비둘기 = 스레드가 되겠습니다.
▲ 그림 1-20 CPU 개수(비둘기 집)보다 Runnable 스레드 개수(비둘기)가 많으면?