2013-09-30 3 views
2

단일 코어 CPU가 주어지면 스레드를 사용하여 코딩하면 어떤 이점이 있습니까?스레드 프로그래밍, 이점은 무엇입니까?

최소한 Java 구현의 경우 단일 코어 제한을 고려하여 자연스럽게 다른 언어로 확장하는 것이 당연한 것처럼 보이지만 여러 스레드에서 다양한 작업을 수행 할 수 있지만 프로세스가 시간 제한되고 전환됩니다.

주어진 프로세스 A와 프로세스 B :

어떤 프로세스 A, 마무리 공정 B의 절반을 수행하는 혜택은 다음 B 다음 과정 VS 수행 과정 (A)의 후반을 완료?

스레드 사이의 전환 VS 전환 그냥 유용한 다음 B.

+0

이유가 있습니다. I/O 바인딩 작업은 스레딩 (특히 네트워크 응용 프로그램)의 이점을 얻습니다. 하이퍼 스레딩 프로세서는 단일 코어에서도 멀티 스레드 응용 프로그램의 속도를 높일 수 있습니다. 스레드는 특정 이벤트에 대해 대기 (차단) 및 작동을 지시 할 수 있으므로 이벤트 중심 프로그래밍을 활성화 할 수 있습니다. – nneonneo

+0

이벤트 기반 프로그래밍은 놀라운 이점입니다. 따라서, 간단한 구현을 위해 - 메인 스레드는 단일 스레드에 있고, 이벤트 스레드는 프로그램 흐름을 방해하고 특정 작업을 실행합니까? – sherrellbc

+0

다른 방법. "주 스레드"는 입력 사용에 응답하는 짧은 코드를 실행합니다. 계산 및 무거운 리프트 코드는 우선 순위가 낮은 스레드에서 실행됩니다. 주 스레드는 이벤트가 들어올 때마다 깨어나 UI 코드를 통해 처리하고 다시 잠자기 상태로 돌아갑니다. – nneonneo

답변

4

실행 스레드가 반드시 안하고 아무것도 완료하지 두 프로세스의 전체 완료 시간을 연장 할 시간 지연을 소개 할 것으로 보인다. 표준 예는 디스크에서 읽는 것입니다. 데이터가 몇 밀리 초 동안 존재하지 않을 것이며 프로세서가 사용되지 않을 것입니다. 스레드는 프로그램의 한 부분이 CPU를 사용하는 동안 프로그램의 다른 부분은 작업이 완료되기를 기다리고 있습니다.

6

단일 코어 시스템에서 스레드를 사용하는 이유는 단순히 모든 CPU를 사용하는 프로세스가 더 빨리 수행되어야하는 다른 작업에 의해 선점 될 수 있도록 허용하기 위해서입니다. 시스템을 멀티 스레드로 만드는 가장 보편적 인 이유는 긴 계산을 수행하는 동안에도 반응 형 사용자 인터페이스를 갖는 것입니다.

물론 어떤 작업이든 (파일 읽기, 데이터베이스 액세스, 사진 크기 조정, 스프레드 시트 재 계산) 시간이 오래 걸리며 스레드가 사용자 입력에 응답 할 수 있도록 별도의 스레드에서 수행 할 수 있습니다 전체 시간을 운영합니다.

예를 들어 20 년 전에는 멀티 CPU 시스템이나 멀티 스레딩을 허용하는 OS가 거의 없었기 때문에 거의 모든 프로그램이 단일 스레드 였고 시스템에서 UI를 가질 수 있도록 많은 프레임 워크가 만들어졌습니다 여전히 I/O를 수행합니다. 이를위한 표준 메커니즘은 모든 이벤트 (UI, 네트워크, 타이머 등)가 큰 루프로 처리되는 이벤트 루프입니다.

이 유형의 시스템은 파일 I/O 및 계산과 같은 상황에서 UI가 보류되었음을 의미합니다. UI를 너무 많이 유지하지 않으려면 청크로 I/O를 수행해야합니다 (예 : 한 번에 4k 개의 파일을 읽음). 들어오는 UI 이벤트를 청크 사이에서 처리해야합니다. 이것은 실제로 시스템을 계속 실행하기위한 해킹이지만 이벤트를 얼마나 자주 처리해야하는지 모르기 때문에 시스템을 원활하게 실행하기는 어렵습니다.

해결 방법은 스프레드 시트를 다시 계산하거나 파일을 쓰는 별도의 스레드가 있어야합니다. 그렇게하면 운영 체제가 해당 스레드에 공정한 타임 슬라 이프를 제공하면서 UI 실행을 선점 할 수 있으므로 UI가 항상 응답 할 수 있습니다.

+0

좋아요! 이것은 너무 큰 의미가 있습니다. 다른 작업이 수행되는 동안 UI가 지속적으로 새로 고침됩니다. 감사! – sherrellbc

3

많은 이유가 있습니다. Wikipedia는 page about threads에 대한 간략한 개요를 제공합니다.

는 여기에 몇 가지 OTOH입니다 :

의 I/O 바운드 작업 (특히 네트워크 응용 프로그램) 스레딩의 혜택을
  • .
  • 하이퍼 스레딩 프로세서는 단일 코어에서도 멀티 스레드 응용 프로그램의 속도를 높일 수 있습니다.
  • 스레드는 특정 이벤트를 대기 (차단)하고 작동하도록 지시하여 반응 이벤트 기반 프로그래밍을 활성화 할 수 있습니다.
2

프로그램이 "동시에"여러 가지 작업을 수행해야한다면 스레드가 좋은 방법이며, 특히 그 중 일부는 상당히 오래 실행됩니다. 그렇지 않으면 자신의 프로그램 내에 운영 체제 스케줄러처럼 보이는 코드를 작성하게되는데, 바로 아래의 OS에 완벽하게 좋은 것이 있다면 시간 낭비 일 것입니다. 당신은 소스 코드가 대부분 '스케줄러'이고별로 '프로그램'이 아니라는 사실을 알게 될 것입니다. 이것은 매우 비 효과적입니다. 좋은 스레드 프로그램은 소스 코드에서 매우 우아하고 경제적 일 수있어 자신을 좋게 보이게하고 시간을 절약합니다.

일부 실행 시간에 오류가 발생합니다. Ada 초기에 런타임 환경은 자체 스레드 스케줄링을 수행 할 것이고 결코 만족스럽지 않았습니다. 이는 Ada 언어 사양에 스레드 개념이 포함되어 있었기 때문에 우리가 사용했던 OS가 제공하지 않는 경우가 많았 기 때문입니다. Ada는 컴파일러 작성자가 기본 OS 스레드를 대신 사용하기 시작했을 때 훨씬 나아졌습니다.

마찬가지로 파이썬은 기본 OS 스레드를 실제로 제대로 사용하지 않습니다. 그것은 Global Interpreter Lock으로 그것을 망칠 수 있습니다. 파이썬은 멀티 프로세싱 대신 (윈도우 호스트에서 반드시 좋은 것은 아닙니다 ...) 전체적인 문제를 피했습니다.

Windows 초기 버전은 스레드를 수행하지 않았으며 협력 멀티 태스킹을 수행했습니다. 이것은 적어도 지금은 OS 루틴을 호출하는 전체 시스템의 각 프로세스에 달려 있습니다. 각 OS 루틴은 먼저 '스케줄러'를 참조하여 프로그램을 대신하여 수행해야하는 작업을 수행하기 전에 다른 작업이 실행되기를 기다리고 있는지 확인합니다. 그 당시에는 공을 치지 않고 전체 기계를 사용할 수없는 많은 끔찍한 프로그램이있었습니다. 길이 계산을 할 때 Solitaire 게임을 할 수 없습니다.

1

프로그램의 정신 모델은 무엇입니까?

당신이 그 입력에 대한 응답으로 수행 할 작업을 간단하지 않다 시간에 겹칠 수있는 경우 예측할 수없는 순서로 일어날 수 있습니다 다양한 외부 입력에 의존하는 경우 ...

다음이에 의미가 있습니다 각 입력 요청에 별도의 스레드를 할당하고 해당 스레드가 해당 요청에 필요한 응답을 수행하게하십시오.

예를 들어 프로그램이 외부 채널의 입력 요청을 기다리고 있고 각 요청이 발신 및 수신 메시지의 자체 프로토콜을 트리거해야하는 경우 코드를 매우 단순화하여 새 스레드를 만들 수 있습니다 (또는 이전 요청을 다시 사용).

어떻게 든 사람들은 스레드가 속도면에서 (병렬성을 통해) 있다고 생각하는 노동력에 들어가는 것 같습니다. 멀티 CPU 칩을 크랭크 축으로 사용하는 것이 가능하다면, 한 가지 방법 이겠지만, 반드시 사용하는 것은 아닙니다.

관련 문제