[libevent] libev와 libevent의 차이점은 무엇입니까?

2 개의 lib는 모두 비동기 I / O 스케줄링을 위해 설계되었으며, 둘 다 Linux에서 epoll, FreeBSD에서 kqueue 등을 사용합니다.

피상적 인 차이를 제외하고는이 두 라이브러리의 진정한 차이점은 무엇입니까? 건축이나 디자인 철학에 관한 것입니까?



답변

디자인 철학과 관련하여 libev는 libevent의 일부 아키텍처 결정을 개선하기 위해 만들어졌습니다. 예를 들어 전역 변수 사용으로 인해 다중 스레드 환경에서 libevent를 안전하게 사용하기 어려웠고, 감시자 구조는 I / O, 시간 및 신호를 결합하기 때문에 큽니다. 하나의 핸들러, http 및 dns 서버와 같은 추가 구성 요소는 구현 품질이 좋지 않고 그에 따른 보안 문제가 발생했으며 타이머가 정확하지 않았고 시간 점프에 잘 대처하지 못했습니다.

Libev는 각 이벤트 유형에 대해 작은 감시자를 사용하여 전역 변수를 사용하지 않고 모든 함수에 대해 루프 컨텍스트를 사용하여 이들 각각을 개선하려고했습니다 (I / O 감시자는 libevent에 대해 136 바이트와 비교하여 x86_64에서 56 바이트를 사용함). wallclock 대 단조로운 시간, 스레드 간 중단, 다른 이벤트 루프를 포함하거나 포함 할 감시자를 준비 및 확인하는 타이머와 같은 이벤트 유형.

추가 구성 요소 문제는 전혀 갖지 않음으로써 “해결”되므로 libev는 작고 효율적일 수 있지만 libev에는 http 라이브러리가 없기 때문에 다른 곳에서도 http 라이브러리를 찾아야합니다 (예 : 비동기 I / O를 수행하는 libeio라는 매우 관련된 라이브러리로, 독립적으로 또는 libev와 함께 사용할 수 있으므로 혼합 및 일치가 가능합니다.

간단히 말해서 libev는 한 가지 (POSIX 이벤트 라이브러리)만을 시도하며, 이것은 가능한 가장 효율적인 방법입니다. Libevent는 완전한 솔루션 (이벤트 라이브러리, 비 차단 I / O 라이브러리, http 서버, DNS 클라이언트)을 제공하려고합니다.

또는 더 짧게 말해서 libev는 유닉스 툴박스 철학을 따르려고합니다.

이것이 내가 libev를 디자인했기 때문에 권위를 가지고 말할 수있는 디자인 철학입니다. 이러한 디자인 목표가 실제로 달성되었는지 또는 철학이 건전한 원칙을 기반으로하는지 여부는 판단하는 데 달려 있습니다.

2017 업데이트 :

나는 내가 언급하는 타이머 부정확성과 libev가 Windows에서 IOCP를 지원하지 않는 이유를 여러 번 물었습니다.

타이머의 경우 libevent는 사용자가 알지 못하는 사이 미래의 알 수없는 기본 시간에 상대적인 타이머를 예약합니다. Libev는 타이머를 예약하는 데 사용할 기본 시간을 미리 알려줄 수 있으므로 프로그램이 libevent 접근 방식과 libev 접근 방식을 모두 사용할 수 있습니다. 또한 libevent는 백엔드에 따라 타이머를 일찍 만료하는 경우가 있습니다. 전자는 API 문제이고 후자는 수정 가능합니다 (확인하지 않은 이후 수정되었을 수 있음).

IOCP 지원에 관해서는-IOCP가 단순히 충분히 강력하지 않기 때문에 할 수 있다고 생각하지 않습니다. 한 가지 예로, 그들은 윈도우에서 허용되는 핸들 세트를 훨씬 더 제한하는 특별한 소켓 유형이 필요합니다 (예를 들어, perl에서 사용하는 소켓은 IOCP에 대해 “잘못된”유형입니다). 또한 IOCP는 단순히 I / O 준비 이벤트를 전혀 지원하지 않으며 실제 I / O 만 수행 할 수 있습니다. 더미 0 바이트 읽기를 수행하는 것과 같은 일부 핸들 유형에 대한 해결 방법이 있지만 다시 말하지만 이것은 Windows에서 사용할 수있는 핸들 유형을 훨씬 더 제한하고 모든 소켓 공급자가 공유하지 않을 가능성이있는 문서화되지 않은 동작에 의존합니다. .

내가 아는 한 다른 어떤 이벤트 라이브러리도 Windows에서 IOCP를 지원하지 않습니다. libevent가하는 일은 이벤트 라이브러리 외에도 IOCP를 통해 수행 할 수있는 읽기 / 쓰기 작업을 큐에 넣을 수 있다는 것입니다. libev는 I / O를 수행하지 않기 때문에 libev 자체에서 IOCP를 사용할 방법이 없습니다.

이것은 실제로 의도적으로 설계된 것입니다. libev는 작고 POSIX와 비슷하며 창에는 POSIX 스타일의 I / O 이벤트를 얻는 효율적인 방법이 없습니다. IOCP가 중요한 경우 직접 사용하거나 실제로 I / O를 수행하여 IOCP를 사용할 수있는 다른 많은 프레임 워크를 사용해야합니다.


답변

저에게 libevent 의 가장 큰 장점은 내장 된 OpenSSL 지원입니다. 2.0 버전의 libevent API에 도입 된 Bufferevent 인터페이스 는 개발자를 위해 거의 고통없이 보안 연결을 처리합니다. 내 지식이 오래되었을 수 있지만 libev 가 이것을 지원하지 않는 것 같습니다 .


답변