Post

[CS 지식] 동기/비동기, 블로킹/논블로킹

Sync/Async, Blocking/Non-blocking

[CS 지식] 동기/비동기, 블로킹/논블로킹

✏️ 요약

  • 동기/비동기(Synchronous/Asynchronous)는 작업의 처리 순서와 결과에 대한 관점
  • 블로킹/논블로킹(Blocking/Non-Blocking)은 작업 제어에 대한 관점

동기/비동기와 블로킹/논블로킹 프로그래밍 기법은 비슷해 보일지라도, 서로 다른 관점에서 작업 방식을 설명하는 개념이다.

동기/비동기는 작업의 처리 순서와 결과를 기준으로 두 기법을 구분하고, 블로킹/논블로킹은 작업의 제어권이 어디에 있는지를 기준으로 두 기법을 구분한다.




✏️ 동기/비동기

■ 동기

동기 (Synchronous)

작업이 순차적으로 실행되며, 하나의 작업이 완료된 후에야 다음 작업이 실행되는 프로그래밍 방식


■ 비동기

비동기 (Asynchronous)

요청한 작업의 완료 여부를 따지지 않고 실행하는 방식 ➜ 작업 순서가 지켜지지 않을 수 있다.

  • 여러 작업이 병렬로 실행될 수 있다.
  • 작업이 완료되면 콜백 함수, 프로미스와 같은 메커니즘을 통해 결과를 처리한다.




✏️ 블로킹/논블로킹

■ 블로킹

특정 작업이 완료될 때까지 다른 작업이 중단되는 방식

  • 제어권은 호출된 작업에게 인가된다.


■ 논블로킹

작업이 완료될 때까지 기다리지 않고 다른 작업을 계속 진행할 수 있는 방식

  • 제어권은 호출한 작업으로 즉시 반환된다.




✏️ 비동기 VS 논블로킹

위의 설명들만으로는 비동기와 논블로킹 개념이 비슷한 것이라 혼동할 수 있다. 결과로만 따지면 비동기와 논블로킹 모두 동시에 다른 작업을 수행한다는 점에서 비슷해 보일 수 있다.

하지만, 앞서 설명했듯이 비동기는 작업의 완료 여부에 관한 기법이고, 논블로킹은 작업의 제어에 관한 기법이다.


작업의 완료 여부는 따지지만 제어권은 넘기지 않는 함수가 존재한다고 해보자. 아래와 같은 MyTask 클래스의 run() 함수가 그 예시이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// Runnable 인터페이스를 구현하는 클래스 정의
class MyTask implements Runnable {
    @Override
    public void run() {
        // 비동기로 실행할 작업
        System.out.println("Hello from a thread!");
    }
}

public class Main {
    public static void main(String[] args) {
        // Thread 객체 생성
        Thread thread = new Thread(new MyTask());

        // 스레드 실행
        thread.start();

        // Non-Blocking이므로 다른 작업 계속 가능
        System.out.println("Main thread is running...");

        // Sync를 위해 스레드의 작업 완료 여부 확인
        while (thread.isAlive()) {
            System.out.println("Waiting for the thread to finish...");
        }
        System.out.println("Thread finished!");
        
        System.out.println("Run the next tasks");
    }
}

while(thread.isAlive()) 로 작업의 완료 여부를 확인한다. 하지만, 제어권은 main 에 있으므로 main 함수 내부의 다른 메소드들을 실행할 수 있다.

위의 예시처럼, 비동기와 논블로킹이 항상 같이 사용되는 것은 아니다. 동기(Synchronous)이면서 논블로킹일 수도 있다.


결론

비동기와 논블로킹은 작업의 병렬 수행이라는 공통점을 가지고 있지만, 두 개념의 판단 기준이 다르다. 비동기는 완료 여부, 논블로킹은 제어권에 따라서 판단한다.


REFERENCE

https://inpa.tistory.com/entry/👩‍💻-동기비동기-블로킹논블로킹-개념-정리

This post is licensed under CC BY 4.0 by the author.