쉽게 헷갈리는 블록 논 블록 / 동기 비동기 관련해서 나름의 정리를 해봤다. 무조건 적으로 이게 맞다기 보단 이렇지 않을까 하는 추측성 내용도 있기 때문에 매우 매우 주관적이다.

블록, 논 블록 vs 동기, 비동기

제어권을 넘긴다는 설명이 많아서 '어떤 제어권을 넘긴다는 거지? ' 생각해본 결과 스레드는 아니라 생각해서 프로세스의 제어권을 넘긴다고 가정했다.
결과
블록, 논 블록은 프로세스 제어권을 리턴하는 것으로 끝나기 때문에 함수의 결과를 기다리지 않지만 동기 비동기는 함수의 결과를 계속 확인하거나 콜백 함수로 받는다.
추상적인 개념
동기, 비동기가 추상적이라한 이유는 다음과 같다. 순차적으로 일어나는 것은 동기, 동시에 일어나는 것은 비동기라고 구분하지만, A 스레드가 B스레드를 관찰하는 행위(결과를 요청하는 행위)를 한다면 이는 동기라고 볼 수 있다. 또한 동시에 작업되고 있어도 인과관계가 없다면 비동기라 할 수 없다. 이 때문에 결과라는 측면으로 구분하기 때문에 추상적이다 라는 표현을 썼다.
블록 vs 동기 vs 논 블록 vs 비동기
큰 틀에서 차이를 확인했으니 개별 정의를 보자.
블록 / 논 블록
기술적으로 구분되며 함수에서의 개념이다.
블록 :함수를 호출했을 때 작업이 모두 끝마치고 프로세스 제어권을 리턴하는 것을 블로킹이라 한다.
논 블록 : 함수를 호출했을 때 작업을 요청하자마자 프로세스 제어권을 리턴하는 것을 논블로킹이라 한다.
동기 / 비동기
추상적으로 구분되며 작업에서의 개념이다.
동기 : 호출된 함수의 수행 결과 및 리턴을 호출된 함수뿐만 아니라 호출한 함수도 신경 쓰면 동기이다. 동기는 순차적으로 일어나며 A함수가 B함수를 지속적으로 관찰하는 것도 동기라 할 수 있다.
비동기 : 호출된 함수의 수행 결과 및 리턴을 호출된 함수만 신경 쓰고 처리한다면 비동기이다.(callBack)
조합

총 4가지 경우가 나온다.
블록 / 동기

A함수가 실행되다가 B함수가 실행되면 A는 일시중지(블록) 되고 프로세스 제어권은 B로 넘어간다. B가 끝나면 리턴(동기) 후 제어권은 A로 넘어간다. 위 과정은 순차적으로 진행되기 때문에 동기이며 B라는 일이 끝난 후 제어권을 리턴하기 때문에 블록이다.
나: (전화로) 저... 수영 강좌 좀 늘려주세요
고객센터: 네! 잠시만 기다려 주세요
나: 네
고객센터 : (강좌 개설 시간 설정, 모집인원 결정, 강습 과정 작성, 모집 요강 작성)
나: (궁금해서 모집 요강이 작성되는 전체 과정을 기다림, 내 일 하지 못하고 전화만 붙들고 있음)
고객센터 : 강좌 개설됐습니다. 신청하시면 됩니다.
블록 / 비동기

A함수 실행 중 B함수를 실행한다. B를 실행하면서 제어권은 B로 넘어가고 A는 일시정지(블록) 된다. B에서 바로 수행결과를 리턴(비동기)하지만 제어권은 B에게 있기 때문에 A는 일시정지 하고 있다. B의 일이 끝나고 콜백을 호출하면서 제어권을 A로 넘긴다. 그 결과로 A의 작업을 마친다. 결론은 B함수의 작업이 끝날 때 까지 A는 기다려야 하기 때문에 블럭 / 동기와 같은 효율이 나온다.
나: (전화로) 저... 수영 강좌 좀 늘려주세요
고객센터: 네! 잠시만 기다려 주세요
나: 네
고객센터 : (강좌 개설 시간 설정, 모집인원 결정, 강습 과정 작성, 모집 요강 작성)
나: (일하러 가야 되는데 모집 요강이 작성되는 전체 과정을 기다리고 있음, 일 못하고 전화만 붙들고 있음)
고객센터 : 강좌 개설됐습니다. 신청하시면 됩니다.
논 블록 / 동기

회사에서 볼 수 있는 구조다.
A함수 시작 후 B함수를 호출한다. 제어권이 다시 넘어오기 때문에 A는 자신의 일을 할 수 있다. 일을 하다 중간결과를 요청하고 미완료 됐다는 결과를 받은 뒤 다시 중간결과를 요청하고 이를 반복한다. 마지막으로 완료된 결과를 리턴 받으면 A의 작업을 마무리한다. 결과적으로 A의 주된 작업은 함수 내용이 아니라 B를 관찰하는 것이 됐다. 비동기처럼 보이지만 순차적으로 요청 -> 리턴 -> 다시 요청 -> 리턴을 반복하고 있기 때문에 동기이다.
나: (전화로) 저... 수영 강좌 좀 늘려주세요
고객센터: 네! 잠시만 기다려 주세요
나: 강좌 새로 개설했나요?
고객센터 : 조금만 기다려 주세요!
나: 강좌 새로 개설했나요?
고객센터 : 조금만 기다려 주세요!!
나: 강좌 새로 개설했나요?
고객센터 : 조금만 기다려 주세요!!!
나: 강좌 새로 개설했나요?
고객센터 : 조금만 기다려 주세요!!!
나: 강좌 새로 개설했나요?
고객센터 : 네! 등록하시면 됩니다.
논 블록 / 비동기

B를 호출하자마자 제어권을 A로 다시 넘기고 A와 B는 각자 작업을 수행한다. B의 작업이 끝나면 콜백을 호출하고 호출된 결과를 바탕으로 A의 작업을 마무리한다.
나: (전화로) 저... 수영 강좌 좀 늘려주세요
고객센터: 네! 잠시만 기다려 주세요
나: 네
고객센터 : (강좌 개설 시간 설정, 모집인원 결정, 강습 과정 작성, 모집 요강 작성)
나: (스피커로 설정하고 일하는 중)
고객센터 : 강좌 개설 됐습니다. 등록하시면 됩니다.
'CS 지식' 카테고리의 다른 글
Monolithic vs MicroService(MSA) (0) | 2022.06.13 |
---|---|
인스턴스변수의 재할당 (0) | 2022.06.13 |
객체와 클래스, 인스턴스 (0) | 2022.06.13 |