문제

Boost.asio에는 소켓, 직렬 포트 및 모든 종류의 비 파일 예제와 관련된 많은 예제가 있음을 알았습니다. Google은 ASIO가 비동기 파일 I/O를 수행하기위한 양호하거나 유효한 접근 방식인지 언급하는 것이 실제로 많은 일을하지 않았습니다.

디스크에 비동기 적으로 쓰고 싶은 데이터가 있습니다. 이것은 Windows (내 플랫폼)에서 네이티브 중첩 된 IO로 수행 할 수 있지만 플랫폼 독립 솔루션을 선호합니다.

궁금합니다

  1. boost.asio에는 모든 종류의 파일 지원이 있습니다
  2. boost.asio 파일 지원은 일상 파일 I/O에 충분히 성숙합니다.
  3. 파일 지원이 추가 될까요? 이것에 대한 전망은 무엇입니까?
도움이 되었습니까?

해결책

boost.asio 모든 종류의 파일 지원이 있습니까?

(내 생각) Boost 1.36 (ASIO 1.2.0 포함)부터 시작하여 [boost :: asio ::] Windows :: stream_handle 또는 Windows :: random_access_handle을 사용하여 손잡이를 감싸고 비동기식 읽기를 수행하고 그에 대한 메소드를 작성할 수 있습니다. 내부적으로 겹친 구조를 사용하십시오.

사용자 Lazin은 또한 비동기 작업 (예 : 명명 된 파이프뿐만 아니라 파일)에 사용할 수있는 Boost :: asio :: random_access_handle을 언급합니다.

boost.asio 파일 지원은 일상 파일 I/O에 충분히 성숙합니까?

boost.asio 자체가 지금까지 널리 사용되며, 구현을 내부적으로 겹친 IO를 사용하면 예라고 말할 것입니다.

파일 지원이 추가 될까요? 이것에 대한 전망은 무엇입니까?

에 로드맵이 없습니다 ASIO 웹 사이트, 나는이 기능을 위해 boost.asio에 새로운 추가 기능이 없을 것이라고 말할 것입니다. Boost.asio에 코드와 클래스를 추가 할 가능성은 항상 있습니다. 어쩌면 당신은 누락 된 부분을 직접 기여할 수도 있습니다! :-)

다른 팁

부스트 :: Linux의 ASIO 파일 I/O

Linux에서 Asio는 다음을 사용합니다 epoll 소켓/파일 디스크립터가 읽기/쓰기 준비가되었는지 여부를 감지하는 메커니즘. Linux의 일반 파일에서 Vanilla Asio를 사용하려고하면 "작동 할 수없는 작업"예외가 발생합니다. Epoll은 Linux의 일반 파일을 지원하지 않습니다.

해결 방법은 ASIO를 사용하도록 구성하는 것입니다 select 리눅스 메커니즘. 당신은 정의함으로써 이것을 할 수 있습니다 BOOST_ASIO_DISABLE_EPOLL. 여기에 트레이드 오프가 있습니다 SELECT는 Epoll보다 느린 경향이 있습니다 많은 수의 열린 소켓으로 작업하는 경우. 정기적으로 파일을 엽니 다 open() 그런 다음 파일 디스크립터를 a로 전달하십시오 boost::asio::posix::stream_descriptor.

Boost :: Windows에서 ASIO 파일 I/O입니다

창에서 사용할 수 있습니다 boost::asio::windows::object_handle 포장하기 위해 Handle 파일 작업에서 생성되었습니다. 보다 예시.

ASIO는 지원이 좋은 Windows의 중첩 된 I/O를 지원합니다. Unixes 에서이 아이디어는 다음과 같이 정체되었습니다.

  • 파일은 종종 동일한 물리적 장치에 위치하여 순차적으로 액세스하는 것이 바람직합니다.
  • 파일 요청은 물리적으로 가까이 있기 때문에 종종 매우 빠르게 완료됩니다.
  • 파일은 종종 프로그램의 기본 작동을 완료하는 데 중요합니다 (예 : 구성 파일에서 읽는 것은 더 이상 초기화하기 전에 수행해야합니다).

일반적인 예외는 소켓에 직접 파일을 제공하는 것입니다. 이것은 Linux가 커널 기능 그것은 당신을 위해 이것을 처리합니다. 다시, 비동기 파일 I/O를 사용하는 이유를 부정합니다.

요컨대 : ASIO는 대부분의 UNIX 개발자에 의해 무시되는 기본 OS 디자인 철학을 반영하는 것으로 보이므로 해당 플랫폼에서는 지원되지 않습니다.

부스트 :: asio :: windows :: random_access_handle이 가장 쉬운 방법입니다. 예를 들어 비동기식 잠금 장치 또는 다른 것과 같은 고급이 필요한 경우 ASIO를 확장하고 비동기 이벤트를 추가 할 수 있습니다. 예시

Linux에는이 작업에 Windows API보다 사용하기 어렵지 않은 ASIO 라이브러리가 있습니다 (사용했습니다). 두 운영 체제 세트는 동일한 개념 아키텍처를 구현합니다. 좋은 라이브러리를 작성하는 것과 관련된 세부 사항은 다르지만 두 OS 플랫폼 모두에 대해 공통 인터페이스를 가질 수는 없습니다 (사용).

기본적으로 Async 파일 I/O의 모든 맛은 "Fry Cook"아키텍처를 따릅니다. 다음은 읽기 OP : I (가공 스레드)의 맥락에서 의미하는 바입니다. 패스트 푸드 카운터 (OS)로 올라가서 치즈 버거 (일부 데이터)를 요청합니다. 그것은 내 주문 티켓 (일부 데이터 구조) 사본을 제공하고 버거를 요리하기 위해 쿡 (커널 및 파일 시스템)으로 뒷면에 티켓을 발행합니다. 그런 다음 앉거나 내 전화를 읽습니다 (다른 일을하십시오). 나중에 누군가 내 버거가 준비되어 있다고 발표하고 (가공 스레드에 대한 신호) 음식 (읽기 버퍼)을 수집합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top