إيو على أوسك:هل يتم تنفيذه في النواة أو مع خيوط المستخدم?خيارات أخرى?

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

سؤال

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

  • هو إيو تنفيذها في نواة أوسك وبالتالي هو على الأرجح أفضل من بلدي تنفيذ الخيوط الخاصة?

  • هل يمكن لنظام رد الاتصال-وضع مؤشر ترابط لكل رد اتصال-أن يصبح عنق الزجاجة في الممارسة?

  • إذا إيو لا يستحق استخدام على أوسك, هل هناك أي بدائل أخرى على يونكس?في الكاكاو?في الكربون?

  • أو يجب أن أحاكي ببساطة الإدخال/الإخراج غير المتزامن مع مجموعة المواضيع الخاصة بي?

ما هي تجربتك في هذا الموضوع?

هل كانت مفيدة؟

المحلول

يمكنك أن ترى بالضبط كيف يتم تنفيذ إيو على أوسك الحق هنا.

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

يمكنك تكوين عدد من المواضيع وحجم قائمة الانتظار مع sysctl.للاطلاع على هذه الخيارات والقيم الافتراضية ، قم بتشغيل sysctl -a | grep aio

kern.aiomax = 90
kern.aioprocmax = 16
kern.aiothreads = 4

في تجربتي ، من أجل أن يكون أي معنى لاستخدام إيو ، يجب أن تكون هذه الحدود أعلى بكثير.

أما بالنسبة للاسترجاعات في المواضيع ، وأنا لا أعتقد ماك أوس س يدعم ذلك.يقوم فقط بإشعارات الإكمال من خلال الإشارات (انظر المصدر).

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

نصائح أخرى

Moka : نأسف للقول إنك مخطئ في تطبيق Linux ، بدءًا من kernel 2.6 ، هناك تطبيق kernel لـ AIO ، والذي يأتي في libaio (libaio.h)

التطبيق الذي لا يستخدم سلاسل Kernel ولكن بدلاً من ذلك يستخدم خيوط المستخدم هو POSIX.1 AIO ، وهو يفعل ذلك بهذه الطريقة لجعله أكثر قابلية للنقل ، حيث لا تدعم جميع أنظمة التشغيل المستندة إلى نظام التشغيل Unix أحداث الإكمال على مستوى Kernel.ص>

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