본문 바로가기

OS

synchronous, asynchronous, blocking, non-blocking

동기, 비동기 그리고 블로킹, 논블로킹은 프로그램을 개발할 때 중요한 개념 중 하나이다. 기초 프로그래밍을 배우고 응용 파트인 병렬 프로그래밍을 익힐 때 나오는 개념이고 익히기 쉽지 않은 개념이기도 하다. 

이번 기회에 개념을 확실히 잡아 나중에 힘든일을 겪지 않도록 하자.

 

동기와 비동기 개념과 블로킹과 논블로킹은 혼용하여 사용하는 경우가 있지만 엄연히 서로 다른 개념이다. 흔히 '동기' == '블로킹', '비동기' == '논블로킹'으로 헷갈리기도 합다. 하지만 실제로는 두 개념은 서로 크게 연관관계가 없는 별개의 개념이다.

 

동기/비동기는 작업을 수행하는 주체가 두 개 이상이어야 한다. 이 때 작업의 시간(시작, 종료 등)을 서로 맞춘다면 이를 동기라고 부르고, 서로 작업의 시간이 관계없다면 이를 비동기라고 부른다. 반면 블로킹/논블로킹은 작업의 대상이 2개 이상이어야 한다. 두 개념이 서로 바라보는 관점이 다르기 때문에 동기/블로킹, 동기/논블로킹, 비동기/블로킹, 비동기/논블로킹의 다양한 조합이 가능하다.

 

동기/비동기

동기 작업이란 작업을 수행하는 두 개 이상의 주체가 서로 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작할 때를 의미한다. 시작과 종료를 동시에 하거나, 하나의 작업이 끝나는 동시에 다른 주체가 작업을 시작하면 이는 동기 작업이라고 볼 수 있다. 즉, 두 주체간 서로 시간을 맞추는 것이 동기이다.

 

비동기 작업은 두 주체가 서로의 시작, 종료시간과는 관계 없이 별도의 수행 시작/종료시간을 가지고 있을 때를 뜻한다. 서로 다른 주체가 하는 작업이 자신의 작업 시작, 종료시간과는 관계가 없을 때 비동기라고 부를 수 있다.

 

블로킹/논블로킹

블로킹과 논블로킹은 다른 작업을 수행하는 주체를 어떻게 상대하는지가 중요하다. 자신의 작업을 하다가 다른 작업 주체가 하는 작업의 시작부터 끝까지 기다렸다가 다시 자신의 작업을 시작한다면 이는 블로킹이고, 다른 주체의 작업과 관계없이 자신의 작업을 계속한다면 이를 논블로킹이라고 할 수 있다.

 

즉, 어떠한 함수가 실행되고 있을때 도중에 return하고 제어권을 다른 함수에게 넘겨준다면 논블록킹이고 함수가 하는 일이 종료된 후 return하여 다른 함수에게 제어권을 넘겨주는 것이 블록킹이다.

 

예를 들어 Java에서 JDBC를 사용하여 DB에 질의를 날리고 결과를 받아오는 작업을 블로킹 작업이라고 부를 수 있다. 이와 반대로 다른 주체에게 작업을 요청하고 그 결과를 받을 때까지 기다리지 않으며 자신의 작업을 한다면 이를 논블로킹이라고 할 수 있다.

 

예시

위의 개념이 이해가 되지 않다면 다음의 조합된 예시 보며 이해하는데 도움을 받도록 하자.

 

예를 들어 상황을 가정하자 나는 배달기사이며 우체국에서 배달을 하려는 상황이다.

 

이때 우체국과 나는 각각 스레드 1, 2 인 셈이며 배달은 하나의 작업(함수)인 셈이다.

동기 블로킹

우체국은 물건을 준비하는 작업을 진행하고 있다. 나는 우체국에서 물건이 준비될때까지 계속 기다렸다 준비가 완료되면 배달을 한다.

 

동기 논블로킹

나는 우체국에다가 물건이 언제준비 되는지 전화해서 물어본다.(우체국에서 물건을 준비하는 작업(함수)를 종료시키지 않았지만 논블록킹이기에 물어볼 수 있음)  전화가 끝나면 나는 또다시 우체국에 물건이 언제 준비되는지 물어본다.(논블록킹이기 때문에 다른 함수를 수행할 수 있지만 우체국이 일을 하는동안 아무것도 할 수 없음)

 

비동기 블로킹

나는 우체국에서 물건을 준비하는동안 어떤 작업이든 할 수 있는 상태이다. 하지만 블록킹이기에 우체국에서 일을 끝낼때까지 그저 기다리기만 한다.

 

비동기 논블록킹

나는 우체국에서 물건을 준비하는동안 집안일이나 다른 일을 할 수 있다.(context switching) 그 후에 배달을 하는데 배달을 하는동안 우체국에서는 다음 물건에 대해 준비할 수 있다. 하지만 내가 돌아오기 전까지 우체국에서 작업한 물건을 담을 상자가 없다. 이때의 상자를 버퍼라고 한다. 상자가 충분히 있더라도 내가 돌아오기 전까지는 배달일을 할 수 없다. 이렇게 상자가 계속 쌓이는 현상을 병목현상이라고 하며 집배원을 늘려 해결할 수 있다. 이때의 집배원 하나하나가 스레드라고 말할 수 있다.

 

동시성 vs 병렬성

동시성은 싱글 코어에서 멀티스레드의 환경에서 발생하며 동시에 여러가지 일을 하는것처럼 보이는것을 말하며 병렬성은 멀티 코어에서 여러가지 작업을 할때 발생하며 여러가지 일을 실제로 하는것을 말한다.

 

컴퓨터는 코어당 한개의 일만을 할 수 있기 때문에 하나의 작업이 끝나기 전에 다른 작업을 할때는 context-switching을 하여 작업을 한다.

 

따라서 위에서 우체국이란 스레드와, 나라는 스레드 또한 단일 코어인 컴퓨터 내에서는 context-switching을 통해 동시에 작업을 하는것 처럼 보인다.

 

Reference

https://deveric.tistory.com/99

 

'OS' 카테고리의 다른 글

Race Condition  (0) 2022.11.21
Thread & Process  (0) 2022.11.16