비동기 대 동기의 의미 [닫힘]


46

컴퓨터 과학에서 비동기동기 라는 단어의 의미는 무엇입니까 ?

당신이 단어의 의미를 구글하면 다음을 얻을 것이다 :

그러나 프로그래밍이나 컴퓨터 과학에서 반대의 의미를 전달하는 데 사용되는 것처럼 보입니다.

HTML 비동기 속성 은 HTML이 여전히 구문 분석 또는 다운로드 되더라도 스크립트가 다운로드되는 즉시 스크립트가 실행됨을 의미합니다. 즉, 스크립트와 HTML 프로세스가 모두 존재하고 동시에 발생합니다.

이 용어가 컴퓨터 과학에서 반대의 의미를 전달하는 데 사용됩니까, 아니면 요점이 누락 되었습니까?


47
코드가 어떻게 작동하는지 이해하지 못하고 버그를 찾을 때 갑자기 버그가 사라지면 코드가 비동기적일 수 있습니다. :)
Eric Duminil

4
슬픈 사실은 프로그래밍 영역에서 시간이 지남에 따라이 단어들이 다른 의미로 바뀌 었다는 것입니다. 현재의 의미에 대한 역사적 이유가있을 수 있지만 타당한 이유는 없습니다.
솔로몬 오프의 비밀

3
무엇 과 동시에, 열쇠는 :)
가벼움 모니카와 함께

5
실제 작업 함수가 호출 될 때 (필요하게) 동시에 발생 하지 않습니다. vs. 함수가 호출되는 동시에 작업 발생합니다 ... 뒤로 보이지 않습니까? 함수를 비동기식으로 기술하면 호출하는 것과 동시에 발생하는 것은 아닙니다.
Affe

2
"순차적"과 "비 순차적"은 의미 상 더 나은 선택 일 수 있지만, 그 배는 이미 항해 중이다.
Jared Smith

답변:


47

찾은 정의와 직접 관련된 답변을 드리고자합니다. 하나의 작업 T1이 두 번째 작업 T2를 시작하면 다음과 같은 방식으로 발생할 수 있습니다.

동기식 : 기존 또는 동시에 발생합니다.

따라서 T2는 T1의 타임 슬라이스 내에서 시작되고 실행 됩니다 . T1은 T2의 종료를 "대기"하고 나중에 처리를 계속할 수 있습니다. 이러한 의미에서, T1 및 T2는 "동시에"( "병렬"이 아니라 연속적인 시간 간격으로) 발생한다.

비동기 : 존재하지 않거나 동시에 발생하지 않습니다.

따라서 T2의 실행 시간은 이제 T1과 관련이 없습니다. 병렬로 실행될 수 있으며, 1 초, 1 분 또는 몇 시간 후에 발생할 수 있으며 T1이 종료되었을 때 T2가 계속 실행될 수 있습니다 (T2의 결과를 처리하려면 새 태스크 T3이 필요할 수 있음). 이런 의미에서 T1과 T2는 "동시 발생 (간격)"되지 않습니다.

물론, 오늘날 비동기 작업이 종종 병렬 실행을 만드는 데 사용되는 것을 볼 때 리터럴 정의가 모호한 것으로 보입니다.


4
내가 잘못 생각하기 때문에 이것은 너무 많은 공판을 가지고 너무 나쁘다. 두 번째 방법은 첫 번째 (차단) 방법이 완료 될 때까지 기다려야하므로 동기식 방법은 하나씩 차례로 실행됩니다. 이 두 가지 방법은 동시에 실행 되지 않습니다 .
Robert Harvey

6
아뇨. 동기와 동시성은 동일하지 않습니다.
Robert Harvey

1
사전 정의가 소프트웨어 개발자에게별로 유용하지 않다고 주장합니다. 사전 정의를 우리가 사용하는 기술 용어에 매핑하는 것은 유용하지 않을 수 있습니다.
Robert Harvey

1
어쨌든 편집 내용이 개선되지만 "존재하거나 동시에 발생"이라는 단어가 설명을 혼란스럽게 만듭니다. 동기 메소드는 "동시에"실행되지 않습니다. 그것들은 순서대로 실행되어 동기를 만듭니다.
Robert Harvey

1
@RobertHarvey 올바른 관점을 사용하면 사전 정의가 완벽하게 작동합니다. 당신은 모두 실행 시간에 집착합니다. 명령은 실행될 때의 수명이 아닙니다. 순차 명령은 리볼버의 글 머리 기호가 동 기적으로 이동하는 것과 동일한 방식으로 동 기적으로 이동합니다. 마찬가지로 명령은 명령 파이프 라인을 통해 동 기적으로 이동할 수 있습니다. 실행 관점에 집착하지 마십시오. 명령이 실행되기 전에 많은 쓰레기가 발생합니다.
candied_orange

20

이해하는 가장 좋은 방법은 다음과 같습니다.

  • 동기식 : 언제 발생하는지 알고 있습니다 (다른 코드가 종료 될 때 발생 함).
  • 비동기 : 언제 발생하는지 알 수 없습니다.

참고 : 주어진 클럭 시간에 코드가 실행되도록 예약 할 수는 있지만 실제로는 시스템이 다른 작업을 수행하기 때문에 시스템 클럭과의 혼란을 무시하고 지연 될 수 있기 때문에 언제 발생하는지 알 수 없습니다. 게다가, 주어진 시계 시간에 정확히 일어날 것이라는 보장이 있었지만, 그 시점에서 프로그램의 실행 위치는 확실하지 않습니다. 따라서 클럭 시간으로 예약 된 코드는 동기식이 아닙니다.


예를 들어 소프트웨어 개발에서는 작업이 격리 된 작업에 대해 비동기 적이라는 것을 알 수 있습니다. 그러나 동시에 발생하는 관점에서 정의하거나 작업을 비교할 다른 항목이 필요하지 않은 경우.

많은 플랫폼이 병렬 처리 및 작업 전환을 수행 할 수 있으며, 일부는 병렬 처리가 제한적이며, 일부는 병렬 처리를 전혀 수행 할 수 없으며, 작업 전환에만 의존합니다 ... 또한 일부 플랫폼은 작업을 중단 할 수 없으며 다른 플랫폼을 실행하기 전에 완료해야합니다. ... 비동기 작업은 모든 것을 추상화하여 시스템이 개발자가 너무 걱정하지 않고 주어진 플랫폼에 대해 작업을 실행하는 방법을 결정할 수 있습니다.

외부 입력을 비동기 작업으로 가져 와서 개념화 할 수 있으며 일반적으로 추상화 할 수도 있습니다. 예를 들어 : 사용자 입력에서 텍스트를 가져옵니다. 우리는 사용자가 언제 타이핑 할 것인지 모른다. 이는 영구 저장소에서 읽거나 네트워크 또는 다른 외부 시스템을 통해 데이터를 가져 오는 경우에도 적용됩니다.


그건 그렇고, 근본적으로 비동기적인 것이 있지만 일반적으로 그렇지 않은 척 할 수 있습니다. 소프트웨어가 현재 실행을 차단하고 완료 될 때까지 다른 작업을 수행하지 않도록합니다. 즉, 비동기식으로 무언가를 동기 API로 랩핑 할 수 있습니다.

비동기 API를 사용하면 요청 된 작업이 완료되지 않아도 동기 작업이 완료되지 않아도 실행을 계속할 수 있습니다. 그리고 거기에서 당신은 아이디어가 소프트웨어에서 동시에 동시에 발생한다는 의미를 얻습니다 (동시).

비동기가 동시성을 의미하지는 않습니다. 경우에 따라 플랫폼은 현재 작업이 완료된 후에 만 ​​비동기 작업을 실행할 수 있습니다. 순차적 (비동기 작업의 실행 순서가 반드시 보장되는 것은 아니지만)이지만 동시에 실행되지는 않지만 (실행 기간에 겹치지 않음) 비동기 적입니다.

그건 그렇고, 일부 플랫폼에서 시스템은 비동기 작업을 인라인하기로 결정하여 동기 작업으로 바로 실행할 수 있습니다 (모든 작업에 대해 가능한 것은 아니라고 가정).

다시 한번, 비동기는 단지 언제 일어날 지 모른다는 것을 의미합니다.


당신은 또한에 관심이있을 수있다 "동시"과 "병렬"실행의 차이는? .


바로 그거죠. OP가 발견 한 설명은 동기 부여보다 병렬 처리에 대해 훨씬 더 많이 들립니다 (단어 인 경우 ...). asynch vs synch는 작업이 시작되는 시점 (지금은 호출 할 때 또는 나중에 스케줄러가 결정할 때)에 관한 것이지만 병렬은 "yep가 동시에 발생합니다"와 순차적을 의미합니다.
Giacomo Alzetta

1
@GiacomoAlzetta 단어가 동기라고 생각합니다. 나는 또한 이와 유사한 단어를 발견했다 : 동기화, 동기 및 동기. 아마도 자체 질문의 가치가 있습니다.
치료

12

비동기 : 존재하지 않거나 동시에 발생하지 않습니다.

동기식 : 기존 또는 동시에 발생합니다.

async 속성은 HTML이 여전히 구문 분석되어 있어도 스크립트가 다운로드되는 즉시 스크립트가 실행됨을 의미하며, 두 프로세스가 동시에 존재합니다.

이것은 실제로 혼란 스럽다!

대신 동기화동기화되지 않은 의미를 고려하십시오 . 하나의 타이밍이 다른 타이밍에 의존하면 두 가지가 동기화 되고 타이밍이 관련 되지 않으면 동기화되지 않습니다.

예제 비동기 워크 플로에서 스크립트 실행과 html 파싱이라는 두 가지 일이 발생합니다. 이 두 가지는 동기화되지 않습니다 . 실행 동작의 타이밍과 파싱 동작의 타이밍은 서로에 의존하지 않는다. 워크 플로를 동기화 하면 작업이 동기화 됩니다. 구문 분석이 확실히 끝날 때까지 실행이 시작되지 않는다고 가정 해보십시오.

그러나 실제로 여기에는 세 가지 가능성이 있다는 것을 인식하는 것이 중요합니다.

  • 실행 및 구문 분석은 실제로 동기화되지 않습니다. 그것들은 가장 효율적인 방법으로 언제 어디서나 발생할 수 있습니다.
  • 실행 및 구문 분석이 동기화됩니다. 즉, I / O가 완료되기를 기다리는 동안 CPU는 아무 작업도 수행하지 않습니다 .
  • 실행 및 구문 분석은 동기화되지만 I / O가 완료되기를 기다리는 동안 CPU는 다른 작업을 수행 한 다음 다운로드가 완료된 후 되돌아와 구문 분석을 수행 할 수 있습니다.

이를 이해하면 널리 사용되는 프로그래밍 언어에서 비동기 워크 플로의 목적이보다 명확 해집니다.

  • 비동기 워크 플로는 관련없는 항목을 제 시간에 주문하도록 제한되지 않기 때문에 대기 시간이 긴 작업을 효율적으로 구현하는 데 도움이됩니다. 구문 분석이 대기 시간이 길고 I / O 바운드이고 스크립트 실행이 대기 시간이 길고 CPU가 바운드 인 경우 해당 작업을 완전히 또는 부분적으로 동기화하지 않으면 승리 할 수 ​​있습니다.

  • awaitC #과 같은 언어 의 연산자는 비동기 워크 플로에서의 주문 작업입니다. 대기는 비동기 대기입니다 . 비동기 워크 플로의 두 부분 사이에 순서 관계를 표현 하고 대기 전의 코드와 대기 후의 코드 사이에 "이전 발생"관계 있다고 말합니다 . 이것이 우리가 세 번째 옵션을 구현하는 방법 입니다.

이것이 너무 추상적이라면 실제 사례를 생각해보십시오. 대기 시간이 긴 I / O 작업 인 문자를 보낼 때 문자에 대한 응답을 기다리는 동안에도 CPU를 많이 사용하는 작업 (수학 숙제)을 수행 할 수 있습니다. 수학 숙제를하고 메일을 읽는 작업은 동기화되지 않습니다.

그러나 이제 편지를 보내고 답장에 세금을내는 데 필요한 번호가 포함되어 있다고 가정하십시오. 이제 I / O 작업이 완료 될 때까지 CPU 작업 (세금 계산)을 수행 할 수 없습니다. 그러나 기다리는 동안에도 잔디를 깎을 수 있습니다 . 그것은 부품들 사이의 타이밍 관계를 표현한 비동기 워크 플로입니다.


6

저는 전기 엔지니어이며 논리 회로 (논리 게이트)에서 동기식 vs 비동기식을 처리했습니다.

두 개의 입력과 출력이있는 AND- 게이트 (또는 모든 게이트)가 있다고 가정 해 봅시다.

비동기 인 경우 출력이 변경되는 방식으로 입력이 변경되는 순간 출력을 업데이트합니다. 이것이 당신의 예제가 작동하는 방식입니다-당신이 언급 한 프로그램.

그러나 해당 게이트에 클록 (예 : 1 초주기 구형파)이 부착되어 있으면 구형파가 로우에서 하이로 갈 때마다 매 초마다 비트가 업데이트되므로 동기식입니다. 클럭 주파수에 바인딩됩니다. 따라서 동기식입니다. 그 클럭을 여러 회로에 연결할 수 있으며 서로 동기화 된 리듬으로 작동합니다. 프로그램이 1 초마다 실행되도록 읽었는지 여부 만 확인한 경우에도 동기화됩니다.


1
비동기식 / 동기식 직렬 포트와 같습니다.
jiwopene

2

지구를 공전하는 두 개의 위성을 상상해보십시오.

  • 위성 A 는 지구 주위를 회전하는주기를 가지므로 행성이 완전히 회전 할 때마다 위성이 지구를 두 번 이상 돌고 있습니다 .
  • 위성 B 는 지구 주위를 회전하는주기를 가지므로 행성이 완전히 회전 할 때마다 위성이 지구를 정확히 한 번 돌았 습니다 .

위의 예에서 위성 B는

지구의 회전주기와 동기되는 회전주기를 갖는 것.

위성 A가 단순히 지구와 "존재하거나 동시에 존재"하기 때문에 위성 A가 지구 동기화라고 주장하지는 않는다. 실제로 위성 B 자체도 관련이 없습니다. 관련되는 것은 지구의 회전주기와 동기화되는 회전주기입니다. 그것은 객체의 동시 존재에 관한 것이 아닙니다. 그것은 객체들 사이의 관계에 관한 것입니다. 이 생각을 잡아라.

시스템에서 두 개의 스레드가 동시에 실행되고 있다고 가정합니다. 스레드 A (TA)는 프로세스 A에 대한 데이터를 페치하고 스레드 B (TB)는 프로세스 B에 대한 데이터를 페치합니다. "TA와 TB가 비동기입니까?" 귀하의 답변은 "어떻게 알 수 있습니까? 각 프로세스에서 해당 코드를 호출 한 코드를 확인해야합니다."입니다. "하지만 TA와 TB가 동시에 동시에 실행되고 있다고 말하고 싶습니다."

그리고 당신은 상당히 영리한 개인으로서 "다시-그들은 동시에 실행되고 있을지 모르지만 그들이 호출 한 각각의 프로세스와 관련하여 비동기 적 으로 실행되고 있다면 아무런 단서도 없습니다 . TA와 TB가 서로 비동기 적으로 실행되면 실제로는 같은 프로세스에서 생성되지 않았기 때문에 말이되지 않습니다. "

이제 우리는 관계의 존재가이 두 스레드 자체의 존재 만이 아니라 여기에 관련된 것이라는 직관을 얻고 있어야합니다. 방법이 비동기 적으로 실행되면, 우리가 말하고있는 것은 그 방법의 실행이 "않는다는 것입니다 NOT 을 호출 한 메소드의 실행과 동시에 존재하거나 발생합니다." 다음 예를 보자.

func Invoker() {
    DoThis();
    DoThatAsync();

    var foo = CheckThis();
    ... do some work ...
    CheckThat(foo);

    await DoThatAsync();

    CheckThat();
}

앞서 위성에 대한 논의에서 "그것은 물체의 동시 존재에 관한 것이 아니라 물체 사이의 관계에 관한 것"이라고 말했다. 호출 메소드와 호출 된 메소드의 존재에 관한 것이 아닙니다. 그것은 호출자의 실행과 호출 된의 실행 사이의 관계의 존재에 관한 것입니다. 시스템 스레드를보고 DoThatAsync()호출되었지만 실행되지 않은 것을 발견 한 경우, 스케줄러 나 다른 I / O에서 대기 중일 수 있습니다. 반드시 호출 메소드 Invoker()가 실행 되고 있지 않음을 의미하지는 않습니다. 하고있다. 물론, 그것은 awaiting 의 시점에있을 수 DoThatAsync()있지만 보장되지는 않습니다. 일단 다른 함수가 호출되면 중지되지 않습니다.Invoker()무슨 일이 있어도 중단됩니다. 이것은 보장됩니다. Invoker()호출 된 동기 메소드와 호출 된 동기 메소드 사이의 실행은 "존재하거나 동시에 발생합니다".


나는 이것을 실제로 좋아한다. 일반적으로 "비동기"로 임의 실행의
대서양

또한 이것이 최선의 답변이라고 생각합니다.
Barmar

2

구체적인 예

실제 예제를 추가하고이를 소프트웨어 엔지니어링 세계에 연결하고 싶습니다. 먼저, 어떤 상황에서는 "동기 성"에 대한 직관적 인 정의 : 반딧불이 번쩍이는 것과 일치하기를 바랍니다 . 둘째, 4x100 여자 올림픽 중계 경주를 고려하십시오 . 셋째, 군사 영화의 오래된 병력을 생각해보십시오. "남성, 시계를 동기화하십시오!"

이제 무슨 일이 일어나고 있는지 생각해 봅시다. 이 모든 것들이 프로세스 이거나 시간이 연장 된 엔터티 임을 관찰하여 시작하자 . 그릇이 "동기"이고 바위가 "비동기"라고 말하는 것은 이치에 맞지 않습니다. 둘째, 탱고에 2가 걸립니다 . 당신은 "주자는 동기화"라고 말할 수 없습니다. 무엇과 동기화 하시겠습니까? 마지막으로, 두 프로세스가 동시에 동일한 주파수와 위상을 가지지 않는 한 동시에 어떤 작업을 수행 하려면 둘 중 하나 또는 둘 다 기다려야 합니다.

분석

사전 정의에 동기화 된 두 엔티티가 "동시에 발생하거나 동시에 존재"할 때, 이는 반딧불에서 나오는 빛의 개념과 매우 잘 어울립니다. 불행히도, 빛이 "동기화되었다"고 말하는 것은 반딧불 조명 프로세스 가 동기화 되었다는 것을 말끔하게 말하는 것입니다 .

그렇다면 어떻게 애플 스마트 워치와 NTP가없는 반딧불 무리가 후단을 동시에 번쩍이게 할 수 있을까? 일관된 템포를 설정하고 약간 조정할 수 있다면 아주 쉽습니다. 그들은 단지 번쩍이고, 더 많은 사람들이 바로 뒤에서 번쩍이면 속도가 느려지고 (지연이 증가), 바로 앞에 더 많은 번 플래시가 있으면 속도가 증가합니다 (지연이 감소합니다). 따라서 간단한 피드백 프로세스를 사용하여 본질적으로 동일한 템포 및 위상에 도달 할 수 있습니다. 여기서 중요한 관찰은 이들이 올바른 순간이 깜빡 일 때까지 기다림 으로써 동기를 달성한다는 것 입니다.

4x100 레이스는 두 가지 형식의 프로세스 타이밍이 실제로 작동 하기 때문에 흥미 롭습니다 . 팀 내의 러너 는 동기화 되고 다른 팀 의 러너 는 "비동기 적"입니다. 릴레이의 두 번째 러너는 첫 번째 러너 가 전송 영역에 들어갈 때까지 기다려야 합니다 . 핸드 오프는 두 주자 사이의 동기 이벤트입니다. 그러나 다른 차선의 주자는 다른 차선 에서 일어나는 일을 신경 쓰지 않으며 , 가장 느리게 진행하지 않고 핸드 오프를 동기화합니다. 각 러너 레인은 서로에 대해 비동기 적입니다. 다시 말하지만, 비동기는 대기하지 않지만 동기화는 대기를 수반합니다.

마지막으로 회사의 병사 (소대, 소방대 등)는 적을 동시에 공격 할 수 있도록 시계를 동기화해야합니다 . 일부 군인은 다른 군인보다 먼저 자신의 위치에 도착하거나 적에게 더 빨리 발포 할 수 있습니다. 그러나 동시 공격은 일반적으로 놀람 요소 때문에 우연한 공격보다 효과적입니다. 그래서 동시성을 달성하기 위해, 많은 군인이 있어야 기다릴 행동 정해진 시간.

기능 정의

이것이 왜 대기에 중점을 두는가? 대기는 비동기식 프로세스와 동기식 프로세스를 구별하는 정의 기능이기 때문입니다. 알지 못하는 두 개의 프로세스가있는 경우 기본적으로 프로세스가 비동기라고 가정해야합니다. 예를 들어, 패키지 배달과 구급차 운전은 대부분 동기화 되지 않습니다 . 실제로 두 프로세스가 동기화되었음을 증명하려면 매우 특별한 시점 인 동기화 지점 을 찾아야합니다 .

배달원이 패키지를 내려 놓고 구급차가 누군가를 병원으로 몰아 넣는 것은 일반적으로 "동기화 지점"으로 식별되는 시점을 공유하지 않습니다. 반면에, 반딧불이 번쩍이면 반동 할 때마다 동기 점이 있고, 릴레이 주자는 배턴을 내릴 때마다 동조 점이 있으며, 군인은 공격을 시작할 때 동기 점이 있습니다. 하나 이상의 동기 점을 식별 할 수 있으면 프로세스가 동기화 됩니다. "syn-"은 "with"또는 "together"를 의미 하는 그리스어 접두어 이고 "chrono"는 "시간" 의 그리스어 루트 이므로 이해하기 쉬워야합니다 . "동기화"는 문자 그대로 "동시"를 의미합니다.

경계

"동기화"가 반드시 하나 또는 두 프로세스 의 전체 수명 에 적용되는 것은 아닙니다 . 나는 그것이 "동기화 시점까지의 대기 시간"에만 적용된다고 주장한다. 따라서 두 프로세스는 통신이 필요한 상태에 도달 할 때까지 비동기식으로 작동 한 다음 동기화되어 정보를 교환 한 후 비동기식으로 계속 될 수 있습니다. 간단한 예는 커피를 마시는 사람을 만나는 것입니다. 분명히 회의는 동기화 지점 (또는 많은 것)이며 두 사람이 해당 지점에 도착한다는 사실은 동기화를 보여줍니다. 그러나 우리는 두 사람이 커피를 마시기 때문에이 두 사람의 생애를"동기화"됩니다. 그것은 그들의 삶에서 그들이 만난 유일한 순간 일 수도 있고, 그들이하는 모든 일은 그렇지 않으면 독립적입니다.

우연한 만남이 시연을 보여주는 경우도 아니다. 두 낯선 사람이 길거리에서 서로를 지나가더라도 특정 시간에 특정 장소에 있다는 사실은 동기를 증명하지 못합니다. 한 사람이 버스를 기다리는 벤치에 앉아 있고 다른 사람이 걸어 다니는 것도 아닙니다. 프로세스가 목적 을 충족 할 때만 프로세스가 동기화됩니다 .

소프트웨어 연결

이제 소프트웨어에서 매우 기본적인 작업 인 파일에서 읽기를 생각해 봅시다. 아시다시피 대용량 저장소는 일반적으로 캐시 또는 주 메모리보다 수천에서 수백만 배 느립니다. 이러한 이유로 운영 체제 및 프로그래밍 언어 라이브러리는 일반적으로 동기 및 비동기 I / O 작업을 모두 제공합니다. 이제 프로그램에 단일 스레드 만있는 경우에도이 논의를 위해 OS를 "별도의 프로세스"로 생각해야합니다.

동조

"동기 I / O 읽기"를 수행 할 때 스레드는 데이터가 사용 가능할 까지 기다려야 합니다 . 이것은 배턴을 다음 주자에게 건네주는 릴레이 주자와 매우 비슷하지만, 두 주자가 트랙을 완전히 지나가는 릴레이를 상상해보십시오.

이 경우 프로그램 스레드와 OS I / O 프로세스가 "동시에 발생 (작동)"하지 않으므로 이러한 프로세스가 "동기화"되었다고 말하는 것이 이상해 보입니다. 그러나 그것은 그것을 보는 잘못된 방법입니다! "중계 팀의 선수는 동시에 달리지 않기 때문에 동기화되지 않습니다." 사실, 진술 모두 잘못되었습니다! 릴레이 팀의 주자가 수행 하고 있어야 동시에 실행,하지만 매우 구체적인 순간 : 바톤의 핸드 오프를. 실제로, 레이스 기간 동안 릴레이 팀이 동기화되도록 시작하는 것은이 특별한 순간입니다! I / O 요청 및 응답을 "배턴"으로 보는 경우,

반면에 슈퍼 컴퓨터에서 유한 요소 해석 (Finite Element Analysis)과 같은 것을 생각해 보면 수천 개의 프로세스가 대규모 글로벌 상태를 업데이트하기 위해 잠금 단계에서 작동해야한다는 것을 알 수 있습니다. 일부 노드가 다른 노드보다 주어진 시간 단계 동안 작업을 완료하더라도 결과는 공간을 통해 이웃에게 전파되므로 시간 단계가 완료 될 때까지 기다려야합니다. 이런 종류의 동기화는 반딧불과 같습니다. 모든 행위자는 같은 종류의 작업을 수행합니다.

공정 다양성

이러한 이유로, 우리는 "동종 동기", "이종 동기"및 "순차 동기"의 세 가지 종류의 일이 진행되고 있음을 알 수 있도록 몇 가지 용어를 발명 할 수 있습니다. 따라서 배우들이 동일한 작업을 동시에 수행 할 때 (FEA, 반딧불), 그들은 "동 질적"입니다. 서로 다른 작업을 동시에 수행 할 때 (게임에서 대상을 크롤링하거나 수영하는 대상, 게임에서 물리, 사운드, 인공 지능 스레드) 실행하는 "이종"입니다. 한 번에 하나씩 작업을 수행 할 때 "순차적"(릴레이 러너, I / O 차단)입니다. 그것들은 매우 다르게 보일지 모르지만, 하나의 필수 속성을 공유합니다. 모든 유형의 액터가 모든 사람들이 동시에 동기화 지점에 도착할 수 있도록 약간의 대기를 수행합니다. 동기화 포인트들 사이에서, 또는 "동일한 동작을 수행하는"은 동기의 속성과 관련이 없다.

GPU의 렌더 파이프 라인은 모두 프레임을 함께 마무리하고 새 프레임을 함께 시작해야하기 때문에 동기식입니다. 그들은 같은 종류의 일을하고 있기 때문에 동 질적이며 모두 함께 활동합니다. 그러나 서버의 주요 게임 루프와 원격 입력을 처리하는 블로킹 I / O 스레드는 매우 다른 종류의 작업을 수행하기 때문에 이기종이며 일부 I / O 스레드는 전혀 작동하지 않습니다. 연결이 사용됩니다. 그럼에도 불구하고, 그들은 원자 적으로 상태를 공유해야하기 때문에 동기화됩니다 (플레이어는 부분적인 게임 월드 업데이트를 보거나 서버가 플레이어 입력의 일부만을 보지 않아야합니다).

비동기

이제 "비동기 I / O 읽기"를 고려해 보자. 프로그램이 스토리지에서 약간의 데이터를 읽기 위해 OS로 요청을 보내면 호출 이 즉시 리턴 됩니다. 콜백을 무시하고 폴링에 집중합시다. 일반적으로 프로그램에서 데이터를 사용할 수있는 순간은 프로그램 스레드에 관한 한 특정 시점과 일치하지 않습니다. 프로그램이 명시 적으로 데이터를 기다리지 않으면 스레드는 그 순간이 언제 발생하는지 정확하게 알지 못합니다. 다음에 검사 할 때 데이터가 대기 중임을 발견합니다.

OS와 프로그램 스레드가 데이터를 넘겨 주기로 동의 한 특별한 회의 시간은 없습니다. 그들은 밤에 지나가는 두 배와 같습니다. 비동기 성은 이러한 대기가없는 것이 특징 입니다. 물론 프로그램 스레드는 결국 I / O 작업을 기다리게되지만 반드시 그럴 필요는 없습니다. I / O 페치가 발생하는 동안 다른 계산을 계속 수행 할 수 있으며 여유 시간이있을 때만 나중에 확인할 수 있습니다. 물론 OS가 데이터 가져 오기를 완료하면 대기하지 않습니다. 그것은 단지 어딘가에 편리하게 데이터를 넣고 비즈니스에 관한 것입니다. 이 경우, 프로그램이 배턴을 OS에 전달하고 OS가 나중에 돌아와서 데이터와 함께 배턴을 땅에 떨어 뜨리고 트랙에서 걸어 나가는 것과 같습니다. 프로그램이 핸드 오프를 받기 위해 대기 중이거나 대기 중이 아닐 수 있습니다.

병행

소프트웨어에서 함수를 "비동기"로 표시 할 때 종종 병렬 처리 를 원합니다 . 그러나 병렬 처리가 동기화를 의미하지는 않습니다 . 반딧불은 동기 및 비동기 동작을 모두 나타 내기 때문에 좋은 예입니다. 대부분의 파리가 일제히 번쩍이는 동안, 많은 그룹은 나머지 그룹과 분명히 일치하지 않았으며 더 무작위로 번쩍였습니다. 파리는 동시에 행동 했을지도 모르지만 모두 동기화 된 것은 아닙니다 .

이제 일부 코드를 "비동기"로 표시하면 표시되지 않은 나머지 코드가 "동기화"임을 의미하기 때문에 재미있어 보입니다. 그게 무슨 뜻입니까? "동기화"에 탱고에 2 개가 필요하다고 주장하지 않았습니까? 그러나 단일 스레드에서 실행되는 코드에 대해 이야기한다면 어떻게 될까요? 이 경우, 한 걸음 물러나서 프로그램을 상태 시퀀스와 해당 상태 간의 전환으로 생각해야합니다. 프로그램의 명령문은 상태 전이를 유발합니다. 우리는 그것을 진술로 시작하고 멈추는 "마이크로 프로세스"라고 생각할 수 있습니다. 언어에 의해 정의 된 시퀀스 포인트는 실제로 이러한 "마이크로 프로세스" 의 동기화 포인트 입니다. 따라서 단일 스레드를 볼 수 있습니다.

프로그래밍 언어의 무결성으로 인해 상태 업데이트가 여러 문을 방해하지 않으며 시퀀스 포인트는 컴파일러가 관찰 가능한 최적화를 할 수없는 경계를 정의합니다. 예를 들어, 명령문 내에서 표현식의 평가 순서는 정의되지 않았거나 지정되지 않아서 컴파일러가 다양한 방식으로 명령문을 최적화 할 수있는 자유를줍니다. 그러나 다음 문장이 시작될 때까지 PL 자체가 건전하다면 프로그램은 잘 정의 된 상태에 있어야합니다.

지금까지 "비동기"의 의미가 분명해야합니다. 이는 코드 블록 내에서 묵시적 동기 계약이 비동기 블록에 대해 제외됨을 의미합니다. 순차적 인 (일관되고 동기적인) 계산 모델에 의해 일반적으로 암시되는 안전성을 보장하지 않고 프로그램 상태를 독립적으로 업데이트 할 수 있습니다. 물론 이것은 불일치로 프로그램 상태를 파괴하지 않도록 특별한주의를 기울여야한다는 것을 의미합니다. 이것은 일반적으로 비동기 블록과 조정하기 위해 제한된 명시 적 동기화를 도입한다는 것을 의미합니다 . 이것은 비동기 블록이 서로 다른 시간에 비동기 동기 가 될 수 있음을 의미합니다 ! 그러나 동기화가 단지 동기 점의 존재를 나타내는 것임을 기억하면, 우리는이 개념을 받아들이는 데 어려움이 없을 것입니다.


릴레이 레이스 (동기화 및 비 동기화의 소프트웨어 개념을 명확하게 설명하는 반면 다른 것에서는 그렇지 않음)를 제외하고 여기에서 모든 예제를 제거 할 수 있으며 응답이 크게 향상됩니다.
Robert Harvey

다른 사례는 동시 행동과 이기종 행동을 보여 주며 OP의 혼란을 많이 초래했다고 생각합니다.
잔디 깍는 기계 남자

1

그것에 대해 생각하는 한 가지 방법 은 AVX 와 같은 SIMD 명령어 입니다. 사용 방법에 대한 몇 가지 는 다음과 같습니다 .

Synchroneous SIMD 명령어를 사용하면 여러 데이터에 대해 단일 명령어를 실행하여 동일한 스레드 에서 정확히 동시에 여러 계산을 수행 할 수 있습니다 .

비동기식 멀티 스레딩을 사용하면 "아마도" "약간"시간에 여러 계산을 수행 할 수 있습니다.

이것을 다음 정의와 결합하십시오.

동기 형용사 syn · chro · nous | \ ˈsiŋ-krə-nəs, ˈsin-

1 : 정확히 동시에 발생, 존재 또는 발생 [강조 광산]

비동기 형용사 asyn · chro · nous | \ (ˌ) ā-ˈsiŋ-krə-nəs, -ˈsin- \

1 : [...] : 동기가 아님


1

싱크 대 비동기 대 멀티 스레드의 차이점을 이해하게 만든 비유는 주방 요리사의 것입니다.

파스타를 만들고 있다고 상상해보십시오. 세 단계가 있습니다.

  1. 파스타를 삶아 버립니다.
  2. 소스 준비
  3. 파스타와 소스를 결합

동기식 방법. 동기 시나리오에서는 모든 작업을 순서대로 수행하는 사람 (스레드)이 한 명뿐입니다. 먼저 파스타를 끓여서 끓는 것을 지켜 보았습니다. 그런 다음 배수하고 따로 보관하십시오. 그런 다음 소스를 준비하십시오. 소스가 준비되면 파스타를 가져 와서 소스와 혼합하면 요리가 준비됩니다. 여기서 문제는 비효율적이라는 것입니다. 동기식으로 순차적으로 작업했기 때문에 파스타가 끓는 동안 소스에서 작업 할 수 없었습니다. 그래서 시간을 낭비하고 소스를 준비하는 동안 파스타가 차가워졌습니다.

비동기 방식. 이 시나리오에서는 여전히 하나의 요리사 (실)가 있지만 파스타가 끓는 동안 소스를 만듭니다. 파스타가 끓으면 called-back소스를 만들어서 배출 한 다음 called-back다시 소스를 완성하는 것입니다. 시간을 절약하고 파스타가 소스를 오래 기다릴 필요가 없기 때문에 이제는 더 효율적입니다.

멀티 스레드 방법. 이제 새 요리사를 고용한다고 상상해보십시오. 이제 두 개의 요리사 (실)가 있습니다. 한 요리사가 파스타를하는 동안 두 번째 요리사는 소스를 만들고 있습니다. 이 시나리오에서 필요합니까? 파스타를 만드는 것은 비동기식 방법으로 효율적일 수있을만큼 간단하기 때문입니다. 그리고 여러 요리를 관리하는 것이 추가 오버 헤드입니다. 그러나 한 번에 더 복잡한 요리 나 더 많은 요리를 만들고 있다면 여러 요리사가 유용합니다.


이것은 실제로 꽤 좋은 비유입니다.
Robert Harvey

0

좋은 질문과 혼동을 야기하는 다른 방식으로 자주 사용되는 용어.

저의 대답은이 용어들이 상대적이라는 것입니다. 그리고 그것들과 관련된 것은 실행되고있는 (또는 때때로 쓰레드) 메인 프로그램입니다.

이 용어들은 메시지가 차단 방식 (동기식)으로 또는 비 차단 방식 (비동기식)으로 전송 또는 수신되는지에 관한 프로그램의 내부 작동 및 타이밍에 대해 무언가를 지정합니다. (메인) 스레드가 전송 또는 수신에 의해 차단 된 경우 "동기화"이고 어떤 식 으로든 중단 될 수있는 경우 "비동기 적"입니다. 다시 말해서,이 용어들은 (정규) 작동하고 이벤트를 처리하는 구현에 관한 것입니다.

(물론 IMHO) 일단 메시지가 연결되면 sync vs. async와 같은 것은 없습니다. 메시징에는 발신자와 수신자가 있으며 각 발신자와 수신자는 서로 독립적으로 동기화 또는 비동기 구현을 가질 수 있습니다. 그러나 일단 메시지가 연결되면 더 이상 동기화 또는 비동기가 아닌 메시지 일뿐입니다. 메시지를 요청 또는 응답 또는 단방향 메시지로 분류 할 수 있지만 동기화 및 비동기에 직교합니다 (구현이 대기를 차단하고 있는지 또는 어떤 방식으로 중단 될 수 있는지를 나타냄).


비 차단은 비동기와 구별됩니다.
user207421

1
@ user207421이 문맥에서 동의어라고 부를 수 있기 때문에 자세히 설명해주세요
Jacob Raihle

0

"동기"는 두 개의 이벤트가 동시에 발생하지만 어떤 이벤트입니까?

"동기 실행"이라고 할 때, 호출자와 호출 수신자가 동시에 (즉, 스택에서) 실행 중임을 의미합니다. 그것은 아마도 당신이 추구하는 의미 일 것입니다.

"동기 논리 게이트"라고 말하면 논리 게이트가 CPU 클록과 동기화됨을 의미합니다.

분산 시스템과 관련하여 "동기 모델"이라고 말하면 모든 노드가 잠금 단계에서 프로그램을 실행하고 n 단계에서 보낸 메시지가 n + 1 단계의 시작에 도달한다는 것을 의미합니다.

Java 언어 사양에서 스레드가 다른 스레드와 "동기화"한다고하면 다른 스레드의 작업이 "동시에"발생한다는 것을 의미합니다 (관계 이전에 발생 함). 그리고 두 스레드가 "객체에 대한 액세스 동기화"라고 말하면 실제로 스레드가 서로 동기화되어 개체에서 동시에 작업 하지 않도록 합니다.

... 그리고 더 많은 상황에서 단어를 적용 할 수 있다고 확신합니다. "일이 동시에 발생합니다"는 일반적인 아이디어이기 때문에 :-)


0

혼란의 열쇠는 다음과 같이 요약 할 수 있습니다.

비동기 속성 은 HTML이 여전히 파싱되는 경우에도 다운로드되는 즉시 스크립트가 실행됨을 의미합니다.

알아야 할 것은이 문장이 불가능한 상황을 설명하기 때문에 의미가 없다는 것입니다. HTML이 여전히 구문 분석 중이 면 스크립트 다운로드 프로세스가 비동기식 인 경우 시작되지 않습니다 .

프로그래밍에서 동기 수단은 다음을 의미합니다.

로직을 실행할 때 관심있는 모든 데이터가 이미 메모리에 존재합니다.

비동기는 다음을 의미하지만

관심있는 일부 데이터는 아직 존재하지 않으며 미래의 특정 시점에만 존재합니다

실제로 비동기 프로그래밍의 현재가 아닌 측면이 사람들을 혼란스럽게합니다.

스크립트가 정상적으로 로드되는 방식은 html 파싱이 일시 중지 된 다음 스크립트가 다운로드되고 스크립트 다운로드가 완료되면 html 파싱이 계속됩니다. html 구문 분석 및 스크립트 실행은 "동일한"시간에 발생합니다 (동시가 아니라 동일한 시간을 의미 함).

어떻게 async스크립트가로드 된 HTML 스크립트 태그를보고 다음에 스크립트를 다운로드하는 기억이다 미래 하지만 구문 분석하고 있습니다. 스크립트 다운로드를 위해 HTML 구문 분석이 일시 중지되지 않았습니다. 나중에 html 파싱이 완료된 후 모든 비동기 스크립트가 다운로드되어 실행됩니다. html 구문 분석 및 스크립트 실행은 동시에 발생하지 않습니다 (다시 말해서 같은 시간을 의미 함).이 경우에는 별도로 실행됩니다.

요약하면 다음과 같습니다.

  • 동기식 스크립트는 html과 함께 구문 분석됩니다.

  • 비동기 스크립트는 나중에 별도로 구문 분석됩니다.

따라서 async속성 의 정의는 스크립트가 다운로드되는 즉시 실행되는 것이 아닙니다. 이는 동기 및 비동기 스크립트 모두에 해당됩니다. async 정의는 html 파싱이 스크립트가 다운로드 될 때까지 기다리지 않는다는 것 입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.