문제

병렬 처리를 달성하기 위해 애플리케이션에서 스레드를 사용할지 아니면 별도의 프로세스를 생성할지 결정하는 방법입니다.

도움이 되었습니까?

해결책

스레드는 더 가볍고 사용 가능한 모든 CPU 또는 코어를 활용하기 위해 여러 "작업자"를 만드는 경우 스레드를 사용하는 것이 더 좋습니다.

대부분의 서버와 같이 작업자를 더 잘 격리하고 더 강력하게 만들어야 하는 경우 소켓을 사용하십시오.하나의 스레드가 심하게 충돌하면 일반적으로 해당 프로세스에서 작동하는 다른 스레드를 포함하여 전체 프로세스가 중단됩니다.프로세스가 불량해지고 죽어도 다른 프로세스에는 영향을 주지 않으므로 마치 아무 일도 없었던 것처럼 즐겁게 업무를 계속할 수 있습니다.

다른 팁

프로세스에는 더 많은 격리된 메모리가 있습니다.이는 여러 가지 이유로 중요합니다.

  • 단일 작업이 다른 작업을 충돌시키는 것이 더 어렵습니다.
  • 프로세스당 더 많은 메모리를 사용할 수 있습니다.이는 Apache나 Postgres와 같은 데이터베이스 서버와 같은 대규모 고성능 애플리케이션에 중요합니다.이는 할당된 메모리와 메모리 매핑된 파일 모두에 중요합니다.

병렬성 정도는 주로 컴퓨터에서 사용할 수 있는 물리적 프로세서/코어에 따라 달라집니다.단일 프로세서/코어 시스템이 있는 경우 별도의 프로세스를 사용하면 너무 많은 오버헤드가 발생할 수 있습니다.이 경우 일반적으로 스레드가 선호됩니다.

여러 코어/CPU가 있는 경우 각 프로세스/스레드의 기능에 따라 오버헤드가 정당하다면 프로세스를 선택할 수 있습니다.프로세스는 분명히 스레드보다 훨씬 더 나은 수준의 메모리 격리를 가지고 있지만 동시에 Windows에서는 스레드에 비해 프로세스가 상당히 무겁습니다.

물론 스레드는 동일한 프로세스에서 데이터를 공유할 수 있지만 손상된 상태를 방지하려면 공유 데이터에 대한 액세스를 다시 동기화해야 합니다.프로세스 간 데이터 공유는 더 복잡하며 명명된 파이프, 사용자 정의 소켓 기반 통신, 원격 프레임워크 사용, 공유 파일/데이터베이스 등과 같이 사용되는 메커니즘에 따라 오버헤드(단순 스레드 동기화보다 큼)가 더 큽니다.

일반적으로 개별 실행 스트림이 전역 데이터를 공유할 필요가 없고 각각을 서로 보호하려는 경우 프로세스를 사용해야 합니다.

결정하는 데 도움이 될 수 있는 몇 가지 링크가 있기를 바랍니다.

http://blog.labnotes.org/2006/08/29/why-processes-scale-better-than-threads/ http://www.jroller.com/cpurdy/entry/fastcgi_not_so_fast

Windows에서는 프로세스가 스레드보다 생성하기가 더 어렵습니다.따라서 여러 개의 작은 작업이 있는 경우 스레드 또는 스레드 풀이 더 좋습니다.또는 프로세스 풀을 사용하여 프로세스를 재활용합니다.또한 프로세스 간 상태를 공유하는 것은 스레드 간 상태를 공유하는 것보다 더 많은 작업입니다.하지만 다시:스레드는 전체 프로세스를 불안정하게 만들어 다른 스레드도 함께 다운시킬 수 있습니다.이러한 일이 발생할 가능성을 최소화하려면 별도의 프로세스를 수행할 수 있습니다..Net의 AppDomains는 둘 사이의 중간 지점이 될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top