2 개의 lib는 모두 비동기 I / O 스케줄링을 위해 설계되었으며, 둘 다 Linux에서 epoll, FreeBSD에서 kqueue 등을 사용합니다.
피상적 인 차이를 제외하고는이 두 라이브러리의 진정한 차이점은 무엇입니까? 건축이나 디자인 철학에 관한 것입니까?
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를 사용할 수있는 다른 많은 프레임 워크를 사용해야합니다.
libev
Windows 플랫폼에서는 고통 스럽습니다. MinGW 컴파일러는 항상 ++activecnt
(함수 ev_ref
) 에 sigfault를 수행 하고이 문제를 해결하는 방법을 이해하지 못합니다. 두 번째 문제는 select
소켓 상호 운용의 최신 IOCP 버전과 함께 이전 소켓 인터페이스를 사용하는 것 입니다. Widnows 지원을 개선 할 수 있습니까?