어떤 개념이든 정확하게 정의하고 규정하는 것이 필요하지만,
block, non-block, sync, async는 보면 볼수록 헷갈리는 구석이 있다.
block이 sync 같고 non-block이 async 같은데
찾아보면 찾아볼수록 개념이 혼재되어 있다는 생각이 많이 들었다. (그러면서도 정확히는 다르다고들 한다..)
그러던 와중 stackoverflow에서 발견한 comment
개념이 맥락에 따라 용어 자체가 똑같이 쓰일수도, 비슷하게 쓰일수도, 혹은 다르게 쓰일 수도 있으니
너무 무자르듯이 해당 개념을 쪼개기 보다는 이해는 하되 어느정도의 추상성은 유지한채 가는게 어떨까 라는 생각을 가지게 된 것 같다.
서론이 길었다. 밑에는 정리
Blocking
blocking process
- request가 생기면, process는 그 request가 완료될 때 까지 다음 작업(next task)을 수행하기를 멈춘다.
- 이때 프로세스를 blocked 되었다고 말함
- blocked 된 프로세스는 기다리는 과정동안 프로세스는 아무런 작업을 수행하지 못한다.
blocking I/O
- 프로세스는 I/O 작업이 완료될 때까지 기다린다.
Non-blocking
non-blocking process
- request가 생기면, process는 그 request가 완료되기를 기다리지 않고 다른 작업(other tasks)을 수행
- non-blocking process는 좀 더 효율적이라 여겨지는데 여러 요청들을 동시에 수행하기 때문
- 동시에 복잡성은 증가됨
- request가 완료되기를 확인하는지 확인하지 않는지는 모름
Synchronous
- 프로그램은 특정 작업의 수행이 완료되기를 기다리고 다음 작업을 수행한다. (block과 유사)
- 프로그램은 특정 지점에 멈춰서 response를 기다리고 response가 도달하면 다음 작업을 수행한다.
- response를 기다리는 부분이 block과는 다른 부분으로 보임
- 예를 들어, A가 B에 request를 보낼 시에 A는 B의 response를 기다리고 있음
- 여기서 A와 B는 synchronous된 상태라고 여겨짐
- 경우에 따라서는 코드가 순서에 맞게 동작한다고 생각하면 됨 (1→2→3→4)
console.log("1st")
console.log("2nd")
console.log("3rd")
// 출력 순서 "1st" -> "2nd" -> "3rd"
Asynchronous
- 프로그램은 특정 작업의 수행이 완료되기를 기다리지 않고 다음 작업을 수행한다.
- 프로그램은 작업을 수행할 request를 보낸 후 response를 기다리지 않고 다른 작업을 수행
- response가 올 시에 (response를 따로 요청하지 않음) callback function이 실행되고 결과를 수행
- response를 기다리지 않는 부분이 non-blocking과 다른 점으로 보임
- 예를 들어,커널에게 I/O 작업을 맡기면 커널의 작업 진행사항에 대해 프로세스가 인지할 필요가 없는 상황
- (sync와 차이점) 프로세스가 현재의 과정이 완료되기 전에 동시에 진행되거나 순서와 상관없이 진행
console.log("1st")
setTimeout(() => {
console.log("2nd");
},5000)
console.log("3rd")
// 출력 순서 "1st" -> "3rd" -> "2nd"
한줄씩 요약
Blocking : 멈추고 기다림, 기다리는 프로세스가 Block 되었다고 표현
Non-blocking : 안 멈추고 다른 일함, 다른 일 하는 프로세스가 Non-block 되었다고 표현
Sync : A가 B에게 Request 보낸 후 Request가 완료되었는지 지속적으로 확인 / A와 B는 Sync되는 상황
Async : A가 B에게 Request 보낸 후 Request가 완료되었지는 확인 안하고 B가 다 되었다고 알림 / A와 B는 Async되는 상황
그래서 아래의 그림이 성립되는 것 같다.
'Study > Computer' 카테고리의 다른 글
[OS] 메모리 관리 (메모리할당, 단편화, swapping, segmentation) (0) | 2023.03.18 |
---|---|
[OS] 스케쥴러와 CPU 스케쥴링 (0) | 2023.03.12 |
[기초] RESTful API란 무엇일까? (0) | 2023.03.01 |
[기초] 2의 보수에 대해 알아보자! (2) | 2023.02.15 |
크롬 개발자도구 알아보기 (0) | 2023.02.09 |