하나의 개별 프로세스를 사용하여 멀티 스레드로 기능을 구현할 때 어떤 요소를 고려해야할까요?멀티 스레딩 vs 프로세스
답변
대상 OS는 무엇입니까 : 내가 스레드
을 할 가능성이 더 높습니다 오전 스레드에 대한 좋은 지원 언어에서 : 유닉스에 나는 과정에서 생각 할 가능성이 나는 내가 쓰고 있어요 언어
나는 그것이 내 목표 언어로 프로세스 간 통신을 사용하는 것이 얼마나 쉬운
을 원하는 얼마나 분리
일이 possi만큼 멀티 프로세스 솔루션을 선호 가능한 한 피해야 나는 개인적으로 스레드를 처리 블레어. 그러나 구별은 관련 작업 단위가 얼마나 분리되어 있는지를 나타냅니다.
Windows에서 fork()가 부족하여 동일한 작업자의 변형 인스턴스 (예 : 둘 이상을 나타내는 Apache 처리기 또는 에이전트 프로세스)의 다중 프로세스 모델보다 다중 스레드 모델을 사용하는 경향이 큽니다 다른면에서 유사하게 작동합니다). 유닉스에서 작은 작업자 스레드를 제외한 거의 모든 작업에 다중 프로세스를 사용하는 경향이 있습니다 (특히 UI를 응답 성있게 유지하는 GUI). 크로스 플랫폼 작업에서는 Windows의 한계로 인해 멀티 스레드를 사용합니다.
얼마나 많은 리소스를 공유해야합니까? 공유 메모리는 스레드에 대해서는 무료이지만 일반적인 자원 경합 문제가 발생할 수 있습니다.
메시지 전달 (MPI를 고려해야 함)과 공유 메모리. 또한 작업 시간 대 프로세스 시작 오버 헤드와 스레드 시작 오버 헤드를 고려하십시오.
이 게시물에서는 언어를 쉽게 만들기 위해 프로세스 또는 스레드를 나타 내기 위해 태스크라는 단어를 사용합니다.
어떤 OS입니까?
Windows에서 스레딩이 더 쉽고 * nix 다중 프로세스에서 약간 더 쉽습니다. 궁극적으로 둘 중 하나에서 할 수 있습니다.
내가 지속적으로 아마 스레드와 함께 갈 것입니다 각 실행중인 작업간에 데이터를 공유해야하는 경우 나 각 실행 작업
간에 데이터를 공유해야합니까. 스레드가 프로세스보다 데이터를 공유하는 것이 더 간단합니다. 모두 동일한 메모리 덩어리에 액세스 할 수 있기 때문입니다. 프로세스를 사용해야하는 다른 이유가 있다면 플랫폼에서 사용할 수있는 공유 메모리 (예 : boost :: interprocess)의 구현이 좋은지 확인합니다.
는 작업 중 하나에 대한/수 일반적인 경우 작업 사이
완화 간섭이 나는 멀티 프로세스 향하다 것, 충돌합니다. Chrome에서 사용하는 접근 방식 (탭 당 하나의 프로세스)입니다. 이렇게하면 한 프로세스가 충돌하면 다른 프로세스가 계속 진행될 수 있습니다. 스레드가 충돌하면 전체 프로세스가 중단 될 때 분명히 다른 모든 스레드를 잃게됩니다.
로드/풀/성능
로드가 얼마나됩니까? 매우 무거 우면 기계간에로드 균형을 조정할 수 있습니다. 다중 스레드 대신 다중 처리되도록 설계하면 여러 시스템에서 쉽게 균형을 유지할 수 있습니다. 언제든지 즉시 사용할 수있는 작업 풀이 필요하다면 스레드 풀 구현이 이미 존재하기 때문에 어떤 방식 으로든 스레드가 더 쉽습니다.
무형 자산
내 직감에는 어떤 내용이 있습니까? 나중에 그것을 정당화하고, 그 권리를 희망하십시오! :)
저는 모두 프로세스 간 통신 (소켓 생각, 네트워킹 생각, 파이프 생각, 사서함 생각)보다 훨씬 단순한 연결, 일반적으로 스레드 간 통신 및 동기화 (mutexes, 생각 공유 메모리) 그래서 당신이 논리적으로 기능을 그룹화 할 때 나는 스레드로 갈 것입니다.
그러나 교차 시스템의 크기를 조정하거나 (분산 된 것으로 생각하는) 응용 프로그램이 필요하거나 적절한 잠금이 필요한 응용 프로그램이나 엔티티 간의 구분이 논리적으로 그룹화하는 것보다 훨씬 엄격한 응용 프로그램이 필요한 경우 나는 processess로 이동합니다.
개인적으로는 멀티 스레딩 대신 여러 프로세스를 사용하는 아주 좋은 이유가 필요합니다.