--목차--
동기?
비동기?
동기와 비동기의 차이
블로킹, 논블로킹
--------
1. 동기(Synchronous)
1) 정의
데이터 요청과 결과가 한 자리에서 동시에 일어나는 것.
(사용자가 데이터를 서버에게 요청하면 서버가 데이터 요청에 따른 응답을 다시 사용자에게 리턴하기 전에는 사용자는 다른 활동 불가.
즉, 반환값을 계속 확인하는 과정을 가진다.)
2) 특징
직렬적으로 task 수행.
요청이 들어온 순서에 맞게 하나씩 처리하는 방식.
순서에 맞춰 진행되지만, 여러 요청 동시 처리 불가.
노드 사이의 작업 처리 단위(transaction)를 동시에 맞춘다는 개념. (요청, 결과가 한자리에서 동시발생)
2. 비동기(Asynchronous)
1) 정의
동기의 대비되는 단어로, 요청한 결과는 동시에 일어나지 않는다.
(서버에게 데이터를 요청한 후, 요청에 따른 응답을 계속 기다리지 않고 다른 작업을 진행해도 무방하다.
응답 여부를 확인하기 위해 요청시 콜백 함수를 함께 전달해서, 응답을 받을 때 콜백함수를 실행한다.)
2) 특징
여러 개의 요청을 동시에 처리 가능하다.
동기 방식보다 속도가 떨어질 수 있다.
노드 사이의 작업 처리 단위를 동시에 맞추지 않아도 된다.
자원을 효율적으로 사용할 수 있다.
(예시-페이지 리로드의 경우, 전체 리소스를 불러오는 과정에서 동기화방식으로 전부 요청시 불필요한 리소스 낭비가 발생하지만 비동기식은 필요한 부분만 불러와 사용 가능)
3. 동기와 비동기의 차이
동기 : 메소드를 실행시킴과 동시에 반환값이 기대되며, 이 때 반환값이 돌아오기 전까지는 blocking되어있다.
비동기 : 메소드를 실행시킴과 반환값이 기대되는 부분은 별개이며, 반환값이 blocking되지 않아 이벤트 큐에 넣거나 백그라운드 스레드에 해당 task를 위임하고 바로 다음 코드를 실행한다.
두 경우는 호출되는 함수의 작업 완료 여부를 고려할 것인지, 함수 실행/리턴의 순차적 흐름을 따르는지를 기준으로 잡는다.
4. 블로킹, 논블로킹
1) 동기/비동기와의 개념 차이
동기/비동기 : 프로세스의 수행 순서 보장에 대한 과정
블로킹/논블로킹 : 프로세스의 유휴 상태의 개념
2) 필요한 개념
제어권 : 자신(함수)의 코드를 실행할 권리. (소유할 경우 자신의 코드를 끝까지 실행 후 자신을 호출한 함수에게 반환)
결과값 대기 : A함수에서 B함수를 호출할 경우, A함수가 B함수의 결과값 대기 여부
3) 정의
블로킹
자신의 작업을 진행하다 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 자신의 작업 시작.
- A함수가 B함수를 호출하면, 제어권을 A가 호출한 B 함수에 넘겨준다.
- B는 함수를 실행하고, A는 잠시 멈춘다.
- B는 실행이 끝나면 A에게 제어권을 돌려준다.
논블로킹 : 다른 주체의 작업에 관련없이 자신의 작업 진행.
- A함수가 B함수를 호출하면, B함수는 실행되지만 제어권은 A함수가 소유.
- A함수는 자신의 코드 계속 실행.
4) 동기/비동기 + 블로킹/논블로킹
Sync-Blocking
- A함수는 B함수의 리턴값을 필요로 함. (동기)
- 제어권을 B함수에게 넘겨주고, 해당 함수가 실행을 완료하여 리턴값과 제어권 반환할 때까지 대기. (블로킹)
- 코드 실행 후 커맨드에서 입력받기(제어권 이동 : 시스템 -> 유저, 리턴값 입력할 때까지 기다림+반환될 때까지 확인)
Sync-Nonblocking
- A함수는 B함수 호출.
- A함수는 B함수에게 제어권을 주지 않고, 자신의 코드 계속 실행. (논블로킹)
- A함수는 B함수의 리턴값이 필요하기 때문에 지속적으로 B함수에게 함수 실행 완료 여부 확인. (동기)
- 게임에서 데이터 로드율 표시(논블로킹으로 게임 실행중, 다른 작업과의 동기를 위해 작업 진행 여부 조회)
Async-Nonblocking
- A함수는 B함수 호출
- A함수는 제어권을 B함수에 주지 않고 계속 소유.
- B함수 호출시 콜백함수를 함께 제공. B함수는 자신의 작업이 끝나면 A함수가 준 콜백함수 실행.
- JS 비동기 콜백, AJAX 요청(프론트 단에서 서버로 api요청 보냄, 응답 기다리지 않고 자신의 다음 일 진행)
- 복잡하게 얽히면 개발자가 흐름을 읽기 어려워지므로 JS에서 Promise, Async/Await 같은 문법을 사용한다.
Async-Blocking
- A함수는 B함수의 리턴값에 관계없이 콜백함수를 보낸다.(비동기)
- B함수의 작업에 관심이 없지만, A함수는 B함수에게 제어권을 넘긴다.(블로킹)
- A함수는 B함수 작업이 끝날 때까지 대기
- Sync-blocking과 성능이 비슷해서 거의 사용되지 않음.
- Nodejs + MySQL의 경우, 서버에서 비동기적으로 DB작업을 수행해도 블로킹 방식으로 작동하는 MySQL 드라이버 거침.
https://inpa.tistory.com/entry/👩%E2%80%8D💻-동기비동기-블로킹논블로킹-개념-정리
https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/OS#프로세스-동기화
'이론 공부 내용 정리' 카테고리의 다른 글
[CS스터디] Design Pattern - Singleton (0) | 2022.12.05 |
---|---|
[CS스터디] Statement vs PreparedStatement (0) | 2022.12.05 |
[CS스터디] CPU 스케줄러 (0) | 2022.11.07 |
[CS 스터디] 프로세스 동기화 (0) | 2022.11.07 |
[CS스터디] 스케줄러 (0) | 2022.11.07 |