비동기 실행과 동기 실행의 차이점은 무엇입니까?
비동기 실행과 동기 실행의 차이점은 무엇입니까?
답변:
동 기적으로 무언가를 실행하면 다른 작업으로 넘어 가기 전에 완료 될 때까지 기다립니다. 비동기식으로 무언가를 실행하면 완료되기 전에 다른 작업으로 넘어갈 수 있습니다.
컴퓨터의 맥락에서 이것은 다른 "스레드"에서 프로세스 또는 작업을 실행하는 것으로 해석됩니다. 스레드는 작업 단위로 존재하는 일련의 명령 (코드 블록)입니다. 운영 체제는 다른 스레드로 전환하기 전에 여러 스레드를 관리하고 스레드에 프로세서 시간 ( "슬라이스")을 할당하여 일부 작업을 수행 할 수 있습니다. 핵심에서 (펑을 용서함) 프로세서는 단순히 명령을 실행할 수 있으며 한 번에 두 가지 작업을 수행한다는 개념이 없습니다. 운영 체제는 시간 조각을 다른 스레드에 할당하여이를 시뮬레이션합니다.
이제 여러 코어 / 프로세서를 믹스에 도입하면 실제로는 실제로 일어날 수 있습니다. 운영 체제는 첫 번째 프로세서의 한 스레드에 시간을 할당 한 다음 다른 프로세서의 다른 스레드에 동일한 시간 블록을 할당 할 수 있습니다. 이 모든 것은 운영 체제가 작업 완료를 관리하고 코드를 작성하고 다른 작업을 수행 할 수 있도록하는 것입니다.
비동기 프로그래밍은 작업을 동시에 수행 할 수있을 때 사물이 어떻게 연결되는지에 대한 의미로 인해 복잡한 주제입니다. 주제에 관한 많은 기사와 책이 있습니다. 보세요!
동기식 / 비동기식은 멀티 스레딩과 관련이 없습니다.
동기 또는 동기화 는 "연결됨"또는 "의존적"을 의미합니다. 즉, 두 개의 동기 작업은 서로를 인식해야하며 한 작업은 다른 작업이 완료 될 때까지 시작 대기와 같이 다른 작업에 종속 된 방식으로 실행되어야합니다.
비동기는 그것들이 완전히 독립적이라는 것을 의미하며, 어느 쪽도 시작 또는 실행 중 어느 쪽도 다른 것을 고려해서는 안됩니다.
동기식 (한 스레드) :
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 또는 실제로 어떤 하드웨어가 관련이 없습니다. 실제로이 점을 나타 내기 위해 그래픽을 편집하여 표시했습니다.
비동기식 예 :
많은 엔지니어링 문제를 해결하기 위해 소프트웨어는 전체 문제를 여러 개의 개별 작업으로 분할 한 다음 비동기 적으로 실행하도록 설계되었습니다. 행렬을 반전하거나 유한 요소 분석 문제가 좋은 예입니다. 컴퓨팅에서 목록을 정렬하는 것이 예입니다. 예를 들어, 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"라고 말합니다. 스레드 타이밍 등에 따라 원본으로 실행할 수도 있습니다.
나는 이것이 간단한 설명이라고 생각하지만 실제 사례를 사용하여 명확하게 설명합니다.
작은 예 :
오디오 재생에는 세 단계가 포함되어 있다고 가정 해 보겠습니다.
오디오 플레이어가 모든 노래에 대해 1,2,3 단계를 순차적으로 수행하면 동기화됩니다. 노래가 실제로 가져오고 압축이 풀릴 때까지 노래를 들으려면 잠시 기다려야합니다.
오디오 플레이어가 서로 독립적으로 1,2,3 단계를 수행하는 경우 비동기입니다. 즉. 오디오 1 (3 단계)을 재생하는 동안 하드 디스크에서 오디오 3을 병렬로 가져 오면 (1 단계) 오디오 2를 병렬로 압축 해제합니다. 가져 오기 및 압축 해제를 많이 기다리지 않고 노래를들을 수있게됩니다.
동기화 및 비동기 작업은 현재 작업 과 관련된 새 작업의 실행 순서에 관한 것입니다. 테이블의 두 가지 작업 : 현재 작업과 새 작업
동기식 (차단)-작업이 하나씩 실행됨을 의미합니다. 다음 작업은 이전 작업이 완료된 후에 만 시작됩니다. 완료 Task 2
될 때까지 시작되지 않습니다Task 1
비동기식 (비 차단) – 태스크가 코드를 실행하고 나중에 결과 (예 : 콜백, 기능)를 알리 겠다는 약속으로 즉시 제어권을 반환 함을 의미합니다. 완료되지 않은 Task 2
경우에도 실행됩니다Task 1
단순히 비동기 실행이 백그라운드에서 수행되고 있다고 말했다.
예를 들어 인터넷에서 파일을 다운로드하려는 경우 동기 기능을 사용하여 파일을 다운로드 할 수 있지만 파일 다운로드가 완료 될 때까지 스레드가 차단됩니다. 따라서 응용 프로그램이 모든 사용자 입력에 응답하지 않을 수 있습니다.
대신 비동기 방법을 사용하여 백그라운드에서 파일을 다운로드 할 수 있습니다. 이 경우 다운로드 기능이 즉시 반환되고 프로그램 실행이 정상적으로 계속됩니다. 모든 다운로드 작업은 백그라운드에서 수행되며 완료되면 프로그램에 알림이 표시됩니다.
정말 간단한 예로
동기식
3 명의 학교 학생들이 도로에서 릴레이 경주를하도록 지시했다고 상상해보십시오.
첫 번째 학생은 주어진 거리로 달려가 정지하고 배턴을 두 번째로 전달합니다. 아무도 달리기 시작하지 않았습니다.
1------>
2.
3.
두 번째 학생이 지휘봉을 회수하면 주어진 거리를 달리기 시작합니다.
1.
2------>
3.
두 번째 학생은 신발 끈을 묶지 않았습니다. 이제 그녀는 멈추고 다시 묶었 다. 이로 인해 2 차 종료 시간이 연장되었고 3 차 시작 시간이 지연되었습니다.
1.
--2.--->
3.
이 패턴은 3 일이 2 일부터 지휘봉을 가져와 경주를 마칠 때까지 계속됩니다.
비동기
같은 길을 걷고있는 10 명의 무작위 사람들을 상상해보십시오. 그들은 물론 대기열에 있지 않고 도로의 다른 장소에서 다른 속도로 무작위로 걷는 것입니다.
두 번째 사람의 신발 끈이 풀렸다. 그녀는 다시 묶기 위해 멈췄다.
그러나 아무도 그녀가 묶여 있기를 기다리고 있지 않습니다. 다른 모든 사람들은 여전히 같은 속도로 그들과 같은 방식으로 걷고 있습니다.
10--> 9-->
8--> 7--> 6-->
5--> 4-->
1--> 2. 3-->
a> b> c> d>와 같은 시퀀스를 실행할 때 다음과 같이 실행 도중 실패하면
a
b
c
fail
그런 다음 처음부터 다시 시작합니다.
a
b
c
d
이것은 동 기적이다
그러나 동일한 순서로 a> b> c> d>를 실행하면 중간에 오류가 발생합니다.
a
b
c
fail
...하지만 처음부터 다시 시작하는 대신 실패 지점부터 다시 시작합니다.
c
d
... 이것은 비동기식입니다.
동기 대 병렬 대 시리즈를 혼동하고 있습니다. 동기 평균은 모두 동시에입니다. 동기화 된 것은 서로 또는 직렬로 또는 고정 된 간격을 의미 할 수있는 관련 수단을 의미합니다. 프로그램이 모든 작업을 수행하는 동안 프로그램은 연속적으로 실행됩니다. 사전을 얻으십시오 ... 이것이 우리가 달콤한 차를 마시는 이유입니다. 차 또는 달게 한 차가 있습니다.
동기는 기본적으로 한 번에 하나만 실행할 수 있음을 의미합니다. 비동기는 한 번에 여러 작업을 실행할 수 있으며 다음 작업으로 넘어 가기 위해 현재 작업을 완료하지 않아도됨을 의미합니다.
아침 식사를위한 지침의 예를 사용하십시오
요리 경험이있는 경우 해당 명령을 비동기 적으로 실행합니다. 계란 팬을 데우기 시작한 다음 베이컨을 시작합니다. 빵을 토스터에 넣고 계란을 시작합니다. 프로세스의 각 단계에서 작업을 시작한 다음주의를 기울일 준비가 된 작업에주의를 기울이십시오.
아침 식사 요리 는 병렬 작업이 아닌 비동기 작업 의 좋은 예입니다 . 한 사람 (또는 스레드)이이 모든 작업을 처리 할 수 있습니다. 아침 식사 비유를 계속하면 한 사람이 첫 번째 작업이 완료되기 전에 다음 작업을 시작하여 아침 식사를 비동기 적으로 만들 수 있습니다. 누군가보고 있든 없든 요리는 진행됩니다. 계란 팬을 데우기 시작하면 베이컨 튀김을 시작할 수 있습니다. 베이컨이 시작되면 빵을 토스터에 넣을 수 있습니다.
병렬 알고리즘의 경우 여러 쿡 (또는 스레드)이 필요합니다. 하나는 계란, 하나는 베이컨 등을 만들 것입니다. 각 작업은 하나의 작업에만 집중됩니다. 각 쿡 (또는 실)은 베이컨이 뒤집어 지거나 토스트가 터질 때까지 동기식으로 차단됩니다.
비동기 프로그래밍 개념 에서 참조
은 "에 관해서 같은 시간에 (때로는 혼란) 동기 실행의"정의, 여기를 이해하는 좋은 방법입니다 :
동기 실행 : 코드 블록 내의 모든 작업이 동시에 실행됩니다.
비동기 실행 : 코드 블록 내의 모든 작업이 동시에 실행되는 것은 아닙니다.