[CS] 동기와 비동기, 블로킹과 논블로킹

해니·2024년 11월 1일
0

CS

목록 보기
15/15
post-thumbnail

동기와 비동기


이미지 출처 :: 👩‍💻 완벽히 이해하는 동기/비동기 & 블로킹/논블로킹

  • 요청한 작업에 대해 완료 여부를 신경 써서 작업을 순차적으로 수행할지 아닌지에 대한 관점

동기(Synchronous)

  • 요청한 작업에 대해 완료 여부를 따져 순차대로 처리한다.

비동기(Asynchronous)

  • 요청한 작업에 대해 완료 여부를 따지지 않기 때문에 자신의 다음 작업을 그대로 수행한다.



비동기 방식 성능

  • I/O 작업과 같은 느린 작업이 발생할 때, 기다리지 않고 다른 작업을 처리하면서 동시에 처리하여 멀티 작업을 진행할 수 있기 때문에, 전반적인 시스템 성능 향상에 도움을 줄 수 있다.
  • 동기 방식은 해당 작업이 완료될 때까지 기다려야 하고 다른 요청을 처리하지 못하므로 대규모 이벤트나 트래픽이 발생시 성능이 저하될 수 있다.



동기와 비동기 작업 순서 처리

이미지 출처 :: 👩‍💻 완벽히 이해하는 동기/비동기 & 블로킹/논블로킹

  • 동시 방식은 요청 작업에 대해 순서가 지켜지는 것을 의미한다.
  • 비동기 방식은 요청 작업에 대한 순서가 지켜지지 않을 수 있다는 것을 의미한다.




블로킹과 논블로킹


이미지 출처 :: 👩‍💻 완벽히 이해하는 동기/비동기 & 블로킹/논블로킹

  • 현재 작업이 block(차단, 대기) 되느냐 아니냐에 따라 다른 작업을 수행할 수 있는지에 대한 관점
  • 전체적인 작업의 흐름 자체를 막냐 안 막냐로 볼 수 있다.


블로킹 (Blocking)

  • 요청에 대한 응답을 받을때까지 기다리는것
    ex) 블로킹 방식으로 파일을 읽을 경우, 다른 작업은 할 수 없다.



논 블로킹 (Non-Blocking)

  • 요청에 대한 응답을 기다리지 않고, 다음 작업을 바로 수행한다.
    ex) 논 블로킹 방식으로 파일을 읽을 경우, 파일을 다 읽지 않아도 다른 작업을 할 수 있다.



비동기 vs 논 블로킹

console.log("시작");

setTimeout(() => {
  console.log("1초 후에 실행됩니다!");
}, 1000);

console.log("끝");


// 시작
// 끝
// 1초 후에 실행됩니다.
  • 비동기(Asynchronouse) 관점
    • 코드 라인 순서와 출력 순서가 일치하지 않는다.
    • setTimeout() 함수에 대해 작업 완료 여부를 신경 쓰지 않고 바로 다음 cosnole 작업을 진행한다.
  • 논 블로킹(Non-blocking) 관점
    • setTimeout() 함수는 타이머 작업을 수행하기 위해 메인 함수를 블락하지 않고 백그라운드에서 별도로 처리된다.
    • 메인 함수를 블락하지 않으니 setTimeout()  함수를 호출하고 바로 그 다음 콘솔 함수를 호출한다.



제어권

  • 함수의 코드나 프로세스의 실행 흐름을 제어할 수 있는 권리
  • 블로킹과 논 블로킹은 호출된 함수(callee)가 호출한 함수(caller)에게 제어권을 바로 주느냐 안 주느냐에 따라 구분된다.

블로킹 방식 예제


이미지 출처 :: 👩‍💻 완벽히 이해하는 동기/비동기 & 블로킹/논블로킹

  1. A 함수가 B 함수를 호출하면 B 함수에게 제어권이 넘어간다.
  2. 제어권을 넘겨받은 B가 실행된다.
    2-1. A 함수는 B 함수에게 제어권을 넘겨주었기 때문에 A 함수는 실행을 잠시 멈춘다. (Block)
  3. B 함수가 실행이 끝나면 자신을 호출한 A 함수에게 제어권을 돌려준다.
    3-1. 제어권을 다시 받은 A 함수는 그 다음 작업을 실행한다.



논 블로킹 방식 예제

이미지 출처 :: 👩‍💻 완벽히 이해하는 동기/비동기 & 블로킹/논블로킹

  1. A 함수가 B 함수를 호출한다.
  2. 호출된 B 함수는 실행되지만, 제어권은 A 함수가 그대로 갖고 있다.
  3. 함수 A는 계속 제어권을 갖고 있기 때문에 함수 B를 호출한 이후에도 자신의 코드를 계속 실행한다.





동기/비동기 + 블로킹/논블로킹 조합 예제



동기 + 블로킹 (Sync + Blocking)

  • 다른 작업이 진행되는 동안 자신의 작업을 처리하지 않고 (Blocking), 다른 작업의 완료 여부를 바로 받아 순차적으로 처리하는 (Sync) 방식
  • 다른 작업의 결과가 자신의 작업에 영향을 주는 경우에 활용할 수 있다.
  • 코드가 순차적으로 실행되기 때문에 일반적으로 작업이 간단하거나 작업량이 적은 경우에 사용된다.
console.log('1');
console.log('2');
console.log('3');
  1. 숫자 1, 2, 3이 순서대로 출력된다.



동기 + 논블로킹 (Sync + Non-Blocking)

  • 다른 작업이 진행되는 동안에도 자신의 작업을 처리하고 (Non Blocking), 다른 작업의 결과를 바로 처리하여 작업을 순차대로 수행 하는 (Sync) 방식
// 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");
    }
}

// Main thread is running..
// Waiting for the thread to finish...
// Waiting for the thread to finish... 
// Waiting for the thread to finish... 
// Waiting for the thread to finish... 
// Hello from a thread!
// Thread finished!
// Run the next tasks
  • 스레드(Thread) 객체를 만들어 요청 작업을 백그라운드에 돌게 하고 메인 메서드에서 while문을 통해 스레드가 모두 처리되었는지 끊임없이 확인하고, 처리가 완료되면 다음 메인 작업을 수행한다.



비동기 + 블로킹 (Async + Blocking)

  • 다른 작업이 진행되는 동안 자신의 작업을 멈추고 기다리는 (Blocking), 다른 작업의 결과를 바로 처리하지 않아 순서대로 작업을 수행하지 않는 (Async) 방식
  • 실무에서는 잘 쓰이지 않는다.



비동기 + 논블로킹 (Async + Non-Blocking)

function foo() {
  console.log("Async");
}
setTimeout(foo, 3000);	// 3초 뒤 실행
console.log("Non-Blocking");

// Non-Blocking
// Async
  • 비동기 방식 관점
    • foo()는 콜백 함수로, 함수를 호출한 쪽에서 처리하지 않고, setTimeout()이 실행되고 나면 콜백함수를 통해서 알아서 결과가 처리된다.
  • 논 블로킹 방식 관점
    • setTimeout()이 수행되는 것을 기다리지 않고 바로 아래의 'Non-Blocking' 문구가 출력된다.






출처
백엔드 개발자들이 알아야할 동시성 2 — 블로킹과 논블로킹, 동기와 비동기
👩‍💻 완벽히 이해하는 동기/비동기 & 블로킹/논블로킹
동기/비동기 VS 블로킹/논블로킹
블로킹 Vs. 논블로킹, 동기 Vs. 비동기
Callback함수란?? 뭔데??
[network] 동기vs비동기, 블로킹vs논블로킹의 차이

profile
💻 ⚾️ 🐻

0개의 댓글