다만 Runnable 상태(실행 중)의 스레드가 CPU 개수보다 많을 경우 성능 문제가 될 뿐입니다. Waitable 상태(잠자는)의 스레드는 이러한 성능 문제가 없습니다. 실제로 대부분 운영체제에는 CPU 개수보다 훨씬 많은 수의 프로세스가 있고, 각 프로세스는 스레드를 최소 1개는 갖고 있으므로 성능에 큰 문제가 되어야 할 텐데, 그렇지 않은 이유는 바로 이 때문입니다. 다시 말해서 여러분이 만드는 프로그램의 스레드가 많더라도, 정작 Runnable인 스레드 개수가 CPU 개수보다 적다면 별 문제가 없다는 이야기입니다.
주의할 점이 또 하나 있습니다. 프로그램이 어디까지 실행된 후에 컨텍스트 스위치가 일어나는지와 관련해서입니다.
컴퓨터가 실행하는 명령어는 기본적으로 기계어 명령어 단위로 실행합니다. 컨텍스트 스위치도 마찬가지로 기계어 명령어 단위로 일어납니다. 다시 말해서 기계어 명령어를 실행하다 말고 컨텍스트 스위치를 하지 않습니다. 한 기계어 명령어를 다 실행하고 나면 컨텍스트 스위치를 합니다. 즉, 컨텍스트 스위치는 기계어 명령어 단위로 이루어진다고 보면 됩니다.
여러분이 C++나 다른 언어로 프로그래밍을 하는 경우, 한 구문은 실제로 기계어 명령어 여러 개로 컴파일됩니다. 불행하게도 컨텍스트 스위치는 기계어 명령어 단위로 일어납니다. 따라서 여러분 프로그램 소스의 한 줄 구문 안에 있는 것을 실행하다 말고 컨텍스트 스위치를 할 가능성이 있는 것입니다.
▲ 그림 1-21 컨텍스트 스위치: 실행 지점이 잠시 다른 데 들렸다 오는 것