스레드는 프로세스(process) 내부의 CPU 수행 단위이다. 즉, 실제로 작업을 수행하는 주체를 의미한다. 프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이고 모든 프로세스에는 한 개 이상의 스레드가 존재하여 프로세스가 할당받은 자원을 이용하여 작업을 수행한다.
멀티 스레딩은 하나의 프로세스 내에서 여러 스레드가 동시에 작업을 수행하는 것이다. 실제로는 한 개의 CPU가 한 번에 단 한가지 작업만 수행할 수 있기 때문에 아주 짧은 시간 동안 여러 작업을 번갈아 가며 수행함으로써 동시에 여러 작업이 수행되는 것처럼 보이게 한다.
각 프로세스는 운영체제로 부터 할당받은 Code, Data, Heap, Stack 영역을 각자 보유한다. 쓰레드는 Code, Data, Heap 영역은 공유하고 Stack영역만 각자 보유한다.
멀티 프로세스는 하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스들이 하나의 작업을 처리하도록 한다.
📝 Context Switching
CPU는 한번에 하나의 프로세스만 실행 가능하다. CPU에서 여러 프로세스를 돌아가면서 작업을 처리하는데 이 과정을 Context Switching라 한다. 동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업을 말한다.
시스템 자원 소모가 감소한다. 프로세스를 생성하는 system call이 줄어들어 자원을 효율적으로 관리할 수 있다.
시스템 처리량(Througput)이 증가한다. 동시성와 병렬성을 얻을 수 있기 때문에 효율적이다.
📝 동시성과 병렬성
프로세스 내의 Data, Code, Heap 영역을 공유하기 때문에 쓰레드 간의 통신이 간단하다.
하나의 스레드가 blocked 상태인 동안 (ex - I/O를 기다리거나 메모리 적재를 기다리는 중) 다른 스레드는 실행되기 때문에 사용자의 응답에 대한 빠른 응답성을 가질 수 있다.
자원공유로 인해서 동기화(Synchronize) 문제, 교착상태(deadlock) 등이 발생할 수 있다.
디버깅이 까다롭다.
하나의 쓰레드에 문제가 발생하면 전체 프로세스에 영향을 준다.