스트림 짧은 읽기와 짧은 쓰기 (Streams, Short Reads and Short Writes) Boost.Asio의 많은 I/O 개체는 스트림 지향적(stream-oriented)이다. 이는 다음을 의미한다: 메시지 경계가 없다. 전송되는 데이터는 바이트의 연속된 순서다. 읽기나 쓰기 작업은 요청된 바이트 수보다 적은 바이트 수를 전송할 수 있다. 이를 짧은 읽기 또는 짧은 쓰기라고 한다. 스트림 지향 I/O 모델을 제공하는 객체는 다음 유형 요건 중 하나 이상을 제공한다: SyncReadStream, 여기서 read_some()이라는 멤버 함수를 사용하여 동기식 읽기 작업을 수행한다. AsyncReadStream, 여기서 async_read_some()이라는 멤버 함수를 사용하여 비동기식 읽기 ..
버퍼 (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) 소켓에서..