Timer.1 - Using a timer synchronously
위 링크에 있는 Boost의 튜토리얼을 따라하며 공부해보는 글이다.
동기화 타이머 써보기가 주제이다.
Timer.1 - Using a timer synchronously
This tutorial program introduces asio by showing how to perform a blocking wait on a timer. We start by including the necessary header files. All of the asio classes can be used by simply including the "asio.hpp" header file. #include #include All programs
www.boost.org
Boost란?
Boost는 cpp 라이브러리 중 하나로 네트워크 및 저수준 I/O 프로그래밍을 위해 사용되는 크로스 플랫폼 라이브러리다.
Asio란?
Asio는 'Asynchronous I/O'의 줄임말로, 이름에서 알 수 있듯이 비동기 입출력을 핵심 기능으로 제공한다.
한 줄로 정리하면 크로스 플랫폼(Window, Linux 등)에서 비동기 입출력을 네트워크가 되게 해주는 라이브러리이다.
장점으로는 운영체제마다 컨셉이 다른 Window의 IOCP와 Linux의 epoll 등 운영체제마다 다른 비동기 입출력을 추상화해준다.
그렇다면 왜 비동기 입출력이 필요한지에 대해서도 알아봐야 한다.
비동기 입출력이 필요한 이유
CS(Computer Science)를 조금 공부했다면 입출력 장치(I/O)는 CPU에 비해 매우 느리다는 것을 당연히 알고 있을 것이다.
이 때 동기식 입출력을 하게 된다면 I/O의 처리가 되는 동안 CPU는 동작하지 않고 쉬게 된다.
물론 멀티 쓰레드를 이용한 멀티 플렉싱으로 어느정도 효율을 높일 수 있지만 CPU가 휴식하는 시간이 생기는 것은 어쩔 수 없다.
멀티 플렉싱이란?
멀티 쓰레드 or 프로세스를 이용해 하나의 쓰레드가 여러 소켓을 관리하게 하여 효율적으로 네트워크를 관리하는 기술이다.
멀티 플렉싱의 자세한 내용을 알고 싶다면 참고한 블로그를 첨부한다.
멀티플렉싱 개념(select,epoll)
멀티플렉싱(Multiplexing)이란? -다수의 네트워크 연결요청을 동시에 처리하기 위한 기술, 위에서 멀티 쓰레드,프로세스를 이용해 동시 처리를 할 수 있지만, 해당 기술은 매우 불안정합니다. 따라
tioon.tistory.com
튜토리얼 따라하기
위에서 Boost가 왜 필요한 라이브러리인지 충분히 설명이 되었으리라고 생각한다.
이제부터는 튜토리얼을 따라하며 Boost에 대해서 학습하고자 한다.
헤더파일 Include
튜토리얼 문서에 따르면 모든 asio 클래스들은 asio.hpp 헤더파일을 include함으로 사용할 수 되어있다고 설명되어 있다.
#include <boost/asio.hpp>
우선 이 include가 되려면 기본적으로 vs에 NuGet을 통해 Boost를 설치해야한다.
위와 같이 NuGet을 통해 설치가 되었다면 include가 가능해진다.
io_context 클래스
여기서 새로운 컨셉이 하나 나오게 된다.
입출력 장치를 추상화해둔 클래스를 하나 설명한다.
boost::asio::io_context io;
이 클래스를 따라가보면 io_context.hpp파일에 있는 클래스로 따라가게 된다.
위로 올려서 설명을 확인하면 다음과 같이 명시되어있다.
/// Provides core I/O functionality.
/**
* The io_context class provides the core I/O functionality for users of the
* asynchronous I/O objects, including:
*
* @li boost::asio::ip::tcp::socket
* @li boost::asio::ip::tcp::acceptor
* @li boost::asio::ip::udp::socket
* @li boost::asio::deadline_timer.
*
* The io_context class also includes facilities intended for developers of
* custom asynchronous services.
대략적으로 "io_context 클래스는 핵심 I/O의 사용자에게 비동기 I/O 객체들의 기능을 제공한다."는 내용이다.
그리고 예시로 boost::asio::ip::tcp::socket과 boost::asio::ip::tcp::acceptor, boost::asio::ip::udp::socket, boost::asio::deadline_timer을 명시하였다.
공식 문서에 나와있는 정보를 찾아보았다.
TCP Socket Type
boost::asio::ip::tcp::acceptor
TCP Acceptor Type
UDP Socket Type
Typedef for the typical usage of timer. Uses a UTC clock.
타이머로 쓰이는 타입인데 UTC 시간을 쓰나보다.
Acceptor
개인적으로 Listener Socket에서 accept 함수는 써봤지만 Accptor의 개념은 안써봐서 찾아보았다.
accept 함수는 운영체제 수준에서의 저수준의 코드이지만 acceptor는 객체 지향적으로 추상화한 클래스라고 한다.
운영체제가 다른 곳에서 돌아가는 boost 라이브러리이기 때문에 Acceptor라고 수락하는 과정도 추상화한 것으로 추측된다.
타이머 만들기
다음 코드로 타이머를 만들라고 써있다.
boost::asio::steady_timer t(io, boost::asio::chrono::seconds(5));
"I/O 기능을 제공하는 핵심 ASio 클래스는 항상 첫 번째 생성자 인수로 실행자 또는 실행 컨텍스트(예: io_context)에 대한 참조를 사용한다. 생성자에 대한 두 번째 인수는 타이머가 지금부터 5초 후에 만료되도록 설정한다."고 설명되어 있다.
Typedef for a timer based on the steady clock.
boost::asio::chrono::seconds
std::chrono::seconds를 Boost.Asio에서 사용할 수 있게 하는 alias(별칭)
대기하기
t.wait();
다음과 같이 코드를 써서 선언한 타이머만큼 대기하게 설정한다.
이 코드에 대해서 대기는 동기형 blocking 함수이다. 따라서 5초 이후에나 호출이 된다.
출력하기
std::cout << "Hello, world!" << std::endl;
return 0;
5초가 지났으니 5초 후에 동작이 되는 것을 확인하기 위해 출력을 하고 있다.
5초 뒤에 출력이 나오는 것을 확인할 수 있다.
'Server' 카테고리의 다른 글
[Boost Tutorial 2-1] Timer.2 학습 (0) | 2025.09.10 |
---|