2012-04-11 1 views
11

단일 스레딩과 멀티 스레딩 프로그래밍의 차이점에 대해 오해하고 있습니다. 다음 질문에 대한 답을 얻으려면 모든 사항을 명확히해야합니다.단일 스레딩과 멀티 스레딩 프로그래밍의 차이점을 알고 싶습니다.

9 개의 독립적 인 작업이 있다고 가정하고 단일 스레드 프로그램과 다중 스레드 프로그램으로이를 수행하려고합니다.

단일 스레드 :

- Execute task 1 
- Execute task 2 
- Execute task 3 
- Execute task 4 
- Execute task 5 
- Execute task 6 
- Execute task 7 
- Execute task 8 
- Execute task 9 

멀티 스레드 :

Thread1 : 기본적으로 이런 식으로 뭔가있을 것

- Execute task 1 
- Execute task 2 
- Execute task 3 

Thread2 :

- Execute task 4 
- Execute task 5 
- Execute task 6 

Thread3 : 내가 알고있는 것처럼

- Execute task 7 
- Execute task 8 
- Execute task 9 

, 양자가 완료되면에만 ONE 스레드가 한 번에 (CPU를 얻을)에서 실행 될 것입니다, 스레드 스케줄러 것 CPU 시간을 다른 스레드에 알리십시오.

그럼 어떤 프로그램을 더 빨리 끝내겠습니까? 다중 스레드 프로그램입니까 (논리적으로)? 또는 그것은 단일 스레드 프로그램입니까? (다중 스레딩에는 많은 시간이 소요되는 컨텍스트 전환이 많기 때문입니까?) 그리고 왜? 좋은 설명이 필요합니다 :)

+2

'어떤 프로그램이 더 일찍 종료할까요? ' Answer : it depends –

+0

메모리 페치, 디스크 I/O, 네트워크 I/O ... 컨텍스트 스위치는 종종 "강제 타임 아웃"동안 선호와 함께 발생하는 단일 CPU에서도 비동기 적으로 발생합니다. 어쨌든, 누가 정말 CPU가 하나 밖에 없습니까? –

+0

질문은 현재 양식에서 답할 수 없습니다. 작업이 서로 독립적이거나 이전 작업의 결과에 의존합니까? 사용 가능한 CPU/코어의 수는 얼마입니까? 작업 프로세서가 바인딩되었거나 I/O 바인딩되어 있습니까? 병렬 처리 (여러 CPU/코어, 프로세서 바운드, 독립적 인 작업)에 이상적인 상황에서 멀티 스레드 버전은 * 빠를 가능성이 큽니다. 하지만 그렇지 않을 수도 있습니다. – dlev

답변

17

에 달려 있습니다.

얼마나 많은 CPU가 있습니까? 당신의 작업에 얼마나 많은 I/O가 관련되어 있습니까?

CPU가 1 개 밖에없고 작업에 I/O 블로킹이없는 경우 단일 스레드는 멀티 스레드보다 같거나 빠르기 때문에 스레드 전환에 오버 헤드가 있으므로

CPU가 1 대 있지만 차단 I/O가 많은 작업이있는 경우 I/O가 진행 중일 때 작업을 수행 할 수 있다고 가정하면 스레딩을 사용하여 속도가 향상 될 수 있습니다.

여러 개의 cpus가있는 경우 하나 이상의 스레드가 병렬로 실행될 수 있기 때문에 단일 스레드보다 다중 스레드 구현 속도가 빨라야합니다. 물론 작업이 I/O를 지배하지 않는 한, 제한 요소는 CPU 속도가 아닌 장치 속도입니다. 내가 알고있는 것처럼

+0

CPU가 1 대 있지만 I/O 차단이 많이 필요한 작업의 경우 완료 IO로 신호를 보내면 9 개의 작업 모두 CPU를 확보 할 수 있으므로 큰 속도 향상이 있습니다. –

+1

그리고 cpus로 코어를 의미합니까? 대부분의 컴퓨터에는 단일 CPU가 있지만 CPU에는 여러 개의 코어가 있습니다. – Guffa

+0

예 [15 자] – hvgotcodes

6

은 하나의 스레드는 CPU가 하나 개의 코어를 가지고있는 경우 케이스가 될 것입니다 시간

에서 실행됩니다. 최신 CPU는 여러 개의 코어를 가지고 있으며 여러 스레드를 병렬로 실행할 수 있습니다.

3 개의 스레드를 실행하는 프로그램은 거의 3 배 빠르게 실행됩니다. 작업이 독립적 인 경우에도 메모리 액세스와 같이 스레드간에 공유해야하는 컴퓨터의 리소스가 여전히 남아 있습니다.

2

글쎄, 이것은 전적으로 언어에 구애받지 않습니다. 일부 해석 프로그래밍 언어는 실제 스레드를 지원하지 않습니다. 즉, 실행 스레드는 프로그램에 의해 정의 될 수 있지만 인터프리터는 단일 스레드이므로 모든 실행은 CPU의 한 핵심에 있습니다.

진정한 멀티 스레딩을 지원하는 컴파일 된 언어 및 언어의 경우 단일 CPU에 많은 코어가있을 수 있습니다. 실제로 대부분의 데스크톱 컴퓨터는 2 ~ 4 개의 코어를 사용합니다. 따라서 진정으로 독립적 인 작업을 수행하는 멀티 스레드 프로그램은 CPU의 사용 가능한 코어 수를 기준으로 2-4 배 빨라질 수 있습니다.

+0

작업이 거의 독립적 인 경우는 거의 없습니다. 내 경험상, 일반적으로 일어나는 일은 코드가 단일 쓰레드 및/또는 코어처럼 CPU에 더 이상 바인딩되지 않지만 대신 현재 I/O 바운드가 될 가능성이 높다는 것입니다. 네 코어 사용에 대한 노력은 종종 낭비되는 경우가 많습니다. 이 공과는 어려운 길을 배웠다. –

+1

@ A-B-B, 맞습니다. 또한 동시 계산이 오버 헤드를 정당화 할만큼 충분히 복잡하다는 것을 확인하는 것도 중요합니다. 그러나 IO 관점에서 IO 집중적 인 작업이 있다고 상상해보십시오. 다른 스레드가 통신 버스를 사용하는 동안 한 스레드가 컴퓨팅 할 수 있기 때문에이 작업은 멀티 스레딩의 이점을 여전히 얻습니다. 마지막으로 효율적인 병렬 입출력을 수행 할 수있는 특수 아키텍처 설계가 있습니다. –

2

가정 설정 : 하이퍼 스레딩이없는 단일 코어; 작업이 CPU 바운드입니다. 각 작업에는 3 개의 시간이 걸립니다. 각 스케줄러 할당은 1 퀀텀 시간으로 제한됩니다. FIFO 스케줄러 비방 조; 모든 스레드가 동시에 스케줄러에 도달했습니다. 모든 컨텍스트 전환에는 동일한 시간이 필요합니다.

  • 테스트 1 : 단일 프로세스, 단일 스레드는
  • 테스트 2 (모두 9 작업 포함) : 다음과 같이

    프로세스가 묘사하는 단일 프로세스, 세 개의 스레드를

  • (3 개 작업을 각각 포함) 테스트 3 : 세 개의 스레드 (포함하는 하나의 작업을 각각)
으로 세 가지 프로세스, 각 : 세 가지 프로세스, 각각의 단일 스레드는
  • 테스트 4 (3 개 작업을 각각 포함)

    위의 가정과 함께 모두 완료됩니다. 이것은 CPU에 대해 일정 시간 동안 식별자가 있고 컨텍스트 스위치가 identicle이고 인터럽트 처리가없고 IO를 기다리는 것이 아무것도 없기 때문입니다.

    더 자세한 내용은 this book을 참조하십시오.