운영체제에서 여러 작업을 동시에 수행하려면 프로세스(Process)나 스레드(Thread)를 사용한다. 이때 여러 작업 사이를 전환하는 것을 컨텍스트 스위칭(Context Switching)이라고 한다. 일반적으로 스레드 간의 컨텍스트 스위칭이 프로세스보다 빠르다고 알려져 있는데, 그 이유는 다음과 같다.
프로세스는 각자 독립된 메모리 공간(주소 공간)을 가진다.
스레드는 같은 프로세스 내의 자원(주소 공간, 파일 디스크립터 등)을 공유한다.
→ 프로세스 전환 시에는 메모리 맵, 페이지 테이블 등 전체 주소 공간을 바꾸어야 하지만, 스레드는 그럴 필요가 없다.
프로세스 전환 시에는 레지스터, 프로그램 카운터, 스택 포인터, 메모리 맵, 커널 구조체 등 많은 상태 정보를 저장하고 복원해야 한다.
반면 스레드는 스택 포인터와 레지스터 등 일부 상태 정보만 저장하면 된다.
→ 전환할 때 필요한 작업량이 상대적으로 적다.
프로세스 간 전환은 커널 수준에서 더 많은 작업이 필요하다 (주소 공간 할당, 권한 변경 등).
스레드 간 전환은 같은 프로세스 내에서 이루어지므로, 커널의 관여가 줄어들 수 있다.
→ 사용자 스레드(User Thread)라면 커널 호출 없이도 스케줄링이 가능하다.
회의 중,
프로세스 전환은 회의실을 완전히 바꾸고 다른 팀이 들어오는 것과 같다 (자리 정리, 장비 교체 등 필요).
스레드 전환은 같은 회의실 안에서 발표자만 바뀌는 것과 같다 (환경 그대로, 발표자만 교체).
스레드는 공유 자원 기반으로 작동하기 때문에 전환 시 필요한 정보가 적고, 작업량이 가볍다.
이로 인해 컨텍스트 스위칭 속도가 프로세스보다 훨씬 빠르다.
멀티스레드 기반 애플리케이션이 고성능을 요구하는 서비스에서 많이 사용되는 이유이기도 하다.