أنت غير متصل حاليًا، وفي انتظار الإنترنت الخاص بك ليقوم بإعادة الاتصال

إن المستعرض الذي تستخدمه غير معتمد

إنك تحتاج إلى تحديث المستعرض لاستخدام الموقع.

التحديث إلى أحدث إصدار من Internet Explorer

يظهر إدخال/إخراج القرص غير متزامن متزامن كما في Windows

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

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

ميزة الإدخال/الإخراج غير المتزامن أن الطالب لديه وقت للقيام بعمل آخر أو إصدار طلبات أكثر أثناء إكمال عملية الإدخال/الإخراج. أنا متراكبة على المصطلح/أبحر استخداماً متراكبة على عدم إدخال/إخراج "الإدخال/الإخراج غير المتزامن" "الإدخال/الإخراج المتزامنة". تستخدم هذه المقالة المصطلحات المتزامن ومتزامن لعمليات الإدخال/الإخراج. تفترض هذه المقالة الإلمام بوظائف "إدخال/إخراج الملف" مثل WriteFile CreateFile "،" ReadFile، يحتوي القارئ.

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

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

إعداد إدخال/إخراج غير متزامن

يجب تحديد العلامة FILE_FLAG_OVERLAPPED في CreateFile عند فتح الملف. تسمح هذه العلامة عمليات إدخال/إخراج الملف المراد تنفيذها بشكل متزامن. إليك مثال:
   HANDLE hFile;   hFile = CreateFile(szFileName,                      GENERIC_READ,                      0,                      NULL,                      OPEN_EXISTING,                      FILE_FLAG_NORMAL | FILE_FLAG_OVERLAPPED,                      NULL);   if (hFile == INVALID_HANDLE_VALUE)      ErrorOpeningFile();				
كن حذراً عند كتابة التعليمات البرمجية للإدخال/الإخراج غير المتزامن لأن يحجز النظام المتعامل لإجراء متزامن إذا كان يحتاج إلى عملية. ولذلك، فمن الأفضل إذا قمت بكتابة برنامج للتعامل مع عملية الإدخال/إخراج قد أتم شكل متزامن أو بشكل غير متزامن. يوضح نموذج التعليمات البرمجية هذا الاعتبار.

هناك العديد من الأشياء التي يمكن برنامج أثناء انتظار أسينتشرونوسوبيريشنز لإكمال، مثل عمليات إضافية في قائمة انتظار أو عمل دوينجباكجروند. على سبيل المثال، التعليمات البرمجية التالية بشكل صحيح هاندليسوفيرلابيد وإتمام عملية القراءة غير متراكب. دوسنوثينج أكثر من الانتظار للإدخال/الإخراج المعلقة لإكمال:
   if (!ReadFile(hFile,                 pDataBuf,                 dwSizeOfBuffer,                 &NumberOfBytesRead,                 &osReadOperation )   {      if (GetLastError() != ERROR_IO_PENDING)      {         // Some other error occurred while reading the file.         ErrorReadingFile();         ExitProcess(0);      }      else         // Operation has been queued and         // will complete in the future.         fOverlapped = TRUE;   }   else      // Operation has completed immediately.      fOverlapped = FALSE;   if (fOverlapped)   {      // Wait for the operation to complete before continuing.      // You could do some background work if you wanted to.      if (GetOverlappedResult( hFile,                               &osReadOperation,                               &NumberOfBytesTransferred,                               TRUE))         ReadHasCompleted(NumberOfBytesTransferred);      else         // Operation has completed, but it failed.         ErrorReadingFile();   }   else      ReadHasCompleted(NumberOfBytesRead);				
لاحظ أن آند نومبيروفبيتيسريد التي تم تمريرها إلى ReadFile يختلف عن آند نومبيروفبيتيسترانسفيريد التي تم تمريرها إلى جيتوفيرلابيدريسولت. إذا تم إجراء أوبيراتيونهاس غير متزامنة، ثم جيتوفيرلابيدريسولت يستخدم ديتيرمينيثي العدد الفعلي لوحدات البايت المرسلة في العملية بعد ذلك هاسكومبليتيد. آند نومبيروفبيتيسريد التي تم تمريرها إلى ReadFile لا معنى له.

إذا، على الجانب الآخر، اكتمال عملية مباشرة، ثم آند نومبيروفبيتيسريد التي تم تمريرها إلى ReadFile صالحاً لعدد وحدات البايت المقروءة. في هذه الحالة، يتم تجاهل بناء متراكب التي تم تمريرها إلى "ReadFile"؛ لا تستخدم مع جيتوفيرلابيدريسولت أو WaitForSingleObject.

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

ينطبق نفس النوع من التقييد على المخزن المؤقت للبيانات المستخدمة في أنوبيريشن. لا يمكن قراءة المخزن مؤقت لبيانات أو الكتابة حتى اكتمال عملية الإدخال/الإخراج إيتسكوريسبوندينج؛ قراءة أو كتابة بوفيرماي تسبب أخطاء والبيانات التالفة.

غير متزامن "الإدخال/الإخراج لا يزال يبدو" متزامن

إذا اتبعت الإرشادات الموجودة مسبقاً في هذه المقالة، على الرغم من ذلك، عمليات الإدخال/الإخراج لا يزال عادة إكمال شكل متزامن في الأمر الصادر، وأي عمليات ReadFile إرجاع FALSE GetLastError() إرجاع ERROR_IO_PENDING، وهذا يعني أن لديك في أي وقت من الأوقات لأي عمل خلفية. لماذا يحدث هذا؟

هناك عدة أسباب لماذا سينتشرونوسلييفين إكمال عمليات الإدخال/الإخراج إذا قمت بكتابة التعليمات البرمجية لعملية غير متزامنة:

ضغط

واحد من عرقلة لعملية غير متزامنة ضغط NTFS. برنامج تشغيل نظام الملفات لا تصل إلى الملفات المضغوطة بشكل متزامن; بدلاً من ذلك يتم فقط إجراء متزامن اللوبيريشنز. وهذا ينطبق على ملفات أريكومبريسيد التي لديها مرافق مشابهة للضغط أو PKZIP.

تشفير NTFS

مشابه للضغط، يؤدي تشفير ملف برنامج تشغيل النظام لتحويل إدخال/إخراج غير متزامن إلى متزامن. يتم فك تشفير الملفات، سيتم طلبات إدخال/إخراج غير متزامن.

توسيع ملف

تم إكمال عمليات الإدخال/الإخراج شكل متزامن سببا آخر العمليات نفسها. على Windows NT أو أي كتابة ستكون عملية لملف الذي يمتد طوله متزامن.

ملاحظة: التطبيقات إجراء عملية الكتابة السالفة الذكر غير متزامن عن طريق تغيير "طول البيانات الصالحة" للملف باستخدام الدالة سيتفيليفاليداتا، ومن ثم يصدر WriteFile.

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

لأن نظام الملفات NTFS لا صفر-تعبئة البيانات تصل إلى طول البيانات الصالحة (VDL) التي تم تعريفها بواسطة سيتفيليفاليداتا، تحتوي هذه الدالة على ضمانات الأمان حيث الملف قد يتم تعيين الكتل التي يشغلها سابقا الملفات الأخرى. ولذلك، سيتفيليفاليداتا يتطلب أن يكون الطالب سيماناجيفولومبريفيليجي جديدة ممكنة (بشكل افتراضي، يتم تعيين هذا للمسؤولين فقط). توصي Microsoft بأن ISVs بعناية الآثار المترتبة على استخدام هذه الدالة.

ذاكرة التخزين المؤقت

تحتوي معظم برامج إدخال/إخراج (القرص، والاتصالات، وغيرها) رمز حالة خاصة حيث يمكن إكمال طلب الإدخال/إخراج "على الفور"، سيتم إكمال العملية وسيتم إرجاع "صحيح" ReadFile أو WriteFile الدالة. بكافة الطرق، تظهر هذه الأنواع من العمليات متزامنتين. ديسكديفيسي، بشكل عام، طلب الإدخال/إخراج يمكن إكمال عند تخزين البيانات مؤقتاً في الذاكرة "على الفور".

البيانات غير موجود في ذاكرة التخزين المؤقت

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

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

يمكن أيضا أن تتأثر سلوك إدارة التخزين المؤقت على أساس الوصول ويثيريو ملف تسلسلي أو عشوائي. تكون فوائد ذاكرة التخزين المؤقت سينموست عند الوصول إلى ملفات التسلسل. سيتم تحسين فلاجين FILE_FLAG_SEQUENTIAL_SCAN استدعاء CreateFile ذاكرة التخزين المؤقت لهذا النوع من الوصول. ومع ذلك، إذا كان الوصول إلى الملفات بطريقة عشوائية، استخدام العلامة theFILE_FLAG_RANDOM_ACCESS في CreateFile لإرشاد سلوكه للوصول العشوائي توبتيميزي إدارة ذاكرة التخزين المؤقت.

لا تستخدم ذاكرة التخزين المؤقت

علامة FILE_FLAG_NO_BUFFERING أثر معظم على سلوك نظام ملف عملية غير متزامنة. هذا هو أفضل طريقة لطلبات الإدخال/الإخراج تكون غير متزامنة في الواقع جوارانتيثات. يوعز الملف سيستيمتو لا تستخدم أي إليه ذاكرة التخزين المؤقت على الإطلاق.

تحذير: توجد بعض القيود على استخدام هذه العلامة بمحاذاة المخزن المؤقت للبيانات وحجم القطاع الخاص بالجهاز. راجع مرجع دالة في الوثائق الخاصة بالدالة CreateFile لمزيد من المعلومات حول استخدام هذه العلامة بشكل صحيح.

نتائج الاختبار العالم الحقيقي

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

يمكنك أن تتوقع رؤية النتائج مشابهة لما يلي:
  • اختبار 1
    Asynchronous, unbuffered I/O:  asynchio /f*.dat /n   Operations completed out of the order in which they were requested.   500 requests queued in 0.224264 seconds.   500 requests completed in 4.982481 seconds.						
    يوضح هذا الاختبار أن البرنامج السالفة الذكر إصدار طلبات إدخال/إخراج 500 بسرعة، وكان كثير من الوقت للقيام بعمل آخر أو إصدار طلبات أكثر.
  • الاختبار 2
    Synchronous, unbuffered I/O: asynchio /f*.dat /s /n   Operations completed in the order issued.   500 requests queued and completed in 4.495806 seconds.						
    يوضح هذا الاختبار الذي استغرقه هذا البرنامج ثانية 4.495880 استدعاء ReadFile لإكمال عملياتها، بينما 0.224264 ثانية فقط لإصدار طلبات نفس الاختبار 1. في اختبار 2، لا يوجد "إضافية" وقت للبرنامج للقيام بأي عمل في الخلفية.
  • اختبار 3
    Asynchronous, buffered I/O: asynchio /f*.dat   Operations completed in the order issued.   500 requests issued and completed in 0.251670 seconds.						
    يوضح هذا الاختبار الطبيعة المتزامنة لذاكرة التخزين المؤقت. تم إصدار كل القراءات وإكمالها في 0.251670 ثانية. وبعبارة أخرى، تم إكمال طلبات متزامنة شكل متزامن. يوضح هذا الاختبار عالية الأداء لإدارة ذاكرة التخزين المؤقت عندما تكون البيانات في ذاكرة التخزين المؤقت.
  • اختبار 4
    Synchronous, buffered I/O: asynchio /f*.dat /s   Operations completed in the order issued.   500 requests and completed in 0.217011 seconds.						
    يوضح هذا الاختبار نفس النتائج كما هو الحال في اختبار 3. لاحظ إكمال القراءة من ذاكرة التخزين المؤقت أسرع قليلاً من قراءة غير متزامنة من ذاكرة التخزين المؤقت. يوضح هذا الاختبار عالية الأداء لإدارة ذاكرة التخزين المؤقت عندما تكون البيانات في ذاكرة التخزين المؤقت.

خاتمة

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

الوصول إلى الملفات الافتراضية دون تحديد أي إشارات خاصة إلى كريتيفيليس عملية متزامنة والمخزنة مؤقتاً.

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

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

مراقبة الأداء يمكن أن يساعد في تحديد مدى فعالية إيسوسينج البرنامج الخاص بك القرص وذاكرة التخزين المؤقت. سيشير إلى تعقب أي عدادات الأداء لكائن التخزين المؤقت أداء إدارة ذاكرة التخزين المؤقت. تعقب عدادات أداء "القرص الفعلي" أو "المنطقي ديسكوبجيكتس" تشير إلى أداء أنظمة الأقراص.

هناك العديد من المرافق التي قد تكون مفيدة في رصد الأداء؛ الأداء و DiskPerf مفيدة بشكل خاص. نظام جمع البيانات بشأن أداء أنظمة الأقراص، يجب أولاً إصدار الأمر diskperf-y. بعد إصدار الأمر، يجب إعادة تشغيل النظام لبدء عملية تجميع البيانات.
مراجع
تشير إلى وثائق MSDN على الإدخال/الإخراج غير المتزامن وغير المتزامن لمزيد من المعلومات.

كبدس WriteFile ريدفيليكس ReadFile أسينكزيب كبفيلي "وريتيفيليكس جيتوفيرلابيدريسولت غير متزامن متزامن متراكبة غير" متراكب

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 156932 - آخر مراجعة: 06/25/2015 21:29:00 - المراجعة: 7.0

  • Microsoft Win32 واجهة برمجة تطبيقات
  • kbapi kbfileio kbinfo kbkernbase kbmt KB156932 KbMtar
تعليقات
mp;t=">if?DI=4050&did=1&t=">t.write(" ttps://c.microsoft.com/ms.js">