एपोल: Difference between revisions
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
{{Short description|Linux-specific system call for a scalable I/O event notification mechanism}} | {{Short description|Linux-specific system call for a scalable I/O event notification mechanism}} | ||
<code>epoll</code>स्केलेबल | <code>epoll</code> स्केलेबल इनपुट/आउटपुट ईवेंट अधिसूचना प्रणाली के लिए लिनक्स कर्नेल [[सिस्टम कॉल|प्रणाली कॉल]] है, जिसे सर्वप्रथम लिनक्स कर्नेल के संस्करण 2.5.44 में प्रस्तुत किया गया था।<ref name="epoll(7) - Linux manual page">{{cite web |url=http://man7.org/linux/man-pages/man7/epoll.7.html |title=epoll(7) - Linux manual page |publisher=Man7.org |date=2012-04-17 |access-date=2014-03-01}}</ref> इसका कार्य एकाधिक फ़ाइल डिस्क्रिप्टरों का निरीक्षण करना है जिससे यह देखा जा सके कि उनमें से किसी पर इनपुट/आउटपुट संभव है या नहीं। इसका उद्देश्य अधिक आवश्यकता वाले अनुप्रयोगों में उत्तम प्रदर्शन प्राप्त करने के लिए प्राचीन [[POSIX|पॉज़िक्स]] चयन <code>select(2)</code> (यूनिक्स) और <code>poll(2)</code> प्रणाली कॉल को प्रतिस्थापित करना है, जहां देखे गए [[फ़ाइल डिस्क्रिप्टर]] की संख्या बड़ी है (प्राचीन प्रणाली कॉल के विपरीत, जो O में कार्य करते हैं) (''O''(''n'') समय, एपोल <code>epoll</code> O(1) समय में संचालित होता है)।<ref>{{cite web |url=http://kovyrin.net/2006/04/13/epoll-asynchronous-network-programming |title=एसिंक्रोनस नेटवर्क प्रोग्रामिंग के लिए epoll() का उपयोग करना|author=Oleksiy Kovyrin |publisher=Kovyrin.net |date=2006-04-13 |access-date=2014-03-01}}</ref> | ||
<code>epoll</code> [[FreeBSD]] के | <code>epoll</code> [[FreeBSD|फ्रीबीएसडी]] के <code>kqueue</code> के समान है, इसमें उपयोगकर्ता-स्पेस फ़ंक्शंस का सेट सम्मिलित है, प्रत्येक फ़ाइल डिस्क्रिप्टर तर्क लेता है जो कॉन्फ़िगर करने योग्य कर्नेल ऑब्जेक्ट को दर्शाता है, जिसके विरुद्ध वे सहकारी रूप से कार्य करते हैं। <code>epoll</code> वर्तमान में मॉनिटर किए जा रहे सभी फ़ाइल डिस्क्रिप्टरों पर निरीक्षण रखने के लिए रेड-ब्लैक ट्री (आरबी-ट्री) डेटा संरचना का उपयोग करता है।<ref>{{cite web |url=https://idndx.com/the-implementation-of-epoll-1/ |title=एपोल का कार्यान्वयन (1)|website=idndx.com |date=September 2014 |url-status=live}} </ref> | ||
== एपीआई == | == एपीआई == | ||
<syntaxhighlight lang="c">int epoll_create1(int flags);</syntaxhighlight> | <syntaxhighlight lang="c">int epoll_create1(int flags);</syntaxhighlight> | ||
<code>epoll</code> ऑब्जेक्ट बनाता है और उसका फ़ाइल डिस्क्रिप्टर रिटर्न करता है। <code>flags</code> पैरामीटर एपोल व्यवहार को संशोधित करने की अनुमति देता है। इसका केवल एक ही वैध मान है, <code>EPOLL_CLOEXEC</code>. <code>epoll_create()</code> <code>epoll_create1()</code> का प्राचीन संस्करण है और इसे लिनक्स कर्नेल संस्करण 2.6.27 और glibc संस्करण 2.9 के रूप में विस्थापित कर गया है।<ref>{{cite book|last=Love|first=Robert|title=लिनक्स सिस्टम प्रोग्रामिंग|year=2013|publisher=O’Reilly|isbn=978-1-449-33953-1|pages=97, 98|edition=Second}}</ref> | |||
<syntaxhighlight lang="c">int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);</syntaxhighlight> | <syntaxhighlight lang="c">int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);</syntaxhighlight> | ||
नियंत्रित करता है (कॉन्फ़िगर करता है) कि कौन से फ़ाइल डिस्क्रिप्टर इस ऑब्जेक्ट द्वारा देखे जाते हैं, और किन घटनाओं के | नियंत्रित करता है (कॉन्फ़िगर करता है) कि कौन से फ़ाइल डिस्क्रिप्टर इस ऑब्जेक्ट द्वारा देखे जाते हैं, और किन घटनाओं के लिए <code>op</code> जोड़ें, संशोधित करें या विस्थापित किये जा सकते हैं। | ||
<syntaxhighlight lang="c">int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);</syntaxhighlight> | <syntaxhighlight lang="c">int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);</syntaxhighlight> | ||
के साथ पंजीकृत किसी भी घटना की प्रतीक्षा करता है | <code>epoll_ctl</code> के साथ पंजीकृत किसी भी घटना की प्रतीक्षा करता है, जब तक कि कम से कम घटित न हो या समय समाप्त न हो जाए। घटनाओं में घटित घटनाओं को अधिकतम घटनाओं तक रिटर्न करता है। <code>maxevents</code> निरीक्षण के लिए <code>epoll_event</code>/फ़ाइल डिस्क्रिप्टर की अधिकतम संख्या है। अधिकांश स्तिथि में, <code>maxevents</code> को <code>events</code>, तर्क <code>maxevent</code> (<code>struct epoll_event *events</code> ऐरे) के आकार के मान पर सेट किया जाता है।<ref>{{cite web |url=https://stackoverflow.com/questions/2969425/epoll-wait-maxevents |title=epoll_wait: maxevents |date=Jun 3, 2010|access-date=2023-07-06}}</ref><ref>{{cite web |url=https://man7.org/linux/man-pages/man2/epoll_wait.2.html |title=epoll_wait(2) — Linux manual page |date=2023-03-30|access-date=2023-07-06}}</ref> | ||
==ट्रिगरिंग मोड== | ==ट्रिगरिंग मोड== | ||
<code>epoll</code> | <code>epoll</code> एज-ट्रिगर और लेवल-ट्रिगर दोनों मोड प्रदान करता है। एज-ट्रिगर मोड में, <code>epoll_wait</code> पर कॉल केवल तभी रिटर्न आएगा जब कोई नया इवेंट <code>epoll</code> ऑब्जेक्ट के साथ जोड़ा जाएगा, जबकि लेवल-ट्रिगर मोड में, <code>epoll_wait</code> तब तक वापस आएगा जब तक स्थिति बनी रहेगी। | ||
उदाहरण के लिए, यदि | उदाहरण के लिए, यदि ईपोल के साथ पंजीकृत पाइप को डेटा प्राप्त हुआ है, तो <code>epoll_wait</code> पर कॉल रिटर्न आएगी, जो पढ़ने के लिए डेटा की उपस्थिति का संकेत देगी। मान लीजिए, पाठक ने बफ़र से डेटा का केवल एक भाग ही उपभोग किया। लेवल-ट्रिगर मोड में, <code>epoll_wait</code> पर आगे की कॉल तुरंत वापस आ जाएगी, जब तक पाइप के बफर में पढ़ने के लिए डेटा उपस्तिथ है। चूँकि, एज-ट्रिगर मोड में, <code>epoll_wait</code> पाइप में नया डेटा लिखे जाने के पश्चात ही रिटर्न\ आएगा।<ref name="epoll(7) - Linux manual page" /> | ||
== आलोचना == | == आलोचना == | ||
[[ब्रायन कैंट्रिल]] | [[ब्रायन कैंट्रिल]] बताया कि एपोल में ऐसी त्रुटि थीं जिनसे बचा जा सकता था, यदि उसने अपने पूर्ववर्तियों से सीखा होता: इनपुट/आउटपुट पूर्णता पोर्ट, [[इवेंट पोर्ट]] (सोलारिस) और क्यूक्यू है। चूँकि, उनकी आलोचना का बड़ा भाग <code>epoll</code> के <code>EPOLLONESHOT</code> और <code>EPOLLEXCLUSIVE</code> विकल्पों द्वारा संबोधित किया गया था।<ref>Archived at [https://ghostarchive.org/varchive/youtube/20211205/l6XQUciI-Sc Ghostarchive]{{cbignore}} and the [https://web.archive.org/web/20151202133409/https://www.youtube.com/watch?v=l6XQUciI-Sc Wayback Machine]{{cbignore}}: {{cite web| url = https://www.youtube.com/watch?v=l6XQUciI-Sc&t=57m| title = Ubuntu Slaughters Kittens {{!}} BSD Now 103 | website=[[YouTube]]}}{{cbignore}}</ref> <code>EPOLLONESHOT</code> को फरवरी 2004 में प्रारंभ लिनक्स कर्नेल मेनलाइन के संस्करण 2.6.2 में जोड़ा गया था। <code>EPOLLEXCLUSIVE</code> को मार्च 2016 में प्रारंभ संस्करण 4.5 में जोड़ा गया था। | ||
<ref>{{cite web |url=https://idea.popcount.org/2017-02-20-epoll-is-fundamentally-broken-12/ |title=Epoll is fundamentally broken 1/2 |publisher=idea.popcount.org |date=2017-02-20 |access-date=2017-10-06}}</ref> | |||
== यह भी देखें{{Portal|Linux}} == | == यह भी देखें{{Portal|Linux}} == | ||
* इनपुट/आउटपुट पूर्णता पोर्ट (आईओसीपी) | * इनपुट/आउटपुट पूर्णता पोर्ट (आईओसीपी) | ||
* क्यू | * क्यू | ||
* | * लिबइवेंट | ||
==संदर्भ== | ==संदर्भ== |
Revision as of 14:06, 16 July 2023
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.