멀티프로세스와 멀티스레드의 차이점
멀티태스킹(멀티프로세스)과 멀티스레드의 차이점과 장단점
1. 멀티태스킹(멀티프로세스)과 멀티스레드는 어떤 차이점이 있는 걸까?
멀티태스킹은 하나의 운영체제(OS)에서 여러 개의 작업(태스크)을 동시에 수행하는 개념이며, 이를 구현하는 대표적인 방식이 멀티프로세스(Multi-Process) 와 멀티스레드(Multi-Thread) 입니다.
1.1 멀티프로세스
멀티프로세스(Multi-Process) 는 운영체제에서 하나의 응용 프로그램에 대해 동시에 여러 개의 프로세스를 실행할 수 있게 해주는 기술을 의미합니다.
- 보통 하나의 프로그램 실행에 대해 하나의 프로세스가 생성되지만, 부가적인 기능을 위해 여러 개의 프로세스를 생성할 수 있습니다.
- 예를 들어, 웹 브라우저의 탭(Tab) 은 각각 독립된 프로세스로 실행됩니다.
- 같은 브라우저 프로그램이지만, 서로 다른 사이트를 실행하는 개별적인 프로세스로 동작합니다.
1.2 멀티스레드
멀티스레드(Multi-Thread) 는 하나의 프로세스 내에서 여러 개의 스레드를 실행하는 방식입니다.
- 스레드는 프로세스 내에서 실행되는 작은 실행 단위입니다.
- 하나의 프로그램에서 두 가지 이상의 동작을 동시에 처리할 수 있도록 합니다.
- 예를 들어, 웹 브라우저에서:
- 멀티프로세스는 여러 개의 탭을 독립적인 프로세스로 실행하는 방식이라면,
- 멀티스레드는 하나의 브라우저 창 내에서 네트워크 요청, UI 렌더링, 입력 처리 등의 작업을 동시에 수행하는 방식입니다.
2. 멀티태스킹과 멀티스레드의 장단점
2.1 멀티태스킹(멀티프로세스)의 장단점
✅ 장점
-
프로그램 안정성
- 각 프로세스가 독립적인 메모리 공간을 가지므로,
하나의 프로세스가 비정상적으로 종료되어도 다른 프로세스에 영향을 주지 않습니다.
- 각 프로세스가 독립적인 메모리 공간을 가지므로,
-
병렬 처리(Parallelism) 가능
- 멀티프로세스는 여러 개의 CPU 코어를 활용하여 병렬 실행이 가능합니다.
-
확장성 및 유지보수 용이
- 새로운 기능이나 모듈을 추가할 때,
독립된 프로세스로 실행할 수 있어 다른 프로세스에 영향을 주지 않습니다.
- 새로운 기능이나 모듈을 추가할 때,
❌ 단점
-
컨텍스트 스위칭 비용 발생
- 멀티태스킹을 구현하는 과정에서 컨텍스트 스위칭(Context Switching)이 빈번하게 발생하여 성능 저하가 발생할 수 있습니다.
-
자원 공유 비효율성
- 프로세스 간 메모리 공간이 분리되어 있어,
데이터를 공유하려면 IPC(Inter-Process Communication) 기술을 사용해야 하므로 오버헤드가 발생할 수 있습니다.
- 프로세스 간 메모리 공간이 분리되어 있어,
2.2 멀티스레드의 장단점
✅ 장점
-
자원 효율성 증가
- 멀티스레드는 같은 프로세스 내에서 여러 개의 스레드가 메모리를 공유할 수 있어 자원 소모가 적습니다.
-
컨텍스트 스위칭 비용 감소
- 프로세스 간 전환보다 스레드 간 컨텍스트 스위칭이 더 가볍게 동작하므로 성능이 향상됩니다.
-
응답 시간 단축
- 멀티스레드를 사용하면, 한 스레드가 블로킹(Blocked) 상태에 빠져도 다른 스레드가 실행을 계속할 수 있어 응답 속도가 개선됩니다.
❌ 단점
-
안정성 문제
- 하나의 스레드에서 문제가 발생하면 다른 스레드에도 영향을 주어 프로그램 전체가 중단될 위험이 있습니다.
-
동기화 문제 발생
- 여러 개의 스레드가 공유 자원에 동시에 접근하면 동기화 문제가 발생할 수 있습니다.
- 예를 들어, 여러 스레드가 한 자원을 동시에 변경하면 경쟁 조건(Race Condition)이 발생하여 의도치 않은 오류가 생길 수 있습니다.
3. 멀티스레드에서 동기화 문제와 해결 방법
멀티스레드 환경에서는 여러 스레드가 동시에 공유 자원에 접근할 경우 데이터 일관성이 깨질 위험이 있습니다.
이를 방지하기 위해 다음과 같은 동기화(Synchronization) 기법을 사용합니다.
3.1 트랜잭션(Transaction)
트랜잭션은 여러 개의 작업을 하나의 단위로 묶어 처리하는 방식입니다.
ACID 원칙을 따르며, 트랜잭션이 완료되지 않으면 작업을 롤백(Rollback)하여 원래 상태로 되돌릴 수 있습니다.
- 원자성(Atomicity): 트랜잭션 내의 작업이 모두 성공하거나 모두 실패해야 함.
- 일관성(Consistency): 트랜잭션 수행 후 데이터의 상태가 일관성을 유지해야 함.
- 격리성(Isolation): 동시에 실행되는 트랜잭션이 서로 간섭하지 않아야 함.
- 지속성(Durability): 트랜잭션이 성공적으로 수행된 경우 영구적으로 저장되어야 함.
3.2 락(Lock)
락(Lock) 은 여러 요청이 동시에 같은 데이터에 접근하는 것을 방지하는 역할을 합니다.
이를 통해 데이터의 일관성과 무결성을 유지할 수 있습니다.
3.3 뮤텍스(Mutex)
뮤텍스(Mutex, Mutual Exclusion) 는 임계 영역(Critical Section)에 하나의 스레드만 접근하도록 보장하는 동기화 기법입니다.
- 한 스레드가 임계 영역에 진입할 때 락(Lock)을 획득하고,
작업이 끝난 후 락을 해제하여 다른 스레드가 접근할 수 있도록 합니다.
3.4 세마포어(Semaphore)
세마포어(Semaphore) 는 동시에 접근할 수 있는 스레드의 개수를 제한하는 기법입니다.
- 세마포어 값이 1이면 뮤텍스와 동일한 역할을 수행.
- 세마포어 값이 2 이상이면 여러 개의 스레드가 동시에 접근할 수 있음.
4. 결론
- 멀티프로세스는 안정성이 높지만, 컨텍스트 스위칭 비용이 크고 자원 공유가 어렵습니다.
- 멀티스레드는 자원 공유와 응답 시간이 빠르지만, 동기화 문제로 인해 안정성이 떨어질 수 있습니다.
- 멀티스레드 환경에서는 트랜잭션, 락, 뮤텍스, 세마포어 등의 동기화 기법을 활용해야 합니다.