1. 동기와 비동기
동기와 비동기는 작업(프로세스)의 수행 순서에 관한 개념으로,
처리해야할 작업들의 순서를 보장하는지 아닌지에 대한 관심사이다.
작업의 순서를 보장하기 위해서는 작업의 완료 여부가 중요하다.
작업이 완료된 후 바로 다음 순서의 작업을 수행해야 하기 때문이다.
만약 작업의 순서가 보장되어야 한다면 선행 작업이 완료될 때 까지 그 결과를 기다릴 것이고,
그렇지 않다면 기다리지 않고 각자의 작업을 수행한다.
즉, 동기/비동기는 특정 작업이 다른 작업의 완료를 신경쓰는지 여부에 대한 관심사이다.
1) 동기 (Synchronous)
동기라는 단어의 뜻은 동시에 일어난다는 뜻으로, 요청과 동시에 결과가 주어진다는 약속이다.
즉, 요청을 하면 시간이 얼마가 걸리던지 결과가 바로 주어져야 한다. (결과를 기다린다)
순서가 보장되지만 다수의 요청을 병렬적으로 처리할 수 없다.
2) 비동기 (Asynchronous)
동시에 일어나지 않는다는 뜻으로, 요청과 결과가 동시에 주어지지 않는다는 약속이다.
요청에 대한 결과를 기다리지 않기 때문에 그 동안 다른 요청을 처리할 수 있다.
다수의 요청을 병렬적으로 처리할 수 있지만 순서가 보장되지 않는다.
3) 장단점
동기 방식은 설계가 간단하고 직관적이지만 결과가 주어질 때까지 기다려야 한다.
비동기 방식은 동기보다 설계가 복잡하지만 결과가 오래 걸리더라도 그 시간 동안
다른 작업을 처리할 수 있어서 자원을 효율적으로 사용할 수 있다.
2. 블록킹과 논블록킹
블록킹과 논블록킹은 작업의 수행 흐름에 관한 개념으로,
처리해야할 작업이 전체적인 작업의 흐름을 막는지 안막는지에 대한 관심사이다.
스레드(프로세스)는 제어권을 가지고 자신의 작업을 처리한다.
제어권은 스레드(프로세스)가 자신의 작업을 처리할 수 있는 권한같은 것이다.
만약 다른 작업을 처리하기 위해 제어권을 넘긴다면 제어권을 받을 때까지 자신의 작업을 수행하지 못하고,
그렇지 않으면 흐름을 막지 않으면서 자신의 작업을 수행한다.
즉, 블록킹/논블록킹은 제어권이 누구에게 있느냐에 대한 관심사이다.
1) 블록킹 (Blocking)
다른 작업을 처리하기 위해 제어권을 넘겨주고, 작업이 완료되면 다시 제어권을 받는 것
제어권을 받을 때까지 기존 작업의 흐름이 막히고 이어가지 못한다.
2) 논블록킹 (Non-Blocking)
처리해야할 작업(B 함수)에게 제어권을 넘겨주지 않고 자신의 작업(A 함수)을 계속 처리함.
제어권을 계속 갖고 있어서 작업의 흐름이 이어진다.
B 함수를 실행하는 주체는 서버 또는 다른 스레드(멀티스레딩)일 수 있다.
3. 동기/비동기, 블록킹/논블록킹 조합
동기 & 비동기와 블록킹 & 논블록킹은 서로 조합되어 사용되는 것이고 완전히 다른 개념이다.
1) 동기-블록킹
다른 작업을 처리하기 위해 제어권을 넘기고, 그 작업의 결과를 기다린다.
기존 작업은 진행되지 못하고 대기하다가 작업이 완료되면 제어권과 결과를 받아서 흐름을 이어간다.
2) 동기-논블록킹
제어권을 넘기지 않은 상태로 다른 작업을 요청하고 자신의 작업을 이어서 진행한다.
요청 결과를 기다리는 동안 작업은 할 수 있지만 결과를 받기 위해 요청 작업의 완료 여부를 계속 확인한다.
게임 맵을 로딩할 때 로딩 작업이 완료됐는지 확인하는 작업
3) 비동기-논블록킹
다른 작업을 요청할 경우 제어권을 넘기지 않고 자신의 작업을 진행한다.
요청 결과를 기다리지 않고(순서가 보장되지 않는다) 콜백함수를 통해 결과를 보고 받는다.
4) 비동기-블록킹
다른 작업을 요청할 때 제어권을 넘기지만 요청 결과를 기다리지 않는다.
제어권을 넘겼기 때문에 콜백함수를 통해 결과를 보고받을 때까지 작업을 이어서 진행하지 못한다.
동기-블록킹과 성능이 비슷해서 거의 사용하지 않는다고 한다.
참고 문서
'CS' 카테고리의 다른 글
OSI 7계층에 대하여 (0) | 2023.02.24 |
---|---|
데드락(Deadlock)에 대하여 (0) | 2023.02.22 |
프로세스와 스레드에 대하여 (0) | 2023.02.14 |
아키텍처 패턴에 대하여 (MVC, MVP, MVVM) (0) | 2023.02.10 |
함수형 프로그래밍에 대하여 (1) | 2023.02.06 |