프로세스와 스레드는 독립적인 존재가 아니다
프로세스(process)와 스레드(thread)를 독립적으로 따로 존재하는 개념으로 인식하는 경우가 꽤 있는 것 같다
예를 들어 프로세스 A가 있고, 그 프로세스에 속한 스레드 x가 있을 때
A와 x 둘 다 독립적으로 CPU 코어에서 실행 가능한 존재로 인식하는 것처럼 말이다
오늘은 이 부분을 정리하고자 한다
프로세스와 스레드와 CPU의 관계
프로세스는 메모리에 올라가서 사용자에 의해 컴퓨터 상에서 '실행 중인 프로그램'을 의미하며
그 프로세스의 실행 정보나 상태(메모리 주소 공간, 프로세스 ID, .. etc)는 OS에 의해 관리된다
하지만 실제로 CPU 코어에서 실행되는 것은 스레드다 (이게 매우 중요한 개념 !!)
그렇기 때문에 하나의 프로세스가 CPU 코어에서 실행되기 위해서는 최소한 한 개의 스레드를 반드시 가져야 한다
그래서 C언어를 처음 배울 때 main 함수에서 hello world를 출력하는 코드를 짜서 실행하게 되면
따로 명시적으로 스레드를 만드는 코드를 작성하지 않았음에도
기본적으로 스레드 하나가 생성되고 그 스레드를 통해 해당 코드가 실행되는 것이다
어떤 경우에 프로세스 혹은 스레드라고 써야 할까?
하나의 스레드가 다른 스레드와 데이터 공유를 한다고 해보겠다
만약 이 두 개의 스레드가 같은 프로세스 소속이라면
'두 스레드가 데이터를 공유한다'라고 얘기할 수 있다
하지만 만약 두 개의 스레드가 각각 서로 다른 프로세스 소속이라면
이 경우에 보다 정확한 표현은 '두 프로세스가 데이터를 공유한다'라고 얘기하는 게 좋다
비슷한 예를 들어보면,
CPU 코어에서 컨텍스트 스위칭이 되는 대상은 언제나 스레드다
왜냐하면 CPU 코어에서 실행되는 것은 스레드이기 때문이다
이때 같은 프로세스 속한 스레드들끼리 컨텍스트 스위칭이 발생한다면
이건 스레드 컨텍스트 스위칭이라고 불러야 하고
서로 다른 프로세스 속한 스레드들 사이에서 컨텍스트 스위칭이 발생한다면
이 경우엔 프로세스 컨텍스트 스위칭이라고 불러야 한다
일반적으로 같은 프로세스에 속한 스레드들 사이에서 발생한 일을 얘기할 때는 스레드로 표현하고
그게 아니라 서로 다른 프로세스에 속한 스레드들 사이에서 발생한 일을 얘기할 때는 프로세스로 표현하는 것이
더 명확한 표현이라고 볼 수 있겠다
핵심은
프로세스는 '컴퓨터에서 실행 중인 프로그램'이라는 관점에서 인식하는 게 좋고
스레드는 프로세스가 CPU 코어에서 실제로 실행되기 위한 기준 단위로 인식하는 것이 좋다
결국 중요한 포인트는
실제로 CPU 코어에서 실행되는 것은 언제나 스레드다
p.s.
윈도우에서는 예외적인 경우에 스레드 없는 프로세스가 존재한다고 들었다
하지만 이때는 정상적인 동작이 불가능하기 때문에 무시해도 괜찮을 것 같다
쉬운코드는 본질에 충실합니다