etc./StackOverFlow

비동기 대 동기 실행, 주요 차이점은 무엇입니까? [닫은]

청렴결백한 만능 재주꾼 2023. 4. 13. 10:23
반응형

질문자 :tush1r


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



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

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

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

비동기 프로그래밍은 동시에 수행할 수 있을 때 함께 묶이는 의미 때문에 복잡한 주제입니다. 주제에 대한 수많은 기사와 책이 있습니다. 봐!


Adam Robinson

동기/비동기는 멀티스레딩과 아무 관련이 없습니다.

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

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

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

동기 예:

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


Charles Bretana

더 간단한 용어로:

동기

당신은 영화표를 받기 위해 줄을 서 있습니다. 앞에 있는 모든 사람이 받을 때까지 받을 수 없으며, 뒤에 있는 사람들도 마찬가지입니다.

비동기식

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


themightysapien

유추를 통한 간단한 설명

화난 직원

(당신이 기억하는 데 도움이되는 이야기 및 사진 제공).

동기 실행

나의 상사는 바쁜 사람이다. 그는 나에게 코드를 작성하라고 말한다. 나는 그에게 말한다: 좋아. 내가 시작하자 그는 독수리처럼 내 뒤에 서서 내 어깨 너머로 나를 지켜보고 있습니다. 나는 "야, WTF: 내가 이 일을 끝내는 동안 가서 뭔가 하는 게 어때?"

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

비동기 실행

사장이 하라고 하고 내 일을 기다리지 않고 사장이 나가서 다른 일을 한다. 일을 마치면 상사에게 보고하고 "끝났어!"라고 말합니다. 이것은 비동기 실행입니다.

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


BenKoshy

동기 실행 은 실행이 단일 시리즈에서 발생함을 의미합니다. A->B->C->D . 이러한 루틴을 호출하는 경우 A 가 실행된 다음 완료되고 B 가 시작되고 완료되고 C 가 시작되는 식입니다.

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

시작 A->B->C->D-> A 가 완료될 때까지 기다립니다.

이점은 A 가 여전히 실행 중인 동안 B , C 및 또는 D 를 실행할 수 있으므로 리소스를 더 잘 활용하고 "중단" 또는 "대기"가 더 적다는 것입니다.


Reed Copsey

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

동기
   |--------아--------|
                     |--------B--------|

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

비동기식
   |--------아--------|
         |--------B--------|

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

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


entr0p3te

동기식이란 호출자가 응답 또는 완료를 기다리는 것을 의미하고 asynchronous 으로 호출자가 계속되고 응답이 나중에 온다는 것을 의미합니다(해당되는 경우).

예로서:

 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 asynchronous 으로 만들면(여러 방법으로 수행) 출력 은 다음과 같을 수 있습니다 .

 Before call After call In call

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


Ragoczy

동기화 대 비동기

Syncasync 작업은 현재 작업과 관련된 next task 실행 순서 current task

Task 2current task 이고 Task 3next task 예를 살펴보겠습니다. 작업은 원자적 작업입니다 - 스택(메서드 프레임)의 메서드 호출

동기식 - 작업이 하나씩 실행됨을 의미합니다. next task current task 이 완료된 후에만 시작됩니다. Task 3 Task 2 가 완료될 때까지 시작되지 않습니다.

단일 스레드 + 동기화 - 순차적 일반 실행. 의사 코드:

 main() { task1() task2() task3() }

다중 스레드 + 동기화 - 병렬 - 차단됨. 차단됨은 스레드가 대기 중임을 의미합니다(유용한 작업을 수행할 수 있지만 예를 들어 Java ExecutorService [About]Future [About] ) 의사 코드:

 main() { task1() Future future = ExecutorService.submit(task2()) future.get() //<- blocked operation task3() }

비동기식 – 작업이 코드를 실행하고 나중에 결과를 알리겠다는 약속(예: 콜백, 기능)과 함께 즉시 제어를 반환함을 의미합니다. Task 2 가 완료되지 않은 Task 3 이 실행됩니다. async callback , completion handler [정보]

단일 스레드 + 비동기 - 동시 Callback Queue ( Message Queue ) 및 Event Loop ( Run Loop , Looper )가 사용됩니다. Event Loop Thread Stack 이 비어 있는지 확인하고 true이면 Callback Queue 첫 번째 항목을 Thread Stack 으로 푸시하고 이러한 단계를 다시 반복합니다. 간단한 예는 버튼 클릭, 이벤트 게시... 의사 코드:

 main() { task1() ThreadMain.handler.post(task2()); task3() }

다중 스레드 + 비동기 - 동시 및 병렬 비 차단. 예를 들어 차단하지 않고 다른 스레드에서 일부 계산을 수행해야 할 때. 의사 코드:

 main() { task1() new Thread(task2()).start(); //or Future future = ExecutorService.submit(task2()) task3() }

get() 사용하거나 loop 통해 async callback 을 사용하여 작업 2의 결과를 사용할 수 있습니다.

예를 들어 UI/메인 스레드가 있고 다운로드해야 하는 모바일 세계에서 몇 가지 옵션이 있습니다.

  • sync 블록 - UI 스레드를 차단하고 다운로드가 완료될 때까지 기다립니다. UI가 반응하지 않습니다.
  • async 콜백 - 비동기 콜백으로 새 트레드를 생성하여 UI를 업데이트합니다(비 UI 스레드에서 UI에 액세스할 수 없음). 콜백 지옥.
  • async coroutine [About] - 동기화 구문이 있는 비동기 작업. UI 작업과 다운로드 작업(일시 중단 기능)을 혼합할 수 있습니다.

[iOS 동기화/비동기] , [안드로이드 동기화/비동기]

[병렬 대 동시]


yoAlex5

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

작은 예:

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

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

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

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


aJ.

나는 이것을 설명하기 위해 gif를 만들었습니다. 도움이 되기를 바랍니다. 보세요. 3행은 비동기식이고 나머지는 동기식입니다. 라인 3 이전의 모든 라인은 라인이 작업을 완료할 때까지 기다려야 하지만 라인 3은 비동기식이므로 다음 라인(라인 4)은 라인 3을 기다리지 말고 라인 5는 라인 4가 작업을 완료할 때까지 기다려야 합니다. 6번 줄은 5번 줄, 7번 줄은 6번을 기다려야 합니다. 4,5,6,7번 줄은 비동기식이 아니기 때문입니다. 라인 3은 비동기식이고 나머지는 동기식입니다.


Abolfazl Miadian

간단히 말해서 비동기 실행은 백그라운드에서 작업을 수행하는 것입니다.

예를 들어 인터넷에서 파일을 다운로드하려면 동기 함수를 사용할 수 있지만 파일 다운로드가 완료될 때까지 스레드가 차단됩니다. 이로 인해 애플리케이션이 사용자 입력에 응답하지 않을 수 있습니다.

대신 비동기 방법을 사용하여 백그라운드에서 파일을 다운로드할 수 있습니다. 이 경우 다운로드 기능이 즉시 반환되고 프로그램 실행이 정상적으로 계속됩니다. 모든 다운로드 작업은 백그라운드에서 수행되며 완료되면 프로그램에 알림이 전송됩니다.


Michał Piaskowski

정말 간단한 예로,

동기

도로에서 릴레이 경주를 하도록 지시받은 3명의 학생을 상상해 보십시오.

1등 학생은 주어진 거리를 달리다가 멈춰 2등 학생에게 배턴을 넘깁니다. 다른 사람이 달리기 시작하지 않았습니다.

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

2번째 학생이 배턴을 회수하면 지정된 거리를 달리기 시작합니다.

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

두 번째 학생은 신발끈을 풀었습니다. 이제 그녀는 멈추고 다시 묶습니다. 이로 인해 2차 종료 시간이 연장되고 3차 시작 시간이 늦어지고 있습니다.

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

이 패턴은 3번째가 2번째에서 배턴을 회수하고 레이스를 마칠 때까지 계속됩니다.

비동기식

10명의 무작위 사람들이 같은 길을 걷고 있다고 상상해보십시오. 물론 줄을 서지 않고 도로의 다른 장소를 다른 속도로 무작위로 걷고 있습니다.

2인칭 신발끈이 풀렸다. 그녀는 그것을 다시 묶기 위해 멈춰 섰다.

그러나 그녀가 그것을 묶기를 기다리는 사람은 아무도 없습니다. 다른 모든 사람들은 여전히 이전과 같은 방식으로 같은 속도로 걷고 있습니다.

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

Dasun Nirmitha

동기식이란 기본적으로 한 번에 한 가지만 실행할 수 있음을 의미합니다. 비동기식이란 한 번에 여러 작업을 실행할 수 있고 다음 작업으로 이동하기 위해 현재 작업을 완료할 필요가 없음을 의미합니다.


Mike

>b>c>d>와 같은 시퀀스를 실행할 때 실행 도중에 다음과 같이 실패하면:

 a b c fail

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

 a b c d

이것은 동기식입니다

그러나 실행할 시퀀스가 동일한 경우:>b>c>d> 중간에 오류가 있습니다.

 a b c fail

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

 c d

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


mohamed tharik

아침 식사를 만들기 위한 지침의 예를 사용하십시오.

  1. 커피 한 잔을 붓습니다.
  2. 팬을 달군 다음 계란 2개를 볶습니다.
  3. 베이컨 3장을 볶습니다.
  4. 빵 두 조각을 토스트하십시오.
  5. 토스트에 버터와 잼을 추가합니다.
  6. 오렌지 주스 한 잔을 붓습니다.

요리 경험이 있는 경우 해당 지침을 비동기식으로 실행합니다. 계란 팬을 데우기 시작한 다음 베이컨을 시작하십시오. 빵을 토스터에 넣은 다음 계란을 시작하십시오. 프로세스의 각 단계에서 작업을 시작한 다음 주의를 기울일 준비가 된 작업으로 주의를 돌립니다.

아침 식사 요리 는 병렬이 아닌 비동기 작업의 좋은 예입니다. 한 사람(또는 스레드)이 이 모든 작업을 처리할 수 있습니다. 아침 식사 비유를 계속하면 한 사람이 첫 번째 작업이 완료되기 전에 다음 작업을 시작하여 비동기식으로 아침 식사를 만들 수 있습니다. 누군가 보고 있든 없든 요리는 진행됩니다. 계란 팬을 데우자마자 베이컨을 튀길 수 있습니다. 베이컨이 시작되면 빵을 토스터기에 넣을 수 있습니다.

병렬 알고리즘의 경우 여러 쿡(또는 스레드)이 필요합니다. 하나는 계란, 하나는 베이컨 등을 만들 것입니다. 각자는 그 하나의 작업에만 집중할 것입니다. 각 쿡(또는 스레드)은 베이컨이 뒤집힐 준비가 되거나 토스트가 터질 때까지 동기적으로 차단됩니다.

비동기 프로그래밍 개념의 참조


Hla Min Swe

동기와 직렬을 혼동하고 있습니다. 동기는 동시에 모든 것을 의미합니다. 동기식이란 직렬로 또는 고정된 간격으로 의미할 수 있는 서로 관련된 것을 의미합니다. 프로그램이 모든 작업을 수행하는 동안 연속적으로 실행됩니다. 사전을 가져오십시오. 이것이 우리가 달지 않은 차를 마시는 이유입니다. 당신은 차 또는 달게 한 차를 가지고 있습니다.


Joe

동기 작업은 호출자에게 반환되기 전에 작업을 수행합니다.

비동기 작업은 호출자에게 반환된 후 작업(대부분 또는 전체)을 수행합니다.


Maxim Eliseev

동기 실행의 "동시에 " 정의(때로는 혼란스럽기도 함)와 관련하여 이해하는 좋은 방법은 다음과 같습니다.

동기 실행 : 코드 블록 내의 모든 작업이 모두 동시에 실행됩니다.

비동기식 실행 : 코드 블록 내의 모든 작업이 동시에 실행되는 것은 아닙니다.


docta_faustus

클래식 런닝 릴레이 레이스라고 생각하면 좋을 것 같아요

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

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

말이 되나요?


Sharif

동기화의 다른 영어 정의는 다음과 같습니다.

동등 어구; 결합시키다.

나는 그것이 "동시에 일어나는"보다 더 나은 정의라고 생각합니다. 그것도 하나의 정의이지만 컴퓨터 과학에서 사용되는 방식에 맞는 것은 아니라고 생각합니다.

따라서 비동기 작업은 다른 작업과 조정되지 않는 반면 동기 작업은 다른 작업과 조정되므로 다른 작업이 시작되기 전에 완료됩니다.

그것을 달성하는 방법은 다른 질문입니다.


Greg Gum

동기식이란 대기열 방식 실행이 하나씩 작업을 실행한다는 의미입니다. 목적지에 도착하기 위해 친구끼리만 공유해야 하는 차량이 있다고 가정하면 차량이 하나씩 공유됩니다.
비동기식의 경우 각 친구는 차량을 대여하여 목적지에 도달할 수 있습니다.


Rohit

네, 동기식이란 말 그대로 동시에 작업을 수행하는 것을 의미합니다. 세계의 여러 사람/객체는 동시에 여러 작업을 수행할 수 있지만 컴퓨터를 보면 동기식이란 프로세스가 함께 작동하는 것을 의미합니다. 적절한 순서로 차례로. 비동기는 프로세스가 함께 작동하지 않는 것을 의미하지만 동시에(다중 스레드에 있는 경우) 작동할 수 있지만 독립적으로 작동합니다.


Saptarshi

출처 : http:www.stackoverflow.com/questions/748175/asynchronous-vs-synchronous-execution-what-is-the-main-difference

반응형