멀티 프로세스 vs 멀티 쓰레드 는 개발자 면접에서 자주 나오는 질문 중의 하나!
멀티 쓰레드는 '한 어플리케이션에 대한 처리방식' 이라고 보면 된다.
단순히 프로그램을 여러개 띄워놓는 것이 아니라, 언제 어느때에 어떤 방식으로 처리하느냐에 따라 다른 것으로 이해해야 한다.
멀티 Thread 덕분에, User 가 서버 DB 에 자료를 요청하는 동안 브라우저의 다른 기능을 이용할 수 있게 된다.
멀티 프로세스는 웹 브라우저에서의 여러 탭이나 여러 창이고,
멀티 쓰레드는 웹 브라우저의 단일 탭 또는 창 내에서 브라우저 이벤트 루프, 네트워크 처리, I/O 및 기타 작업을 관리하고 처리하는데 사용된다.
멀티 Process 보다 멀티 Thread 로 프로그램을 돌리는 것이 유리한 이유는 Thread 자체의 장점이기도 하다.
Thread 는 Process 보다 용량이 가볍다.
CODE, DATA, STACK 영역을 제외한 나머지 자원을 서로 공유하기 때문에, 기본적으로 내장되어 있는 데이터 용량이 Process 보다 작다.
여러 개의 Thread가 공유 자원에 동시에 접근할 수 있기 때문에, 동기화 문제가 발생할 수 있다.
Thread 간 동기화(syncronized)
임계 영역(Critical Section)에 대하여 뮤텍스(mutex), 또는 세마포어(Semaphore) 방식으로 해결 가능!
스레드 1 은 자원 A을 점유하고 있는 상태이나, 자원 B 도 필요한 상황
스레드 2 는 자원 B를 점유하고 있는 상태이나. 자원 A 도 필요한 상황
그러나,
스레드 1 은 자원 B 가 필요한 상황에서 자원 A 을 빌려줄 수 없고
스레드 2 는 자원 A 이 필요한 상황에서 자원 B 를 빌려줄 수 없다.
즉, 다수의 Thread가 같은 lock을 동시에 다른 명령에 의해 획득하려 할 때, 서로 절대 불가능한 일을 계속적으로 기다리는 상황
Deadlock 이란?
상호배제(Mutual Exclusion), 점유와 대기(Hold and Wait), 비선점(No Preemption), 순환 대기(Circular Wait) 등의 알고리즘으로 방지 가능!
(프로세스에 비해) Thread 의 Context Switching Overhead 이 작긴하나,
그럼에도 Thread 수가 많아질수록 Context Switching Overhead 또한 많이 발생하게 된다.
즉, 단순히 Thread 가 많다고 해서 성능이 향상하는 것만은 아니라는 것이다.
여러 개의 Thread가 동시에 실행되기 때문에, 각 Thread의 동작을 추적하기 어려울 수 있다.