버퍼 (Buffers) 기본적으로, I/O는 버퍼라고 불리는 메모리 인접 영역과 데이터를 주고받는 것을 포함한다. 이러한 버퍼는 포인터와 크기(바이트)로 구성된 튜플로 단순하게 표현할 수 있다. 효율적인 네트워크 응용프로그램을 개발을 허용하기 위해 Boost.Asio는 Scatter-Gather(분산-수집) 작업의 지원을 포함한다. 이러한 작업은 하나 이상의 버퍼를 포함한다: Scatter 읽기는 데이터를 여러 버퍼로 수신한다. Gather 쓰기는 여러 버퍼를 전송한다. ※ Scatter-Gather는 분산-수집으로 번역이 가능하지만, 글의 전체적인 이해를 위해 영문 그대로 사용한다. 그러므로 버퍼 컬렉션을 표현하려면 추상화가 필요하다. Boost.Asio에서 사용되는 접근 방식은 단일 버퍼를 나타내는 ..
스트랜드: 명시적 잠금 없이 스레드 사용 (Strands: Use Threads Without Explicit Locking) 스트랜드(strand)는 이벤트 핸들러의 엄격한 순차 호출(즉, 동시 호출 없음)로 정의된다. 스트랜드(strands)를 사용하면 멀티스레드 프로그램에서 명시적 잠금(예:뮤텍스 사용)없이 코드를 실행할 수 있다. 스트랜드(strands)는 다음 선택 가능한 방식에서 설명하는 것처럼 암시적이나 명시적일 수 있다: 하나의 스레드에서만 io_context::run()을 호출하면 모든 이벤트 핸들러가 암시적으로 스트랜드(strand)에서 실행되는 것을 의미한다. 핸들러가 run() 내부에서만 호출된다는 io_context의 보장 때문이다. 연결과 관련된 비동기식 작업용 단일 체인이 있는..
스레드와 Boost.Asio (Threads and Boost.Asio) 스레드 안정성 일반적으로 개별 개체를 동시에 사용하는 것은 안전하지만, 단일 개체를 동시에 사용하는 것은 안전하지 않다. 하지만 io_context와 같은 유형은 단일 개체를 동시에 사용하는 것이 안전하다는 더 강력한 보증을 제공한다. 스레드 풀 여러 스레드에서 io_context::run()을 호출하여 완료 핸들러를 호출할 수 있는 스레드의 풀을 설정할 수 있다. 이 접근 방식은 스레드 풀에서 임의 계산 작업을 수행하는 수단으로 post()와 함께 사용할 수 있다. io_context 스레드 풀에 결합된 모든 스레드는 동등한 것으로 간주되며, io_context는 임의의 방식으로 작업을 분산시킬 수 있다는 점에 유의해야 한다. 내..
Proactor 디자인 패턴: 스레드 없는 동시 실행 (The Proactor Design Pattern: Concurrency Without Threads) Boost.Asio 라이브러리는 동기식과 비동기식 작업에 대한 지원을 함께 제공한다. 비동기식 지원은 Proactor 디자인 패턴 [POSA2]을 기반으로 한다. 전용-동기식이나 Reactor 접근 방식과 비교하는 경우, 이 접근 방식의 장점과 단점은 아래에 요약되어 있다. Proactor와 Boost.Asio 플랫폼 세부사항을 참조하지 않고, Boost.Asio에서 Proactor 디자인 패턴이 어떻게 구현되는지 살펴본다. Proactor 디자인 패턴 ([POSA2]에서 수정됨) 비동기식 작업 (Asynchronous Operation) 소켓에서..
Boost.Asio 기본 구조 (Basic Boost.Asio Anatomy) Boost.Asio는 소켓과 같은 I/O 개체에 대해 동기식과 비동기식 작업을 모두 수행할 수 있다. Boost.Asio를 사용하기 전에, 프로그램 내에서 Boost.Asio의 다양한 부분들이 함께 작동하는 방식에 대한 개념적 그림을 보는 것이 유용할 수 있다. 입문 예제로 소켓에서 연결 작업을 수행할 때 어떤 일이 발생하는지 살펴본다. 동기식 작업을 살펴보는 것부터 시작할 것이다. 프로그램에는 boost::asio::io_context 개체, boost::asio::thread_pool 개체 또는 boost::asio::system_context와 같은 I/O 실행 컨텍스트가 적어도 하나 있다. 이런 I/O 실행 컨텍스트는 ..