스레드 대 비동기
이 정말 좋은 기사에서 스레드 된 프로그래밍 모델과 비동기 모델에 대해 읽어 봤습니다. http://krondo.com/blog/?p=1209
그러나이 기사에서는 다음과 같은 사항을 언급합니다.
- 비동기 프로그램은 I / O가있을 때마다 작업을 전환하여 동기화 프로그램을 능가합니다.
- 스레드는 운영 체제에서 관리합니다.
나는 스레드가 Ready-Queue와 Waiting-Queue (다른 대기열 중에서) 사이에서 TCB를 이동함으로써 운영 체제에 의해 관리된다는 것을 읽은 것을 기억합니다. 이 경우 스레드는 기다리는 시간을 낭비하지 않습니까?
위에서 언급 한 내용에 비추어 볼 때 스레드 프로그램에 비해 비동기 프로그램의 장점은 무엇입니까?
- 스레드로부터 안전한 코드를 작성하는 것은 매우 어렵습니다. 비동기 코드를 사용하면 코드가 한 작업에서 다음 작업으로 이동하는 위치를 정확히 알 수 있으므로 경쟁 조건이 발생하기가 훨씬 더 어렵습니다.
- 각 스레드에는 자체 스택이 있어야하므로 스레드는 상당한 양의 데이터를 소비합니다. 비동기 코드를 사용하면 모든 코드가 동일한 스택을 공유하고 작업간에 스택을 지속적으로 풀기 때문에 스택이 작게 유지됩니다.
- 스레드는 OS 구조이므로 플랫폼이 지원할 수있는 더 많은 메모리입니다. 비동기 작업에는 이러한 문제가 없습니다.
스레드를 생성하는 방법에는 두 가지가 있습니다.
동기 스레딩 -부모는 하나 이상의 자식 스레드를 만든 다음 각 자식이 종료 될 때까지 기다려야합니다. 동기식 스레딩은 종종 fork-join 모델이라고 합니다.
비동기 스레딩 -부모와 자식이 동시에 / 독립적으로 실행됩니다. 다중 스레드 서버는 일반적으로이 모델을 따릅니다.
리소스-http: //www.amazon.com/Operating-System-Concepts-Abraham-Silberschatz/dp/0470128720
우선, 스레드가 구현되고 예약되는 방법에 대한 많은 세부 사항은 매우 OS에 따라 다릅니다. 일반적으로 OS와 하드웨어는 단일 프로세서 시스템에서 비동기 적으로 또는 다중 프로세서에서 병렬로 스레드가 효율적으로 실행되도록 정렬하기 때문에 서로 대기중인 스레드에 대해 걱정할 필요가 없습니다.
스레드가 I / O와 같은 무언가를 기다리면 실행 가능한 것으로 간주 할 수 있습니다. 실행 가능한 스레드는 곧 실행될 예정입니다. 이것이 단순한 대기열로 구현되는지 또는 더 복잡한 것으로 구현되는지 여부는 OS 및 하드웨어에 따라 다릅니다. 차단 된 스레드 집합을 엄격하게 정렬 된 대기열이 아닌 집합으로 생각할 수 있습니다.
단일 프로세서 시스템에서 여기에 정의 된 비동기 프로그램은 스레드 프로그램과 동일합니다.
IO (다중 프로세서 시스템에서)를 포함하지 않는 2 개의 작업이 있다고 가정합니다. 이 경우 스레드가 Async를 능가합니다. 단일 스레드 프로그램과 같은 Async는 작업을 순서대로 실행하기 때문입니다. 그러나 스레드는 두 작업을 동시에 실행할 수 있습니다.
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
하고 언제 사용 해야하는지 설명합니다 .
이것이 도움이되기를 바랍니다.
비동기 I / O는 작업을 수행하는 드라이버에 이미 스레드가 있음을 의미하므로 기능을 복제하고 약간의 오버 헤드가 발생합니다. 반면에 드라이버 스레드가 정확히 어떻게 작동하는지 문서화되지 않은 경우가 많으며 복잡한 시나리오에서 시간 초과 / 취소 / 시작 / 중지 동작, 다른 스레드와의 동기화를 제어하려는 경우 자체 스레드를 구현하는 것이 좋습니다. 때로는 동기식으로 추론하는 것이 더 쉽습니다.
http://en.wikipedia.org/wiki/Thread_(computing)#I.2FO_and_scheduling 참조
그러나 사용자 스레드 (커널 스레드와 반대) 또는 파이버에서 차단 시스템 호출을 사용하는 것은 문제가 될 수 있습니다. 사용자 스레드 또는 파이버가 차단하는 시스템 호출을 수행하는 경우 프로세스의 다른 사용자 스레드 및 파이버는 시스템 호출이 반환 될 때까지 실행할 수 없습니다. 이 문제의 전형적인 예는 I / O를 수행 할 때입니다. 대부분의 프로그램은 I / O를 동 기적으로 수행하도록 작성됩니다. I / O 작업이 시작되면 시스템 호출이 수행되고 I / O 작업이 완료 될 때까지 반환되지 않습니다. 중간 기간 동안 전체 프로세스는 커널에 의해 "차단"되고 실행될 수 없으므로 동일한 프로세스의 다른 사용자 스레드 및 파이버가 실행되지 않습니다.
이에 따라 전체 프로세스가 차단 될 수 있으며 IO에서 하나의 스레드가 차단 될 때 스레드가 예약되지 않습니다. 나는 이것이 OS에 따라 다르며 항상 유지되지는 않을 것이라고 생각합니다.
참고 URL : https://stackoverflow.com/questions/4024056/threads-vs-async
'program tip' 카테고리의 다른 글
Docker의 사용자 파일 소유권 이해 : 연결된 볼륨의 권한 변경을 방지하는 방법 (0) | 2020.11.25 |
---|---|
C #에서 이벤트를 어떻게 기다리나요? (0) | 2020.11.25 |
컬렉션의 Groovy 맵 방법 (0) | 2020.11.25 |
자바 스크립트에서 window.location.href를 조롱 (0) | 2020.11.25 |
"Objective-C 블록 없음"을 표시하는 데 적합한 nil 또는 NULL은 무엇입니까? (0) | 2020.11.25 |