[운영체제] 동기와 비동기, 블로킹과 논블로킹 차이에 대해 알아보자

네민·2025년 6월 30일
0

우당탕탕 cs 공부

목록 보기
14/14

동기 - 비동기는 순차적인 흐름 유무,
블로킹 - 논블로킹은 작업의 흐름 자체를 막냐 안막냐의 차이 !

✅ 동기 (Synchronous)

작업이 순차적으로 진행되는 것이다.
어떤 작업을 시작했을때, 그 작업이 끝나야 다음 작업을 시작한다.

📌 예시

String data = readFile(); // 파일을 다 읽을 때까지 멈춤
System.out.println("읽은 데이터: " + data);

readFile()이 끝나야 다음 줄 실행한다. → 순차적 흐름

✅ 비동기 (Asynchronous)

작업이 독립적으로 실행되며, 작업의 완료 여부를 기다리지 않고 다른 작업을 실행할 수 있는 방식이다.
어떤 작업을 시작하고, 결과를 기다리지 않고 다른 작업을 시작한다.

I/O나 네트워크 요청과 같은 시간이 오래걸리는 작업에 유용하다.
비동기 방식은 callback, Promise, async/await 등의 메커니즘을 통해 구현한다.

📌 예시

스프링부트에서 비동기 작업의 예시는 @Scheduled@Async를 함께 사용하는 경우이다.

예를 들어, 아래 코드에서는 매일 자정에 뉴스레터를 전송하는 예약 작업이다.
이때 @Async를 함께 사용하면, 해당 작업이 백그라운드 스레드에서 실행되기 때문에
뉴스레터 전송 도중에도 메인 스레드는 다른 작업을 계속 수행할 수 있다.

@Component
public class EmailScheduler {

    @Async
    @Scheduled(cron = "0 0 0 * * *") // 매일 자정
    public void sendNewsletter() throws InterruptedException {
        System.out.println("뉴스레터 전송 시작");

        Thread.sleep(5000); // 오래 걸리는 작업 대체

        System.out.println("뉴스레터 전송 완료");
    }
}

@Async를 사용하는 이유는 예약 작업이 오래 걸리더라도 메인 스레드나 다른 예약 작업을 막지 않고,
동시에 여러 작업을 병렬로 처리할 수 있게 하기 위해서이다.

✅ 블로킹 (Blocking)

한 작업이 끝나서 결과를 받을 때까지 멈춰 있는 상태이다.

📌 예시

InputStream in = socket.getInputStream();
int data = in.read(); // 데이터 도착할 때까지 멈춤

스레드는 read()가 끝날 때까지 아무 일도 못 한다.

✅ 논블로킹 (Non - Blocking)

한 작업을 실행하고 난 후 바로 제어권을 되돌려받는다. → 지금 결과가 없으면, "없다"고 바로 알려주고, 스레드는 다른 작업 가능

📌 예시

socketChannel.configureBlocking(false);
int bytes = socketChannel.read(buffer); // 데이터 없으면 -1 즉시 리턴

스레드는 계속 살아 있고, 다른 일도 할 수 있다.

각자의 개념을 이해했다면, 이제 4가지 특징을 살펴보자.

1. 동기 + 블로킹

작업을 시작하고, 그 작업이 끝날 때까지 스레드가 멈춰 있음

📦 편의점 비유:

A가 편의점에 가서
"택배 왔나요?" → "아직이요"
→ A는 편의점에서 계속 기다림

2. 비동기 + 블로킹

작업을 백그라운드에 맡기지만, 결과를 받을 때까지 스레드는 멈춤

📦 편의점 비유:

A가 친구에게
"네가 대신 택배 찾아줘" 하고 요청함
하지만 A는 친구가 줄 때까지 가만히 기다림

3. 동기 + 논블로킹

작업을 시작하고 결과를 기다리지만, 스레드는 멈추지 않음
대신 계속 결과를 직접 확인해야 함 (polling)
→ CPU 낭비 가능성 있음

📦 편의점 비유:

A는 계속 편의점에 들러서
"왔나요?" → "아직이요"
"왔나요?" → "아직이요"
"왔나요?" → "네, 왔어요"
이렇게 계속 반복해서 확인

4. 비동기 + 논블로킹

작업을 요청하고, 스레드는 다른 작업도 처리 가능
결과는 콜백, 이벤트로 나중에 알려줌
→ 가장 효율적인 구조

📦 편의점 비유:

A가 편의점에 "도착하면 문자 주세요" 해놓고
다른 일 하러 감
→ 나중에 편의점에서 "왔어요" 문자 보내면 A가 받으러 감



참고 자료
👩‍💻 완벽히 이해하는 동기/비동기 & 블로킹/논블로킹

profile
기록하자

0개의 댓글