Multi-Process Server (멀티 프로세스)
각 클라이언트 연결을 처리하기 위해 새로운 프로세스를 생성
💡 각 클라이언트에 대해 별도의 프로세스를 할당하므로 독립적인 실행 흐름을 갖게 됨
- 자식 프로세스에게 일을 맡기고 부모 프로세스는 연결 요청을 받아주는 형태
- 자식 프로세스는, 부모 프로세스가 새로 만들어준 소켓을 이어받아 이후 남은 잔여 3-way handshake를 수행 후 데이터 통신을 수행함
- 자식 프로세스는 새로운 연결요청을 받지 않고 그저 응답을 준 후 exit(0)를 통해 종료됨
특징
1. 대규모 동시 접속 처리:
멀티 프로세스 서버는 여러 개의 프로세스를 동시에 실행할 수 있으므로 동시 다수의 클라이언트 연결을 처리할 수 있음.
2. 독립적인 주소 공간:
각 프로세스는 독립적인 주소 공간을 가지기 때문에 하나의 프로세스가 다른 프로세스에 영향을 미치지 않습니다. 이로 인해 안정성이 높음.
3. 프로세스 간 통신:
멀티 프로세스 서버에서 프로세스 간 통신(IPC)이 필요할 수 있으며, 이를 위해 파이프, 소켓 등의 메커니즘을 사용.
4. 프로세스 생성 오버헤드:
프로세스를 생성하는 오버헤드가 있기 때문에 클라이언트의 연결이 많을 때 이로 인한 성능 저하가 있을 수 있음.
장점
- 독립적인 주소 공간을 가지므로 안정성이 높음
- 프로세스 간 통신(IPC)을 사용하여 데이터 공유 가능
단점
- 프로세스 생성 오버헤드가 있어 클라이언트 연결이 많을 때 성능 저하 가능
- 각 프로세스는 독립적인 주소 공간을 가지므로, 메모리 사용량이 증가하여 메모리 부족 문제
과정
- 서버 소켓 생성 및 바인딩
- 서버 소켓을 리스닝 상태로 변경
- 클라이언트의 연결 요청 대기
accept
시스템 콜로 클라이언트 연결 수락
- 새로운 프로세스 생성 (fork)
- 새로운 프로세스에서 클라이언트 연결 처리
- 부모 프로세스에서 다음 클라이언트 연결 대기
- 반복
Multi-Thread Server (멀티 스레드)
각 클라이언트 연결을 처리하기 위해 새로운 스레드를 생성
💡 스레드는 프로세스 내에서 실행되며, 여러 스레드는 동일한 주소 공간을 공유
- 멀티 프로세스의 단점을 보완하기 위해 리눅스에서 등장한 기술
- 멀티 프로세스의 단점을 보완한 것을 제외하고는 크게 다르지 않음
특징
1. 경량화 및 빠른 스레드 생성:
스레드는 프로세스보다 경량이므로 스레드를 생성하고 관리하는데 더 적은 오버헤드가 있음. 따라서 빠른 연결 처리가 가능
2. 공유 주소 공간:
스레드는 동일한 프로세스 내에서 실행되기 때문에 공유 주소 공간을 가짐. 이로 인해 데이터 공유가 간단하고 효율적
3. 동기화 필요:
공유 데이터에 대한 동시 접근을 관리하기 위해 스레드 간 동기화가 필요할 수 있습니다. 이로 인해 다중 스레딩 환경에서 버그나 데드락 등의 문제를 주의 깊게 다뤄야 함
4. 스레드 안정성:
멀티 스레드 서버는 스레드 안정성에 주의해야 하며, 이를 위해 적절한 스레드 동기화 기술과 패턴을 사용해야 함
장점
- 경량 스레드 생성 및 관리로 빠른 연결 처리 가능
- 공유 주소 공간을 활용하여 데이터 공유 간편
단점
- 스레드 간 동기화가 필요하며, 잘못 구현할 경우 데드락과 같은 문제 발생 가능
- 스레드 안정성에 대한 고려가 필요하며, 이를 위해 적절한 스레드 동기화 기술과 패턴을 사용해야 함.
과정
- 서버 소켓 생성 및 바인딩
- 서버 소켓을 리스닝 상태로 변경
- 클라이언트의 연결 요청 대기
accept
시스템 콜로 클라이언트 연결 수락
- 새로운 스레드 생성
- 새로운 스레드에서 클라이언트 연결 처리
- 부모 스레드에서 다음 클라이언트 연결 대기
- 반복