سؤال

لقد لاحظت أن Boost.asio يحتوي على الكثير من الأمثلة التي تتضمن المقابس والمنافذ التسلسلية وجميع أنواع الأمثلة غير المتعلقة بالملفات.لم تظهر لي Google الكثير مما يشير إلى ما إذا كان asio طريقة جيدة أو صالحة لإجراء عمليات إدخال/إخراج غير متزامنة للملفات.

لدي كميات كبيرة من البيانات وأرغب في كتابتها على القرص بشكل غير متزامن.يمكن القيام بذلك باستخدام نظام التشغيل io المتداخل الأصلي في Windows (النظام الأساسي الخاص بي)، لكنني أفضل أن يكون لدي حل مستقل عن النظام الأساسي.

أنا فضولي إذا

  1. Boost.asio لديه أي نوع من دعم الملفات
  2. يعد دعم ملف Boost.asio ناضجًا بدرجة كافية لعمليات الإدخال/الإخراج اليومية للملفات
  3. هل سيتم إضافة دعم الملفات على الإطلاق؟ما هي التوقعات لهذا؟
هل كانت مفيدة؟

المحلول

هل لدى Boost.asio أي نوع من دعم الملفات؟

بدءًا من (على ما أظن) Boost 1.36 (الذي يحتوي على Asio 1.2.0) يمكنك استخدام [boost::asio::]windows::stream_handle أو windows::random_access_handle لتغليف مقبض وإجراء طرق قراءة وكتابة غير متزامنة عليه استخدم البنية المتراكبة داخليًا.

يذكر المستخدم Lazin أيضًا Boost::asio::windows::random_access_handle الذي يمكن استخدامه للعمليات غير المتزامنة (على سبيل المثال.الأنابيب المسماة، ولكن أيضًا الملفات).

هل دعم ملف Boost.asio ناضج بدرجة كافية للإدخال/الإخراج اليومي للملفات؟

نظرًا لأن Boost.Asio في حد ذاته يستخدم على نطاق واسع الآن، ويستخدم التنفيذ عمليات الإدخال والإخراج المتداخلة داخليًا، أود أن أقول نعم.

هل سيتم إضافة دعم الملفات على الإطلاق؟ما هي التوقعات لهذا؟

نظرًا لعدم وجود خريطة طريق موجودة على اسيو موقع الويب، أود أن أقول أنه لن تكون هناك إضافات جديدة إلى Boost.Asio لهذه الميزة.على الرغم من أن هناك دائمًا فرصة للمساهمين بإضافة التعليمات البرمجية والفئات إلى Boost.Asio.ربما يمكنك حتى المساهمة بالأجزاء المفقودة بنفسك!:-)

نصائح أخرى

Boost::asio file i/o على Linux

في Linux، يستخدم asio ملحق epoll آلية لاكتشاف ما إذا كان واصف المقبس/الملف جاهزًا للقراءة/الكتابة.إذا حاولت استخدام Vanilla asio في ملف عادي على Linux، فستحصل على استثناء "العملية غير مسموح بها" بسبب لا يدعم epoll الملفات العادية على Linux.

الحل البديل هو تكوين asio لاستخدام select آلية على لينكس.يمكنك القيام بذلك عن طريق تحديد BOOST_ASIO_DISABLE_EPOLL.المقايضة هنا يجري حدد يميل إلى أن يكون أبطأ من epoll إذا كنت تعمل مع عدد كبير من المقابس المفتوحة.افتح ملفًا بانتظام باستخدام open() ثم قم بتمرير واصف الملف إلى ملف boost::asio::posix::stream_descriptor.

Boost::asio file i/o على نظام التشغيل Windows

على نظام التشغيل Windows يمكنك استخدام boost::asio::windows::object_handle للالتفاف أ Handle الذي تم إنشاؤه من عملية الملف.يرى مثال.

يدعم ASIO عمليات الإدخال/الإخراج المتداخلة على نظام التشغيل Windows حيث يكون الدعم جيدًا.في نظام يونكس، ظلت هذه الفكرة راكدة بسبب:

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

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

باختصار:يبدو أن ASIO يعكس فلسفة تصميم نظام التشغيل الأساسية، حيث يتم تجاهل الإدخال/الإخراج المتداخل من قبل معظم مطوري Unix، لذا فهو غير مدعوم على هذا النظام الأساسي.

Boost::asio::windows::random_access_handle هي أسهل طريقة للقيام بذلك، إذا كنت بحاجة إلى شيء متقدم، على سبيل المثال LockFileEx غير المتزامن أو أي شيء آخر، فيمكنك تمديد asio وإضافة الأحداث غير المتزامنة الخاصة بك. مثال

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

في الأساس، تتبع جميع إصدارات Async File I/O بنية "Fry Cook".إليك ما أعنيه في سياق عملية القراءة:أنا (معالجة الخيط) أذهب إلى طاولة الوجبات السريعة (OS) وأطلب برجر بالجبن (بعض البيانات).إنه يعطيني نسخة من تذكرة الطلب الخاصة بي (بعض هياكل البيانات) ويصدر تذكرة في الخلف إلى الطباخ (نظام Kernel & File) لطهي البرجر الخاص بي.ثم أذهب للجلوس أو قراءة هاتفي (أقوم بعمل آخر).لاحقًا، أعلن شخص ما أن البرجر الخاص بي جاهز (إشارة إلى خيط المعالجة) وقمت بتجميع طعامي (المخزن المؤقت للقراءة).

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