프로그램이란 윈도우의 .exe파일이나 mac의 .dmg 파일과 같은 컴퓨터에서 실행 할 수 있는 파일을 말합니다.
컴퓨터에서 실행할 수 있는 명령어들의 집합 즉, 코드 덩어리라고 말할 수 있습니다.
프로세스는 컴퓨터에서 실행중인 프로그램을 말합니다.
모든 프로그램은 운영체제가 실행되기 위한 메모리 공간을 할당해 줘야 합니다.
운영체제로부터 CPU를 할당받아 프로그램이 실행되고 있는 상태입니다.
한 번에 하나의 프로그램만 실행됩니다.
프로세스가 I/O 작업이 이뤄진다면 해당 작업이 완료될때까지 CPU는 노는 시간이 증가하기에 사용률이 좋지 않습니다.

단일 프로세스 시스템의 단점을 해결하기 위해 멀티 프로그래밍이 등장을 하였습니다.
여러개의 프로그램을 메모리에 올려놓고 동시에 실행을 합니다.
I/O 작업이 발생하면 다른 프로세스가 CPU를 할당받아 작업을 수행하게 됩니다.
다만 특정 프로세스의 CPU 점유 시간이 길어진다면 다른 프로세스는 대기를 해야 합니다.
멀티 프로그래밍이 갖고 있는 단점을 극복하기 위한 해결책으로 멀티 태스킹이 등장을 하였습니다.
프로세스는 한 번 CPU를 이용할 때 아주 짧은 시간(quantum)만 CPU에서 실행되도록 합니다.

두 개 이상의 프로세서나 코어를 활용하는 시스템입니다.
멀티 프로세스 vs 멀티 프로세서
프로세스(process)는 프로그램의 실행 상태를 말하고, 프로세서(processer)는 CPU 코어를 말합니다. 단어는 유사하나 의미는 완전히 다릅니다.
멀티 프로세스는 하나의 프로그램에서 여러 개의 프로세스를 실행하는 것을 의미하고, 멀티 프로세서는 여러 개의 CPU 코어가 하나의 시스템에서 동시에 실행되는 것을 의미합니다.
스레드는 프로세스의 한계(아쉬움)를 해결하기 위해 탄생하였습니다.

스레드는 프로세스가 할당 받은 자원을 이용하는 실행 단위입니다.
이때 프로세스의 4가지 메모리 영역 중 스레드는 stack만 할당받아 복사하고 Code, Data, Heap은 프로세스내의 다른 스레드들과 공유합니다.

멀티 스레드는 하나의 프로세스 안에 여러개의 스레드가 존재하는 것을 말합니다. 따라서 하나의 프로그램에서 두 가지 이상의 동작을 동시에 처리가 가능합니다.
프로세스보다 가볍다
스레드는 프로세스 내에서 생성되기 때문에 스레드 실행 환경을 설정하는 작업이 간단하다.
프로세스와 달리 Code, Data, Stack 영역을 제외한 나머지 자원을 서로 공유하기에 프로세스보다 가볍다.
자원의 효율성
멀티 스레드는 Heap 영역과 같은 공유 메모리에 대해 스레드 간에 자원을 공유할 수 있다. 이응 통해 프로세스 간 통신(IPC)을 사용하지 않고도 데이터를 공유할 수 있기 때문에 자원의 효율적인 화용이 가능하다.
Context Switching 비용 감소
스레드에도 컨텍스트 스위칭 오버헤드가 존재하지만, 프로세스 컨텍스트 스위칭 오버헤드보다 훨씬 낮은 비용을 갖고 있다.
프로세스 컨텍스트 스위칭 비용은 스위칭할 때마다 CPU 캐시에 있는 내용을 모두 초기화하고, 새로운 프로세스 정보를 CPU 캐시에 적재해야 하므로 높은 비용이 든다.
반면에 스레드 컨텍스트 스위칭 비용은 스위칭할때 스레드 간에 공유하는 자원을 제외한 스레드 정보(stack, register)만 교체하면 되기에 저렴하다.

응답 시간 단축
멀티 프로세서 환경에서 멀티 스레드를 사용하여 작업을 처리하는 것이 멀티 스레드를 사용하는 것보다 더 효율적이다.
안정성 문제
멀티 프로세스 모델은 각 프로세스가 독립적으로 동작하므로 하나의 프로세스가 죽어도 다른 프로세스에는 문제를 주지 않습니다.
하지만, 멀티 스레드는 하나의 스레드에 문제가 발생한다면 전체 프로그램이 종료될 수 있습니다.
그래서 이를 프로그래머가 적절한 예외 처리를 통해 프로그램 종료를 방지할 수 있습니다.
동기화로 인한 성능 저하
멀티 스레드 모델은 여러 개의 스레드가 공유 자원에 동시에 접근할 수 있기 때문에 동기화 문제가 발생할 수 있습니다.
따라서 스레드 간 동기화(Synchronized)는 데이터 접근을 제어하기 위해 필수적인 기술입니다.
하지만 동기화 작업은 여러 스레드 접근을 제한하는 것이기 때문에 병목 현상이 일어나 성능이 저하될 가능서잉 높다는 단점이 있습니다.
이를 해결하기 위해 임계 영역(Critical Section)에 대하여 뮤텍스(Mutex) 또는 세마포어(Semaphore) 방식을 활용합니다.
임계영역(Critical Section)
멀티 스레드 프로그래밍에서 임계 영역은 공유 자원을 접근하는 코드 영역을 말합니다.대표적으로 전역 변수나 heap 메모리 영역을 말할 수 있습니다.
뮤텍스(Mutex)
공유 자원에 대한 접근을 제어하기 위한 상호 배제 기법 중 하나로, 임계 영역에 진입하기 전에 락을 획득하고, 임계 영역을 빠져나올 때 락을 해제하여 다른 스레드들이 접근할 수 있도록 합니다.
오직 1개의 ㅡ레드만이 공유 자원에 접근할 수 있도록 제어하는 기법입니다.
세마포어(Semaphore)
세마포어는 동시에 접근 가능한 스레드의 개수를 지정할 수 있습니다.
세마포어의 값이 1이면 뮤텍스와 동일한 역할을 하고, 값이 2 이상이면 동시에 접근 가능한 스레드의 수를 제어할 수 있습니다.
스레드가 임계 영역에 진입하기 전에 세마포어 값을 확인하고 값이 허용된 범위 내에 있을 때만 락을 획득할 수 있는 방식입니다.
데드락(교착 상태)
데드락이란 다수의 프로세스나 스레드가 서로 자원을 점유하고, 다른 프로세스나 스레드가 점유한 자원을 기다리는 상황에서 발생하는 상태를 말합니다.
컨텍스트 스위칭 오버헤드
멀티 스레드 컨텍스트 스위칭 비용이 멀티 프로세스 컨텍스트 스위칭 비용보다는 저렴하다고 했지만, 스레드 수가 많을 수록 그만큼 컨텍스트 스위칭이 많이 발생되고 성능 저하로 이어진다.
스레드가 많으면 많을 수록 성능이 좋아지지는 않다.