Blocking/Non-Blocking + Sync/Async 조합 정리

그림자왕국·2021년 3월 7일
1

CS

목록 보기
5/8
post-thumbnail

요약

Blocking / non-Blocking 차이

Blocking :
호출된 함수(callee)가 작업을 모두 마칠 때까지 caller는 대기한다.
Non-Blocking :
호출된 함수(callee)가 가상으로 return하여 caller가 기다리지 않고 다른 작업을 수행할 수 있다.
(I/O 처리 시나 다중 코어일 시 gain 획득)

동기 / 비동기 차이

Synchronous :
callee의 작업 후 return을 caller가 계속 기다리거나, 작업 완료 여부를 시스템 콜을 통해 스스로 확인
Asynchronous :
caller은 작업 완료 여부를 신경쓰지 않고 callee는 작업이 완료되면 callback을 호출하여 전달


핵심

What's Non-Blocking ?

프로그램의 문맥 상 함수 호출 후 caller가 다음 작업을 수행하려면 반드시 callee의 반환 값을 가상(임시)로라도 받아내야 한다. 그래야 컴파일러가 인식하여 caller의 다음 작업을 수행시킬 수 있다.

What's Synchronous ?

동기 방식은 caller가 반환 값을 시스템 콜 안에서 직접 받아낸다.
비동기 방식은 callee가 반환 값을 callback을 호출하여 건내준다.


Sync 상에서 Blocking / Non-Blocking 정리

Blocking :
반환 값을 받을 때까지 caller는 다른 작업을 하지 못한다.

Non-Blocking :
caller가 다른 일들을 하면서 그 일이 끝날 때마다 callee의 작업 완료 상황을 수시로 전달 받는다.
(callee의 상황을 전달 받을 때마다 매번 시스템 콜 소요)


Async 상에서 Blocking / Non-Blocking 정리

Blocking :
콜백이 올 때까지 caller는 다른 일들을 할 수 있다.

Non-Blocking :
콜백이 올 때까지 caller는 계속 대기한다.



Non-Blocking 상에서 synchronous / Asynchronous 정리

synchronous :
caller가 다른 일들을 하면서 일이 끝날 때마다 callee의 작업 완료 상황을 수시로 전달 받는다. (동기블로킹의 개선안이지만 비효율적. 왜냐하면 논블로킹방식은 정상데이터가 올 때 까지 계속 시스템 콜을 하며 문맥교환을 하기 때문)

Asynchronous :
다른 일을 하지 않고 계속 대기하면서 그저 callee의 리턴 값 반환을 기다린다.
(시스템 콜을 callee 바인딩 시 최초로 한 번만 하기에 문맥교환을 한 번만 하며, 최고의 방식이다.)


Blocking 상에서 synchronous / Asynchronous 정리

synchronous :
Caller가 다른 일을 하지 않고 대기하면서 반환 값을 일반적으로 받는다.
(오버헤드는 적음)

Asynchronous :
Caller가 다른 일을 하지 않고 대기하면서 반환 값을 콜백으로 받는다.
(당연히 콜백을 호출하여 받는게 오버헤드가 크다.)



부가 예시

블록 : caller가 callee를 호출하면 caller는 아무런 행동도 하지 못한다. (CPU 제어권이 없다)
callee가 리턴값을 반환할 때야 제어권도 가져온다.

논-블록 : caller가 calle를 호출하지만 제어권은 그대로 caller가 유지한다.
callee는 다른 스레드를 사용하던지 해서 알아서 돌아간다.

이 때 callee의 반환 값을 어떻게 받아낼 지에 대해 동기/비동기(콜백)으로 나눌 수 있다.

싱크로 : 동기는 함수의 끝과 시작을 맞추는 것 뿐만 아니라, 제어권 반환과 결과값 전달을 맞추는 것도 동기화라고 함. (시간을 일치시키는 것)

블록/논블록은 제어권의 대상
싱크/논싱크는 제어권을 반환하는 타이밍

동기 + 논블락 : caller가 callee을 호출할 때 정확한 리턴 값이 아닌 "끝나지 않음" 이란 리턴 값을 호출과 동시에 받은 상태 제어권의 반환과 결과값의 전달이 동시에 이뤄졌기 때문에 동기로 볼 수 있음

profile
언리얼 엔진 매니아입니다.

0개의 댓글