정보보안/보안 기초 지식

콜백 함수, 비동기 프로그래밍

피어나는 열정 2022. 8. 3. 22:15

콜백 함수는 다른 함수에서 호출되는 함수입니다. 콜백 함수는 일반적으로 함수 포인터로 전달되며, 함수 포인터는 함수의 주소를 저장합니다. 콜백 함수는 이벤트 처리, 비동기 프로그래밍, 함수 간의 통신에 자주 사용됩니다.

 

예를 들어, 이벤트 처리기 함수는 이벤트가 발생하면 실행되는 함수입니다. 이벤트 처리기 함수는 일반적으로 함수 포인터로 전달됩니다. 이벤트가 발생하면 이벤트 처리기 함수가 실행되어 이벤트를 처리합니다.

 

 

#include <iostream>

using namespace std;

void callback() {
  cout << "Callback function called." << endl;
}

int main() {
  // Callback function을 등록합니다.
  atexit(callback);

  // 프로그램 종료 시 콜백 함수가 호출됩니다.
  return 0;
}

 

특징 콜백 함수일반 함수

호출 방식 다른 함수에서 호출 직접 호출
사용 용도 이벤트 처리, 비동기 프로그래밍, 함수 간의 통신 일반적인 프로그래밍

직접 호출

void foo() {
  cout << "Hello World!";
}

int main() {
  foo();
  return 0;
}

다른 함수 호출

void foo() {
  cout << "Hello World!";
}

void bar() {
  foo();
}

int main() {
  bar();
  return 0;
}

 

잠깐!! 함수형 프로그래밍과 콜백 함수 차이

콜백 함수와 함수형 프로그래밍은 모두 다른 함수에서 호출하는 함수이지만, 몇 가지 중요한 차이점이 있습니다.

 

콜백 함수는 일반적으로 비동기 프로그래밍에서 사용됩니다. 비동기 프로그래밍은 여러 작업을 동시에 실행하는 프로그래밍 방법입니다. 콜백 함수는 비동기 프로그래밍에서 작업의 완료 또는 실패를 처리하는 데 사용됩니다.

 

함수형 프로그래밍은 함수의 순수성을 강조하는 프로그래밍 패러다임입니다. 함수의 순수성은 함수의 입력값이 같으면 항상 같은 출력값을 반환하는 것을 의미합니다. 함수형 프로그래밍은 함수의 순수성을 유지함으로써 코드를 테스트하기 쉽고, 디버깅하기 쉽고, 병렬 처리하기 쉽습니다.

 

// 비동기 함수
void asyncFunction(int n) {
  // n초 동안 대기합니다.
  std::this_thread::sleep_for(std::chrono::seconds(n));

  // 작업이 완료되었음을 출력합니다.
  std::cout << "작업이 완료되었습니다." << std::endl;
}

// main 함수
int main() {
  // 비동기 함수를 호출합니다.
  std::thread thread(asyncFunction, 5);

  // 5초 동안 대기합니다.
  std::this_thread::sleep_for(std::chrono::seconds(5));

  // thread가 종료되었는지 확인합니다.
  if (thread.joinable()) {
    thread.join();
  }

  // 작업이 완료되었음을 출력합니다.
  std::cout << "작업이 완료되었습니다." << std::endl;

  return 0;
}

 

잠깐!! 비동기 프로그래밍이란

비동기 프로그래밍과 병렬 프로그래밍은 관련이 있습니다. 비동기 프로그래밍은 여러 작업을 동시에 수행함으로써 작업이 완료되는 시간을 줄일 수 있습니다. 병렬 프로그래밍은 여러 작업을 동시에 수행하는 프로그래밍 방법입니다. 비동기 프로그래밍은 병렬 프로그래밍의 한 종류입니다.

 

main() 함수는 asyncFunction() 함수를 기다리지 않습니다. main() 함수는 asyncFunction() 함수를 호출한 후 5초 동안 대기하지만, asyncFunction() 함수는 5초 후에 완료될 수도 있고, 5초보다 더 오래 걸릴 수도 있습니다. 따라서, main() 함수는 asyncFunction() 함수가 완료되기 전에 끝날 수도 있습니다.

 

asyncFunction() 함수가 완료되지 않은 상태에서 main() 함수가 끝나면 asyncFunction() 함수는 종료되지 않은 상태로 남아 있게 됩니다. asyncFunction() 함수는 종료되지 않은 상태로 남아 있으면 CPU를 계속 사용하게 됩니다. 따라서, main() 함수가 끝나면 asyncFunction() 함수가 CPU를 계속 사용하게 되어 시스템의 성능이 저하될 수 있습니다.

 

if thread joinable()을 통해 asyncFunction() 함수가 종료되었는지 확인하고, 종료되지 않은 경우 asyncFunction() 함수가 종료될 때까지 대기하여 시스템의 성능을 저하시키는 것을 방지합니다.

>> 이 함수를 직접적으로 관리하기 위해서 쓰레드로 시작, 종료 시킴.

 

쓰레드 생성

std::thread t(threadFunc);

쓰레드 있는지 조인 가능한지 확인

  if (t.joinable()) {
    t.join();
  }

 

 

정리 : 콜백함수에 대해서 알아보면서 콜백함수의 이벤트 처리와, 비동기 프로그래밍을 알아보았습니다.

'정보보안 > 보안 기초 지식' 카테고리의 다른 글

WinDbg란?  (0) 2023.07.24
Ram & SSD & HDD  (0) 2023.07.23
volatility3 사용 매뉴얼  (0) 2022.08.03