c# - ماذا يعني الدفق؟ ما هي خصائصه؟




c++ class stream nomenclature (5)

في وظائف C المحددة في <stdio.h> تعمل على الدفق.

المقطع 7.19.2 يناقش دفق في C99 كيف تتصرف ، وإن لم يكن ما هي عليه ، وبصرف النظر عن "تسلسل مرتبة من الأحرف".

يعطي rationale السياق الإضافي في القسم المقابل ، بدءًا من:

ورثت C مفهومها لدفق النص من بيئة UNIX التي ولدت فيها.

إذن هذا هو مصدر هذا المفهوم.

يستخدم كل من C ++ و C # stream الكلمات هذا لتسمية العديد من الفئات.

  • C ++: iostream و istream_iterator و istream_iterator و istream_iterator و istream_iterator و istream_iterator وهكذا.
  • C #: Stream ، FileStream ، MemoryStream ، BufferedStream وهلم جرا.

لذلك جعلني أشعر بالفضول لمعرفة ما يعني stream ؟ ما هي خصائص تيار؟ متى يمكنني استخدام هذا المصطلح لتسمية فصولي؟ هل يقتصر هذا على فصول I / O فقط؟

من المثير للاهتمام ، C لا يستخدم هذه الكلمة في أي مكان ، بقدر ما أعرف.


من دفق I / O (على الرغم من أنه في java ، فإن المعنى هو نفسه في C ++ / C #)

يمثل I / O Stream مصدر دخل أو وجهة مخرجات. يمكن أن يمثل الدفق العديد من الأنواع المختلفة من المصادر والوجهات ، بما في ذلك ملفات القرص والأجهزة والبرامج الأخرى ومصفوفات الذاكرة.

تدعم التدفقات العديد من أنواع البيانات المختلفة ، بما في ذلك وحدات البايت البسيطة وأنواع البيانات الأولية والأحرف المحلية والكائنات. بعض التدفقات تمر ببساطة على البيانات. الآخرين يتلاعبون ويحولون البيانات بطرق مفيدة.

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

في C # ، تستمد التدفقات التي ذكرتها من Stream فئة أساسية مجردة. كل تطبيق لهذه الفئة الأساسية له غرض محدد.

على سبيل المثال ، يدعم FileStream عمليات القراءة / الكتابة على الملف ، بينما يعمل MemoryStream على كائن دفق في الذاكرة. بخلاف فئتي FileStream و MemoryStream ، تسمح فئة BufferedStream للمستخدم بتخزين I / O.

بالإضافة إلى الفئات المذكورة أعلاه ، هناك العديد من الفئات الأخرى التي تنفذ فئة Stream . للحصول على قائمة كاملة ، راجع Stream على فئة Stream .


مع مراعاة المصطلحات والتفسيرات الرسمية ، تم أخذ كلمة stream نفسها من stream "الحياة الحقيقية" - بدلاً من الماء ، يتم نقل البيانات من مكان إلى آخر.

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


العديد من هياكل البيانات (القوائم ، والمجموعات ، وما إلى ذلك) بمثابة حاويات - أنها تحتوي على مجموعة من الكائنات. لكن ليس تيارًا إذا كانت القائمة عبارة عن مجموعة بيانات ، فإن التدفق هو خرطوم. يمكنك سحب البيانات من دفق ، أو دفع البيانات في دفق - ولكن عادة مرة واحدة وفقط في اتجاه واحد (هناك استثناءات بالطبع). على سبيل المثال ، بيانات TCP عبر شبكة هي دفق؛ يمكنك إرسال (أو تلقي) أجزاء من البيانات ، ولكن فقط بالاتصال مع الكمبيوتر الآخر ، وعادة مرة واحدة فقط - لا يمكنك إرجاع الإنترنت.

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


سأعطي فقط القياس الذي أفهم نماذج تناسق الذاكرة (أو نماذج الذاكرة ، باختصار). مستوحاة من ورقة ليزلي لامبورت الأصلية "Time، Clocks، و Ordering of Events in a Distributed System" . التناظر هو مناسب وله أهمية أساسية ، ولكن قد يكون مبالغة للكثير من الناس. ومع ذلك ، آمل أن يوفر صورة ذهنية (تمثيل تصويري) تسهل التفكير في نماذج تناسق الذاكرة.

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

نقلا عن "A التمهيدي على تناسق الذاكرة وذاكرة التماسك"

نموذج الذاكرة الحدسي (والأكثر تقييدًا) هو التناسق المتسلسل (SC) الذي يجب أن يشبه التنفيذ متعدد مؤشرات الترابط تشويشًا لعمليات التنفيذ المتسلسلة لكل مؤشر ترابط مكون ، كما لو كانت مؤشرات الترابط متعددة الإرسال على معالج أحادي النواة.

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

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

[صورة من ويكيبيديا]

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

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

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

في نموذج الذاكرة C ++ 11 ، يتم استخدام آلية مماثلة (نموذج تماسك الإطلاق) للحصول على هذه العلاقات السببية المحلية .

لتوفير تعريف لاتساق الذاكرة ودافع للتخلي عن SC ، سوف أقتبس من "A Primer on Memory Consistency and Cache Coherence"

بالنسبة لآلة ذاكرة مشتركة ، يحدد نموذج تناسق الذاكرة السلوك المرئي المعماري لنظام الذاكرة الخاص به. معيار الصواب لسلوك الأجزاء الأساسية للمعالج الواحد بين " نتيجة واحدة صحيحة " و " العديد من البدائل غير الصحيحة ". ويرجع ذلك إلى أن بنية المعالج تفترض أن تنفيذ مؤشر الترابط يحول حالة إدخال معينة إلى حالة خرج واحدة محددة جيدًا ، حتى في حالة نفاذ خارج الترتيب. نماذج تناسق الذاكرة المشتركة ، ومع ذلك ، تتعلّق بالأحمال ومخازن سلاسل عمليات متعددة وتسمح عادةً بالعديد من عمليات التنفيذ الصحيحة أثناء عدم السماح بالعديد من (غير ذلك) غير صحيحة. احتمال تنفيذ عمليات إعدام صحيحة متعددة هو ISA يسمح لعدة مؤشرات التنفيذ بشكل متزامن ، غالباً مع العديد من interleavings القانونية المحتملة من مؤشرات مختلفة.

يتم تحفيز نماذج تناسق الذاكرة المريح أو الضعيف بحقيقة أن معظم طلبات الذاكرة في النماذج القوية غير ضرورية. إذا قام مؤشر ترابط بتحديث عشرة عناصر بيانات ثم علامة مزامنة ، فالمبرمجون عادة لا يهتمون إذا تم تحديث عناصر البيانات بالترتيب بالنسبة لبعضها البعض ولكن فقط يتم تحديث جميع عناصر البيانات قبل تحديث العلم (عادة ما يتم تنفيذها باستخدام تعليمات FENCE ). وتسعى النماذج المسترخية إلى الحصول على هذه المرونة المتزايدة في الطلب والحفاظ على الطلبات التي يطلبها المبرمجون فقط للحصول على أداء أعلى وصحة أعلى من SC. على سبيل المثال ، في معماريات معينة ، يتم استخدام المخازن المؤقتة للكتابة FIFO بواسطة كل نواة لاحتواء نتائج المخازن (المتقاعدة) الملتزم بها قبل كتابة النتائج إلى ذاكرات التخزين المؤقت. يعمل هذا التحسين على تحسين الأداء ولكنه ينتهك SC. المخزن المؤقت للكتابة يخفي زمن الوصول لخدمة مخزن تفوت. نظرًا لأن المتاجر شائعة ، فإن القدرة على تجنب التوقف على معظمها تعد ميزة مهمة. بالنسبة للمعالج أحادي النواة ، يمكن جعل المخزن المؤقت للكتابة غير مرئي من الناحية المعمارية عن طريق التأكد من أن الحمل إلى العنوان A يعيد قيمة المخزن الأحدث إلى A حتى إذا كان مخزن واحد أو أكثر موجود في المخزن المؤقت للكتابة. ويتم ذلك عادة إما بتجاوز قيمة أحدث مخزن إلى A إلى الحمل من A ، حيث يتم تحديد "الأحدث" حسب ترتيب البرنامج ، أو عن طريق إيقاف تحميل A إذا كان مخزن إلى A في مخزن الكتابة المؤقت . عند استخدام نوى متعددة ، سيكون لكل منها مساره الخاص لتجاوز المخزن المؤقت للكتابة. بدون المخازن المؤقتة للكتابة ، فإن الأجهزة هي SC ، ولكن مع المخازن المؤقتة للكتابة ، فهي ليست كذلك ، مما يجعل التخزين المؤقت للكتابة مرئيًا بشكل معماري في معالج متعدد النواة.

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

ولأن تماسك ذاكرة التخزين المؤقت وتناسق الذاكرة يتم الخلط بينهما أحيانًا ، فمن المفيد أيضًا الحصول على هذا الاقتباس:

على عكس الاتساق ، لا يكون تماسك ذاكرة التخزين المؤقت مرئيًا للبرامج ولا مطلوبًا. يسعى Coherence إلى جعل مخابئ نظام الذاكرة المشتركة غير مرئية وظيفياً مثل المخابئ في نظام أحادي النواة. يضمن التماسك الصحيح أن المبرمج لا يستطيع تحديد ما إذا كان النظام يحتوي على ذاكرة تخزين مؤقت من خلال تحليل نتائج الأحمال والمخازن. ويرجع هذا إلى أن التماسك الصحيح يضمن أن التخزين المؤقت لا يُمكِّن أبداً السلوك الوظيفي الجديد أو المختلف (قد يظل المبرمجون قادرين على استنتاج بنية ذاكرة التخزين المؤقت المحتملة باستخدام معلومات التوقيت ). الغرض الرئيسي من بروتوكولات تماسك ذاكرة التخزين المؤقت هو الحفاظ على ثابت واحد - متعددة القراء (SWMR) ثابتة لكل موقع الذاكرة. التمييز المهم بين التماسك والاتساق هو أن التماسك محدد على أساس كل موقع ذاكرة ، بينما يتم تحديد الاتساق فيما يتعلق بجميع مواقع الذاكرة.

واستمرارًا لصورتنا العقلية ، يتوافق معيار SWMR الثابت مع المتطلبات المادية التي تنص على وجود جسيم واحد على الأكثر في أي موقع ، ولكن يمكن أن يكون هناك عدد غير محدود من المراقبين في أي مكان.





c# c++ class stream nomenclature