حرف E

إيبول

epoll

آخر تحديث: 2026-10-12
مستوى الشرح اختر المستوى التقني المناسب لك

الشرح المبسط

تخيل أنك نادل في مطعم ضخم يحتوي على آلاف الطاولات. في الطرق القديمة، كان النادل يضطر للمرور على كل طاولة واحدة تلو الأخرى ليسأل الزبائن إذا كانوا بحاجة لشيء، وهذا يضيع الكثير من الوقت والجهد. لكن مع تقنية إيبول (epoll)، أصبح لدى كل طاولة زر استدعاء. الآن، النادل ينتظر في مكانه حتى يضيء زر معين، فيذهب مباشرة للطاولة التي طلبته. في نظام لينكس، تعمل هذه التقنية بنفس الطريقة مع الاتصالات الشبكية والملفات، حيث تخبر النظام فورا بالاتصالات التي تحتاج إلى معالجة بدلا من فحصها كلها، مما يسمح للخوادم بالتعامل مع ملايين المستخدمين في نفس الوقت بكفاءة عالية جدا وبدون استهلاك موارد المعالج.

الشرح التقني المتقدم

تعتبر واجهة إيبول (epoll) من أهم آليات إشعار أحداث الإدخال والإخراج (I/O Event Notification) في نواة لينكس (Linux Kernel). تم تقديمها لحل مشاكل الأداء المرتبطة بالدوال القديمة مثل select و poll عندما يتعامل الخادم (Server) مع عدد هائل من واصفات الملفات (File Descriptors).

المفهوم الأساسي لعمل واجهة إيبول

تعتمد هذه التقنية على إنشاء كائن خاص داخل نواة لينكس يراقب واصفات الملفات المسجلة فيه. بدلاً من قيام التطبيق بالمرور على جميع الواصفات لفحص حالتها، تقوم النواة بإنشاء هيكل بيانات يعتمد على شجرة الصنف الأحمر والأسود (Red-Black Tree) لتخزين الواصفات، وترجع فقط قائمة بالواصفات التي حدثت فيها تغييرات فعلية.

تدعم هذه التقنية نمطين أساسيين للتشغيل:

  • التحفيز عند مستوى معين (Level-Triggered): وهو النمط الافتراضي، حيث يستمر النظام بإشعار التطبيق طالما أن هناك بيانات جاهزة للقراءة ولم تتم قراءتها بالكامل.
  • التحفيز عند تغير الحالة (Edge-Triggered): في هذا النمط المتقدم، يرسل النظام إشعارا واحدا فقط عند انتقال حالة واصف الملف من غير جاهز إلى جاهز، مما يتطلب من التطبيق قراءة جميع البيانات المتاحة.

الاستخدام العملي في برمجة لينكس

تعتمد برمجة هذه الواجهة على ثلاث استدعاءات نظام (System Calls) رئيسية لإدارة دورة حياة مراقبة الأحداث. تبدأ العملية بإنشاء نسخة جديدة من إيبول للحصول على واصف ملف خاص بها:

أمر الإنشاء في لغة سي (C):

int epoll_fd = epoll_create1(0);

بعد الإنشاء، تكتمل العملية من خلال الخطوتين التاليتين:

  • استدعاء epoll_ctl: يستخدم لإضافة، أو تعديل، أو حذف واصفات الملفات التي نرغب في مراقبتها، وتحديد أنواع الأحداث المطلوبة (مثل EPOLLIN للقراءة أو EPOLLOUT للكتابة).
  • استدعاء epoll_wait: يقوم بإيقاف تنفيذ البرنامج مؤقتا (Blocking) حتى تحدث إحدى الفعاليات المطلوبة في واصفات الملفات المراقبة، أو ينتهي الوقت المحدد (Timeout).

ملاحظة ختامية: الصورة الكبرى (نصيحة احترافية)

تُعد واجهة إيبول السر وراء قدرة خوادم الويب الحديثة مثل إنجن إكس (Nginx) وقواعد البيانات مثل رديس (Redis) وبيئات التشغيل مثل نود جي إس (Node.js) على التعامل مع مشكلة العشرة آلاف اتصال متزامن (C10k problem). للحصول على أقصى أداء، يُنصح دائما باستخدام نمط التغير (Edge-Triggered) بالتزامن مع المقابس غير المعرقلة (Non-blocking Sockets) لتجنب توقف خيط المعالجة (Thread).