동시성 프로그램을 만드는 가장 간단한 방법으로, fork
, exec
, waitpid
와 같은 함수를 사용한다.
여러 개의 별도 프로세스를 두어 개별로 동작시키며 동시성을 구현한다.
각각의 프로세스가 독립적으로 실행되므로, 한 프로세스의 오류나 충돌이 다른 프로세스에 영향을 미치지 않는다 ! 따라서 안정성과 신뢰성이 뛰어나다.
여러 작업을 각각의 프로세스에서 제약 없이 병렬 처리가 가능하다.
하지만 각 프로세스들이 자체적인 메모리 공간과 리소스를 사용하기에, 메모리 측면에서 좋지 않다.
또한, 각 프로세스간의 통신과 데이터 공유가 복잡하기에 확장성이 제한된다.
운영체제의 관리와 스케줄링에 많은 리소스를 요구한다.
요약하면 병렬 처리, 격리와 안정성에서 강점을 보이지만, 전체적인 성능적인 면에서 부족한 면을 보인다!
일반적인 동시성 프로그램과 달리 입출력 작업이 필요한 경우에만 작업을 처리하고, 그 외에는 다른 작업을 처리할 수 있도록 한다. select
, poll
, epoll
과 같은 시스템 함수를 이용하는 방식이 대표적
단일 프로세스의 컨텍스트에서 돌아가므로, 멀티프로세싱과 멀티스레딩에 비해 단순하고 직관적이고, 데이터 공유가 쉽다.
컨텍스트 스위칭이 필요없기 때문에 성능적으로 매우 효율적이다.
단점으로는 코딩이 복잡하고 디버깅이 어려울 수 있다는 정도?
압도적인 성능 덕에 현대의 고성능 서버들은 대부분 이 방식을 이용한 이벤트 기반 서버이다.
요약하면 설계의 어려움을 감수한다면 팔방미인과도 같은 방법!
멀티프로세스와 유사하지만, 프로세스 내에서 더 잘게 쪼갠 스레드라는 단위로 흐름을 나누어 동작한다. 하나의 프로세스 내에서 공유하는 메모리 공간을 가지기에 리소스 공유가 멀티프로세싱에 비해 간단하다. 하지만 lock
과 같은 별도의 동기화 메커니즘이 필요하다!
프로세스의 생성과 삭제에 비해 스레드의 생성과 삭제는 비용이 비교적 적게 든다.
요약하면 간단한 구현과 작은 규모의 동시성 처리에 특화된 방식!