2012-02-24 13 views
76

दोनों 2 libs async के लिए तैयार कर रहे हैं मैं/हे निर्धारण, और दोनों FreeBSD पर लिनक्स पर epoll, और kqueue संलग्न है, आदिlibev और libevent के बीच क्या अंतर है?

सतही मतभेदों को छोड़कर, मेरा मतलब है इन दो पुस्तकालयों के बीच सही क्या अंतर है? वास्तुकला, या डिजाइन दर्शन के संबंध में?

+4

http://cvs.schmorp.de/libev/README – cadrell0

+1

libevent भी खिड़कियों के लिए IOCP का समर्थन करता है (bufferevent AFAIK के माध्यम से) कि libev नहीं – rogerdpack

+1

rogerdpack, libuv समर्थन IOCP https://github.com/joyent/libuv –

उत्तर

192

डिजाइन दर्शन के लिए, libev को libevent में कुछ वास्तुशिल्प निर्णयों में सुधार के लिए बनाया गया था, उदाहरण के लिए, वैश्विक परिवर्तनीय उपयोग ने बहुप्रचारित वातावरण में सुरक्षित रूप से libevent का उपयोग करना मुश्किल बना दिया, वॉचर संरचनाएं बड़ी हैं क्योंकि वे I/O को गठबंधन करते हैं , समय और सिग्नल हैंडलर एक में, http और dns सर्वर जैसे अतिरिक्त घटक खराब कार्यान्वयन गुणवत्ता और परिणामी सुरक्षा समस्याओं से ग्रस्त थे, और टाइमर अचूक थे और समय कूदने के साथ अच्छी तरह से सामना नहीं करते थे।

लिबेव ने वैश्विक चर का उपयोग न करके सभी कार्यों के लिए लूप संदर्भ का उपयोग करके, इनमें से प्रत्येक को बेहतर बनाने की कोशिश की, प्रत्येक घटना प्रकार के लिए छोटे निरीक्षक का उपयोग करके (एक आई/ओ वॉचर x86_64 पर 56 बाइट्स का उपयोग करता है जो कि libevent के लिए 136 की तुलना में), अतिरिक्त घटना प्रकारों जैसे कि वॉलक्लॉक बनाम मोनोटोनिक समय, इंटर-थ्रेड बाधाओं के आधार पर टाइमर जैसे अन्य ईवेंट प्रकारों को अनुमति देना, अन्य ईवेंट लूप को एम्बेड करने या एम्बेडेड करने के लिए वॉचर्स तैयार करना और जांचना।

अतिरिक्त घटक समस्या उन्हें हल करके "हल" की जाती है, इसलिए libev छोटा और कुशल हो सकता है, लेकिन आपको http पुस्तकालय के लिए कहीं और देखने की आवश्यकता है, क्योंकि libev में केवल एक नहीं है (उदाहरण के लिए , libeio नामक एक बहुत ही संबंधित लाइब्रेरी है जो एसिंक्रोनस I/O करता है, जिसका प्रयोग स्वतंत्र रूप से या libev के साथ किया जा सकता है, ताकि आप मिश्रण और मिलान कर सकें)।

तो संक्षेप में, libev केवल एक चीज (POSIX ईवेंट लाइब्रेरी) करने की कोशिश करता है, और यह सबसे प्रभावी तरीके से संभव है। Libevent आपको पूर्ण समाधान देने की कोशिश करता है (ईवेंट lib, गैर-अवरुद्ध I/O लाइब्रेरी, http सर्वर, DNS क्लाइंट)।

या, यहां तक ​​कि छोटा, libev केवल एक चीज करने के लिए यूनिक्स टूलबॉक्स दर्शन का पालन करने की कोशिश करता है, जितना संभव हो उतना अच्छा।

ध्यान दें कि यह डिज़ाइन दर्शन है, जिसे मैं प्राधिकरण के साथ बता सकता हूं क्योंकि मैंने libev बनाया है। चाहे इन डिज़ाइन लक्ष्यों को वास्तव में पहुंचाया गया हो, या क्या दर्शन ध्वनि सिद्धांतों पर आधारित है, यह आपके लिए न्याय करने के लिए है।

अद्यतन 2017:

मैं कई बार क्या टाइमर अशुद्धता मैं का उल्लेख, और क्यों libev खिड़कियों पर IOCPs का समर्थन नहीं करता कहा गया।

टाइमर के लिए, भविष्य में कुछ अज्ञात आधार समय के सापेक्ष टाइमरवें शेड्यूल टाइमर, बिना आपको जानते हुए। लिबेव आपको पहले से बता सकता है कि टाइमर शेड्यूल करने के लिए इसका उपयोग किस आधार पर किया जाएगा, जो कार्यक्रमों को libevent दृष्टिकोण और libev दृष्टिकोण दोनों का उपयोग करने की अनुमति देता है। इसके अलावा, बैकएंड बैकएंड के आधार पर कभी-कभी टाइमर की समयसीमा समाप्त कर देगा। पूर्व एक एपीआई मुद्दा है, बाद वाला फिक्स करने योग्य है (और तब से तय किया गया है - मैंने जांच नहीं की थी)।

आईओसीपी समर्थन के लिए - मुझे नहीं लगता कि यह किया जा सकता है, क्योंकि आईओसीपी बस पर्याप्त शक्तिशाली नहीं हैं। एक बात के लिए, उन्हें एक विशेष सॉकेट प्रकार की आवश्यकता होती है, जो विंडोज़ पर भी हैंडल के सेट को सीमित कर देगा (उदाहरण के लिए, पर्ल द्वारा उपयोग किए गए सोपकेट आईओसीपी के लिए "गलत" प्रकार हैं)। इसके अलावा, आईओसीपी बस आई/ओ तैयारी कार्यक्रमों का समर्थन नहीं करते हैं, वे केवल वास्तविक I/O कर सकते हैं। कुछ हैंडल प्रकारों के लिए कामकाज हैं, जैसे कि डमी 0-बाइट पढ़ना, लेकिन फिर से, यह उन हैंडल प्रकारों को सीमित कर देगा जिन्हें आप विंडोज़ पर भी इस्तेमाल कर सकते हैं और आगे भी अनौपचारिक व्यवहार पर भरोसा करेंगे जो संभावित रूप से सभी सॉकेट प्रदाताओं द्वारा साझा नहीं किया जाता है ।

मेरे ज्ञान के लिए, कोई अन्य ईवेंट लाइब्रेरी विंडोज़ पर आईओसीपी का समर्थन नहीं करती है, या तो। इवेंट लाइब्रेरी के अलावा, क्या libevent करता है, यह आपको पढ़ने/लिखने के संचालन कतारबद्ध करने की अनुमति देता है जो तब आईओसीपी के माध्यम से किया जा सकता है। चूंकि libev आपके लिए I/O नहीं करता है, इसलिए libev में IOCP का उपयोग करने का कोई तरीका नहीं है।

यह वास्तव में डिज़ाइन द्वारा है - libev छोटे होने और POSIX जैसी होने की कोशिश करता है, और विंडोज़ में बस पॉज़िक्स-शैली I/O ईवेंट प्राप्त करने का कोई प्रभावी तरीका नहीं है। यदि आईओसीपी महत्वपूर्ण हैं, तो आपको या तो स्वयं का उपयोग करना होगा, या वास्तव में आपके लिए I/O करने वाले कई अन्य ढांचे का उपयोग करना होगा और इसलिए आईओसीपी का उपयोग कर सकते हैं।

+0

मार्क क्या आप libeio के लेखक भी हैं? – juanpavergara

+3

हाँ वास्तव में मैं हूं। –

+0

दुख की बात है, इसे हटा दिया गया और libuv द्वारा प्रतिस्थापित किया गया: https://github.com/joyent/libuv/issues/485 और यह: https://groups.google.com/forum/#!topic/nodejs/UwHkaOksprw –

11

का बड़ा लाभ मेरे लिए libevent अंतर्निहित ओपनएसएसएल समर्थन है। libevent एपीआई के 2.0 संस्करण में पेश किया गया Bufferevent इंटरफ़ेस, डेवलपर के लिए सुरक्षित कनेक्शन लगभग दर्द रहित रूप से संभालता है। मेरा ज्ञान आज से बाहर हो गया है लेकिन ऐसा लगता है कि libev इसका समर्थन नहीं करता है।

+1

सही: libev आपके लिए I/O नहीं करता है, और इसलिए आपके लिए टीएलएस नहीं करता है (या, वास्तव में, कोई I/O)। –

संबंधित मुद्दे