سؤال

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

أود أن أعرف:

  • ما هو الغرض من POSIX AIO ؟ بالنظر إلى أن المثال الأكثر وضوحا من تنفيذ يمكنني العثور يقول أنه لا يدعم مآخذ كل شيء يبدو غريبا بالنسبة لي.هو فقط من أجل المتزامن القرص I/O ؟ إذا كان الأمر كذلك, لماذا فرط العامة API ؟ إذا لم يكن كذلك ، لماذا القرص I/O أول ما هوجمت ؟
  • حيث هناك على سبيل المثال كاملة POSIX AIO البرامج التي أنا يمكن أن ننظر ؟
  • لا أحد استخدامها في الواقع الحقيقي ؟
  • ما المنصات تدعم POSIX AIO ؟ ما أجزاء منه هل تؤيد ؟ لا أحد حقا دعم ضمني "أي I/O إلى أي FD" أن <aio.h> يبدو أن الوعد ؟

أخرى مضاعفة الآليات المتاحة لي هي جيدة تماما ، ولكن شظايا عشوائية من المعلومات تطوف هناك جعلت لي غريبة.

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

المحلول

شبكة I/O لا يشكل أولوية بالنسبة AIO لأن الجميع كتابة POSIX خوادم الشبكة يستخدم القائم على الحدث وعدم حجب النهج.من الطراز القديم جافا "مليارات حجب المواضيع" نهج سيء فظيعة.

الكتابة إلى القرص I/O هو بالفعل مخزنة و قراءة القرص I/O يمكن prefetched إلى العازلة باستخدام وظائف مثل posix_fadvise.أن يترك المباشر ، unbuffered القرص I/O فقط مفيدة الغرض AIO.

مباشر, unbuffered I/O هي فقط مفيدة حقا المعاملات قواعد البيانات ، وتلك التي تميل إلى كتابة خاصة بهم مؤشرات الترابط أو العمليات لإدارة القرص I/O.

لذا في النهاية أن يترك POSIX AIO في موقف لا يخدم أي غرض مفيد.لا تستخدم.

نصائح أخرى

القيام مأخذ I/O بكفاءة وقد تم حل مع وkqueue, epoll ، IO الانتهاء الموانئ ويحب.فعل غير متزامن ملف I/O هو نوع من الوافدين الراحل (وبصرف النظر عن ويندوز'/الإخراج المتراكب و سولاريس في وقت مبكر لدعم posix AIO).

إذا كنت تبحث عن القيام مأخذ I/O, ربما أنت أفضل حالا باستخدام واحدة من الآليات المذكورة أعلاه.

والغرض الرئيسي من AIO ومن ثم حل المشكلة من غير متزامن القرص I/O.هذا هو على الأرجح السبب في نظام التشغيل Mac OS X يدعم فقط AIO للملفات العادية ، وليس مآخذ (منذ وkqueue هل هذا أفضل بكثير على أي حال).

عمليات الكتابة عادة مؤقتا من قبل النواة و يخرجوا في وقت لاحق.فعلى سبيل المثال عندما تقرأ رئيس بالسيارة يحدث أن تمر من خلال الموقع حيث منع أن تكون مكتوبة.

ومع ذلك ، من أجل عمليات القراءة ، إذا كنت تريد النواة أولويات النظام الخاص بك يقرأ ، AIO هو حقا الخيار الوحيد.هنا لماذا kernal يمكن (نظريا) يفعل ذلك أفضل من أي مستخدم على مستوى التطبيق:

  • نواة يرى كل القرص I/O ، وليس فقط التطبيقات الخاصة بك القرص الوظائف يمكن ترتيبها على المستوى العالمي
  • النواة (قد) حيث تعرف على قراءة القرص الرأس و يمكن اختيار قراءة الوظائف التي تمر بها من أجل الأمثل ، حرك رأسه أقصر مسافة
  • نواة يمكن الاستفادة من قوائم انتظار الأوامر الأصلية لتحسين عمليات قراءة المزيد
  • كنت قد تكون قادرة على إصدار المزيد من عمليات القراءة في نظام الاتصال باستخدام lio_listio() من readv(), ولا سيما إذا كان يقرأ لا (منطقيا) متجاورة ، وتوفير القليل من استدعاء نظام النفقات العامة.
  • البرنامج قد يكون قليلا أكثر بساطة مع AIO منذ كنت لا تحتاج إلى ترابط إضافية إلى كتلة في قراءة أو كتابة الكلمة.

وقال posix AIO لديه حرج للغاية واجهة على سبيل المثال:

  • فقط فعالة ومدعومة بشكل جيد يعني حدث الاستدعاء يتم عبر إشارات ، مما يجعل من الصعب استخدامها في المكتبة ، لأنه يعني استخدام إشارة الأرقام من عملية عالمية إشارة مساحة الاسم.إذا كان نظام التشغيل الخاص بك لا يدعم إشارات الحقيقي ، وهو ما يعني أيضا عليك أن حلقة من خلال كل ما تبذلونه من الطلبات المعلقة لمعرفة أي واحد فعلا انتهى (هذا هو الحال في نظام التشغيل Mac OS X على سبيل المثال وليس لينكس).اصطياد إشارات متعددة الخيوط البيئة أيضا يجعل بعض صعبة قيود.يمكنك عادة لا تتفاعل مع الحدث داخل معالج إشارة ، ولكن عليك أن رفع إشارة الكتابة إلى أنبوب أو استخدام signalfd() (لينكس).
  • lio_suspend() لديها نفس القضايا كما حدد() لا ، لا مقياس جيد جدا مع عدد من فرص العمل.
  • lio_listio () ، كما نفذت لديه إلى حد ما عدد محدود من الوظائف يمكنك تمرير في انها ليست تافهة للعثور على هذا الحد في المحمولة الطريقة.عليك الاتصال sysconf(_SC_AIO_LISTIO_MAX) ، والتي قد تفشل في هذه الحالة يمكنك استخدام AIO_LISTIO_MAX تعريف ، والتي ليست بالضرورة محددة ، ولكن بعد ذلك يمكنك استخدام 2 ، والذي يعرف بأنه يضمن أن تكون معتمدة.

أما في العالم الحقيقي التطبيق باستخدام posix AIO, هل يمكن أن نلقي نظرة على lighttpd (إعلام) الذي نشر أيضا قياس الأداء عند تقديم الدعم.

معظم posix منصات يدعم posix AIO الآن (لينكس, سولاريس, AIX, tru64).ويندوز يدعم ذلك عبر تتداخل ملف I/O.ما أفهمه هو أن فقط Solaris, نظام التشغيل ويندوز لينكس حقا يدعم التزامن.ملف I/O على طول الطريق وصولا إلى السائق ، في حين أن أنظمة تشغيل أخرى تحاكي المتزامن.I/O مع نواة المواضيع.لينكس هو الاستثناء ، posix AIO التنفيذ في سي العمومية يحاكي المتزامن مع عمليات المستخدم مستوى المواضيع ، في حين أن موطنه الأصلي المتزامن I/O واجهة (io_submit ().... الخ) هي حقا غير متزامن على طول الطريق وصولا إلى السائق ، على افتراض السائق يدعم ذلك.

أعتقد أنه أمر شائع بين انظمة التشغيل لا تدعم posix AIO لأي fd, لكن تقييد الملفات العادية.

أ libtorrent المطور يقدم تقريرا عن هذا: http://blog.libtorrent.org/2012/10/asynchronous-disk-io/

هناك aio_write تنفيذها في سي العمومية;المكالمة الأولى من aio_read أو aio_write وظيفة يولد عدد من العضو وضع المواضيع ، aio_write أو aio_read طلبات الوظائف إلى هذا الموضوع ، موضوع لا pread/pwrite و عندما يتم الانتهاء من الإجابة نشرها مرة أخرى إلى حظر مؤشر ترابط استدعاء.

هناك أيضا 'الحقيقية' aio - بدعم من نواة مستوى (تحتاج libaio من أجل أن نرى io_submit الاتصال http://linux.die.net/man/2/io_submit );تحتاج أيضا O_DIRECT ذلك (أيضا قد لا تكون معتمدة من قبل جميع أنظمة الملفات ، ولكن تلك الكبرى لا تدعم ذلك)

انظر هنا:

http://lse.sourceforge.net/io/aio.html

http://linux.die.net/man/2/io_submit

الفرق بين POSIX AIO و libaio على لينكس ؟

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