एपोल
epoll
स्केलेबल इनपुट/आउटपुट ईवेंट अधिसूचना प्रणाली के लिए लिनक्स कर्नेल प्रणाली कॉल है, जिसे सर्वप्रथम लिनक्स कर्नेल के संस्करण 2.5.44 में प्रस्तुत किया गया था।[1] इसका कार्य एकाधिक फ़ाइल डिस्क्रिप्टरों का निरीक्षण करना है जिससे यह देखा जा सके कि उनमें से किसी पर इनपुट/आउटपुट संभव है या नहीं। इसका उद्देश्य अधिक आवश्यकता वाले अनुप्रयोगों में उत्तम प्रदर्शन प्राप्त करने के लिए प्राचीन पॉज़िक्स चयन select(2)
(यूनिक्स) और poll(2)
प्रणाली कॉल को प्रतिस्थापित करना है, जहां देखे गए फ़ाइल डिस्क्रिप्टर की संख्या बड़ी है (प्राचीन प्रणाली कॉल के विपरीत, जो O में कार्य करते हैं) (O(n) समय, एपोल epoll
O(1) समय में संचालित होता है)।[2]
epoll
फ्रीबीएसडी के kqueue
के समान है, इसमें उपयोगकर्ता-स्पेस फ़ंक्शंस का सेट सम्मिलित है, प्रत्येक फ़ाइल डिस्क्रिप्टर तर्क लेता है जो कॉन्फ़िगर करने योग्य कर्नेल ऑब्जेक्ट को दर्शाता है, जिसके विरुद्ध वे सहकारी रूप से कार्य करते हैं। epoll
वर्तमान में मॉनिटर किए जा रहे सभी फ़ाइल डिस्क्रिप्टरों पर निरीक्षण रखने के लिए रेड-ब्लैक ट्री (आरबी-ट्री) डेटा संरचना का उपयोग करता है।[3]
एपीआई
int epoll_create1(int flags);
epoll
ऑब्जेक्ट बनाता है और उसका फ़ाइल डिस्क्रिप्टर रिटर्न करता है। flags
पैरामीटर एपोल व्यवहार को संशोधित करने की अनुमति देता है। इसका केवल एक ही वैध मान है, EPOLL_CLOEXEC
. epoll_create()
epoll_create1()
का प्राचीन संस्करण है और इसे लिनक्स कर्नेल संस्करण 2.6.27 और glibc संस्करण 2.9 के रूप में विस्थापित कर गया है।[4]
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
नियंत्रित करता है (कॉन्फ़िगर करता है) कि कौन से फ़ाइल डिस्क्रिप्टर इस ऑब्जेक्ट द्वारा देखे जाते हैं, और किन घटनाओं के लिए op
जोड़ें, संशोधित करें या विस्थापित किये जा सकते हैं।
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
epoll_ctl
के साथ पंजीकृत किसी भी घटना की प्रतीक्षा करता है, जब तक कि कम से कम घटित न हो या समय समाप्त न हो जाए। घटनाओं में घटित घटनाओं को अधिकतम घटनाओं तक रिटर्न करता है। maxevents
निरीक्षण के लिए epoll_event
/फ़ाइल डिस्क्रिप्टर की अधिकतम संख्या है। अधिकांश स्तिथि में, maxevents
को events
, तर्क maxevent
(struct epoll_event *events
ऐरे) के आकार के मान पर सेट किया जाता है।[5][6]
ट्रिगरिंग मोड
epoll
एज-ट्रिगर और लेवल-ट्रिगर दोनों मोड प्रदान करता है। एज-ट्रिगर मोड में, epoll_wait
पर कॉल केवल तभी रिटर्न आएगा जब कोई नया इवेंट epoll
ऑब्जेक्ट के साथ जोड़ा जाएगा, जबकि लेवल-ट्रिगर मोड में, epoll_wait
तब तक रिटर्न आएगा जब तक स्थिति बनी रहेगी।
उदाहरण के लिए, यदि ईपोल के साथ पंजीकृत पाइप को डेटा प्राप्त हुआ है, तो epoll_wait
पर कॉल रिटर्न आएगी, जो पढ़ने के लिए डेटा की उपस्थिति का संकेत देगी। मान लीजिए, पाठक ने बफ़र से डेटा का केवल एक भाग ही उपभोग किया। लेवल-ट्रिगर मोड में, epoll_wait
पर आगे की कॉल तुरंत रिटर्न आ जाएगी, जब तक पाइप के बफर में पढ़ने के लिए डेटा उपस्तिथ है। चूँकि, एज-ट्रिगर मोड में, epoll_wait
पाइप में नया डेटा लिखे जाने के पश्चात ही रिटर्न आएगा।[1]
आलोचना
ब्रायन कैंट्रिल बताया कि एपोल में ऐसी त्रुटि थीं जिनसे बचा जा सकता था, यदि उसने अपने पूर्ववर्तियों से सीखा होता: इनपुट/आउटपुट पूर्णता पोर्ट, इवेंट पोर्ट (सोलारिस) और क्यूक्यू है। चूँकि, उनकी आलोचना का बड़ा भाग epoll
के EPOLLONESHOT
और EPOLLEXCLUSIVE
विकल्पों द्वारा संबोधित किया गया था।[7] EPOLLONESHOT
को फरवरी 2004 में प्रारंभ लिनक्स कर्नेल मेनलाइन के संस्करण 2.6.2 में जोड़ा गया था। EPOLLEXCLUSIVE
को मार्च 2016 में प्रारंभ संस्करण 4.5 में जोड़ा गया था।
यह भी देखें
- इनपुट/आउटपुट पूर्णता पोर्ट (आईओसीपी)
- क्यू
- लिबइवेंट
संदर्भ
- ↑ 1.0 1.1 "epoll(7) - Linux manual page". Man7.org. 2012-04-17. Retrieved 2014-03-01.
- ↑ Oleksiy Kovyrin (2006-04-13). "एसिंक्रोनस नेटवर्क प्रोग्रामिंग के लिए epoll() का उपयोग करना". Kovyrin.net. Retrieved 2014-03-01.
- ↑ "एपोल का कार्यान्वयन (1)". idndx.com. September 2014.
{{cite web}}
: CS1 maint: url-status (link) - ↑ Love, Robert (2013). लिनक्स सिस्टम प्रोग्रामिंग (Second ed.). O’Reilly. pp. 97, 98. ISBN 978-1-449-33953-1.
- ↑ "epoll_wait: maxevents". Jun 3, 2010. Retrieved 2023-07-06.
- ↑ "epoll_wait(2) — Linux manual page". 2023-03-30. Retrieved 2023-07-06.
- ↑ Archived at Ghostarchive and the Wayback Machine: "Ubuntu Slaughters Kittens | BSD Now 103". YouTube.
- ↑ "Epoll is fundamentally broken 1/2". idea.popcount.org. 2017-02-20. Retrieved 2017-10-06.