لينكس: ما الذي يمكنك أن تعلقه؟

في وقت سابق من هذا العام ، زعمت أن epoll هو واجهة برمجة التطبيقات التي تدعم الإنترنت الحديث ، ولكن ما الذي يمكنك فعله حقًا باستخدام epoll؟

بمجرد هيكلة تطبيقنا حول حلقة حدث epoll أو استخدام محرك غير متزامن مثل Go أو Rust's tokio ، يصبح من المفيد حقًا ملاءمة كل شيء آخر في حلقة الحدث هذه. ما نوع واصفات الملفات التي يمكنك إضافتها إلى epoll_ctl؟ ما الذي يمكنك تحويله إلى واصف ملف؟

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

مآخذ الشبكة هي السبب وراء رغبتنا في استخدام epoll. وهي دائمًا ما تكون مآخذ IP (TCP و UDP) ، ولكنها تعمل أيضًا مع العائلات الأقل شيوعًا مثل UNIX و PACKET و NETLINK والعديد من العائلات الأخرى. في الواقع ، يجب أن تعمل مع جميع مجموعات البروتوكولات المدعومة بالمآخذ ، على الرغم من أنني لم أختبرها جميعًا.

يسمح لنا timerfd_create بإنشاء مؤقت فردي أو متكرر والحصول على واصف ملف له ، والذي يصبح جاهزًا عند تشغيل المؤقت. عظيم للنوم غير المتزامن أو المهلة.

يعطينا signalfd واصف ملف يصبح جاهزًا عندما تنطلق إشارة نظام التشغيل. تتضمن أمثلة الاستخدام إخبار البرنامج بإعادة تحميل التكوين الخاص به إلى SIGHUP ، أو تسجيل معلومات تصحيح الأخطاء في SIGUSR1.

أحداث نظام الملفات

تسمح لنا واجهة برمجة تطبيقات inotify بمراقبة نظام الملفات للأحداث مثل إنشاء الملفات وتعديلها. يمكن الاستعلام عن واصف الملف الذي تم إرجاعه بواسطة inotify_init باستخدام epoll. تتضمن أمثلة الاستخدام إعادة تحميل ملف التكوين عندما يتغير والاستيقاظ عند ظهور بيانات جديدة في الدليل. العمليات التابعة

يمكننا الحصول على واصف ملف لعملية فرعية إما عن طريق تعيين علامة CLONE_PIDFD على الاستنساخ أو عن طريق استدعاء pidfd_open. يصبح جاهزًا عند اكتمال العملية. مفيد لمراقبة العمليات الفرعية ومنعها من أن تصبح زومبيًا. إذا احتجنا إلى رمز الخروج ، فسنطلق على waitid بعد أن تقول epoll أنه تم. محطات

تقبل epoll ملفات fds من المحطات الطرفية والمحطات الزائفة. يقبل fd 0 (stdin) و 1 (stdout) و 2 (stderr). هذا مفيد للبرامج المصممة لاستخدامها في أنبوب خط cmd ، أو كعملية فرعية حيث يكتب الأصل إلى stdin الخاص به ويقرأ من مخرجاته القياسية.

يتيح لنا أيضًا منح خوادمنا وضع عامل تشغيل / تصحيح أخطاء تفاعليًا وربطه بحلقة الحدث الرئيسية. إنها أيضًا تجربة ممتعة رائعة. إنشاء Epoll يعرض

epoll_create واصف ملف يمكن مراقبته بنفسه عبر epoll_ctl. هذا يسمح ببناء تسلسل هرمي متعدد المستويات لمستمعي epoll.

الإخطارات: خطة كل شيء آخر

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

قوائم انتظار رسائل POSIX: راجع man 7 mq_overview.

أزواج مقابس UNIX: زوج مقبس رجل.

الأنابيب (أو FIFOs المعروفة أيضًا باسم الأنابيب): 7 أنابيب مانعة.

eventfd: مصمم خصيصًا لحالة الاستخدام الخاصة بنا ، يعد eventfd بديلاً حديثًا للقنوات للإشارات القابلة للتفاعل. له دلالات اختيارية. من man eventfd:

يمكن للتطبيقات استخدام واصف ملف eventfd بدلاً من الأنبوب في جميع الحالات حيث يتم استخدام الأنبوب ببساطة للإشارة إلى الأحداث. حجم النواة لواصف ملف eventfd أقل بكثير من الأنبوب ، ولا يلزم سوى واصف ملف واحد (مقابل الاثنين المطلوبين للأنبوب). وما لا يمكنك إبداءه: ملفات عادية

سيؤدي استدعاء epoll_ctl بملف عادي (قرص) إلى إرجاع ...

في وقت سابق من هذا العام ، زعمت أن epoll هو واجهة برمجة التطبيقات التي تدعم الإنترنت الحديث ، ولكن ما الذي يمكنك فعله حقًا باستخدام epoll؟

بمجرد هيكلة تطبيقنا حول حلقة حدث epoll أو استخدام محرك غير متزامن مثل Go أو Rust's tokio ، يصبح من المفيد حقًا ملاءمة كل شيء آخر في حلقة الحدث هذه. ما نوع واصفات الملفات التي يمكنك إضافتها إلى epoll_ctl؟ ما الذي يمكنك تحويله إلى واصف ملف؟

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

مآخذ الشبكة هي السبب وراء رغبتنا في استخدام epoll. وهي دائمًا ما تكون مآخذ IP (TCP و UDP) ، ولكنها تعمل أيضًا مع العائلات الأقل شيوعًا مثل UNIX و PACKET و NETLINK والعديد من العائلات الأخرى. في الواقع ، يجب أن تعمل مع جميع مجموعات البروتوكولات المدعومة بالمآخذ ، على الرغم من أنني لم أختبرها جميعًا.

يسمح لنا timerfd_create بإنشاء مؤقت فردي أو متكرر والحصول على واصف ملف له ، والذي يصبح جاهزًا عند تشغيل المؤقت. عظيم للنوم غير المتزامن أو المهلة.

يعطينا signalfd واصف ملف يصبح جاهزًا عندما تنطلق إشارة نظام التشغيل. تتضمن أمثلة الاستخدام إخبار البرنامج بإعادة تحميل التكوين الخاص به إلى SIGHUP ، أو تسجيل معلومات تصحيح الأخطاء في SIGUSR1.

أحداث نظام الملفات

تسمح لنا واجهة برمجة تطبيقات inotify بمراقبة نظام الملفات للأحداث مثل إنشاء الملفات وتعديلها. يمكن الاستعلام عن واصف الملف الذي تم إرجاعه بواسطة inotify_init باستخدام epoll. تتضمن أمثلة الاستخدام إعادة تحميل ملف التكوين عندما يتغير والاستيقاظ عند ظهور بيانات جديدة في الدليل. العمليات التابعة

يمكننا الحصول على واصف ملف لعملية فرعية إما عن طريق تعيين علامة CLONE_PIDFD على الاستنساخ أو عن طريق استدعاء pidfd_open. يصبح جاهزًا عند اكتمال العملية. مفيد لمراقبة العمليات الفرعية ومنعها من أن تصبح زومبيًا. إذا احتجنا إلى رمز الخروج ، فسنطلق على waitid بعد أن تقول epoll أنه تم. محطات

تقبل epoll ملفات fds من المحطات الطرفية والمحطات الزائفة. يقبل fd 0 (stdin) و 1 (stdout) و 2 (stderr). هذا مفيد للبرامج المصممة لاستخدامها في أنبوب خط cmd ، أو كعملية فرعية حيث يكتب الأصل إلى stdin الخاص به ويقرأ من مخرجاته القياسية.

يتيح لنا أيضًا منح خوادمنا وضع عامل تشغيل / تصحيح أخطاء تفاعليًا وربطه بحلقة الحدث الرئيسية. إنها أيضًا تجربة ممتعة رائعة. إنشاء Epoll يعرض

epoll_create واصف ملف يمكن مراقبته بنفسه عبر epoll_ctl. هذا يسمح ببناء تسلسل هرمي متعدد المستويات لمستمعي epoll.

الإخطارات: خطة كل شيء آخر

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

قوائم انتظار رسائل POSIX: راجع man 7 mq_overview.

أزواج مقابس UNIX: زوج مقبس رجل.

الأنابيب (أو FIFOs المعروفة أيضًا باسم الأنابيب): 7 أنابيب مانعة.

eventfd: مصمم خصيصًا لحالة الاستخدام الخاصة بنا ، يعد eventfd بديلاً حديثًا للقنوات للإشارات القابلة للتفاعل. له دلالات اختيارية. من man eventfd:

يمكن للتطبيقات استخدام واصف ملف eventfd بدلاً من الأنبوب في جميع الحالات حيث يتم استخدام الأنبوب ببساطة للإشارة إلى الأحداث. حجم النواة لواصف ملف eventfd أقل بكثير من الأنبوب ، ولا يلزم سوى واصف ملف واحد (مقابل الاثنين المطلوبين للأنبوب). وما لا يمكنك إبداءه: ملفات عادية

سيؤدي استدعاء epoll_ctl بملف عادي (قرص) إلى إرجاع ...

What's Your Reaction?

like

dislike

love

funny

angry

sad

wow