프로세스는 운영체제로부터 자원을 할당 받는 단위이고 쓰레드는 프로세스가 할당 받은 자원을 이용하는 실행의 단위이다.
즉, 프로세스 안에서 쓰레드가 돈다고 보면 되는데 풀어서 말하면 프로그램이 메모리에 적재되어 CPU를 할당 받아 실행되는 것이 프로세스이고 이렇게 실행되고 있는 프로세스 안에서 쓰레드가 실행되고 있는 것이다.
프로세스는 메모리 공간에 코드, 데이터, 힙, 스택
영역이 있고 쓰레드는 프로세스 내에서 스택 영역을 제외한 영역을 서로 공유하게 된다.
간단하게 그림으로 보면 이렇다.
노션을 실행하는 상황일 때 멀티 프로세스는 각 기능을 프로세스로 구분하여 추가하고 멀티 쓰레드는 한 프로세스 내에서 쓰레드 단위로 기능을 구분하게 된다.
각 프로세스는 서로 다른 메모리(코드, 데이터, 힙, 스택)를 사용하고 있기 때문에 메모리 구분이 필요한 경우 멀티 프로세스가 유리할 수 있다.
Context Switching이 일어날 경우 완전 다른 프로세스를 시작해야 하므로 PC 레지스터나 캐시 메모리와 같이 셋팅할 게 많아진다. 때문에 Context Switching이 느리다는 단점이 있다.
쓰레드는 메모리의 스택 영역을 제외한 부분을 공유하고 있으므로 데이터 공유가 잦거나 자원을 효율적으로 사용해야 하는 경우 유리할 수 있다.
하나의 프로세스 안에서 쓰레드가 동작하는 것인데 하나의 프로세스 안에는 하나의 메모리 영역 밖에 없다. 이때, 메모리의 데이터 영역과 힙 영역은 모든 쓰레드가 같이 사용하게 되고 스택과 코드 영역은 달리 사용하게 된다.
Context Switching을 할 때 PC 레지스터가 서로 공유하고 있는 메모리 내의 코드 영역만 왔다갔다 하면 되므로 속도가 빠르다.(캐시 메모리의 초기화가 필요 없거나 하는 이유 ..)
같은 메모리를 공유하고 있으므로 다수의 쓰레드가 동시에 데이터나, 힙 영역의 메모리에 접근하게 되면 동기화 문제가 발생할 수 있다.
동기화 문제는 여러 쓰레드가 동일한 자원에 동시에 접근했을 때 원하는 값과 다른 이상한 값을 얻어가는 문제를 말한다.
멀티 쓰레드는 더 적은 메모리 공간을 차지하고 Context Switching이 빠르다. 하지만 멀티 쓰레드는 동기화 문제도 있고 하나의 쓰레드 장애가 전체 쓰레드 장애를 초래할 수 있어 안정성이 떨어질 수 있다.
반면에, 멀티 프로세스는 더 많은 메모리 공간과 CPU 시간을 차지하지만 하나의 프로세스는 다른 프로세스에 영향을 주지 않기 때문에 안정성 면에서 더 좋을 수 있다.
크롬 웹 브라우저와 파이어 폭스 웹 브라우저를 예를 들 수 있다. 크롬은 조금 무거울 수 있으나 하나의 작업 탭에 장애가 발생하면 해당 탭을 종료만 하면 된다. 다른 탭에 영향을 주진 않는다. 하지만, 파이어 폭스는 가볍다고 하지만 하나의 탭에 장애가 발생하면 다른 탭에도 장애가 발생한다.
간단한 예시를 통해서 알 수 있듯이 크롬은 멀티 프로세스를 사용하고 있고, 파이어 폭스는 멀티 쓰레드 방식을 사용하고 있다.