2012-03-07 4 views
11

멀티 스레딩에 대해 배우고 있지만 일부 자습서를 읽은 후에는 혼란 스럽습니다. 멀티 스레딩이 응용 프로그램의 속도를 높일 수있는 방법을 모르겠습니다. 당신은 지속적으로 그 세마포어를 기다릴 필요가 있기 때문에스레드를 동시에 실행할 수없는 경우 어떻게 멀티 스레드를 통해 응용 프로그램 속도를 향상시킬 수 있습니까?

는 직관, 나는, 멀티 스레딩 응용 프로그램을 느리게 말할 것입니다.

방법 및 응용 프로그램의 속도를 멀티 스레딩 수, 때 스레드를 동시에 실행할 수 없습니다?

+0

다중 스레드는 하나 이상의 프로세서 또는 하이퍼 스레딩 기능이있는 프로세서가있는 경우 응용 프로그램의 속도를 높입니다. 그렇지 않으면 그럴 수 없습니다. –

+1

동시에 실행할 수없는 경우에도 다중 스레드를 가질 가치가 있는지 묻고 있습니까? –

+8

가까운 투표에 동의하지 않는 경우, 이것은 매력적인 질문에 대한 답입니다. –

답변

11

두 가지 방법.

  • 여러 개의 CPU 또는 코어가있는 경우 여러 스레드를 실행중인 경우 동시에 작동 할 수 있습니다. 스레드가 대기 끝나는 경우 싱글 코어의 경우
  • , (동기) I/O를의 당신이 테이프에서 100MB의 읽기()를 읽어 호출 가정 해 봅시다, 다른 스레드가 예약받을 수 있으며, 기다리는 동안 작업이 완료 얻을.
+1

테이프에서 읽으시겠습니까? 기이 한. 보다 나은 예는 느린 네트워크 연결입니다. –

+1

하나의 스레드로 무언가를 읽는 동안 '또 다른 스레드로 작업하는'동시에 '(참고 : 저는 단일 코어 시스템에 대해 이야기하고 있습니다) : 실제로 응용 프로그램의 속도를 향상 시키 나 기능일까요? 하나의 실에서 모든 것을했다면 같은 속도가 아니겠습니까? 만약 아니라면, 왜 안 되니? – xcrypt

+1

+1 테이프에 대해, 방금 ZX Spectrum 레퍼런스를 추가 한 것처럼 :) –

3

멀티 스레딩의 배경은 가능한 한 적은 차단 점을 갖는 것입니다. 다시 말해, 스레드가 다른 스레드에서 무언가를 끝내기 위해 끊임없이 대기해야하는 경우 스레드의 이점은 그 상황에서 손실 될 가능성이 큽니다.

필수 링크 : 또한 http://en.wikipedia.org/wiki/Amdahl's_law

마크 랜섬 말했듯이 하드웨어가 실제로 한 번에 1 개 이상의 일을 할 수없는 경우, 다음 스레드 정말 그냥 논리적으로 이상 (스와핑)를 동시에 실행 실제로 동시에 실행됩니다. IO를 차단하는 상황에서도 유용 할 수 있습니다.

0

멀티 스레딩의 개념에서 '병렬 스레딩'을 제거하면 아무런 의미가 없습니다. 스레드가 동시에 실행되도록 허용하지 않으면 많은 시간을 소비하는 하나의 처리 스트림이있는 것입니다 OS의 스케줄러에 관한 이야기.

스레드가 병렬로 작동 할 수 있다는 것은 전반적인 성능 향상입니다. 세마포어가 거의 사용되지 않도록 코드를 최적화해야합니다. 일반적인 접근법은 스레드 풀링과 이벤트 루프입니다. 당신이 돌연변이하고자하는 2,000 개의 객체가 있다고 가정하면, 2,000 개의 연관된 작업을 스레드 풀로 밀어 넣을 것입니다. 스레드 풀은 사용 가능한 스레드가있을 때 사용할 수있는 스레드에서 개별 작업을 수행하도록합니다. 그런 다음 작업이 완료 될 때 정의 된 이벤트 루프에 이벤트를 게시 할 수 있다면 코드에 명시 적 세마포어가 전혀 없습니다. 당신이 "병렬 스레딩"는 무엇을 의미 아마도 처음있는 내가 생각할 수있는

3

세마포어를 계속 기다려야하기 때문에.

잘못 설계된 프로그램이나 단일 프로세서 시스템에서 병렬 작업용으로 설계된 프로그램에서만. 잘 설계된 프로그램에서 스레드는 동기화 지점간에 병렬로 유용한 작업을 수행하며 동기화 오버 헤드보다 중요합니다. 스레드가 I/O를 차단 않는 경우

조차없이 병렬 (멀티 코어/멀티) 처리, 다중 스레딩이 유리할 수있다. 예를 들어, 좋은 오래된 CVSup 프로그램은 네트워크 연결의 이중 기능을 최대한 활용하기 위해 단일 코어 시대에 멀티 스레딩을 사용했습니다. 한 스레드가 링크를 통해 데이터가 도착하기를 기다리는 동안 다른 스레드는 데이터를 다른 방향으로 밀어 낼 것입니다.네트워크 대기 시간으로 인해 두 스레드는 반드시 많은 시간을 기다려야했으며 다른 스레드는 유용한 작업을 수행 할 수있었습니다.

0

컴퓨터에서 많은 프로그램 (또는 스레드)이 일부 리소스를 공유합니다. 한 스레드가 특정 리소스를 기다리고 있다고 가정합니다 (예 : 디스크에 데이터를 쓰려는 경우). 그런 다음 OS는 사용 가능한 리소스를 사용하여 계속 컴퓨팅 할 수 있도록 다른 트레드로 전환 할 수 있습니다. 그렇기 때문에 별도의 스레드에 I/O 작업을 넣고 GUI를 별도의 스레드에 배치하는 것이 좋습니다.

물론, 멀티 스레딩은 완벽한 속도 향상을 제공하지 않지만 약간 큰 성능 향상에 도움이 될 수 있습니다. 컨텍스트 스위칭의 영향을 최소화하기 위해 일부 레지스터가 복제되는 하이퍼 스레딩 아키텍처 에서조차 더 좋습니다.

1

로깅 및 컨텍스트 전환에 일부 CPU 리소스가 필요하기 때문에 멀티 스레딩이 응용 프로그램 속도를 저하시키는 경우가 있지만 멀티 코어 또는 멀티 CPU 시스템을 대상으로하면 전반적인 응용 프로그램 성능이 크게 향상됩니다. cores/cpus는 스레드를 사용합니다.

단일 코어 컴퓨터에서 다중 스레드로 단일 작업을 실행하면 위에 언급 한 사실로 인해 속도가 느려지 게됩니다.

스레드의 또 다른 사용법은 장치를 읽거나 네트워크에서 데이터를 가져 오는 것과 같이 과도한 I/O 작업을 수행해야하는 시나리오를 상상해보십시오. 주 스레드에서 이러한 작업을 수행하는 경우 I/O 작업이 실행 중일 때 사용자 UI가 차단됩니다. 다른 스레드에서 I/O 작업을 실행하여 UI 차단을 피할 수 있습니다. 아마도 그것은 "응용 프로그램 속도 향상"과 관련이 있습니다.

1

CPU에서 모든 일이 발생하는 것은 아닙니다. 스레드가없는 컴퓨터를 상상해보십시오. 일부에서 도착하는 네트워크 패킷을 기다리는 요청을

  • 를 완료하기 위해 하드 드라이브를 기다리고
  • 응답하는 마우스를 기다리고
  • 응답 키보드를 기다리는

    • : 해당 컴퓨터는 시간의 매우 많은 양의 낭비 목적지

    등등. 사실 시스템은 최소한의 대화 형으로 설계된 경우 그러한 컴퓨터는 CPU로 아무 것도 할 수 없습니다.

    같은 내용은 한 가지 프로세스, 즉 귀하의 응용 프로그램에 적용됩니다.

    편집 : 같은 286으로하고, OS-ES (또는 원시-OS-ES)가 인터럽트를 처리하여 멀티 스레딩을 시뮬레이션하고 거기에서 '좋은'프로세서에서 실행 '좋은'커널 전에

    . ZX Spectrum조차도 키보드를 다루기 위해 인터럽트가있었습니다 (예를 들어 정확하게 기억한다면).

  • +0

    많이 변경되지 않았습니다. 현대적인 선점 형 OS의 멀티 스레딩은 하드웨어 신호에 대한 신속한 대응을 위해 인터럽트에 100 % 의존합니다. –

    2

    멀티 스레딩의 가장 중요한 용도 중 하나는 GUI 프로그래밍입니다. 단일 스레드 만있는 경우 단추를 클릭하면 어떻게됩니까? 컨트롤이 GUI로 반환되기 전에 버튼이 실행되는 모든 액션을 기다려야합니다. 그것을 문맥에 넣기. 브라우저가 단일 스레드에서만 실행되었고 Linux ISO라고 말하면 다운로드가 진행되는 동안 단일 스레드가 다운로드되어 사용되지 않으므로 브라우저 전체가 사용할 수 없게됩니다. 사용자 행동에 응답 할 수 있습니다. 다운로드를 취소 할 수도 없습니다.

    여러 스레드를 사용하면 백그라운드에서 다운로드가 진행되는 동안 브라우저를 계속 사용할 수 있습니다.

    프로그램 속도를 높일 수있는 많은 용도가 있습니다. 예를 들어, 대형 데이터 세트 검색. 이를 덩어리로 나눌 수 있으며 각 스레드는 덩어리를 검색 할 수 있습니다. 그런 다음 해당 스레드를 결합하여 결과를 완료하고 수집 할 수 있습니다.

    또한, 세마포어가 항상 필요한 것은 아닙니다. 그것은 당신이하는 일에 달려 있습니다. 단일 작업 대기열에서 작업을 소비하는 스레드가 여러 개있는 경우 다른 스레드가 작업을 요청할 수 있기 전에 작업을 대기열에서 제거하여 동일한 작업을 2 개의 스레드에 할당하지 않도록해야합니다. 이 경우 세마포어를 사용하여 작업 대기열을 "스레드 안전성"으로 만듭니다. 다른 한편으로는, hootsuite 또는 다른 소셜 미디어 데스크톱 클라이언트 중 하나 (연결된 경우)는 연결된 플랫폼별로 스레드를 실행하여 여러 플랫폼에서 동시에 업데이트를 가져올 수 있습니다.

    +0

    컨트롤을 GUI로 반환하는 것이 무슨 뜻인지 잘 모르겠습니다. 이것은 OS에 특정한 것입니까? 나는 그래픽의 종류에 따라 DirectX에 익숙하기 때문에 보통은 내 자신의 GUI 시스템을 코딩한다. – xcrypt

    +0

    @xcrypt 스레드는 GUI에서 버튼을 클릭하는 사용자를 청취해야한다. 응용 프로그램이 단일 스레드 인 경우 해당 스레드는 단추와 연관된 조치도 처리해야합니다. 처리를 처리하는 동안 사용자가 GUI를 클릭하는 것을 듣지 않으므로 처리가 처리되고 스레드가 사용자 작업을 다시 청취 할 수있을 때까지 응용 프로그램이 중단 된 것처럼 보입니다. "GUI로 돌아온 컨트롤"은 아마도 잘못된 문구 일 것입니다. – Endophage

    +0

    아, 알겠습니다. 나 자신의 GUI 시스템을 코딩하기 때문에 나는 보통 같은 방식으로 그 문제를 다루지 않는다. 그렇다면 내가하고있는 일은 아마도 성능에 친숙하지 않을 것입니다. x) GUI의 성능은 실제로 문제가되지 않습니다. 실제로 필요할 때만 실시간 시뮬레이션의 성능에 대해 신경을 씁니다. :) – xcrypt

    0

    스레드를 "동시에 발생하는 것"으로 생각하십시오.

    그런 식으로 생각하면, 단일 또는 다중 코어 컴퓨터에서 여러 스레드가 실행 중인지 여부는 중요하지 않습니다. 아이디어는 동시에 실행되는 코드 경로가 두 개 이상 있다는 것입니다.

    이제 단일 코어 머신을 살펴보면 한 번에 하나의 스레드 만 실행될 수 있습니다. 그러나 각 스레드를 컨텍스트로 생각하면 입력 전달, 디스플레이 업데이트, 네트워크 통신 처리, 백그라운드 작업 등 여러 가지 일이 발생할 수 있습니다. 그렇습니다. 단일 코어 시스템에서는 멀티 스레딩이 가능합니다. 느린. 그러나이 아닌 입니다. 요점은 애플리케이션이 여러 활동을 동시에 처리 할 수 ​​있다는 것입니다.

    마지막으로 단일 코어 시스템에서 다중 코어로 이동하는 경우 yur 응용 프로그램을 올바르게 스레드하면 이러한 상황이 실제로 동시에 실행될 확률이 훨씬 높아집니다.

    관련 문제