동기 / 비동기

호출되는 함수의 작업 완료 여부를 누가 신경쓰느냐가 관심사

호출되는 함수에게 callback을 전달해서 호출되는 함수의 작업이 완료되면호출되는 함수가 전달받은 callback을 실행하고, 호출한 함수는 작업 완료 여부를 신경쓰지 않는다면 비동기이다.

호출하는 함수가 호출되는 함수의 작업 완료 후 return을 기다리거나호출되는 함수로부터 바로 return 받더라도 작업 완료 여부를 호출한 함수 스스로 확인하며 신경 쓴다면 동기이다.

동기

  • 두 개 이상의 작업의 시작시간, 종료시간이 같거나 시작과 동시에 종료할 것
  • Thread1이 작업을 시작 시키고, Task1이 끝날때까지 기다렸다 Task2를 시작한다.
  • 작업 요청을 했을 때 요청의 결과값(return)을 직접 받는 것이다.
  • 요청의 결과값이 return값과 동일하다.
  • 호출한 함수가 작업 완료를 신경 쓴다.

비동기

  • 비동기 프로그래밍이란 어떤 특정 작업을 할 때 기다리지 않고 다음 작업을 동시에 실행하는 것을 의미
  • 다른 작업과 시작, 종료 시간을 맞추지 말 것
  • Thread1이 작업을 시작 시키고, 완료를 기다리지 않고, Thread1은 다른 일을 처리할 수 있다.
  • 작업 요청을 했을 때 요청의 결과값(return)을 간접적으로 받는 것이다.
  • 요청의 결과값이 return값과 다를 수 있다.
  • 해당 요청 작업은 별도의 스레드에서 실행하게 된다.
  • 콜백을 통한 처리가 비동기 처리라고 할 수 있다.
  • 호출된 함수(callback 함수)가 작업 완료를 신경 쓴다.

블로킹/논블로킹

호출되는 함수가 바로 return하느냐 마느냐가 관심사

주로 IO의 읽기, 쓰기에서 사용

호출된 함수가 바로 return해서 호출한 함수에게 제어권을 넘겨주고호출한 함수가 다른 일을 할 수 있는 기회를 줄 수 있으면 non-blocking이다.

호출된 함수가 자신의 작업을 모두 마칠 때까지호출한 함수에게 제어권을 넘겨주지 않고 대기하게 만든다면 blocking이다.

블로킹

  • 자신의 작업을 하다가 다른 작업 주체가 하는 작업의 시작부터 끝까지 기다렸다가 다시 자신의 작업을 시작
  • 다른 작업을 하는 동안 자신의 작업을 일시정지할 것
  • 다른 작업의 주체가 작업하는동안 기다릴 것
  • 요청한 작업을 마칠 때까지 계속 대기한다.
  • 즉시 return한다.
  • return 값을 받아야 끝난다.
  • Thread 관점으로 본다면, 요청한 작업을 마칠 때까지 계속 대기하며 return 값을 받을 때까지 한 Thread를 계속 사용/대기 한다.

논블로킹

  • 다른 주체의 작업과 관계없이 자신의 작업을 계속
  • 다른 작업의 주체가 작업하는동안 기다리지 말 것
  • 요청한 작업을 즉시 마칠 수 없다면 즉시 return한다.
  • 즉시 리턴하지 않는다. (일을 못하게 막는다.)
  • Thread 관점으로 본다면, 하나의 Thread가 여러 개의 IO를 처리 가능하다.

동기/비동기와 블로킹/논블로킹의 조합

동기, 블로킹 조합

  • JDBC를 이용해 DB에 쿼리 질의를 날린다
  • 메서드에서 다른 메서드를 호출하여 결과값을 즉시 받아온다
  • 결과가 처리되어 나올때까지 기다렸다가 return 값으로 결과를 전달한다.

비동기, 블로킹 조합

블로킹 작업을 실행하였지만 자기도 모르게 블로킹 작업을 실행했을 때 이러한 결과

  • 비동기, 논블로킹 작업을 호출하고 자신의 작업을 하던 도중 호출한 작업의 결과 값을 조회하려고 했을 때(블로킹 메서드 실행)

동기, 논블로킹 조합

논블로킹으로 자신의 작업을 계속하고 있지만 다른 작업과의 동기를 위해 계속해서 다른 작업이 끝났는지 조회합니다.

  • Polling

비동기, 논블로킹 조합

자신의 작업이 멈추지도 않고, 다른 주체가 하는 작업의 결과가 나왔을 때 콜백을 설정하기도 합니다. 다른 주체에게 작업을 맡겨놓고 자신이 하던 일을 계속할 수 있기 때문에 해야 할 작업이 대규모이고, 동기가 필요하지 않을 때 효과적입니다.

작업 요청을 받아서 별도의 프로세서에서 진행하게 하고 바로 return(작업 끝)한다.

결과는 별도의 작업 후 간접적으로 전달(callback)한다.

  • 대규모 사용자에게 푸시메세지 전송
  • 다양한 외부 API를 한번에 호출할 때

참고

https://deveric.tistory.com/99

https://velog.io/@wonhee010/동기vs비동기-feat.-blocking-vs-non-blocking

728x90

Compile

사람이 이해하는 언어를 컴퓨터가 이해하는 언어로 바꿔주는 과정

정적언어인 경우 가능함 - C언어, Java ...

즉, 변수 Type이 존재

변수의 타입이 존재해야 내가 만든 변수의 크기를 알 수 있고 그래야 메모리의 사이즈를 측정하고 기계에 의해 실행 가능

Interpreter

소스코드를 한 줄씩 읽어서 바로 실행하는 방식

동적언어인 경우 가능 - python, javascript ... 

변수의 Type을 모름

JIT(Just In Time)

1.  중간언어로 컴파일

가상 머신(JVM..) 위에서 작동하는 파일로 컴파일

2. VM에 의해 인터프리터로 실행

중간언어 -> os에 맞게 컴파일 실행

실제 개발

미리 모든 것을 개발하고 컴파일하는 것이 아니라 실행 속도가 느림

그렇기에 개발 환경에서 사용

AOT(Ahead-Of-Time compile)

운영체제에 맞춰 컴파일

배포환경에서 사용


아래의 영상을 보고 정리한 글

https://www.youtube.com/watch?v=NATSWdq2AvU&list=PL93mKxaRDidGEaUXprXqhNvSW02xCjLZI&index=5

 

728x90

'Study > Computer Science' 카테고리의 다른 글

동기 / 비동기 & 블로킹 / 논블로킹  (0) 2021.06.08

+ Recent posts