본문 바로가기

OS

동기 VS 비동기 (+ Blocking VS Non-Blocking)

728x90

동기야~!~!

이 개념을 잘 알고 있어야 추가적으로 GCD 관련된 개념들도 잘 이해할 수 있음 ..

 

Blocking VS Non-Blocking

Blocking

자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것

 

예를 들어서)

소깡이가 상사에게 서류를 전달하는 상황이라고 가정해보자.

이 때 이 상사의 이름이 blocking 이다. (블로킹 상사인 것.)

 

블로킹 상사의 경우,

> 서류를 제출하면, 그 앞에서 기다리라고 한다.

> 소깡이는 기다린다.

> 블로킹 상사가 서류를 모두 확인하면,

> 소깡이는 돌아가서 본인의 일을 한다. 

 

Non-Blocking

다른 주체의 작업에 관련없이 자신의 작업을 하는 것 

 

위의 예시와 같은 상황이라고 생각해보자.

이번에는 논블로킹 상사에게 서류를 전달한다고 가정해보면,

 

> 소깡이는 논블로킹 상사에게 서류를 제출한다.

> 논블로킹 상사는 읽어볼테니 돌아가라고한다.

> 소깡이는 돌아가서 본인의 일을 한다.

> 논블로킹 상사는 서류를 읽는다.

 

블로킹과 논블로킹의 차이는 다른 주체가 작업을 할 때 자신의 제어권이 있는지 없는지로 구분할 수 있다.

 

Synchronous

(= 동기)

작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작함을 의미

 

이번에는 싱크 상사라고 가정해보자.

> 서류를 싱크상사에게 제출한다.

> 싱크 상사는 블로킹/논블로킹 상사와 다르게 소깡이가 일을 하거나/기다리는 것에는 관심 X, 신경 쓰지 않는다.

> 싱크 상사가 서류를 다 읽고 전달해주면

> 소깡이는 서류를 받아서 바로 처리한다.

 

Asynchronous

(= 비동기)

시작, 종료가 일치하지 않으며 끝나는 동시에 시작을 하지 않음을 의미 

 

어싱크 상사에게 서류를 주는 상황이라고 할 때,

> 어싱크 상사에게 서류를 전달하면,

> 어싱크 상사는 마찬가지로 블로킹/논블로킹 상사가 아니기에 소깡이가 어떤 일을 해도 상관이 없고, 싱크 상사가 일을 바로 처리하지 않아도 된다.

> 어싱크 상사가 서류를 다 읽고 나서 해야 할 일을 적어서 소깡이에게 전달한다.

> 소깡이는 이 내용을 확인하고 '언젠가'는 처리하게 된다. 

 

동기와 비동기는 결과를 돌려주었을 때 순서와 결과에 관심이 있는지/없는지로 판단할 수 있다.

 


위의 4가지 개념을 서로 크로스오버하면 아래와 같은 표가 나오게 된다.

 

  Blocking Non-Blocking
Sync Blocking-Sync NonBlocking-Sync
Async Blocking-Async NonBlocking-Async

 

Blocking-Sync

블로킹? 다른 주체가 일을 할 때 나의 제어권이 없다.

동기? 다른 주체의 결과를 받자마자 나의 일을 한다.

 

예)

소깡이가 블로킹-싱크 상사에게 서류를 제출하면,

> 상사가 서류를 다 읽을 때까지 기다려야 하고, (= Blocking)

> 서류에 대한 결과를 받자마자 일을 한다. (= Sync)

 

어디에서 사용?

자바에서 입력요청을 할 때 

 

 

NonBlocking-Sync

논블로킹? 다른 주체가 일을 할 때 나의 제어권이 있다. 내 할 일을 하면서 계속해서 결과를 물어본다. 

동기? 다른 주체의 결과를 받자마자 나의 일을 한다.

 

예)

소깡이가 논블로킹-싱크 상사에게 서류를 제출하면,

> 상사가 서류를 제출하고 할 일을 하지만 중간 중간 끝났는지 확인하고, (= Non-Blocking)

> 서류에 대한 결과가 나오면 바로 일을 한다. (= Sync)

 

Non-Blocking/Sync는 Blocking/Sync와 큰 차이가 나지 않는다.

언제 사용?
게임에서 맵을 넘어갈 때, 해당 데이터를 가져올 때까지 정보의 로드율을 보여줘야 하는 경우 

 

 

Blocking-Async

블로킹? 다른 주체가 일을 할 때 나의 제어권이 없다.

비동기? 다른 주체의 결과를 받고 언젠가 내 일을 한다.  

 

🤔 이 경우는 비동기인데 블로킹으로 할 필요가 있나?

보통 Non-Blocking/Async로 하려다가 개발자의 실수로 이와 같은 상황이 나타나게 된다.

 

예)

소깡이가 블로킹-어싱크 상사에게 서류를 제출하면,

> 상사가 서류를 다 읽을 때까지 기다려야 하고, (= Blocking)

> 서류에 대한 결과가 나오면 언젠가 일을 한다. (= Async)

 

 

Nonblocking-Async

논블로킹? 다른 주체가 일을 할 때 나의 제어권이 있다. (= 내 일을 멈추지 않는다.)

비동기? 다른 주체의 결과를 받고 언젠가 내 일을 한다.  

 

예)

소깡이가 블로킹-어싱크 상사에게 서류를 제출하면,

> 상사가 서류를 다 읽을 때 내 일을 할 수 있고, (= Non-Blocking)

> 서류에 대한 결과가 나오면 언젠가 일을 한다. (= Async)

 

🟢 언제 사용?

API 호출을 하고 다른 작업을 하다가 콜백을 통해서 추가적인 작업을 할 때 


정리 !!

- 블로킹/논블로킹 : 제어의 관점

- 싱크/어싱크 : 순서와 결과(처리)의 관점 

'OS' 카테고리의 다른 글

[운영체제] 시스템 구조 및 프로그램 실행  (1) 2022.09.11
[운영체제] 인터럽트  (0) 2022.09.11
[질문] 프로세스 스케줄링 & CPU 스케줄링  (0) 2022.09.05
CPU 스케줄링  (0) 2022.09.05
프로세스 스케줄링  (0) 2022.09.05