다중 프로세스, 다중 스레드, 이벤트 순환
컴퓨터 구조
컴퓨터 구조를 공부하면서 알게된 내용을 요약해서 작성해보자.
다중 프로세스
- 부모 프로세스가 사용자 요청을 수신하고, 자식 프로세스를 생성해서 해당 사용자 요청을 처리한다.
- 장점
- 프로그래밍이 간단하여 이해하기 쉽다.
- 개별 프로세스의 주소 공간은 서로 격리되어 있기 때문에 하나의 프로세스에 문제가 발생하여 강제 종료되더라도 다른 프로세스에는 영향을 미치지 않는다.
- 다중 코어 리소스를 최대한 활용할 수 있다.
- 단점
- 프로세스 간의 통신의 난이도 상승
- 프로세스 생성 시, 부담이 상대적으로 크고, 프로세스의 빈번한 생성과 종료는 시스템 부담을 증가시킨다.
다중 스레드
- 스레드는 프로세스 주소 공간을 공유하기 때문에 스레드 간 통신을 위해 별도의 통신 작동 방식을 사용할 필요가 없다.
- 스레드 안전이 보장된다는 전제 하에 메모리를 직접 읽어서 데이터를 얻을 수 있다.
- 스레드들이 서로 같은 주소 공간을 공유하기 때문에 하나의 스레드에 문제가 발생하여 강제 종료 되면 같은 프로세스를 공유하는 모든 스레드와 프로세스가 한꺼번에 강제 종료 된다.
- 스레드 안전 문제로 반드시 동기화 시 상호 배제와 같은 방식을 사용해야 한다.
이벤트 순환과 구동
- 이벤트: 네트워크 데이터의 수신 여부, 파일의 읽기 및 쓰기 가능 여부 등
- 이벤트를 처리하는 함수: 이 함수를 일반적으로 이벤트 핸들러라고 한다.
- 이벤트가 도착할 때까지 조용히 있거나, 이벤트가 도착하면 이벤트 유형을 확인한다.
이벤트 소스와 다출력 입력화
- getEvent 같은 함수 하나로 어떻게 여러 이벤트를 가져올 수 있는가?
- 이벤트를 처리하는 handler 함수가 반드시 이벤트 순환과 동일한 스레드에서 실행되어야 하는가?
첫 번째 문제: 이벤트 소스와 입출력 다중화
- 리눅스와 유닉스에서는 모든 것이 파일로 취급된다.
- 일반적으로 소프트웨어 설계와 구현 방법은 단순한 것이 좋지만, 지나치게 단순해서도 안된다.
두 번째 문제: 이벤트 순환과 다중 스레드
- 사용자 요청을 처리하는 데 CPU 시간을 많이 소모하면 어떻게 해야하는가?
- 이벤트 핸들러와 순환을 동일한 스레드에서 실행할 수 있다.
이벤트 순환과 입출력
- 입출력 작업에 대응하는 논 블로킹 인터페이스가 있는 경우는?
- 인터페이스가 즉시 반환되므로 이벤트 순환에서 직접호출 하는 것이 가능하다.
- 입출력 작업에 블로킹 인터페이스만 있는 경우는?
- 이벤트 순환 내에서 절대로 어떤 블로킹 인터페이스도 호출하면 안된다.
- 이벤트 순환이라는 엔진이 멈추는 것에 해당하기 때문에 모두 앞으로 나갈 수 있다.