Async & Sync, Blocking & Non-Blocking

Bindung·2020년 6월 27일
0

Programming

목록 보기
1/1
post-thumbnail

RxJS 스트림에 대해서 공부하기전에 동기와 비동기, 블록과 논블록에 대해서 알아두고 가야했다.

  1. Acync & Sync
  • 호출되는 함수의 작업 완료 여부를 신경쓰느냐 마느냐가 관점이다.
  1. Blocking & Non-Blocing
  • 호출되는 함수가 바로 리턴하느냐 마느냐가 관점이다.

Synchronous(동기)

두가지의 함수가 있다고 상상하자. 하나의 쓰레드만 있으며 동기적으로 이 함수를 수행하려고 한다.
동기는 서로 두함수가 서로 시간을 맞춰서 행동한다.

  • A라는 함수가 동작하고 끝이 날 때까지 B는 기다리고
  • A가 끝나면 바로 B가 실행된다. 그리고 B의 동작이 끝난다.

이렇게 A가 끝날 때까지 기다리는 것이며, 만약 A가 DB에서 데이터를 가져오는데 5초라고 한다면 ::B는 5초간 기다리고 A가 끝나고야 실행::할 수 있다.


Asynchronous(비동기)

비동기는 동기와 반대이다. 또 한번더 상상해볼까?
두가지의 함수가 있다. 하나의 쓰레드만 있으며 비동기적으로 이 함수를 수행한다.
비동기는 서로 두함수가 서로 시간을 맞추지 않고 행동한다.

  • A라는 함수가 동작하고 DB에 데이터를 요청하고 기다리고 있다.
  • B라는 함수는 간단한 함수여서 A가 기다리는 동안 동작을 완료했다.
  • A는 데이터를 응답받고 함수를 종료했다.

이렇게 ::A가 기다리는 동안 B가 실행되고 그리고 종료되거나 A가 다시 실행되::어서 A가 종료되고 다시 B가 실행되어 종료된다.


여기까지는 Ajax써보고 들어본 사람들이 많을 것이다.
대충 이런 내용인거는 알아도 Blocking/Non-Blocking은 잘모를것이다.


Blocking(블록)

동기와 비동기와는 다른 포커스로 봐야한다.
DB를 조회하는 함수A가 있다. A는 DB에서 데이터를 요청하고 응답을 기다리고 그 결과값을 받을 때까지 다른 아무 작업은 할 수 없다.
이것이 블록이다. 동기와 똑같은가? A의 행위가 DB에 데이터를 불러오는 것이다. 하지만 그 데이터의 결과값이 없다면 다른 B, C, D,...는 사용할 수 없다.
::모든 작업이 끝날 때까지 제어권을 넘겨주지 않는다.::


Non-Blocking(논블록)

블록과 반대의 개념이다.
작업을 시작과 동시에 제어권을 넘겨주고 다른 작업들을 할 수 있게 된다.


Sync & Blocking

프로그램이 데이터를 요청하고 데이터를 조회하여 가져와서 다시 줄 때까지 프로그램은 기다리게되고 응답이 될때까지 커널에서는 다음 작업을 못한다.

Sync & Non-Blocking

프로그램이 데이터를 요청하고 커널에서는 데이터를 조회하면서 바로 제어권을 넘긴다. 그리고 프로그램에서 동기상태여서 데이터가 다되었냐고 계속 물어본다.
그리고 커널에서 데이터 조회가 되어 응답해주면 그때 프로그램측에서 받아서 처리후 다음 작업을 한다. 커널측에서 다른 작업도 데이터 조회때부터 가능해진다. 다른 작업중에 데이터가 회신되어서 넘겨줄때 그때 다시 작업을 하게 된다.

Async & Blocking

대표적인 케이스가 Node.js와 오라클, MySQL같은 조합이다.
커널측에서 제어권을 넘겨주지 않아서 결구 비동기로 실행하여도 묶여있는 상태가 되어버린다.

Async & Non-Blocking

프로그램에서 데이터를 요청하고 커널에서 바로 제어권을 반환하여
프로그램에서 다른일을 하게된다. 그리고 데이터가 반환되면
바로 프로그램에서 그 데이터를 받아서 이전에 수행하던 행위를 완료하게 된다.

뒷이야기

이 공부를 하게된것은 RxJS를 이해하기 위한 전단계로 배운것이다.
동기와 비동기는 공부해보았지만 블록킹과 논블록킹은 생각지도 못했다.
만약에 비동기처리를 한다해도 DB자체가 논블록킹을 한다면... 뭔가 부조화스러운 것같다.

출처

Blocking-NonBlocking-Synchronous-Asynchronous

profile
포기하지말고 천천히...

0개의 댓글