함수A가 함수B를 호출했을 때 함수B의 결과값이 언제 나오는지 계속 체크하다가 결과가 나오면 즉각적으로 그에 대한 처리를 하는 동작 방식
비동기
함수A가 함수B를 호출한 후 함수B의 결과값이 어떻게 되든 관심을 갖지 않는 동작 방식
2. 블로킹 vs 논블로킹
구분 기준
함수 호출 이후 호출된 함수가 끝날 때까지 제어권을 붙잡고 있는지 여부가 구분의 기준
블로킹과 논블로킹 비교
블로킹
함수A가 함수B를 호출했을 때 함수B가 작업을 마무리할 때까지 제어권을 계속 가짐으로써 함수A는 아무것도 못하고 기다려야하는 동작 방식
논블로킹
함수A가 함수B를 호출했을 때 함수B가 작업 마무리 전에 제어권을 함수A에게 다시 돌려줘서 함수A가 다른 작업을 할 수 있는 동작 방식
3. 동기/비동기, 블로킹/논블로킹 조합
동기 + 블로킹
일반적인 프로그램 동작 방식
동기 + 논블로킹
프로그램 설치 도중 몇 퍼센트 진행됐는지 진행상황을 보여주는 것과 같은 상황에 적합한 동작 방식
비동기 + 블로킹
비효율적이고 의미없는 동작 방식, 코딩을 잘못한 것
비동기 + 논블로킹
처리하는데 긴 시간이 걸리는 IO 작업에 Application이 Block되지 않고 계속 동작할 수 있도록 함으로써 성능상 이점을 가질 수 있는 동작 방식
추가내용
시퀀스 다이어그램에서 async + non-blocking 방식은 task queue와 event loop를 활용한 동작 방식으로 그린 것인데 이와 다른 방법으로 async + non-blocking 방식이 동작하도록 설계된 것도 있다는 것 같으니 관심이 있으면 검색해보면 좋을 것 같다.
kernel도 하나의 프로그램이므로 Application의 스레드가 붙어서 작업을 수행하지 않아도 자체적으로 IO 작업을 수행하고 그 결과를 반환해줄 수 있다.
싱글 스레드 환경인지 멀티 스레드 환경인지에 따라 동작 방식이 시퀀스 다이어그램과 달라질 수 있을 것 같다.