blocking : 진행이 막히는가 (관심사:제어권)
sync : 결과를 대신 처리하여 순서를 맞추는가 (관심사:작업완료)
내가 이해한 구분법이다.
검색하다보면 정확한 구분은 다르지만(권한과 결과에 집중한다.) 글자 그대로의 느낌을 이해해야 나중에 기억날거같았다.
block 에서 느껴지는 느낌은 막혀있다는 느낌이다.
그래서 block 이라고하면 일을 하다가 멈춘다는 느낌이 온다.
sync는 동시라는 말이다. 영화를 볼때 자막이 sync가 안맞으면 내가 나서서 (자막 제공자) 대신 자막에 속도를 느리거나 빠르게해 입모양과 맞춘다. 일의 sync를 맞춘다는것은 누군가 나서서 일을 (일을한 사람) 대신 처리(행위)함으로써 순서를 맞춘다(결과)는 느낌이다.
나는 게시판에 포스트잇을 붙이는 비유가 가장 찰떡같았다.
A와 B가 게시판에 포스트잇을 붙인다고 생각하자.
이때 A가 B에게 포스트잇을 요청한 상황이다.
이제 어떻게 구분할지 기준을 정해보자.
A가 멈추는가?
A는 B에게 요청하고 막힌(block) 상태로 기다린다.
A는 B에게 요청하고 막히지 않고(non-blocking) 자기 할일을 마저한다.
A가 포스트잇을 대신 붙이는가?
B가 포스트잇에 글을 다 작성하면 A가 대신 붙인다.
(B에게 여러개의 포스트잇을 요청해도 A가 대신 붙이기 때문에 순서가 다 지켜진다.)
B가 포스트잇에 글을 다 작성하면 B가 알아서 붙인다.
(B에게 여러개의 포스트잇을 요청하면 B가 알아서 붙이기 때문에 A가 포스트잇과 순서가 겹쳐진다.)
검색하면 가장 흔하게 나오는 기준표이다.

그럼 위에서 정한 기준으로 생각해보자.
위에 예시를 그대로 가져와
A는 A1,A2,A3 을 붙이고
B는 B1,B2,B3 을 붙인다.
이떄 A1을 작성하고나서 B에게 요청한 상황이다.
막힌 상태 + 직접 처리
A가 멈추지만 결과는 직접 처리한다.
가장 쉽게 생각할수있는 경우다.
결과 : A1,B1,B2,B3,A2,A3
read/write 상황에서 주로 쓰인다.
특징 : 업무 순서가 중요할때 사용된다.
막힌 상태 + 알아서 처리
A는 멈춰있지만 결과는 B가 대신 처리한다.
A 입장에서는 어차피 멈추고 기다리기 때문에 게시판에 붙이는 일을 A가 하던 B가 하던 결과 순서에는 아무런 영향을 주지 않는다.
그래서 결과는 blocking 상태에서 sync와 async가 같다.
결과 : A1,B1,B2,B3,A2,A3
특징 : 거의 사용되지 않는다.
Node.js에서 callback(async)으로 MySQL에 DB 작업(block)을 요청할때 이러한 일이 벌어진다고 한다.
안막힌 상태 + 알아서 처리
A도 멈추지 않고 B도 결과를 알아서 처리한다.
그래서 A가 요청한 시점으로부터 먼저 일이 끝나는 순서대로 결과가 나타난다.
결과 : A1,B1,B2,A2,A3,B3 (한가지 예시 일뿐 A와 B가 뒤죽박죽인 상태)
특징 : 보통 시간이 오래걸리는 I/O 요청이나 API 요청시 사용된다.
안막힌 상태 + 대신 처리
A는 멈추지 않고 일을 하지만 B의 결과를 대신 처리해줘야한다.
A가 참 바쁜 상태다. A는 자기 할일을 계속하지만 B가 일을 끝낼때마다 B를 대신하여 게시판에 포스트잇을 붙여줘야한다. A는 중간중간 B가 일을 끝냈는지 물어보면서 B도 챙겨줘야한다.
결과는 위와 같이 뒤죽박죽이다.
결과 : A1,B1,B2,A2,A3,B3 (한가지 예시 일뿐 A와 B가 뒤죽박죽인 상태)
어차피 안막힌 상태여서 순서는 변하지 않지만 중간중간 B를 감시할수가 있다.
특징 : 호출된 함수를 계속 감시할 수 있다.
그래서 프로세스 진행상황을 나타낼때 사용할 수 있다고한다. (진행 상황을 어떻게 알수있는거지..)
++추가
좀더 포멀한 답변으로는 다음과 같다.
관심사 관점에 서 구분한다면
Blocking/NonBlocking은 호출되는 함수가 바로 리턴하느냐 마느냐가 관심사
바로 리턴하지 않으면 Blocking
바로 리턴하면 NonBlocking
Synchronous/Asynchronous는 호출되는 함수의 작업 완료 여부를 누가 신경쓰냐가 관심사
호출되는 함수의 작업 완료를 호출한 함수가 신경쓰면 Synchronous
호출되는 함수의 작업 완료를 호출된 함수가 신경쓰면 Asynchronous
성능과 자원의 효율적 사용 관점에서 가장 유리한 모델은 Async-NonBlocking 모델이다.
동작 관점에서는 구분한다면
NonBlocking은 제어문 수준에서 지체없이 반환하는 것
Asynchronous는 별도의 쓰레드로 빼서 실행하고, 완료되면 호출하는 측에 알려주는 것