[asynchronous] 비동기 대 동기 실행은 무엇을 의미합니까?



8 Answers

동기식 / 비동기식은 멀티 쓰레딩과 관련이 없습니다.

Synchronous 또는 Synchronized 는 어떤 식 으로든 "connected"또는 "dependent"를 의미합니다. 즉, 두 개의 동기 작업이 서로 인식되어야하며, 한 작업은 다른 작업이 완료 될 때까지 대기하기 위해 어떤 방식 으로든 다른 작업에 종속적으로 실행되어야합니다.
비동기 란 완전히 독립적이며 시작이나 실행 중 어떤 방법으로도 다른 것을 고려해야한다는 것을 의미합니다.

동기식 (한 스레드) :

1 thread ->   |<---A---->||<----B---------->||<------C----->|

동기식 (멀티 스레드) :

thread A -> |<---A---->|   
                        \  
thread B ------------>   ->|<----B---------->|   
                                              \   
thread C ---------------------------------->   ->|<------C----->| 

비동기 (한 스레드) :

         A-Start ------------------------------------------ A-End   
           | B-Start -----------------------------------------|--- B-End   
           |    |      C-Start ------------------- C-End      |      |   
           |    |       |                           |         |      |
           V    V       V                           V         V      V      
1 thread->|<-A-|<--B---|<-C-|-A-|-C-|--A--|-B-|--C-->|---A---->|--B-->| 

비동기 (멀티 스레드) :

 thread A ->     |<---A---->|
 thread B ----->     |<----B---------->| 
 thread C --------->     |<------C--------->|
  • < , > 문자로 표시된 작업 A, B, C의 시작 및 종료 지점.
  • 세로 막대로 표시된 CPU 시간 조각 |

기술적으로 동기식 / 비동기식이라는 개념은 실제로 스레드와 관련이 없습니다 . 일반적으로 같은 스레드에서 실행되는 비동기 작업을 찾는 것은 드문 일이지만 가능한 경우 (아래 예제 참조) 서로 다른 스레드에서 동시에 실행되는 두 개 이상의 작업을 찾는 것이 일반적입니다 . 아니요, 개념 동기식 / 비동기식은 다른 (첫 번째) 작업이 완료되기 전에 두 번째 또는 후속 작업을 시작할 수 있는지 여부 또는 대기해야하는지 여부 만 전적으로 관련이 있습니다. 그게 전부입니다. 어떤 스레드 (또는 스레드), 프로세스 또는 CPU, 또는 실제로 어떤 하드웨어가 실행되는지는 관련이 없습니다. 사실,이 점을 확인하기 위해 그래픽을 편집 해 보았습니다.

비 순응적인 예. 많은 엔지니어링 문제를 해결하면서 소프트웨어는 전반적인 문제를 여러 개별 작업으로 분리 한 다음 비동기 적으로 실행하도록 설계되었습니다. 행렬을 반전하거나 유한 요소 해석 문제는 좋은 예입니다. 컴퓨팅에서 목록 정렬은 예제입니다. 예를 들어, 빠른 정렬 루틴은 목록을 두 개의 목록으로 분할하고 그 자체를 재귀 적으로 호출하여 각 목록을 정렬합니다. 위의 두 예제 모두에서 두 태스크는 비동기 적으로 실행될 수 있습니다. 그들은 별도의 스레드에있을 필요가 없습니다. 하나의 CPU와 하나의 실행 스레드 만있는 머신 일지라도 첫 번째 태스크가 완료되기 전에 두 번째 태스크의 처리를 시작하도록 코딩 할 수 있습니다. 유일한 기준은 한 작업의 결과가 다른 작업의 입력으로 필요하지 않다는 것 입니다. 작업의 시작과 끝 시간이 겹치는 한 (어느 쪽의 출력도 다른 쪽의 입력으로 필요하지 않은 경우에만 가능), 사용중인 스레드의 수에 관계없이 비동기 적으로 실행됩니다.

동기 예. 작업을 순서대로 실행해야하지만 여러 시스템에서 실행해야하는 여러 작업으로 구성된 모든 프로세스 (데이터 가져 오기 및 / 또는 업데이트, 금융 서비스에서 주식 시세 가져 오기 등). 그것은 별도의 컴퓨터에 있다면 그것은 동기 또는 비동기 여부에 관계없이 별도의 스레드에 있습니다.

Question

비동기식 실행과 동기식 실행의 차이점은 무엇입니까?




요컨대, 동기화는 두 개 이상의 프로세스의 시작 지점을 나타내며 실행은 아닙니다 . 이 예에서 프로세스 A의 끝점은 프로세스 B의 시작점과 동기화됩니다.

SYNCHRONOUS
   |--------A--------|
                     |--------B--------|

반면 비동기 프로세스는 시작과 끝점을 동기화하지 않습니다 .

ASYNCHRONOUS
   |--------A--------|
         |--------B--------|

프로세스 A가 프로세스 B와 겹치는 경우, 동시에 또는 synchronously (사전 정의) 실행되므로 혼동이 일어납니다.

"비동기 및 동기 실행 "대신 "비동기 및 동기 프로세스 "라는 용어로 생각하는 것이 도움이 될 수 있습니다.




동기 조작은 호출자에게 리턴하기 전에 작동합니다.

비동기 작업은 호출자에게 반환 한 후 작업의 대부분 또는 전부를 수행합니다.




내가 할 수있는 한 간단하게 설명하려고 노력할 것입니다. (잘하면) 기억할 것입니다.

동기 실행

내 상사는 바쁜 사람입니다. 그는 코드를 작성하라고 알려줍니다. 나는 그에게 말한다. 좋아. 나는 시작하고 그는 나를 뒤에서 내 어깨에 떨어져 독수리처럼 지켜보고있다. 나는 "Dude, WTF 같아. 왜 내가 끝내는 동안 너는 가서 뭔가를하지?"

그는 좋아해. "아니, 네가 끝날 때까지 여기서 기다리고 있어." 이것은 동기식입니다.

비동기 실행

사장님이 저에게 그렇게하라고 말씀하십니다. 저의 일을 위해 바로 기다리는 것보다 사장님이 떨어져서 다른 일을합니다. 직장을 마치면 상사에게보고하고 "나는 끝났어!"라고 말하면됩니다. 이것은 비동기 실행입니다.

정말 간단합니다! 희망이 도움이됩니다.

(제 충고를 지키십시오 : 결코 당신 뒤의 보스와 일하십시오.)




a> b> c> d>와 같은 시퀀스를 실행할 때, 실행 중간에 실패가 발생하면 :

a
b
c
fail

그런 다음 처음부터 다시 시작합니다.

a
b
c
d

이것은 동기식이다.

그러나 a> b> c> d>와 같은 시퀀스를 실행하면 중간에 오류가 발생합니다.

a
b
c
fail

... 처음부터 다시 시작하는 대신 실패 시점부터 다시 시작합니다.

c
d

... 이것은 비동기식으로 알려져 있습니다.




동기식 프로그래밍 모델 - 스레드가 하나의 작업에 할당되고 작업을 시작합니다. 작업이 완료되면 다음 작업을 수행 할 수 있습니다. 이 모델에서는 실행중인 태스크를 중간에두고 다른 태스크를 수행 할 수 없습니다. 이 모델이 단일 및 다중 스레드 환경에서 어떻게 작동하는지에 대해 논의 해 보겠습니다.

단일 스레드 - 우리가 작업해야 할 몇 가지 작업이 있고 현재 시스템이 단 하나의 스레드 만 제공하면 작업은 하나씩 스레드에 할당됩니다. 그림으로 묘사 될 수 있습니다.

Multi-Threaded -이 환경에서는 이러한 작업을 수행 할 수있는 여러 스레드를 사용하여 작업을 시작했습니다. 이는 우리가 스레드 풀 (새로운 스레드는 요구 사항과 사용 가능한 리소스를 기반으로 생성 될 수 있음)과 많은 작업을 의미합니다. 그래서이 스레드는 다음과 같이 작업 할 수 있습니다.

비동기식 프로그래밍 모델 - 동기식 프로그래밍 모델과는 달리, 스레드는 일단 태스크를 실행하기 시작하면 중간에 유지하고 현재 상태를 저장하고 다른 태스크를 시작합니다.

단일 스레드

멀티 스레드

더 많은 정보 - https://codewala.net/2015/07/29/concurrency-vs-multi-threading-vs-asynchronous-programming-explained/




동기식은 호출자가 응답 또는 완료를 기다리고, 호출자가 계속해서 비동기 적이며 응답이 나중에 온다는 것을 의미합니다 (적용 가능한 경우).

예로서:

    static void Main(string[] args)
    {
        Console.WriteLine("Before call");
        doSomething();
        Console.WriteLine("After call");
    }

    private static void doSomething()
    {
        Console.WriteLine("In call");
    }

항상 출력됩니다.

Before call
In call
After call

그러나 doSomething 비동기 (여러 가지 방법으로)를 만들면 출력 다음과 같이 수 있습니다.

Before call
After call
In call

비동기 호출을하는 메소드가 다음 코드 행에서 즉시 계속되기 때문에. 비동기 작업으로 실행 순서를 보장 할 수 없기 때문에 "할 수있다"라고 말합니다. 또한 스레드 타이밍 등에 따라 원본으로 실행할 수도 있습니다.




나는 그것을 생각하는 좋은 방법이 클래식 러닝 계주 레이스라고 생각합니다.

동기식 (Synchronous) : 같은 팀 구성원과 같은 프로세스는 배턴 (이전 프로세스 / 러너의 실행 끝)을받을 때까지 실행되지 않지만 모두 서로 동기화됩니다.

비동기 : 프로세스가 동일한 릴레이 경주 트랙에있는 서로 다른 팀의 구성원과 같은 곳에서는 서로 경쟁하지만 동일한 경주 (전체 프로그램 실행) 내에서 비동기로 실행 및 중지됩니다.

그것은 의미가 있습니까?




정말 간단한 예로서,

동기

도로에서 줄을 서서 걷도록 지시 한 10 명의 학교 학생을 상상해보십시오.

세 번째 학생은 신발 끈을 풀었습니다. 이제 그녀는 멈춰서 다시 묶었습니다.

뒤에있는 모든 학생이 멈 췄고, 이제 그녀가 묶여지기를 기다리고 있습니다. 1 학년과 2 학년 학생들은 모두 과거를 걷고 평소대로 계속 걸어 왔습니다.

10-->9-->8-->7-->6-->5-->4-->3.     2-->1-->

비 순응 적

그냥 같은 길을 걷고있는 무작위 사람들 10 명을 상상해보십시오. 그들은 길의 대기열에 있지 않고, 단지 무작위로 다른 보행 거리의 다른 장소를 걷고 있습니다.

제 3 자의 신발 끈이 풀렸습니다. 그녀는 그것을 다시 묶기 위해 멈췄다.

그러나 아무도 그녀가 묶여지기를 기다리고 있지 않습니다. 다른 사람들은 이전과 똑같은 방식으로 계속 걷고 있습니다.

10-->    9-->
   8--> 7-->   6-->
 5-->  4-->  3. 2-->
1-->



Related