Post

콜백 함수, 동기, 비동기, 블로킹, 논블로킹


컴퓨터 구조

컴퓨터 구조를 공부하면서 알게된 내용을 요약해서 작성해보자.

콜백 함수

  • 코드에서 숫자 10을 직접 사용하는 것보다 변수 a에 10을 담아서 a를 사용하면 효율적이다.
  • 함수를 변수처럼 사용할 수 있다. 파라미터로 다른 함수에 전달되는 함수를 콜백 함수라고 한다.
  • 일반적으로 콜백 함수는 직접 구현하지만, 그 함수를 호출하는 것은 다른 모듈이나 스레드에서 한다.
  • 거의 모든 프로그래밍 언어에서 콜백 함수를 사용할 수 있다.
  • 일반적으로 함수 작성자가 나라면 함수를 호출하는 것도 나여야 하지만, 콜백 함수는 그렇지 않다.
  • 서드 파티 라이브러리를 예로 들면, 내가 서드 파티 라이브러리의 함수를 호출할 때 콜백 함수를 함께 전달하면 서드 파티 라이브러리의 함수는 내가 작성한 콜백 함수를 호출한다.
  • 서드 파티 라이브러리에 콜백 함수를 지정해야 하는 이유는 서드 파티 라이브러리의 작성자가 특정 시기에 어떤 작업을 수행해야 하는지 알 수 없기 때문이다.

동기 콜백

  • 함수를 호출할 때 프로그래머에게 가장 익숙한 사고방식
    • 함수를 호출하고 결과를 얻는다.
    • 얻은 결과를 처리한다.
  • 함수가 반환한 결과를 기다려야 한다. 이것이 함수의 동기 호출이다.
  • 블로킹 콜백이라고도 한다.
  • 주 스레드가 작업이 끝날 때 까지 기다리는 것을 유휴 시간(idle time)이라고 한다.

비동기 콜백

  • 함수 호출이 비동기 호출이라면 함수는 즉시 반환될 수 있고, 결과를 받아 처리하는 프로세스는 다른 스레드와 프로세스, 다른 시스템에서 완료될 수 있다.
  • 처리 흐름을 하나의 작업으로 생각할 때, 동기 호출 프로그래밍 방식은 함수를 호출한 스레드에서 전체 작업이 처리된다.
  • 비동기 호출 프로그래밍은 작업 처리가 두 부분으로 나뉜다.
    • 첫 번째 부분은 함수를 호출하는 스레드에서 처리된다. 함수가 호출되기 전에 해당하는 부분이다.
    • 두 번째 부분은 함수를 호출하는 스레드에서 처리되지 않고 다른 스레드, 프로세스 또는 다른 시스템에서 처리된다.
  • 콜백 함수의 본질
    • 어떤 일을 해야 하는지 알지만, 이 일을 언제 하게 될지는 정확히 알 수 없다. 반면에 다른 모듈은 언제 해야 할지는 알지만 무엇을 해야 하는지는 모르기 때문에 정보를 콜백 함수에 잘 담아 다른 모듈에 전달해야 한다.

동기

  • 예를 들면 상사가 작업을 지시 했는데 내가 작업하는 것을 지켜 보면서 작업이 완료될 때 까지 기다리는 것을 동기 작업이라고 한다.
  • 전화 통화 시, 상대방의 말을 듣고 내가 말을 하고 내 말을 상대방을 듣고 상대방이 말을 한다.
  • 일반적으로 전화 통화가 동기에 해당한다.
  • A와 B라는 두 대상이 강하게 결합된 것을 말한다.

비동기

  • 상사가 작업을 지시 하고 작업을 완료하면 알려달라고 하고 상사 본인의 일을 하는 것을 비동기 작업이라고 한다. 즉, 내가 작업을 완료할 때 까지 기다리지 않는다.
  • 상대방이 이메일을 보내고 내가 읽기전 까지 다른 일을 처리한다. 내가 보낸 이메일을 상대방이 읽을 때 까지 기다리지 않고 다른 일을 한다.
  • 다른 사람의 작업이 끝날 때 까지 기다릴 필요가 없다.
  • 이메일 소통 방식은 비동기에 해당한다.
  • A와 B가 강한 결합과 같은 제약이 없어 각자 자신의 작업을 실행할 수 있을 때 비동기다.

블로킹

  • 함수 A가 함수 B를 호출할 때, 함수 B를 호출함과 동시에 운영 체제가 함수 A가 실행 중인 스레드나 프로세스를 일시 중지시킨다면 함수 B에 대한 호출 방식은 블로킹 방식이다.
  • 모든 함수 호출이 호출자의 스레드를 일시 중지 시키는 것은 아니다.
  • 피자 가게에 가서 직접 피자를 주문하는 것에 비유할 수 있다.
  • 피자가 완성이 되어야 그 피자를 들고 다른 일을 할 수 있다.
  • 동기 호출은 반드시 블로킹이 아닌 반면에 블로킹 호출은 확실한 동기 호출이다.

논블로킹

  • 함수 A가 함수 B를 호출할 때, 운영 체제가 스레드나 프로세스를 일시 중지 시키지 않는다.
  • 전화로 피자를 주문하는 것에 비유할 수 있다.
  • 전화로 주문 후 피자가 완성되기 전에 다른 작업을 할 수 있다.
  • 5분 마다 전화해서 피자가 언제 완성 되는지 물어보고 다른 일을 한다면 여전히 비동기이다.
  • 5분 마다 전화해서 피자가 언제 완성 되는지 물어보고 다른 일을 하지 않는다면 동기이다.
  • 논블로킹이 반드시 비동기를 의미하지 않는다.