कामेच्छा और कामेच्छा के बीच अंतर क्या है?


96

दोनों 2 लिबास async i / o शेड्यूलिंग के लिए डिज़ाइन किए गए हैं, और दोनों linux पर epoll संलग्न करते हैं, और FreeBSD पर kqueue, आदि।

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



1
libevent भी विंडोज़ के लिए IOCP का समर्थन करता है (बफ़रवेंट AFAIK के माध्यम से) जो libev नहीं करता है
rogerdpack

1
रोगरडपैक, लिबवू समर्थन IOCP github.com/joyent/libuv
डेनिस

जवाबों:


223

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

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

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

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

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

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

अपडेट 2017:

मुझे कई बार पूछा गया था कि मैं किस समय की अक्षमता का उल्लेख करता हूं, और क्यों libev विंडोज़ पर IOCPs का समर्थन नहीं करता है।

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

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

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

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


मार्क आप libeio के लेखक भी हैं?
जुआनपावरगारा

दुर्भाग्य से, यह हटा दिया गया था और द्वारा libuv लाए गए: github.com/joyent/libuv/issues/485 और इस: groups.google.com/forum/#!topic/nodejs/UwHkaOksprw
पीटर टेओह

1
मैंने libevfibers नामक libev को एक अच्छा जोड़ दिया है, यह libev, libcoro और libeio के शीर्ष पर एक फाइबर स्तर जोड़ता है। यहाँ पाया जा सकता है: github.com/Lupus/libevfibers
Lupus

1
libevविंडोज प्लेटफॉर्म पर दर्दनाक है। MinGW कंपाइलर हमेशा ++activecnt(फ़ंक्शन ev_ref) पर सिगफॉल्ट करता है और मुझे समझ नहीं आता है कि इस समस्या को कैसे हल किया जाए। दूसरी समस्या पुराने selectसॉकेट इंटरफ़ेस का उपयोग कर रही है जो सॉकेट इंटरोपरेशन के आधुनिक IOCP संस्करण को रोक देता है। क्या आप विडनोज़ सपोर्ट में सुधार कर सकते हैं?
विटॉल्ड एस।

2
कहने के लिए क्षमा करें, लेकिन कामदेव के पीछे एक और "दर्शन" प्रतीत होता है, जिसने कई खुले स्रोत परियोजनाओं को तोड़ दिया है। उदाहरण के लिए सूची में उदाहरण .schmorp.de / pipermail/ libev / 2017q1/ 002710.html या lists.schmorp.de/pipermail/libev/2010q1/000912.html । संभावित उपयोगकर्ताओं को शायद इस पर भी विचार करना चाहिए।
dbrank0

13

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


3
सही: libev आपके लिए I / O नहीं करता है, और इसलिए आप के लिए TLS नहीं करता है (या, वास्तव में, कोई I / O)।
मोनिका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.