본문 바로가기
CS/운영체제

[운영체제] 동기 vs. 비동기 (blocking vs. non-blocking)

by 0inn 2022. 10. 14.

공부할 때도 .. 개발할 때도 .. 매일 듣던 말이 동기 / 비동기 였는데요

오늘 요 아이를 한 번 알아보고자 합니다 . . .

+ 스리슬쩍 blocking vs. non-blocking 개념까지 알아볼게요 . .!

 

동기 (Synchronous)

동기란 말 그대로 동시에 일어난다는 뜻으로 요청과 그 결과가 동시에 일어나게 됩니다.

요청을 하면 시간이 얼마가 걸리던지 요청한 자리에서 결과가 주어져야 합니다.

 

 

Thread1 이 작업을 시작시키고 Task1 이 끝날 때까지 기다렸다 Task2를 시작합니다.

작업 요청을 했을 때 요청의 결과값을 직접 받습니다.

이 때, 요청의 결과값은 return값과 동일합니다. (비동기 예시를 보면 이해할 수 있습니다 ~)

호출한 함수가 작업 완료를 신경 씁니다.

 

비동기 (Asynchronous)

비동기는 동시에 일어나지 않는다는 뜻으로 요청과 결과가 동시에 일어나지 않습니다.

 

 

Thread1 이 작업을 시작시킨 후 완료를 기다리지 않고 다른 일인 Task2 를 수행합니다.

작업 요청을 했을 때 요청의 결과값(return)을 간접적으로 받습니다.

이 때, 요청의 결과값이 return값과 다를 수 있습니다. (동기 예시와 달리 말이죠 !)

콜백을 통한 처리가 비동기 처리라고 할 수 있습니다.

호출된 함수(callback 함수)가 작업 완료를 신경 씁니다.

 

  장점 단점
동기 설계가 매우 간단하고 직관적 결과가 주어질 때까지 대기
다른 작업 X
비동기 동기보다 복잡 결과 주어질 때까지 대기 X
다른 작업 O
자원을 효율적으로 사용 가능

 

그렇다면 여기서 . . . ! blocking 과 non-blocking 을 알아볼까요 ~ ?

blocking과 non-blocking은 주로 IO의 읽기, 쓰기에서 사용된다고 합니다.

 

blocking

blocking이란 요청한 작업을 마칠 때까지 계속 대기하며 즉시 return 하지 않습니다.

스레드 관점으로 본다면 요청한 작업을 마칠 때까지 계속 대기하며 return 값을 받을 때까지 한 Thread를 계속 사용 및 대기합니다.

 

non-blocking

non-blocking이란 요청한 작업을 즉시 마칠 수 없다면 즉시 return 합니다.

Thread 관점으로 본다면 하나의 Thread가 여러 개의 IO 처리가 가능합니다.

 

흠 .. 그래서 동기 비동기랑 뭐가 다른데 ..?

뭔소린지 잘 모르시겠다고요 .. ? 저도요 .. 

다시 한 번 정리하면서 따라가봅시다 !

 

동기 / 비동기

호출되는 함수의 결과를 누가 처리하느냐의 관점입니다.

 

ex. A 함수가 B 함수를 호출하는 경우

  • 동기 : B 함수의 결과를 A 함수가 처리
  • 비동기 : B 함수의 결과를 B 함수가 처리 (callback)

 

blocking / non-blocking

호출되는 함수가 바로 return 하느냐 마느냐의 관점입니다.

 

ex. A 함수가 B 함수를 호출하는 경우

  • blocking : B 함수가 자신의 작업이 종료되기 전까지 A 함수에게 제어권을 돌려주지 않는 것
  • non-blocking : B 함수가 제어권을 바로 A 함수에게 넘겨주면서 A 함수가 다른 일을 할 수 있도록 하는 것

 

 

쪼~끔은 이해가 되기 시작했습니다 . . ! 

그렇다면 이제 이 개념들을 같이 이해해봅시다  ~ 

 

동기 vs. 비동기  + blocking vs. non-blocking

 

1. Sync + blocking

 

결과가 처리되어 나올때까지 기다렸다가 return 값으로 결과를 전달합니다.

 

2. Async + non-blocking

 

작업 요청을 받아서 별도의 프로세서에서 진행하게 하고 바로 return 합니다.

결과는 별도의 작업 후 간접적으로 전달 (callback) 합니다.

 

 

3. Sync + non-blocking

 

B 함수는 바로 제어권을 돌려주기 때문에 A 함수는 다른 작업을 수행할 수 있습니다.

하지만 언제 종료되는지 알 수 없는 B 함수의 종료를 A 함수가 처리해야 합니다.

그러므로 B 함수의 종료를 반복적으로 물어봐야하는 경우가 되는 것이죠.

 

 

4. Async + blocking

 

호출되는 함수가 바로 return하지 않고, 호출하는 함수는 작업 완료 여부를 신경쓰지 않습니다.

이 조합은 이점이 없기 때문에 일부러 이 방식을 사용하지는 않는다고 합니다.

 

후 .. 이제 거의 다왔습니다 . . !

 

입출력(IO)를 처리할 때의 예시도 살펴볼까요 ?

동기와 비동기의 차이는 요청한 순서가 지켜지는지 아닌지입니다.

blocking과 non-blocking의 차이는 요청에 대해 받은 쪽에서 처리가 끝나기 전에 리턴해주는가 아닌가입니다.

 

좀 더 일상적인 예시로 살펴볼까요 ?

 

ex. 급하게 알아야하는 답을 누군가에게 물어보는 상황 !

 

1. 전화

   (바로 전화로 답 얻음) - 동기

2. 이메일

   (답이 언제 올지 모른다..) - 비동기 

3. 전화를 했는데 너무 바빠 안받음

   (전화 받을 때까지 대기) - 동기 + blocking

4. 전화를 했는데 안받음

   (전화 끊고 다른 일하면서 계속 통화 시도하다가 성공) - 동기 + non-blocking


참고

https://velog.io/@wonhee010/%EB%8F%99%EA%B8%B0vs%EB%B9%84%EB%8F%99%EA%B8%B0-feat.-blocking-vs-non-blocking

https://jh-7.tistory.com/25

https://private.tistory.com/24

 

 

'CS > 운영체제' 카테고리의 다른 글

[운영체제] 프로세스 vs. 스레드  (0) 2022.10.13