एपोल: 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>स्केलेबल I/O ईवेंट अधिसूचना तंत्र के लिए | <code>epoll</code>स्केलेबल I/O ईवेंट अधिसूचना तंत्र के लिए Linux कर्नेल [[सिस्टम कॉल]] है, जिसे पहली बार Linux कर्नेल के संस्करण 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> इसका कार्य ाधिक फ़ाइल डिस्क्रिप्टरों की निगरानी करना है ताकि यह देखा जा सके कि उनमें से किसी पर I/O संभव है या नहीं। इसका उद्देश्य पुराने [[POSIX]] सिलेक्ट (यूनिक्स)| को बदलना है<code>select(2)</code>और <code>poll(2)</code> सिस्टम कॉल, अधिक मांग वाले अनुप्रयोगों में बेहतर प्रदर्शन प्राप्त करने के लिए, जहां देखे गए [[फ़ाइल डिस्क्रिप्टर]] की संख्या बड़ी है (पुराने सिस्टम कॉल के विपरीत, जो बिग ओ नोटेशन (एन) समय में काम करते हैं, <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]] के Kqueue| के समान है<code>kqueue</code>, इसमें उपयोगकर्ता-स्पेस फ़ंक्शंस का | <code>epoll</code> [[FreeBSD]] के Kqueue| के समान है<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> e> पैरामीटर एपोल व्यवहार को संशोधित करने की अनुमति देता है। इसका केवल ही वैध मान है, <code>EPOLL_CLOEXEC</code>. <code>epoll_create()</code> का पुराना संस्करण है <code>epoll_create1()</code> और इसे Linux कर्नेल संस्करण 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> जोड़ें, संशोधित करें या हटाएं जा सकते हैं. | नियंत्रित करता है (कॉन्फ़िगर करता है) कि कौन से फ़ाइल डिस्क्रिप्टर इस ऑब्जेक्ट द्वारा देखे जाते हैं, और किन घटनाओं के लिए। <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>epoll_ctl</code>, जब तक कि कम से कम घटित न हो या समय समाप्त न हो जाए। घटित घटनाओं को लौटाता है <code>events</code>, तक <code>maxevents</code> तुरंत। <code>maxevents</code> की अधिकतम संख्या है <code>epoll_event</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>maxevents</code> के आकार के मान पर सेट किया गया है <code>*events</code> तर्क (<code>struct epoll_event *events</code> सारणी)। | ||
==ट्रिगरिंग मोड== | ==ट्रिगरिंग मोड== | ||
<code>epoll</code> इंटरप्ट#एज-ट्रिगर|एज-ट्रिगर और इंटरप्ट#लेवल-ट्रिगर|लेवल-ट्रिगर दोनों मोड प्रदान करता है। एज-ट्रिगर मोड में, | <code>epoll</code> इंटरप्ट#एज-ट्रिगर|एज-ट्रिगर और इंटरप्ट#लेवल-ट्रिगर|लेवल-ट्रिगर दोनों मोड प्रदान करता है। एज-ट्रिगर मोड में, कॉल <code>epoll_wait</code> केवल तभी वापस आएगा जब कोई नया इवेंट इसके साथ जोड़ा जाएगा <code>epoll</code> ऑब्जेक्ट, लेवल-ट्रिगर मोड में रहते हुए, <code>epoll_wait</code> जब तक स्थिति रहेगी वापस आएँगे। | ||
उदाहरण के लिए, यदि कोई अज्ञात पाइप पंजीकृत है <code>epoll</code> डेटा प्राप्त हुआ है, | उदाहरण के लिए, यदि कोई अज्ञात पाइप पंजीकृत है <code>epoll</code> डेटा प्राप्त हुआ है, कॉल <code>epoll_wait</code> पढ़ने के लिए डेटा की उपस्थिति का संकेत देते हुए वापस आ जाएगा। मान लीजिए, पाठक ने बफ़र से डेटा का केवल भाग ही उपभोग किया। लेवल-ट्रिगर मोड में, आगे कॉल करता है <code>epoll_wait</code> तुरंत वापस आ जाएगा, जब तक पाइप के बफ़र में पढ़ने के लिए डेटा मौजूद है। हालाँकि, एज-ट्रिगर मोड में, <code>epoll_wait</code> पाइप में नया डेटा लिखे जाने के बाद ही वापस आएगा।<ref name="epoll(7) - Linux manual page" /> | ||
== आलोचना == | == आलोचना == | ||
[[ब्रायन कैंट्रिल]] ने इस ओर इशारा किया <code>epoll</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>epoll</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>epoll</code>'एस <code>EPOLLONESHOT</code> और <code>EPOLLEXCLUSIVE</code> विकल्प. <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 13:21, 16 July 2023
epoll
स्केलेबल I/O ईवेंट अधिसूचना तंत्र के लिए Linux कर्नेल सिस्टम कॉल है, जिसे पहली बार Linux कर्नेल के संस्करण 2.5.44 में पेश किया गया था।[1] इसका कार्य ाधिक फ़ाइल डिस्क्रिप्टरों की निगरानी करना है ताकि यह देखा जा सके कि उनमें से किसी पर I/O संभव है या नहीं। इसका उद्देश्य पुराने POSIX सिलेक्ट (यूनिक्स)| को बदलना हैselect(2)
और poll(2)
सिस्टम कॉल, अधिक मांग वाले अनुप्रयोगों में बेहतर प्रदर्शन प्राप्त करने के लिए, जहां देखे गए फ़ाइल डिस्क्रिप्टर की संख्या बड़ी है (पुराने सिस्टम कॉल के विपरीत, जो बिग ओ नोटेशन (एन) समय में काम करते हैं, epoll
O(1) समय में संचालित होता है[2]).
epoll
FreeBSD के Kqueue| के समान हैkqueue
, इसमें उपयोगकर्ता-स्पेस फ़ंक्शंस का सेट शामिल है, प्रत्येक फ़ाइल डिस्क्रिप्टर तर्क लेता है जो कॉन्फ़िगर करने योग्य कर्नेल ऑब्जेक्ट को दर्शाता है, जिसके विरुद्ध वे सहकारी रूप से काम करते हैं। epoll
वर्तमान में मॉनिटर किए जा रहे सभी फ़ाइल डिस्क्रिप्टरों पर नज़र रखने के लिए लाल-काले पेड़ (आरबी-ट्री) डेटा संरचना का उपयोग करता है।[3]
एपीआई
int epoll_create1(int flags);
बनाता है epoll
ऑब्जेक्ट और उसका फ़ाइल डिस्क्रिप्टर लौटाता है। flags
e> पैरामीटर एपोल व्यवहार को संशोधित करने की अनुमति देता है। इसका केवल ही वैध मान है, EPOLL_CLOEXEC
. epoll_create()
का पुराना संस्करण है epoll_create1()
और इसे Linux कर्नेल संस्करण 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
, जब तक कि कम से कम घटित न हो या समय समाप्त न हो जाए। घटित घटनाओं को लौटाता है events
, तक maxevents
तुरंत। maxevents
की अधिकतम संख्या है epoll_event
/फ़ाइल डिस्क्रिप्टर की निगरानी की जाएगी।[5][6] अधिकांश मामलों में, maxevents
के आकार के मान पर सेट किया गया है *events
तर्क (struct epoll_event *events
सारणी)।
ट्रिगरिंग मोड
epoll
इंटरप्ट#एज-ट्रिगर|एज-ट्रिगर और इंटरप्ट#लेवल-ट्रिगर|लेवल-ट्रिगर दोनों मोड प्रदान करता है। एज-ट्रिगर मोड में, कॉल epoll_wait
केवल तभी वापस आएगा जब कोई नया इवेंट इसके साथ जोड़ा जाएगा epoll
ऑब्जेक्ट, लेवल-ट्रिगर मोड में रहते हुए, epoll_wait
जब तक स्थिति रहेगी वापस आएँगे।
उदाहरण के लिए, यदि कोई अज्ञात पाइप पंजीकृत है epoll
डेटा प्राप्त हुआ है, कॉल epoll_wait
पढ़ने के लिए डेटा की उपस्थिति का संकेत देते हुए वापस आ जाएगा। मान लीजिए, पाठक ने बफ़र से डेटा का केवल भाग ही उपभोग किया। लेवल-ट्रिगर मोड में, आगे कॉल करता है epoll_wait
तुरंत वापस आ जाएगा, जब तक पाइप के बफ़र में पढ़ने के लिए डेटा मौजूद है। हालाँकि, एज-ट्रिगर मोड में, epoll_wait
पाइप में नया डेटा लिखे जाने के बाद ही वापस आएगा।[1]
आलोचना
ब्रायन कैंट्रिल ने इस ओर इशारा किया epoll
इसमें गलतियाँ थीं जिन्हें टाला जा सकता था, अगर इसने अपने पूर्ववर्तियों से सीखा होता: इनपुट/आउटपुट पूर्णता पोर्ट, इवेंट पोर्ट (सोलारिस) और केक्यू।[7] हालाँकि, उनकी आलोचना के बड़े हिस्से को संबोधित किया गया था epoll
'एस EPOLLONESHOT
और EPOLLEXCLUSIVE
विकल्प. EPOLLONESHOT
फरवरी 2004 में जारी लिनक्स कर्नेल मेनलाइन के संस्करण 2.6.2 में जोड़ा गया था। EPOLLEXCLUSIVE
मार्च 2016 में जारी संस्करण 4.5 में जोड़ा गया था।[8]
यह भी देखें
- इनपुट/आउटपुट पूर्णता पोर्ट (आईओसीपी)
- क्यू
- मुक्ति घटना
संदर्भ
- ↑ 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.