쓰레드
쓰레드
- 작업을 처리하는 주체
- 필요할때마다 생성됨
프로세스와 쓰레드의 차이
- 프로세스
- 자신만의 고유 공간과 자원을 할당받아 사용
- 메모리 상에서 실행중인 프로그램
- 프로세스는 최소 하나의 쓰레드를 보유하고 있음
- 각각 별도의 주소공간을 독립적으로 할당 받음 (code, heap, stack)
- 쓰레드
- 다른 쓰레드와 공간과 자원을 공유하면서 사용
- 자원 중에 stack만 따로 할당받고, 나머지 영역(Code/Data/Heap)은 쓰레드끼리 서로 공유
- 각각의 쓰레드는 별도의 스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있음
- 프로세스 안에서 실행되는 흐름 단위
- 프로세스 안에서 작업을 처리하는 주체
- 다른 쓰레드와 공간과 자원을 공유하면서 사용
프로세스 만으로 작업을 처리할 때의 문제점
- 프로세스 생성에 큰 오버헤드 발생
- 생성시 많은 시간 소요
- 프로세스 컨텍스트 스위칭의 비효율성, 오버헤드
- 프로세스 사이의 통신
- 비용이 비싼 IPC (또는 LPC, 공유 메모리)
CPU의 프로세스 관리 방법
- 여러 프로세스가 동시에 실행되고 관리 되는 것 처럼 보인다. 하지만 CPU는 한 번에 한 가지 명령밖에 처리할 수 없다. 즉, 동시가 아니라 빠르게 프로세스들을 번갈아가면서 실행하고 관리하고 있는 것이다.
쓰레드가 해결한 문제들
- 프로세스 보다 크기가 작은 실행 단위 구현
- 프로세스의 생성 및 소멸에 따른 오버헤드 감소
- 쓰레드간 자원을 공유 함으로써 빠른 컨텍스트 스위칭
- 프로세스들의 통신 시간, 방법 어려움 해소
멀티 프로세스
- 하나의 운영체제 안에서 여러 프로세스가 실행되는 것
- 장점
- 하나의 프로세스가 죽어도 다른 프로세스에 영향을 끼치지 않음
- 단점
- 각각 독립된 메모리 영역을 갖고 있어 작업량이 많을수록 오버헤드가 발생하고, 문맥 교환으로 인한 성능 저하 유발
- 프로세스 사이의 통신 복잡(IPC)
멀티 쓰레드
- 하나의 프로세스가 여러 작업을 여러 쓰레드를 사용해 동시에 처리하는 것
- 장점
- 프로세스를 생성하여 자우너을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리
- Code, Data, Heap 영역을 공유하기 때문에 데이터를 주고 받는 것이 간단해지고 자원 소모가 적음
- 쓰레드 사이 작업량이 작아 문맥교환이 빠르고, 시스템 처리량 증가
- 단점
- 프로그램 디버깅이 까다로움(에러 추적)
- 하나의 쓰레드에 문제가 생기면 전체적인 프로세스에 영향을 끼침
- 동기화 문제 발생(전역 변수 사용하기 때문)
- 단일 프로세스 시스템에서 효과를 기대하기 어려움
- 다른 프로세스에서 쓰레드 제어 불가
- 멀티 쓰레드의 동기화 문제
- 멀티 쓰레드를 사용하면 각각의 쓰레드 중 어떤 것이 어떤 순서로 실행될지 그 순서를 알 수 없음
- 여러 쓰레드가 함께 전역 변수를 사용할 경우 발생하는 충돌
- 프로그래머가 적절한 기법을 직접 구현해야 하므로 멀티 쓰레드를 사용하려면 신중해야 함
쓰레드 풀
쓰레드 풀이란?
- 컴퓨터 프로그램에서 실행의 동시성을 달성하기 위한 소프트웨어 디자인 패턴
- 프로그램이 작업을 동시에 실행할 수 있도록 여러 쓰레드를 미리 생성하고, 유지 관리함
- 여러 쓰레드를 병렬처리
- 작업 처리에 사용되는 쓰레드를 제한된 개수만큼 정해 놓고, 작업 큐에 들어오는 작업들을 하나씩 쓰레드가 맡아 처리하는 것
쓰레드 풀을 사용하는 이유
- 프로그램 성능 저하 방지를 위해
- 매번 발생하는 작업을 병렬처리하기 위해 쓰레드를 생성/수거하는 데 따른 부담은 프로그램 전체적인 퍼포먼스를 저하시기 때문에 쓰레드풀을 만들어 놓고 사용
- 쓰레드 또한 프로세스가 할당한 메모리 사용
- 다수의 사용자 요청을 처리하기 위해
- 대규모 프로젝트
- 다수의 사용자의 요청을 수용하고, 빠르게 처리하고, 대응하기 위해 사용
- 병목현상이 발생하는 I/O 작업과 데이터베이스 작업에서 주로 사용
- 쓰레드가 아무리 빠르게 생성되더라도 시스템 스케줄러에서 쓰레드의 우선순위를 매번 할당해야 하는데, 쓰레드풀을 이용하면 일정 쓰레드가 이미 생성되기 때문에 쓰레드풀에 의해 라이프 사이클이 관리되고, 쓰레드 풀에 의해 작업이 큐를 이용하게 되어 우선순위가 배분되고 처리됩니다.
쓰레드 풀의 장단점
- 장점
- 쓰레드를 생성/수거하는데 비용이 들지 않음
- 쓰레드가 생성될 때 OS가 메모리 공간을 확보해주고 메모리를 쓰레드에게 할당해줌
- 쓰레드 풀을 미리 만들어 두기 때문에 처음에 생성하는 비용은 들지만 이전의 쓰레드를 재사용할 수 있으므로 시스템 자원을 줄일 수 있고, 작업을 요청 시 이미 쓰레드가 대기 중인 상태이기 때문에 작업을 실행하는 데 딜레이가 발생하지 않음
- 단점
- thread pool에 thread를 너무 많이 생성해 두었다가 사용하지 않으면 메모리 낭비가 발생
- 단점 개선
- Fork Join Thread Pool