- 응답성
: 프로그램의 일부분(스레드)이 중단되거나 긴 작업을 수행하더라도 다른 스레드를 통해 프로그램이 계속 수행되어 사용자에 대한 응답성이 증가한다.
- 자원 공유
: 자신이 속한 프로세스 내의 다른 스레드들과 메모리나 자원을 공유하여 효율적으로 사용할 수 있다. 스레드 간의 통신도 프로세스 간의 통신과 달리 부담이 적고 빠르다.
- 경제성
: 프로세스를 새로 생성하는 비용보다 스레드를 새로 생성하는 게 비용이 적게 든다. 스레드 간의 context switching은 Stack 영역만 처리하기 때문에 캐시 메모리를 비울 필요가 없어 프로세스의 context switching보다 더 빠르다.
- 확장성
: 다중 CPU 구조에서는 각각의 스레드가 다른 프로세서에서 병렬로 수행될 수 있으므로 시스템 처리량이 증가하고 효율적이다.
프로세스 내의 스레드 하나가 오류로 종료되면 전체 프로세스에 문제를 일으킨다.
둘 이상의 스레드가 동시에 실행하면 문제가 되는 코드 블록을 Critical Section이라고 한다. 공유 자원에 동시 접근하는 경우 스레드는 데이터와 힙 영역을 공유하기 때문에 어떤 스레드가 다른 스레드에서 사용중인 변수나 자료구조에 접근하여 수정할 수 있다. 이러한 충돌(동기화 문제)이 발생할 수 있으므로 신경써야 한다.
동기화를 통해 스레드의 작업 처리 순서와 공유 자원에 대한 접근을 컨트롤할 수 있지만, 불필요한 부분까지 동기화할 경우 성능이 저하될 수 있다.
하나의 스레드만 실행중일 경우, 동기화 등의 이유로 단일 스레드보다 스레드 생성 시간이 느릴 수 있다.
동시에 여러 작업을 수행하는 공통점이 있지만, 각각의 장단점이 있다.
멀티 프로세스는 하나의 프로세스에 오류가 생기더라도 다른 프로세스에 영향을 주지 않아서 안정성이 높지만, 멀티 스레드보다 많은 메모리 공간과 CPU시간을 차지한다.
멀티 스레드는 멀티 프로세스보다 작은 메모리 공간을 사용하고, Context Switching이 빠르지만 동기화 문제 가능성이 있고, 하나의 스레드 문제가 전체 스레드에 문제를 줄 수 있다.
멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우, 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
프로세스 간의 통신보다 스레드 간의 통신 비용이 적어 작업들 간의 통신 부담이 줄어든다.