2 분 소요

Intro

얼마전에 Blocking과 Non-Blocking에 대해 설명을 해야 할 일이 있었는데, 설명을 Synchronous와 Asynchronous에 대해서 설명한 일이 있었다. 현재 내가 개발을 하면서 많은 곳에서 사용하고 있지만 제대로 알고 사용하고 있지 않다는 것을 알게 되었고, 이에 대해 정리하고자 이 글을 작성한다.

Synchronous

컴퓨터용어에서 Synchronous란 아래와 같이 설명할 수 있다.

현재 작업의 응답과 다음 작업 요청의 타이밍을 맞추는 방식

Synchronous라는 단어에 대한 의미를 찾아보면 수많은 블로그 해석 글들을 볼 수 있었다. 나름대로 여러 글을 읽어보며 가장 잘 해석했다고 생각하는 글을 인용하였다. 관련 블로그 참고

동기적인 코드를 적어보면 아래와 같다.

fun main() {
   println("first")
   println("second")
   println("third")
}

즉, 하나의 작업 실행 결과 시점이 다음 작업의 시작 시점이 된다. 그러므로 firstsecondthird는 코드에 적힌 순서대로 실행된다.

Asynchronous

Asynchronous는 Synchronous와는 반대되는 의미로 해석할 수 있는데 아래와 같이 설명할 수 있다.

현재 작업의 응답은 다음 작업 요청의 타이밍이 맞지 않아도 되는 방식

비 동기적 코드를 적어보면 아래와 같다.

import java.util.concurrent.CompletableFuture.runAsync

fun main() {
    println("first")
    runAsync {
        println("second")
    }
    println("third")
}

즉, 하나의 작업 실행 결과 시점이 다음 작업의 시작 시점이 되지 않는다. 그러므로 first다음 second가 아닌 third가 먼저 실행되고 second가 실행되는 것을 확인할 수 있다. 이는 third의 코드가 second 코드의 실행 응답 시점에 실행 요청하는 것을 보장하지 않기 때문이다.

Blocking

컴퓨터 용어에서 Blocking은 아래와 같이 설명할 수 있다.

직접 제어할 수 없는 대상의 작업이 끝날 때까지 그 제어권을 넘겨받지 않고 기다리는 방식

대표적으로 I/O를 예로 들 수 있다.

코드를 적으면 아래와 같다.

import java.util.*

fun main() {
    val write = Scanner(System.`in`).nextLine()
    println(write)
}

해당 코드는 사용자가 입력을 마칠때까지 아래 출력함수는 동작하지 않을 것이고 사용자 입력이 끝나야지만 프로그램은 입력값을 출력한 후 종료된다.

Non-Blocking

Non-Blocking은 Blocking과 반대되는 의미로 해석할 수 있는데 아래와 같이 설명할 수 있다.

직접 제어할 수 없는 대상의 작업 여부와 관계없이 다음 작업을 수행하는 방식

Multi-Thread를 이용한 처리 방식이 대표적인 Non-Blocking 방식이라 할 수 있다.

Non-Blocking에 대한 코드를 적어보면 아래와 같다.

import java.util.*
import kotlin.concurrent.thread

fun main() {
    thread {
        val write = Scanner(System.`in`).nextLine()
        println(write)
    }
    println("Hello, World!")
}

해당 코드를 실행해보면 사용자 입력을 기다리는 동안에도 Hello, World!문구를 표시하는 코드는 실행됨을 알 수 있다. 이렇듯 Non-Blocking의 경우 제어할 수 없는 대상의 작업 여부와 관계없이 다음 작업을 수행한다.

Wrap up

지금까지 SynchronousAsyncronous, BlockingNon-Blocking에 대해서 알아보았다. 많은 블로그에서 이 네가지를 조합한 2:2 매트릭스 예제를 보여주는데 정확히 이해하고 나만의 방식으로 정리하기에는 아직 어렵다고 생각해서 잘 정리해주신 블로그 링크로 대체하고자 한다.

관련 내용을 찾다가 SynchronousAsyncronous, BlockingNon-Blocking의 관심사 차이에 대한 내용을 보았는데, 해당 내용을 인용하면서 이 글을 마무리하고자 한다.

Blocking과 Non-Blocking은 호출되는 함수가 바로 리턴되느냐 마느냐가 관심사이다.

Synchronous와 Asynchronous는 호출되는 함수의 작업 완료 여부를 누가 신경 쓰느냐가 관심사이다.


https://evan-moon.github.io/2019/09/19/sync-async-blocking-non-blocking/

https://velog.io/@codemcd/Sync-VS-Async-Blocking-VS-Non-Blocking-sak6d01fhx