Programing

비동기 실행과 동기 실행, 이것이 실제로 무엇을 의미합니까?

lottogame 2020. 9. 27. 12:40
반응형

비동기 실행과 동기 실행, 이것이 실제로 무엇을 의미합니까?


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


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

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

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

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


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

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

동기식 (하나의 스레드) :

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와 하나의 실행 스레드 만있는 기계라도 첫 번째 작업이 완료되기 전에 두 번째 작업의 처리를 시작하도록 코딩 할 수 있습니다. 유일한 기준은 한 작업의 결과가 다른 작업에 대한 입력으로 필요하지 않다는 것입니다.. 작업의 시작 및 종료 시간이 겹치는 한 (둘 중 어느 쪽의 출력도 다른쪽에 대한 입력으로 필요하지 않은 경우에만 가능) 사용중인 스레드 수에 관계없이 비동기 적으로 실행됩니다.

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


간단히 말해서 :

동기

영화 티켓을 받기 위해 대기열에 있습니다. 앞에있는 모든 사람이 하나를 얻을 때까지 하나를 얻을 수 없으며, 뒤에있는 사람들도 마찬가지입니다.

비동기

당신은 다른 많은 사람들과 식당에 있습니다. 음식을 주문합니다. 다른 사람들도 음식을 주문할 수 있으며 주문하기 전에 음식이 조리되어 제공 될 때까지 기다릴 필요가 없습니다. 주방 식당에서 직원들은 계속해서 요리하고, 서빙하고, 주문을받습니다. 사람들은 음식이 조리되는 즉시 제공됩니다.


유추를 통한 간단한 설명

동기 실행

내 상사는 바쁜 사람입니다. 그는 코드를 작성하라고합니다. 나는 그에게 말한다 : 좋아. 나는 시작하고 그는 내 뒤에 서서 내 어깨에서 독수리처럼 나를보고 있습니다. 나는 "Dude, WTF : 내가 이걸 끝내는 동안 가서 뭔가하지 그래?"

그는 "아니요, 당신이 끝낼 때까지 여기서 기다리고 있어요 ." 이것은 동기식입니다.

비동기 실행

사장님은 저에게 그렇게하라고 하시고, 바로 그곳에서 제 일을 기다리기보다는 사장님이 나가서 다른 일을합니다. 업무를 마치면 상사에게보고하고 "나는 끝났습니다!"라고 말합니다. 이것은 비동기 실행입니다.

(내 충고를 따르십시오 : 당신 뒤에있는 상사와 함께 일하지 마십시오.)


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

비동기 실행을 사용하면 루틴을 시작하고 다음 작업을 시작하는 동안 백그라운드에서 실행되도록 한 다음 어느 시점에서 "완료 될 때까지 기다리십시오"라고 말합니다. 다음과 같습니다.

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

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


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

예로서:

    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

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


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

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

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

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

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

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


나는 이것이 약간 둥근 설명이라고 생각하지만 여전히 실제 사례를 사용하여 명확하게 설명합니다.

작은 예 :

오디오 재생에 세 단계가 포함된다고 가정 해 보겠습니다.

  1. 하드 디스크에서 압축 된 노래 가져 오기
  2. 오디오 압축을 풉니 다.
  3. 압축되지 않은 오디오를 재생합니다.

오디오 플레이어가 모든 노래에 대해 1,2,3 단계를 순차적으로 수행하면 동기식입니다. 노래를 실제로 가져오고 압축을 풀 때까지 노래를 들으려면 잠시 기다려야합니다.

오디오 플레이어가 서로 독립적으로 1,2,3 단계를 수행하면 비동기식입니다. 즉. 오디오 1을 재생하는 동안 (3 단계) 하드 디스크에서 오디오 3을 병렬로 가져오고 (1 단계) 오디오 2를 병렬로 압축 해제합니다. (2 단계) 가져 오기 및 압축 해제를 많이 기다리지 않고 노래를 듣게 될 것입니다.


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

단일 스레드 – 작업 할 작업이 두 개 있고 현재 시스템이 단일 스레드 만 제공하는 경우 작업이 스레드에 하나씩 할당됩니다. 그림으로 묘사 될 수 있습니다.
동기식 단일 스레드

다중 스레드 –이 환경에서 우리는 이러한 작업을 처리하고 작업을 시작할 수있는 다중 스레드를 사용했습니다. 즉, 스레드 풀 (요구 사항 및 사용 가능한 리소스에 따라 새 스레드를 만들 수도 있음) 및 작업 무리가 있습니다. 따라서이 스레드는 다음과 같이 작업 할 수 있습니다.
동기식 다중 스레드

비동기 프로그래밍 모델 – 동기 프로그래밍 모델과는 달리 스레드는 작업을 실행하기 시작하면 중간에 보류하고 현재 상태를 저장하고 다른 작업을 실행할 수 있습니다.

단일 스레드 비동기 단일 스레드

다중 스레드 비동기 다중 스레드

SO answer about sync and async: in iOS, in Android

The source is here


Simply said asynchronous execution is doing stuff in the background.

For example if you want to download a file from the internet you might use a synchronous function to do that but it will block your thread until the file finished downloading. This can make your application unresponsive to any user input.

Instead you could download the file in the background using asynchronous method. In this case the download function returns immediately and program execution continues normally. All the download operations are done in the background and your program will be notified when it's finished.


When executing a sequence like: a>b>c>d>, if we get a failure in the middle of execution like:

a
b
c
fail

Then we re-start from the beginning:

a
b
c
d

this is synchronous

If, however, we have the same sequence to execute: a>b>c>d>, and we have a failure in the middle:

a
b
c
fail

...but instead of restarting from the beginning, we re-start from the point of failure:

c
d

...this is know as asynchronous.


As a really simple example,

SYNCHRONOUS

Imagine 3 school students instructed to run a relay race on a road.

1st student runs her given distance, stops and passes the baton to the 2nd. No one else has started to run.

1------>
        2.
                3.

When the 2nd student retrieves the baton, she starts to run her given distance.

      1.
        2------>
                3.

The 2nd student got her shoelace untied. Now she has stopped and tying up again. Because of this, 2nd's end time has got extended and the 3rd's starting time has got delayed.

      1.
        --2.--->
                3.

This pattern continues on till the 3rd retrieves the baton from 2nd and finishes the race.

ASYNCHRONOUS

Just Imagine 10 random people walking on the same road. They're not on a queue of course, just randomly walking on different places on the road in different paces.

2nd person's shoelace got untied. She stopped to get it tied up again.

But nobody is waiting for her to get it tied up. Everyone else is still walking the same way they did before, in that same pace of theirs.

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

I created a gif for explain this, hope to be helpful: look, line 3 is asynchronous and others are synchronous. all lines before line 3 should wait until before line finish its work, but because of line 3 is asynchronous, next line (line 4), don't wait for line 3, but line 5 should wait for line 4 to finish its work, and line 6 should wait for line 5 and 7 for 6, because line 4,5,6,7 are not asynchronous. line 3 is asynchronous and others are synchronous


You are confusing Synchronous with Parallel vs Series. Synchronous mean all at the same time. Syncronized means related to each othere which can mean in series or at a fixed interval. While the program is doing all, it it running in series. Get a dictionary...this is why we have unsweet tea. You have tea or sweetened tea.


Synchronous basically means that you can only execute one thing at a time. Asynchronous means that you can execute multiple things at a time and you don't have to finish executing the current thing in order to move on to next one.


Use an example of instructions for making a breakfast

  1. Pour a cup of coffee.
  2. Heat up a pan, then fry two eggs.
  3. Fry three slices of bacon.
  4. Toast two pieces of bread.
  5. Add butter and jam to the toast.
  6. Pour a glass of orange juice.

If you have experience cooking, you'd execute those instructions asynchronously. you'd start warming the pan for eggs, then start the bacon. You'd put the bread in the toaster, then start the eggs. At each step of the process, you'd start a task, then turn your attention to tasks that are ready for your attention.

Cooking breakfast is a good example of asynchronous work that isn't parallel. One person (or thread) can handle all these tasks. Continuing the breakfast analogy, one person can make breakfast asynchronously by starting the next task before the first completes. The cooking progresses whether or not someone is watching it. As soon as you start warming the pan for the eggs, you can begin frying the bacon. Once the bacon starts, you can put the bread into the toaster.

For a parallel algorithm, you'd need multiple cooks (or threads). One would make the eggs, one the bacon, and so on. Each one would be focused on just that one task. Each cook (or thread) would be blocked synchronously waiting for bacon to be ready to flip, or the toast to pop.

Reference from Asynchronous programming concepts


A synchronous operation does its work before returning to the caller.

An asynchronous operation does (most or all of) its work after returning to the caller.


In regards to the "at the same time" definition of synchronous execution (which is sometimes confusing), here's a good way to understand it:

Synchronous Execution: All tasks within a block of code are all executed at the same time.

Asynchronous Execution: All tasks within a block of code are not all executed at the same time.


I think a good way to think of it is a classic running Relay Race

Synchronous: Processes like members of the same team, they won't execute until they receive baton (end of the execution of previous process/runner) and yet they are all acting in sync with each other.

Asynchronous: Where processes like members of different teams on the same relay race track, they will run and stop, async with each other, but within same race (overall program execution).

Does it make sense?


A different english definition of Synchronize is Here

Coordinate; combine.

I think that is a better definition than of "Happening at the same time". That one is also a definition, but I don't think it is the one that fits the way it is used in Computer Science.

So an asynchronous task is not co-coordinated with other tasks, whereas a synchronous task IS co-coordinated with other tasks, so one finishes before another starts.

How that is achieved is a different question.


Synchronous means queue way execution one by one task will be executed. Suppose there is only vehicle that need to be share among friend to reach their destination one by one vehicle will be share.
In asynchronous case each friend can get rented vehicle and reach its destination.


예, 동기는 동시에 말 그대로 함께 일하는 것을 의미합니다. 세계의 여러 인간 / 객체는 동시에 여러 작업을 수행 할 수 있지만 컴퓨터를 살펴보면 동기는 프로세스가 함께 작동하는 위치를 의미하며 이는 프로세스가 서로의 반환에 의존한다는 것을 의미하며 이것이 바로 실행되는 이유입니다. 적절한 순서로 차례로. 비동기는 프로세스가 함께 작동하지 않는 것을 의미하는 반면, 동시에 작동 할 수 있지만 (다중 스레드에있는 경우) 독립적으로 작동합니다.

참고 URL : https://stackoverflow.com/questions/748175/asynchronous-vs-synchronous-execution-what-does-it-really-mean

반응형