동기/비동기와 Blocking/Non-blocking이 같은 것이나 비슷한 것이라고 오해 하는 경우가 많은데 전혀 다른 개념이다.
동기/비동기
프로세스의 수행 순서 보장에 대한 매커니즘
즉 처리해야 하는 작업들을 어떠한 흐름으로 처리할 것이냐에 관점을 둔다.
- 동기: 다른 작업이 끝나는 동시에 시작한다.
- 비동기: 다른 작업이 끝나지 않아도 시작한다.
처리되어야 하는 작업이 전체적인 작업 흐름을 막는 지에 대한 관점
자신의 작업을 진행하다가 다른 주체의 작업이 시작되면
작업을 멈추고 해당 작업을 기다렸다가 다시 작업을 시작
1. 유저는 커널에게 read 작업을 요청
2. 커널은 데이터가 입력될 때까지 무한정 대기(Blocking)
=> 리소스가 일을 하지않고 낭비된다.
다른 주체의 작업에 관련없이 자신의 작업을 하는것
1. 유저가 커널에게 read 작업을 요청
2. 커널은 데이터 입력 여부와 관계 없이 결과를 반환
3. 이후 커널은 유저로 부터 입력 데이터가 올 때까지 수차례 확인
4. 입력 데이터가 있으면 커널이 유저에게 결과를 전달
단점
입력 데이터를 보냈는 지 수시로 확인한다.
Sync-Blocking과 비교했을 때 이점이 없기 때문에 거의 사용되지 않는다. -> 의도치 않게 실수로 사용된다.
정리하면 함수가 다른 함수를 호출할 때 제어권을 주지 않고 자신의 코드를 계속 실행한다.
함수가 다른 함수를 호출할 때 콜백 함수를 함께 줘서 다른 함수는 자신의 작업을 처리하면 콜백 함수를 실행한다.EX) AJAX 요청/JS 비동기 콜백