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


96

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

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



1
libevent는 libev가 지원하지 않는 Windows 용 IOCP (Bufferevent AFAIK를 통해)도 지원합니다.
rogerdpack 2013

1
rogerdpack, libuv 지원 IOCP github.com/joyent/libuv
데니스 데니 소프

답변:


223

디자인 철학과 관련하여 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를 사용할 수있는 다른 많은 프레임 워크를 사용해야합니다.


Marc도 libeio의 저자입니까?
juanpavergara

슬프게도, 그것은 제거하고 libuv로 대체되었다 github.com/joyent/libuv/issues/485 이 : groups.google.com/forum/#!topic/nodejs/UwHkaOksprw
피터 Teoh

1
libev에 libevfibers라는 멋진 추가 기능을 추가했습니다. libev, libcoro 및 libeio 위에 섬유 수준을 추가합니다. 여기에서 찾을 수 있습니다 : github.com/Lupus/libevfibers
Lupus

1
libevWindows 플랫폼에서는 고통 스럽습니다. MinGW 컴파일러는 항상 ++activecnt(함수 ev_ref) 에 sigfault를 수행 하고이 문제를 해결하는 방법을 이해하지 못합니다. 두 번째 문제는 select소켓 상호 운용의 최신 IOCP 버전과 함께 이전 소켓 인터페이스를 사용하는 것 입니다. Widnows 지원을 개선 할 수 있습니까?
Vitold S.

1
죄송 합니다만, 많은 오픈 소스 프로젝트를 망가 뜨린 libev 뒤에 또 다른 "철학"이있는 것 같습니다. 예를 들어 lists.schmorp.de/pipermail/libev/2017q1/002710.html 또는 lists.schmorp.de/pipermail/libev/2010q1/000912.html 에서 분명합니다 . 잠재적 인 사용자도이 점을 고려해야합니다.
dbrank0

13

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


3
정답 : libev는 사용자를 위해 I / O를 수행하지 않으므로 사용자 (또는 실제로는 I / O)를 위해 TLS를 수행하지 않습니다.
모니카 기억
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.