프로세스
란 간단히 말해 실행중인 프로그램이다.
프로그램을 실행하면 OS로부터 실행에 필요한 메모리를 할당받아 프로세스가 된다.
프로세스는 프로그램을 수행하는 데 필요한 데이터와 메모리 등의 자원 그리고 쓰레드로 구성되어 있다.
프로세스의 자원을 이용해서 실제로 작업을 수행하는 것이 바로 쓰레드
이다.
프로세스에는 최소한 하나 이상의 쓰레드가 존재하며, 둘 이상의 쓰레드를 가진 프로세스를 멀티 쓰레드 프로세스
라고 한다.
프로세스가 가질 수 있는 쓰레드의 개수는 제한되어 있지 않으나 쓰레드가 작업을 수행하는데 개별적인 메모리 공간(호출 스택)을 필요로 하기 때문에 프로세스의 메모리 한계에 따라 생성할 수 있는 쓰레드의 수가 결정된다.
CPU의 코어가 한 번에 단 하나의 작업만 수행할 수 있으므로, 실제로 동시에 처리되는 작업의 개수는 코어의 개수와 일치한다. 그래서 프로세스의 성능이 단순히 쓰레드의 개수에 비례하는 것은 아니며, 하나의 쓰레드를 가진 프로세스보다 두 개의 쓰레드를 가진 프로세스가 오히려 더 낮은 성능을 보일 수도 있다.
멀티 쓰레드를 사용함에 있어 얻을 수 있는 이점으로는
1. 자원을 효율적으로 사용할 수 있다
2. CPU의 사용률을 향상시킨다
우리가 채팅 프로그램에서 채팅을 하면서 동시에 이미지를 다운받거나 하는 일을 동시에 할 수 있는 것도 바로 이와 같이 멀티 쓰레드로 프로세스가 작성되어 있기 때문이다.
하지만 장점은 있는 것은 아니다. 여러 쓰레드가 같은 프로세스 내에서 자원을 공유하면서 작업을 하기 때문에 발생할 수 있는 동기화
, 교착상태
와 같은 문제들이 있기에 멀티 쓰레드 프로그래밍은 항상 주의해야 한다.
싱글쓰레드 프로세스의 경우 프로세스 내에서 단 하나의 쓰레드만 작업하기 때문에 프로세스의 자원을 가지고 작업하는데 별 문제가 없지만, 멀티쓰레드 환경에서는 여러 쓰레드가 같은 프로세스 내의 자원을 공유해서 작업하기 때문에 서로의 작업에 영향을 주게 된다.
예를 들어 쓰레드A가 작업하던 도중에 쓰레드B에게 제어권이 넘어갔을 때 쓰레드A가 작업하던 공유데이터를 쓰레드B가 임의로 변경하고, 이를 다시 쓰레드A가 받게 되어 작업을 마치게 된다면 원래 의도했던 것과는 다른 결과를 얻을 수 있다.
이러한 일을 방지하기 위하여 한 쓰레드가 특정 작업을 끝마치기 전까지 다른 쓰레드에 의해 방해받지 않도록 하는 것이 필요하다.
그래서 도입된 개념이 바로 임계 영역(critical section)
과 잠금(lock)
이다.
공유 데이터를 사용하는 코드 영역을 임계 영역으로 지정해놓고, 공유 데이터가 가지고 있는 lock을 획득한 단 하나의 쓰레드만 이 영역 내의 코드를 수행할 수 있게 한다. 그리고 해당 쓰레드가 임계 영역 내의 모든 코드를 수행하고 벗어나서 lock을 반납해야만 다른 쓰레드가 반납된 lock을 획득하여 임계 영역의 코드를 수행할 수 있게 된다.
이처럼 한 쓰레드가 진행중인 작업을 다른 쓰레드가 간섭하지 못하도록 막는 것을 쓰레드의 동기화(Synchronization)
이라고 한다.
두 개 이상의 쓰레드가 서로가 가지고 있는 락이 해제되기를 기다리면서 작업이 더 이상 진행되지 않고 무한정 대기 상태에 빠지는 것을 말한다.
예제, 설명 추가 예정