동기/비동기, 블로킹/논블로킹은 개발 관련 공부를 하거나 서적을 읽을 때 자주 등장하는 개념이지만 다소 헷갈리는 개념이라 제대로 한 번 정리를 하는 것이 중요하다.
여기에는 내가 이해한 내용만 최대한 간단하게 정리해보았다.
1. 동기 / 비동기
먼저 동기/비동기는 작업의 순서와 연관이 있는 개념이다. 동기는 어떤 작업에 대한 완료 여부를 확인한 이후 그 다음 작업이 수행되는 것, 비동기는 작업 완료 여부와 상관없이 다음 작업이 수행되는 것이라고 이해하면 쉽다.
다시 말해 작업이 순차적으로 실행되느냐를 따지는 것이다.
아래와 같이 functionA()라는 함수가 있다고 해보자. 이 함수는 내부에서 functionB()라는 함수를 호출한다.
void functionA() {
// functionB()를 호출하고 완료될 때까지 대기
functionB();
// 이후 작업 수행
~
~
~
}
functionA()를 호출하면 functionB()가 호출되고 그 작업이 끝날때까지 이후 작업은 수행되지 않는다. 다시 말해, functionB()가 완료된 이후에 그 다음작업이 순차적으로 실행되는 것이다. 이것을 동기 호출이라고 할 수 있다.
반면 비동기는 요청한 작업에 대한 완료 여부를 따지지 않고 바로 다음 작업을 수행하게 된다.
예를 들어, 디스크에서 파일을 읽어오는 작업을 요청했다고 해보자. 오래 걸리는 작업인 파일을 읽어오는 동안 다른 작업을 할 수 없다면 아주 비효율적일 것이다. 따라서 요청이 완료되지 않은 상태에서도 이후 작업들이 그대로 수행된다. 이후 파일 읽어오기 작업이 끝나면 작업이 완료되었다는 신호를 호출자에게 보내게 될 것이다.
다시 말해, 호출하는 쪽에서 실행 결과를 반드시 알아야 다음 작업이 수행이 가능하다면 동기 호출을, 실행 결과를 전혀 신경쓰지 않고 다음 작업이 가능하다면 비동기 호출을 이용하는 것이 바람직하다.
2. 블록킹 / 논블록킹
블록킹/논블로킹 개념은 동기/비동기와 비슷해 다소 헷갈리는 점이 있다. 블록킹/논블로킹은 현재 작업이 블록(차단 또는 대기)되느냐 아니냐에 따라 다른 작업을 수행할 수 있는지에 대한 것이다.
다시 말해, 동기/비동기는 작업이 순차적으로 실행되는지, 블록킹/논블록킹은 작업이 일시 차단되느냐 아니냐 여부에 대한 것이다.
보통은 동기와 블록킹, 비동기와 논블록킹을 엮어서 생각하는 것이 일반적이다.
예를 들어, 동기 작업의 경우 호출한 작업이 완료되었는지 여부를 따져야하기 때문에 그동안 다른 작업이 일시적으로 차단, 대기가 될 것이다. 이것이 동기/블록킹이다.
반대로 비동기 작업의 경우 호출한 작업이 완료되었는지 여부를 따지지 않고, 다른 작업도 차단되지 않기 때문에 비동기/논블록킹이다.
하지만 그렇다고 동기라고 무조건 블록킹인 것도 아니고 비동기라고 논블록킹인 것은 아니다.(하지만 비동기/논블록킹은 거의 없다고 봐도 된다.)
예를 들어, 순차적으로 두 작업이 수행되어야한다고 가정해보자. 해당 상황은 동기이다. 그런데 먼저 수행되어야할 작업이 수행되고 있는 도중에 프로그램 흐름이 차단되는 것이 아니라, 선행되어야할 작업이 완료되었는지 여부를 지속적으로 체크하는 등 작업이 중지되지 않은(논블로킹)경우도 있을 것이다. 이런 경우가 동기/논블로킹 이다.
여기까지 다소 헷갈리는 개념인 동기/비동기, 블록킹/논블록킹에 대해 간단히 정리해보았다.
내가 아는 내용만 간단히 정리한 글이라 짧고 간단하게 정리하였는데, 책이나 인터넷 등에서 그림과 함께 보면 이해가 조금 더 쉽기 때문에 다양한 자료를 참고해보라고 말하고 싶다.
'기타' 카테고리의 다른 글
정규 표현식 (3) (0) | 2024.12.19 |
---|---|
정규 표현식 (2) (0) | 2024.12.18 |
정규 표현식 (1) (0) | 2024.12.17 |