$$ 동시에 실행되는 건 아니다! ( CPU는 한번에 하나의 프로세스만 실행가능하기 때문 -> 빠르게 Context-Switching이 발생하면 사용자는 빠른 속도 때문에 동시라고 착각!) $$
-> 멀티 프로세스 환경에서 오버헤드가 크기 때문! ( Context-Switching 시 CPU 레지스터 교체 + RAM 과 CPU 사이 캐시 데이터 초기화 )
-> 쓰레드는 프로세스 내의 Stack 메모리를 공유하기 때문에 데이터를 주고 받는 게 상대적으로 간단
-> 쓰레드는 stack을 제외한 메모리 영역을 공유하기 때문에 Context-Switching과 쓰레드 간 통신 시 Stack영역만 처리하면 된다. ( 통신 비용 감소, 속도 빠름 )
그렇다면, 무조건 멀티 쓰레드가 좋을까?
멀티 쓰레드가 멀티 프로세스보다 성능이 좋다는 건 맞는데 멀티 쓰레드 환경에서 신경써야 할 부분이 있다.
쓰레드가 메모리 영역을 공유한다면 동기화 문제가 발생할 수 있기에!
멀티쓰레드 환경에서 여러 쓰레드가 동시에 하나의 공유 자원(객체, 변수)에 접글할 때, 프로그램에 문제 없이 의도한 대로 동작하는 것
Thread Safe 하기 위해서 공유 자원에 접근하는 Critical Section(임계영역)을 동기화 기법으로 제어 필요!
어떤 함수가 한 스레드에 의해 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하더라도 그 결과가 각각에게 올바로 주어져야 한다.
공유 자원의 사용을 최대한 줄여 각각의 스레드에서만 접근 가능한 저장소들을 사용함으로써 동시 접근을 막는다.
이 방식은 동기화 방법과 관련되어 있고, 또한 공유상태를 피할 수 없을 때 사용하는 방식이다.
공유 자원을 꼭 사용해야 할 경우 해당 자원의 접근을 세마포어 등의 락으로 통제한다.
공유 자원에 접근할 때 원자 연산을 이용하거나 '원자적'으로 정의된 접근 방법을 사용함으로써 상호 배제를 구현할 수 있다.