ما هو أفضل epoll/kqueue/select مكافئ على نظام التشغيل Windows؟

StackOverflow https://stackoverflow.com/questions/67082

سؤال

ما هي أفضل وسيلة إعلام بحدث الإدخال/الإخراج في Windows؟

بالأفضل أعني شيئًا ...

  1. ليس لديه حد لعدد واصفات ملف الإدخال
  2. يعمل على جميع واصفات الملفات (ملفات القرص، والمآخذ، ...)
  3. يوفر أوضاع إعلام مختلفة (تشغيل الحافة، تشغيل الحد)
هل كانت مفيدة؟

المحلول

في نظام التشغيل Windows، تتم العمليات غير المتزامنة عن طريق عملية الملف، وليس عن طريق الواصف.هناك عدة طرق لانتظار اكتمال عمليات الملف بشكل غير متزامن.

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

في Win32، تستخدم العمليات غير المتزامنة OVERLAPPED هيكل يحتوي على حالة حول عملية إدخال/إخراج معلقة.

  1. قم بربط الملفات بـ منفذ إكمال الإدخال والإخراج وإرسال طلبات الإدخال والإخراج غير المتزامنة.عند اكتمال العملية، ستضع رسالة إكمال في قائمة الانتظار والتي يمكن لمؤشر الترابط العامل الخاص بك انتظارها واستردادها عند وصولها.يمكنك أيضًا وضع الرسائل المحددة من قبل المستخدم في قائمة الانتظار.لا يوجد حد لعدد الملفات أو الرسائل الموضوعة في قائمة الانتظار التي يمكن استخدامها مع منفذ الإكمال
  2. قم بإرسال كل عملية إدخال/إخراج مع حدث ما.سيتم الإشارة إلى الحدث المرتبط بالعملية (تلبية الانتظار) عند اكتمالها.يستخدم WaitForMultipleObjects لانتظار كل الأحداث في وقت واحد.وهذا له عيب هو القدرة على الانتظار فقط MAXIMUM_WAIT_OBJECTS الأشياء في وقت واحد (64).يمكنك أيضًا انتظار أنواع أخرى من الأحداث في نفس الوقت (إنهاء العملية/مؤشر الترابط، كائنات المزامنة، الأحداث، الإشارات)
  3. إستخدم تجمع موضوع.يمكن أن يستغرق تجمع مؤشرات الترابط عددًا غير محدود من الكائنات وعمليات الملفات للانتظار وتنفيذها وظيفة محددة من قبل المستخدم عند الانتهاء من كل.
  4. يستخدم قراءةFileEx و WriteFileEx يقف في الصف استدعاءات الإجراءات غير المتزامنة (APCs) إلى مؤشر ترابط الاتصال و SleepEx (أو WaitFor{Single|Multiple}ObjectsEx) مع Alertable TRUE لتلقي رسالة إعلامية لكل عملية عند اكتمالها.تشبه هذه الطريقة منفذ إكمال الإدخال والإخراج، ولكنها تعمل فقط مع مؤشر ترابط واحد.

لا يميز Windows NT kernel بين المقبس وملف القرص والأنبوب وما إلى ذلك.عمليات الملف داخليا:كل هذه الخيارات ستعمل مع جميع أنواع الملفات.

نصائح أخرى

libuv

libuv يقدم أحداث الإدخال/الإخراج لنظامي Unix وWindows ويدعم المقبس والملفات والأنابيب.إنها طبقة النظام الأساسي لـ Node.js.

مزيد من التفاصيل في: http://nikhilm.github.io/uvbook/introduction.html

لا يوجد واحد حتى الآن، على حد علمي.نعمل أنا وصديق على تطبيق Windows epoll مفتوح المصدر (الرابط أدناه) ولكننا نواجه مشكلات في معرفة كيفية جعله يعمل بنفس طريقة تطبيق Linux.

العوائق الحالية:

  • في Linux، تكون واصفات الملفات وواصفات المقبس قابلة للتبديل، ولكن في Windows لا تكون كذلك.يجب أن يكون كلاهما متوافقًا مع تطبيق epoll.
  • في نظام التشغيل Windows، من الصعب جدًا الحصول على أحداث kernel...هذه هي الطريقة التي يعمل بها epoll في Linux.نحن نعتقد أن البرنامج الذي يستخدم مكتبة epoll عبر الأنظمة الأساسية الخاصة بنا سيعمل بشكل أبطأ بشكل ملحوظ في نظام التشغيل Windows مقارنة بنظام التشغيل Linux.

سأحاول العودة وتحديث هذه المشاركة بينما نحرز تقدمًا في المشروع.

http://sourceforge.net/projects/cpoll

وظيفة تحديد () هي POSIX وقابلة للاستخدام على النوافذ بما في ذلك "winsock.h" أو "winsock2.h".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top