스레드 대 비동기


82

이 정말 좋은 기사에서 스레드 된 프로그래밍 모델과 비동기 모델에 대해 읽어 봤습니다. http://krondo.com/blog/?p=1209

그러나이 기사에서는 다음과 같은 사항을 언급합니다.

  1. 비동기 프로그램은 I / O가있을 때마다 작업을 전환하여 동기화 프로그램을 능가합니다.
  2. 스레드는 운영 체제에서 관리합니다.

스레드는 Ready-Queue와 Waiting-Queue (다른 큐 중에서) 사이에서 TCB를 이동하여 운영 체제에 의해 관리된다는 것을 읽은 기억이 있습니다. 이 경우 스레드는 대기하는 데 시간을 낭비하지 않습니다.

위에서 언급 한 점에서 스레드 프로그램에 비해 비동기 프로그램의 장점은 무엇입니까?


5
아니요, Threaded 대 Async를 의미했습니다. 요점 1은 기사에서 이해 한 것이기 때문에 언급했습니다.

답변:


78
  1. 스레드로부터 안전한 코드를 작성하는 것은 매우 어렵습니다. 비동기 코드를 사용하면 코드가 한 작업에서 다음 작업으로 이동하는 위치를 정확히 알 수 있으므로 경쟁 조건이 발생하기가 훨씬 더 어렵습니다.
  2. 각 스레드에는 자체 스택이 있어야하므로 스레드는 상당한 양의 데이터를 소비합니다. 비동기 코드를 사용하면 모든 코드가 동일한 스택을 공유하고 작업간에 스택이 지속적으로 해제되므로 스택이 작게 유지됩니다.
  3. 스레드는 OS 구조이므로 플랫폼이 지원할 수있는 더 많은 메모리입니다. 비동기 작업에는 이러한 문제가 없습니다.

12
좀 더 자세히 설명하려면 : 1. 스레드 코드의 I / O 부분은 비교적 쉽지만 경쟁 조건없이 스레드 간의 공유 상태를 관리 (잠금 / 대기열 등 사용)하는 것이 까다로워집니다. 비동기 모델을 사용하면 동시에 진행하는 일이 줄어들어 경주를 쉽게 피할 수 있습니다. 2/3. 각 스레드는 적어도 하나의 스택 메모리 페이지 (일반적으로 4KB 또는 8KB)와 해당 스레드의 상태와 관련된 다른 데이터 구조에 대해 알 수없는 메모리 양을 소비합니다.
Dobes Vandermeer 2013-07-29

12

스레드를 만드는 방법에는 두 가지가 있습니다.

동기 스레딩 -부모는 하나 이상의 자식 스레드를 만든 다음 각 자식이 종료 될 때까지 기다려야합니다. 동기식 스레딩은 종종 fork-join 모델이라고 합니다.

비동기 스레딩 -부모와 자식이 동시에 / 독립적으로 실행됩니다. 다중 스레드 서버는 일반적으로이 모델을 따릅니다.

리소스-http: //www.amazon.com/Operating-System-Concepts-Abraham-Silberschatz/dp/0470128720


7
  1. IO를 포함하지 않는 2 개의 작업이 있다고 가정합니다 (다중 프로세서 시스템에서). 이 경우 스레드가 Async를 능가합니다. 단일 스레드 프로그램과 같은 Async는 작업을 순서대로 실행하기 때문입니다. 그러나 스레드는 두 작업을 동시에 실행할 수 있습니다.

  2. IO (다중 프로세서 시스템에서)와 관련된 2 개의 작업이 있다고 가정합니다. 이 경우 Async와 Threads는 거의 동일하게 수행됩니다 (성능은 코어 수, 스케줄링, 작업이 얼마나 많은 프로세스를 집중하는지 등에 따라 달라질 수 있습니다). 또한 Async는 리소스 양이 적고 오버 헤드가 적으며 다중 스레드 프로그램을 프로그래밍하는 데 덜 복잡합니다.

어떻게 작동합니까? Thread 1은 Task 1을 실행하는데, IO를 기다리고 있기 때문에 IO Waiting Queue로 이동합니다. 마찬가지로 스레드 2는 작업 2를 실행합니다. IO도 포함되어 있으므로 IO 대기 대기열로 이동합니다. IO 요청이 해결 되 자마자 스케줄러가 실행을 위해 스레드를 예약 할 수 있도록 준비 대기열로 이동합니다.

Async는 작업 1을 실행하고 IO가 완료 될 때까지 기다리지 않고 작업 2를 계속 한 다음 두 작업의 IO가 완료 될 때까지 기다립니다. IO 완료 순서대로 작업을 완료합니다.

웹 서비스 호출, 데이터베이스 쿼리 호출 등을 포함하는 작업에 가장 적합한 비동기, 프로세스 집약적 인 작업을위한 스레드.

아래 비디오는 https://www.youtube.com/watch?v=kdzL3r-yJZY에 대해 설명 Async vs Threaded model하고 언제 사용 해야하는지 설명합니다 .

이것이 도움이되기를 바랍니다.


2
잠재적 인 솔루션에 대한 링크는 항상 환영합니다. 그러나 링크 주변에 컨텍스트추가 하여 동료 사용자가 그것이 무엇인지, 왜 거기에 있는지 알 수 있도록하십시오. 대상 사이트에 연결할 수 없거나 영구적으로 오프라인 상태가되는 경우 항상 중요한 링크에서 가장 관련성이 높은 부분을 인용하십시오. 되는 것을 고려 보다 외부 사이트로의 링크보다 거의 것은 에 관해서는 가능한 이유가 왜 그리고 어떻게 어떤 답변 삭제입니까? .
Machavity

4

우선, 스레드가 구현되고 예약되는 방법에 대한 많은 세부 사항은 매우 OS에 따라 다릅니다. 일반적으로 OS와 하드웨어는 단일 프로세서 시스템에서 비동기 적으로 또는 다중 프로세서에서 병렬로 스레드가 효율적으로 실행되도록 정렬하기 때문에 서로 대기중인 스레드에 대해 걱정할 필요가 없습니다.

스레드가 I / O와 같은 무언가를 기다리면 실행 가능한 것으로 간주 할 수 있습니다. 실행 가능한 스레드는 곧 실행될 예정입니다. 이것이 단순한 대기열로 구현되는지 또는 더 복잡한 것으로 구현되는지 여부는 OS 및 하드웨어에 따라 다릅니다. 차단 된 스레드 집합을 엄격하게 정렬 된 대기열이 아닌 집합으로 생각할 수 있습니다.

단일 프로세서 시스템에서 여기에 정의 된 비동기 프로그램은 스레드 프로그램과 동일합니다.


0

비동기 I / O는 작업을 수행하는 드라이버에 이미 스레드가 있음을 의미하므로 기능을 복제하고 약간의 오버 헤드가 발생합니다. 반면에 드라이버 스레드가 정확히 어떻게 작동하는지 문서화되지 않은 경우가 많으며 복잡한 시나리오에서 시간 초과 / 취소 / 시작 / 중지 동작, 다른 스레드와의 동기화를 제어하려는 경우 자체 스레드를 구현하는 것이 좋습니다. 때로는 동기식으로 추론하는 것이 더 쉽습니다.


5
그것은 비동기 I / O가 전혀 작동하지 않는 방식입니다. 기본적으로 I / O는 이벤트 기반입니다 (장치에 대한 I / O를 시작하면 나중에 장치가이를 완료하고 인터럽트로 알려줍니다). 드라이버가 다소 모호한 이유로 커널 스레드를 사용하는 몇 가지 종류의 I / O (예 : 디스크 I / O)가 있습니다. 그러나 네트워크의 경우 비동기 작업입니다.
Glyph

0

http://en.wikipedia.org/wiki/Thread_(computing)#I.2FO_and_scheduling 참조

그러나 사용자 스레드 (커널 스레드와 반대) 또는 파이버에서 차단 시스템 호출을 사용하는 것은 문제가 될 수 있습니다. 사용자 스레드 또는 파이버가 차단하는 시스템 호출을 수행하는 경우 프로세스의 다른 사용자 스레드와 파이버는 시스템 호출이 반환 될 때까지 실행할 수 없습니다. 이 문제의 전형적인 예는 I / O를 수행 할 때입니다. 대부분의 프로그램은 I / O를 동 기적으로 수행하도록 작성됩니다. I / O 작업이 시작되면 시스템 호출이 수행되고 I / O 작업이 완료 될 때까지 반환되지 않습니다. 중간 기간 동안 전체 프로세스는 커널에 의해 "차단"되어 실행될 수 없으므로 동일한 프로세스의 다른 사용자 스레드와 파이버가 실행되지 않습니다.

이에 따라 전체 프로세스가 차단 될 수 있으며 IO에서 하나의 스레드가 차단 될 때 스레드가 예약되지 않습니다. 나는 이것이 OS와 관련이 있으며 항상 유지되지는 않을 것이라고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.