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

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



답변

동 기적으로 무언가를 실행하면 다른 작업으로 넘어 가기 전에 완료 될 때까지 기다립니다. 비동기식으로 무언가를 실행하면 완료되기 전에 다른 작업으로 넘어갈 수 있습니다.

컴퓨터의 맥락에서 이것은 다른 “스레드”에서 프로세스 또는 작업을 실행하는 것으로 해석됩니다. 스레드는 작업 단위로 존재하는 일련의 명령 (코드 블록)입니다. 운영 체제는 다른 스레드로 전환하기 전에 여러 스레드를 관리하고 스레드에 프로세서 시간 ( “슬라이스”)을 할당하여 일부 작업을 수행 할 수 있습니다. 핵심에서 (펑을 용서함) 프로세서는 단순히 명령을 실행할 수 있으며 한 번에 두 가지 작업을 수행한다는 개념이 없습니다. 운영 체제는 시간 조각을 다른 스레드에 할당하여이를 시뮬레이션합니다.

이제 여러 코어 / 프로세서를 믹스에 도입하면 실제로는 실제로 일어날 수 있습니다. 운영 체제는 첫 번째 프로세서의 한 스레드에 시간을 할당 한 다음 다른 프로세서의 다른 스레드에 동일한 시간 블록을 할당 할 수 있습니다. 이 모든 것은 운영 체제가 작업 완료를 관리하고 코드를 작성하고 다른 작업을 수행 할 수 있도록하는 것입니다.

비동기 프로그래밍은 작업을 동시에 수행 할 수있을 때 사물이 어떻게 연결되는지에 대한 의미로 인해 복잡한 주제입니다. 주제에 관한 많은 기사와 책이 있습니다. 보세요!


답변

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

동기 또는 동기화 는 “연결됨”또는 “의존적”을 의미합니다. 즉, 두 개의 동기 작업은 서로를 인식해야하며 한 작업은 다른 작업이 완료 될 때까지 시작 대기와 같이 다른 작업에 종속 된 방식으로 실행되어야합니다.
비동기는 그것들이 완전히 독립적이라는 것을 의미하며, 어느 쪽도 시작 또는 실행 중 어느 쪽도 다른 것을 고려해서는 안됩니다.

동기식 (한 스레드) :

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 또는 실제로 어떤 하드웨어가 관련이 없습니다. 실제로이 점을 나타 내기 위해 그래픽을 편집하여 표시했습니다.


비동기식 예 :

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

동기식 예 :

작업이 순서대로 실행되어야하지만 다른 시스템에서 실행되어야하는 여러 작업으로 구성된 모든 프로세스 (데이터 가져 오기 및 / 또는 업데이트, 금융 서비스에서 주식 시세 등) 별도의 시스템에있는 경우 동기식이든 비동기식이든 별도의 스레드에 있습니다.


답변

더 간단한 용어로 :

동기식

영화 표를 받기 위해 대기 중입니다. 당신 앞에있는 모든 사람이 하나를 얻을 때까지 하나를 얻을 수 없으며, 당신 뒤에있는 사람들에게도 동일하게 적용됩니다.

비동기

당신은 다른 많은 사람들과 식당에 있습니다. 당신은 음식을 주문합니다. 다른 사람들도 음식을 주문할 수 있으며, 주문을하기 전에 음식이 조리되어 제공 될 때까지 기다릴 필요가 없습니다. 부엌 식당에서 일하는 노동자들은 계속해서 요리하고, 서빙하고, 주문을받습니다. 사람들은 요리하자마자 음식을 제공받을 것입니다.


답변

유추를 통한 간단한 설명

동기 실행

내 상사는 바쁜 사람입니다. 그는 코드를 작성하라고 말합니다. 나는 그에게 말한다. 나는 시작했고 그는 내 어깨 너머로 내 뒤에 서있는 독수리처럼 나를보고있다. 나는 “Dude, WTF : 내가 이걸 끝내는 동안 무언가를 해보지 않겠습니까?”

“아니요, 당신이 끝날 때까지 기다리고 있어요 .” 동기식입니다.

비동기 실행

상사는 나에게 그렇게하라고 지시하고 내 일을 바로 기다리는 대신 상사가 떠나 다른 일을한다. 일을 마치면 나는 단순히 상사에게보고하고 “나는 끝났어!”라고 말합니다. 이것은 비동기 실행입니다.

(나의 충고를 들어라 : 절대로 당신 뒤의 사장과 일하지 마십시오.)


답변

동기 실행 은 단일 시리즈에서 실행이 발생 함을 의미합니다. A->B->C->D. 이러한 루틴을 호출하는 경우 A실행, 종료, B시작, 종료, C시작 등을 수행합니다.

비동기 실행을 사용하면 루틴을 시작하고 다음을 시작할 때 백그라운드에서 실행되도록 한 다음 “이것이 끝날 때까지 기다리십시오”라고 말합니다. 더 비슷하다 :

시작 A->B->C->D->대기 에 대한 A마무리

장점은 실행할 수 있다는 것입니다 B, C그리고 나 D하면서 A여전히 (별도의 스레드에서 백그라운드에서)를 실행하는 당신이 당신의 자원을 더 잘 활용하고 더 적은 “중지”또는 “대기”를 가질 수 있습니다.


답변

간단히 말해서, 동기화는 두 개 이상의 프로세스 ‘를 의미 시작 지점, NOT 자신의 실행 . 이 예에서 프로세스 A의 엔드 포인트는 프로세스 B의 시작점과 동기화됩니다.

동기식
   | -------- A -------- |
                     | -------- B -------- |

반면에 비동기 프로세스 는 시작 및 엔드 포인트가 동기화 되지 않습니다 .

비동기
   | -------- A -------- |
         | -------- B -------- |

프로세스 A가 프로세스 B와 겹치는 경우 동시에 또는 동 기적으로 실행되고 (사전 정의) 혼란이 발생합니다.

업데이트 : Charles Bretana는 그의 대답을 향상 시켰 으므로 이제이 대답은 단순한 (잠재적으로 지나치게 단순화 된) 니모닉입니다.


답변

동기는 호출자가 응답 또는 완료를 대기하고 호출자가 계속하고 응답이 나중에있는 경우 비동기식임을 의미합니다 (해당되는 경우).

예로서:

    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

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