- 프로그램 : 어떤 작업을 하기 위해 실행할 수 있는 파일 또는 프로그램
- 프로세스 : 메모리에 적재되고 CPU 자원을 할당받아 프로그램이 실행되고 있는 상태

멀티 프로세스
- 운영체제에서 하나의 응용 프로그램에 대해 동시에 여러 개의 프로세스를 실행할 수 있게 하는 기술
- 보통 하나의 프로그램 실행에 대해 하나의 프로세스가 메모리에 생성되지만, 부가적인 기능을 위여러 개의 프로세스를 생성하는 것
장점
- 프로그램 안정성
- 각 프로세스가 독립적인 메모리 공간을 가지므로, 한 프로세스가 비정상적으로 종료되어도 다른 프로세스에 영향을 주지 않음
- 시스템 확장성
- 각 프로세스가 독립적이므로, 새로운 기능이나 모듈을 추가하거나 수정할 때 다른 프로세스영향을 주지 않으므로 시스템의 규모를 쉽게 확장할 수 있음
단점
- Context Switching Overhead
- CPU가 다음 프로세스의 정보를 불러오기 위해 메모리를 검색하고, CPU 캐시 메모리를 초기화하며, 프로세스 상태를 저장하고, 불러올 데이터를 준비하는 과정
- 빈번한 Context Switching 작업으로 오버헤드 비용이 발생한다.
- 자원 공유 비효율성
- 각 프로세스가 독립적인 메모리 공간을 가지므로, 결과적으로 메모리 사용량 증가
- 각 프로세스간 자원 공유가 필요할 경우 어렵고 복잡한 통신 기법인 IPC(Inter-Process Communication)을 사용해야 함
멀티 스레드
- 스레드는 하나의 프로세스 내에 있는 실행 흐름
- 멀티 스레드는 하나의 프로세스 안에 여러 개의 스레드가 있는 것
- 따라서 하나의 프로그램에서 두 가지 이상의 동작을 동시에 처리하도록 하는 행위가 가능
장점
- 프로세스보다 가벼움
- 스레드는 프로세스와 달리 코드, 데이터, 스택 영역을 제외한 나머지 자원을 서로 공유하기 때문에 기본적으로 내장된 데이터 용량이 프로세스보다 작다.
- 자원의 효율성
- 하나의 프로세스 내에서 여러 개의 스레드를 생성하기 때문에, heap 영역과 같은 공유 메모에 대해 스레드 간에 자원 공유 가능
- 프로세스 간 통신을 사용하지 않고도 데이터 공유가 가능하므로 자원을 효율적으로 활용해 시스템 자원 소모가 줄어듬
- Context Switching 비용 감소
- 스레드 컨텍스트 스위칭 비용은 스레드 간에 공유하는 자원을 제외한 스레드 정보(stack, register)만 교체하면 되므로 프로세스 컨텍스트 스위칭 비용보다 상대적으로 낮다.
- 응답 시간 단축
- 멀티 스레드는 스레드 간의 통신이나 자원 공유가 더욱 용이하며, 프로세스보다 가벼워 컨텍스트 스위칭 오버헤드보다 작다.
- 여러 개의 스레드가 하나의 프로세스 내에서 요청 처리가 가능하므로 멀티 프로세스보다 응답 시간이 빠르다.
단점
- 안정성 문제
- 하나의 스레드에서 문제가 발생하면 다른 스레드들도 영향을 받아 전체 프로그램 종료될 수 있다.
- 동기화로 인한 성능 저하
- 여러 개의 스레드가 공유 자원에 동시에 접근 가능하로, 동기화 문제가 발생할 수 있다.
- 이를 해결하기 위해 임계 영역(Critical Section)에 대하여 뮤텍스(mutex), 또는 세마포어(Semaphore) 방식을 활용
- 임계 영역(Critical Section)
- 멀티 스레드 프로그래밍에서 임계 영역은 공유 자원에 접근하는 코드 영역
- 대표적으로 전역 변수나 heap 메모리 영역
- 뮤텍스(Mutex)
- 공유 자원에 대한 접근을 제어하기 위한 상호 배제 기법 중 하나
- 임계 영역에 진입하기 전에 락(lock)을 획득하고, 임계 영역을 빠져나올 때 락을 해제여 다른 스레드들이 접근할 수 있도록 함
- 오직 1개의 스레드만이 공유 자원에 접근할 수 있도록 제어하는 기법
- 세마포어(Semaphore)
- 동시에 접근 가능한 스레드의 개수를 지정
- 세마포어 값이 1이면 뮤텍스와 동일
- 2 이상이면 동시에 접근 가능한 스레드의 수를 제어 가능
- 스레드가 임계 영역에 진입하기 전에 세마포어 값을 확인하고, 값이 허용된 범위 내에 있을 때만 락을 획득할 수 있는 형식
- 뮤텍스 상위 호환