쓰레드
프로세스와 쓰레드의 차이점
멀티 프로세스와 멀티 쓰레드
멀티 프로세스
- 장점
- 하나의 프로세스가 죽어도 다른 프로세스에는 영향을 끼치지 않음
- 단점
- 작업량이 많을수록 오버헤드가 발생하고 문맥 교환(Context Switching)으로 인한 성능 저하를 유발
- 프로세스 사이의 통신이 복잡 (IPC)
멀티 쓰레드
- 장점
- 자원의 효율성
- 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어서 자원을 효율적으로 관리할 수 있음
- 응답 시간 단축
- 쓰레드 간 데이터를 주고 받는 것이 간단해져 시스템 자원 소모가 줄어든다
- 처리 비용 감소
- 쓰레드 사이의 작업량이 작아 쓰레드 간 Context Switching이 활발하게 일어난다.
- 단점
- Thread-Safety에 문제가 없는 지 확실한 설계가 필요
- 디버깅이 까다로움
- 동기화나 교착 상태가 발생할 수 있음
- 프로세스 밖에서(다른 프로세스에서) 해당 쓰레드를 제어할 수 없음
- 하나의 쓰레드에 문제가 발생하면 프로세스 전체가 영향을 받음
쓰레드 풀
쓰레드 풀이란?
- 작업 처리에 사용되는 쓰레드를 제한된 개수만큼 정해 놓고 작업 큐(Queue)에 들어오는 작업들을 하나씩 쓰레드가 맡아 처리하는 것을 말한다
- 쓰레드 풀의 동작
- 초기화
- 쓰레드 풀의 크기, 최대 쓰레드의 수, 작업 큐 등의 매개변수를 설정한다
- 작업 수신
- 작업을 수신하고 처리할 준비를 한다
- 일반적으로 작업 큐에 추가된다
- 작업 수행
- 미리 생성된 쓰레드들이 작업 큐를 모니터링하고 대기 중인 작업을 가져와 처리한다
- 이 때 쓰레드 풀 내의 쓰레드 들은 일반적으로 무한루프를 돌면서 작업을 가져오기 위해 대기한다.
- 작업 처리
- 쓰레드가 작업을 가져와서 처리한다
- 작업은 일반적으로 작업 큐에서 FIFO(선입선출) 방식으로 가져온다
- 작업 완료 및 반환
- 작업이 완료되면 해당 결과를 반환한다
- 이 후 쓰레드는 다시 작업 큐에서 새로운 작업을 가져오기 위해 대기 상태로 돌아간다
- 작업 대기
- 작업 큐에 새로운 작업이 추가되면 쓰레드 풀의 쓰레드들은 대기 상태를 벗어나 작업을 가져와 처리한다
- 위를 반복하여 계속적으로 작업을 수행한다
- 종료
- 쓰레드 풀을 더 이상 사용하지 않을 때 종료한다
- 종료할 때는 모든 작업이 완료되었는지 확인하고, 필요에 따라 남은 작업들을 처리하거나 버릴 수 있다.
쓰레드 풀을 사용하는 이유
- 프로그램 성능 저하를 방지하기 위해
- 매번 발생하는 작업을 병렬처리하기 위해 쓰레드를 생성/수거하는 데 따른 부담은 프로그램 전체적인 퍼포먼스를 저하시킨다
- 따라서 쓰레드풀을 만들어 놓고 사용한다
- 다수의 사용자 요청을 처리하기 위해
- 특히 Bottle Neck 현상이 발생하는 I/O 작업과 데이터베이스 작업에서 주로 사용된다
쓰레드 풀의 단점
- 쓰레드 풀에 쓰레드를 너무 많이 생성해 두었다가 사용하지 않으면 메모리 낭비가 발생한다
- 해결책
- Fork Join Thread Pool
동시성과 병렬성
동시성
- 싱글 코어에서 멀티 쓰레드를 동작시키기 위한 방식으로 멀티 태스킹을 위해 여러 개의 쓰레드가 번갈아가면서 실행되는 성질
- 싱글 코어의 멀티 태스킹은 각 쓰레드들이 병렬적으로 실행되는 것처럼 보이지만 사실은 번갈아가면서 조금씩 실행되고 있는 것이다
병렬성
멀티 코어에서 멀티 쓰레드를 동작시키는 방식으로, 한 개 이상의 쓰레드를 포함하는 각 코어들이 동시에 실행되는 성질
- 데이터 병렬성
- 전체 데이터를 쪼개 서비 데이터들로 만든 뒤, 서브 데이터들을 병렬 처리하여 작업을 빠르게 수행하는 것을 말함
- 서브데이터는 멀티 코어의 수만큼 쪼갠다
- 작업 병렬성
- 서로 다른 작업을 병렬 처리하는 것
- Ex) 웹 서버, 각각의 브라우저에서 요청한 내용을 개별 쓰레드에서 병렬로 처리한다