استطلاع رأي إلكتروني

epollهي استدعاء نظام في نواة لينكس لآلية إشعار أحداث الإدخال/الإخراج القابلة للتوسع، وقد طُرحت لأول مرة في الإصدار 2.5.45 من نواة لينكس في أكتوبر 2002. [ 1 ] [ 2 ] تتمثل وظيفتها في مراقبة عدة مُعرّفات ملفات لمعرفة ما إذا كان الإدخال/الإخراج ممكنًا على أي منها. وهي مصممة لاستبدال استدعاءات النظام القديمة POSIX و ، لتحقيق أداء أفضل في التطبيقات الأكثر تطلبًا، حيث يكون عدد مُعرّفات الملفات المُراقبة كبيرًا (على عكس استدعاءات النظام القديمة، التي تعمل في زمن O ( n ))، تعمل هذه الاستدعاءات في زمن O (1)). [ 3 ]select(2)poll(2)epoll

epollيشبه هذا النظام نظام FreeBSDkqueue ، إذ يتكون من مجموعة من الدوال في مساحة المستخدم ، تأخذ كل منها وسيطًا لوصف ملف يشير إلى كائن النواة القابل للتكوين، والذي تعمل عليه هذه الدوال بشكل تعاوني. epollيستخدم هذا النظام بنية بيانات شجرة حمراء-سوداء (شجرة RB) لتتبع جميع واصفات الملفات التي تتم مراقبتها حاليًا. [ 4 ]

واجهة برمجة التطبيقات (API)

int epoll_create1 ( int flags );

يُنشئ epollكائنًا ويُعيد مُعرّف ملفه. flagsيسمح هذا المُعامل بتعديل سلوك epoll. له قيمة صالحة واحدة فقط EPOLL_CLOEXEC. epoll_create()يُعدّ هذا المُعامل إصدارًا قديمًا من epoll ، epoll_create1()وقد تمّ إيقاف استخدامه بدءًا من إصدار نواة لينكس 2.6.27 وإصدار مكتبة glibc 2.9. [ 5 ]

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 );

ينتظر هذا الأمر أيًا من الأحداث المسجلة في المتغير `file` epoll_ctlحتى يقع حدث واحد على الأقل أو تنتهي مهلة الانتظار. ثم يُعيد الأحداث التي وقعت في المتغير `file` events، بحد أقصى `file` maxeventsفي المرة الواحدة. ` maxeventsfile` هو الحد الأقصى لعدد epoll_eventمُعرّفات الملفات التي سيتم مراقبتها. [ 6 ] [ 7 ] في معظم الحالات، maxeventsيتم تعيين `file` إلى قيمة حجم *eventsالوسيط ( struct epoll_event* eventsالمصفوفة).

أوضاع التشغيل

epollيوفر هذا النظام نمطين للتشغيل: نمط التشغيل عند الحافة ونمط التشغيل عند المستوى . في نمط التشغيل عند الحافة، لن يتم استدعاء الدالة epoll_waitإلا عند إضافة حدث جديد إلى قائمة الانتظار مع epollالكائن، بينما في نمط التشغيل عند المستوى، epoll_waitسيتم استدعاء الدالة طالما أن الشرط متحقق.

على سبيل المثال، إذا استقبلت قناة مسجلة بيانات، فإن استدعاء الدالة سيعيد قيمة تشير إلى وجود بيانات للقراءة. لنفترض أن القارئ استهلك جزءًا فقط من البيانات من المخزن المؤقت. في وضع التشغيل بالمستوى، ستعود الاستدعاءات اللاحقة للدالة فورًا، طالما أن مخزن القناة المؤقت يحتوي على بيانات للقراءة. أما في وضع التشغيل بالحافة، فلن تعود الدالة إلا بعد كتابة بيانات جديدة إلى القناة. [ 8 ]epollepoll_waitepoll_waitepoll_wait

الأخطاء

أشار برايان كانتريلepoll إلى وجود أخطاء كان من الممكن تجنبها لو استفادت من تجارب الإصدارات السابقة: منافذ إكمال الإدخال/الإخراج ، ومنافذ الأحداث (سولاريس)، و kqueue . [ 9 ] ومع ذلك، تمت معالجة جزء كبير من انتقاداته بواسطة خيارات epoll's EPOLLONESHOTو EPOLLEXCLUSIVE. EPOLLONESHOTأُضيفت في الإصدار 2.6.2 من نواة لينكس الرئيسية، الذي صدر في فبراير 2004. EPOLLEXCLUSIVEأُضيفت في الإصدار 4.5، الذي صدر في مارس 2016. [ 10 ]

انظر أيضاً

مراجع

  1. كوربيت، جوناثان (30 أكتوبر 2002). "تطوير النواة" . LWN.net . تم الاسترجاع في 15 يوليو 2025 .
  2. تورفالدز، لينوس (30 أكتوبر 2002). "لينكس الإصدار 2.5.45" . نسخة أرشيفية من linux-kernel.vger.kernel.org . تم الاطلاع عليه في 15 يوليو 2025 .
  3. أوليكسي كوفيرين (13 أبريل 2006). "استخدام دالة epoll() لبرمجة الشبكات غير المتزامنة" . Kovyrin.net . تاريخ الاسترجاع: 1 مارس 2014 .
  4. "تطبيق epoll (1)" . idndx.com . سبتمبر 2014.
  5. لوف، روبرت (2013). برمجة أنظمة لينكس ( الطبعة الثانية). أورايلي. الصفحات 97، 98. ISBN   978-1-449-33953-1.
  6. "epoll_wait: maxevents" . 3 يونيو 2010. تم الاسترجاع في 6 يوليو 2023 .
  7. "epoll_wait(2) — صفحة دليل لينكس" . 30-03-2023 . تم الاطلاع عليه بتاريخ 06-07-2023 .
  8. "epoll(7) - صفحة دليل لينكس" . Man7.org. 2012-04-17 . تم الاطلاع عليه بتاريخ 2014-03-01 .
  9. مؤرشف في Ghostarchiveوآلة Wayback" أوبونتو تذبح القطط الصغيرة | بي إس دي ناو 103" . يوتيوب . 20 أغسطس 2015.
  10. "Epoll معيبٌ بشكلٍ أساسي 1/2" . idea.popcount.org. 2017-02-20 . تم الاطلاع عليه بتاريخ 2017-10-06 .