boost에서 가장 많이 사용하는 라이브러리인 asio 에 대해서 정리하려고 합니다. 

https://www.boost.org/doc/libs/1_72_0/doc/html/boost_asio/overview.html문서를 기준으로 개인적으로 번역하면서 영어 공부하려고 합니다.

번역 페이지

https://www.boost.org/doc/libs/1_72_0/doc/html/boost_asio/overview/rationale.html

 

Rationale

 대부분의 프로그램은 파일, 네트워크, serial cable, console을 통해서 외부와 어떤 형태로든 데이터를 주고 받습니다. 

 때때로 네트워킹과 같은 I/O작업은 완료가 오래 걸릴 수 있습니다.(네트워크 지연등등으로) 이러한 것은

 어플리케이션 개발에 까다롭게 만듭니다. 

 Boost asio는 스레드와 lock을 사용한 동시성 모델을 사용하지 않고 이러한 오래 걸리는 작업을 관리하는 도구를

 제공합니다.

 Boost Asio 라이브러리는 네크워킹과 같은 운영 체제 기능에 대한 작업이 필요한  c++ 시스템 프로그래밍을

 사용하는 프로그래머를 목표로 개발되었습니다. 특히 Boost Asio 다음 목표를 해결합니다.

이 식 성

 라이브러리는 일반적으로 사용되는 다양한 운영 체제를 지원해야 하며 운영체제들 사이에서 일관된 행동을

 제공해야 합니다.

확 장 성

 라이브러리는 수천 개의 동시 연결 할 수 있는 네트워크 어플리케이션 개발을 지원해야 합니다.

 개별 운영체제에 대한 라이브러리의 구현은 이러한 확장성을 가장 잘 활용 할 수 있는 방법을 사용해야 합니다. 

효 율 성

 라이브러리는 scatter-gather I/O 같은 기술을 지원해야 하고 프로그램이 데이터 복사를 최소화 하도록 해야 합니다

 (scatter-gather I/O : 그대로 하나의 데이터 스트림에서 여러개의 버퍼로 한 번의 시스템 콜로 읽거나 쓰는 방법)

 참조 : https://waterfordog.tistory.com/27

BSD socket 같은 인정된 API같은 모델 개념

 BSD 소켓 API 넓게 사용되고 알려져 있고 많은 문헌에서 다루고 있습니다.

 다른 프로그래밍 언어에서는 종종 네트워크 API BSD 소켓 API 비슷한 인터페이스를 사용합니다.

 합리적인 범위 내에서 Boost.Asio 관행을 따라야 합니다.

쉬운 사용 방법 

  라이브러리는 프레임워크가 아닌 툴킷 방식을 사용해서 새로운 유저를 위해 낮은 진입 장벽을 제공해야합니다.

  즉 약간의 규칙과 가이드 라인을 배우기 위해서 사용자가 투자하는 시간을 최소화 해야 합니다 

  그런 다음에 사용자는 사용중인 특정 기능만 이해하면 됩니다. 

Basis for further abstraction

 라이브러리는 높은 단계의 추상화를 제공해서 다른 라이브러리의 개발을 허용해야 합니다.

 예를 들면 HTTP와 같이 일반적으로 사용되는 프로토콜의 구현을 말합니다.

Boost Asio 주로 네트워킹을 중심으로 시작했지만 비동기 I/O 컨셉은 파일, 직렬포트등과 같은 다른 운영체제 자원이 포함되도록 확장되었습니다.

 

번역 페이지

https://www.boost.org/doc/libs/1_72_0/doc/html/boost_asio/overview/core/basics.html

Basic Boost.Asio Anatomy

 Boost.Asio는 소켓과 같은 I/O 객체를 통해서 동기 및 비동기 작업 모두 수행 할 수 있습니다. Boost.Asio를

 사용 하기 전에 Boost.Asio의 여러 부분의 대한 개념적 그림을 확인 하는 것이 유용 할 수 있습니다. 

 입문 예제를 통해서 socket에서 connect 작업이 수행 될 때 무슨일이 일어나는지 생각해봅시다.

 우선 동기작업을 확인하면서 시작합니다. 

Boost Asio 동기 작업 구조

 Your Program은 최소한 하나의 io_context를 가질 것입니다. io_contextYour Program

 연결된 Operating System의 I/O 서비스에 해당합니다.

boost::asio::io_context io_context;

 Your Program에서 I/O 작업을 수행 하려면 TCP 소켓과 같은 I/O 객체가 필요합니다. 

boost::asio::ip::tcp::socket socket(io_context);

 동기적 connect 작업이 수행 될 때 다음과 같은 이벤트 발생 순서를 가집니다 :

  1. Your Program I/O 객체를 호출해서 connect 작업을 시작합니다. 

socket.connect(server_endpoint);

  2. I/O 객체 io_context에 요청을 전달합니다.

  3. io_context는 connect 작업을 수행하기 위해서 Operating System를 호출 합니다. 

  4. Operating System io_context에게 작업 결과를 리턴 합니다. 

  5. io_context는 작업으로 인한 모든 오류 결과를 boost::system::error_code로 타입으로 변환합니다. error_code는

    특정값과 비교되거나 bool값으로 확인 될 수 있습니다.(false는 error가 발생되지 않음을 의미합니다.)

    그런 다음 결과를 I/O객체로 전달합니다.

  6. 만약 작업이 실패하면 I/O 객체는 boost::system::system_error 예외를 발생 시킵니다. 

boost::system::error_code ec;
socket.connect(server_endpoint, ec);

     작업의 수행 시작 코드가 다음과 같이 작성된 경우에는 error_code 변수 ec는 작업의 결과로 설정 되며 예외를

     발생시키지 않습니다. 

 

 비동기 작업의 수행되는 경우 다른 이벤트 발생 순서를 가집니다. 

Boost Asio 비동기 작업수행1

  1. Your Program I/O 객체를 호출해서 connect 작업을 수행합니다. 

socket.async_connect(server_endpoint, your_completion_handler);

   your_completion_handler는 다음과 같은 형식을 가집니다.

void your_completion_handler(const boost::system::error_code& ec);

  핸들어의 형식은 수행중인 비동기 작업 호출에 따라서 달라집니다. 참조 문서에서는 각 작업의 적합한 형식을

  보여줍니다.( send, recv, accept등등) 

  2. I/O 객체io_context로 요청을 전달합니다. 

  3. io_context는 운영체제에 비동기 작업을 시작해야 한다고 신호를 전달합니다.

     시간이 흐른 후( 동기 작업에서는 이 대기 시간은 connect 작업 안에 전부 포함 됩니다.)

  4. Operating System은 queue에 결과를 배치해서 connect 작업이 완료되었음을 알리고

     io_context는 결과를 가져 갈 수 있습니다.

  5. Your Program은 결과를 받아오려면 io_context::run() (또는 비슷한 io_context 멤버 함수중에 하나를)을 호출

     해야 합니다. Io_context::run() 호출은 완료되지 않은 비동기 작업이 있는 동안 Block됩니다.

     그래서 일반적으로 첫번째 비동기 작업을 시작하자마자 호출합니다.

  6. io_context::run()을 호출하는 동안, io_context는 작업에 대한 결과를 queue에서 가져오며 error_code를 변환하고 

    your_completion_handler에 결과를 전달합니다. 

 

 이것은 Boost.Asio가 어떻게 작업하는지에 대해서 단순화한 그림입니다. 다른 타입의 비동기 작업을 수행하기 위해서

 확장된 Boost.Asio와 같은 더 전문적인 내용을 원한다면 문서를 자세히 살펴 볼 수 있습니다.

'boost > Asio' 카테고리의 다른 글

[boost][asio] 디자인 패턴 - Proactor 패턴  (0) 2020.04.26

+ Recent posts