19-04-16, 06:10 PM
(آخر تعديل لهذه المشاركة : 19-04-16, 11:57 PM {2} بواسطة الشاكي لله.)
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
كيف حالكم يا اعضاء منتدى فيجوال بيسك العرب ..
--
اليوم سنتكلم عن احد مفاهيم البرمجة الحديثة وهو مفهوم الاتصال الداخلي بين التطبيقات او بعبارة ادق التواصل بين ال(Processes) ، يسمى هذا المفهوم اختصارا بـ IPC بمعناه : Inter-process communication
الهدف من تطبيق هذا المفهوم هو تمكين الاتصال وتبادل البيانات بين عدة تطبيقات اما تعمل على نفس الجهاز او عن بعد ..
اهمية الـ IPC ؟
من الامور الشائعة لاستخدام هذا المفهوم ، هي عندما تكون هناك الحاجة لتطبيقات صغيرة مساعدة لتطبيقك الاساسي ..مثلا :: بعض المطورين عندما يريدون عمل خاصية الابديت لتطبيقهم الاساسي ، في اغلب الاحيان يقومون بصنع برنامج صغير باسم updater.exe ويضعونه بجانب التطبيق الاساسي
بحيث ان updater يتكفل بالبحث عن اخر التحديثات وتنزيلها ثم يحذف التطبيق الاساسي القديم ويستبدله بالتطبيق الاساسي الجديد
في مثالنا اعلاه ، يوجد لدينا اثنان process ، هما تطبيق updater الصغير ، والبرنامج الاساسي ...
الان عندما تريد عمل تواصل بين هذين التطبيقين يجب عليك ان تطبق مفهوم الIPC
عند تطبيقك للIPC ـ سيمكنك هذا من ارسال Messages بين التطبيقات ، او سحب/طلب/تبادل بيانات بين التطبيقات ، او ارسال الاوامر الى تطبيق اخر
مثال اخر ، برنامج الWord بطبيعة الحال يحتوي على مصحح املائي ، لو افترضنا ان المصحح املائي هو برنامج منفصل عن برنامج الword ، عندها يجب على مايكروسوفت تطبيق مفهوم الIPC بين التطبيقين بحيث ان البرنامج الاساسي يرسل الكلمة المراد فحصها املائيا الى "برنامج المصحح الاملائي" ،، بعدها يقوم برنامج المصحح الاملائي بمعالجة الكلمة ، ثم في النهاية يقوم بارسال النتيجة الى البرنامج الاساسي (الword) .
توجد حالات كثيرة مختلفة ولكن لاداعي لذكر المزيد .. فقط تذكر هذا المفهوم دائما عندما تحتاج الى عمل تواصل بين تطبيقين
وتذكر ليس بالضرورة ان تكون التطبيقات التي تريد عمل تواصل بينها لها واجهة مرئية .
تطبيق الـ IPC
في الواقع هناك اكثر من 10 طرق لتطبيق الIPC ، منها : Sockets , Pipe , Shared File , Windows Messages , Web Services Shared Memory .وهناك غيرها...
طبعا ليس جميع هذه الطرق بالامكان تطبيقها دائما ، فمثلا لايمكننا تطبيق طريقة الShared Memory بين تطبيقين بعيدين (ليسا على نفس الجهاز)
وليس جميع هذه الطرق لديها نفس الكفاءة ، مثلا الـSockets تقنية صعبة التنفيذ ودائما تواجه العديد من المصاعب والمأسي لتعمل بشكل صحيح (اكثر هذه المشاكل سببها الجدار الناري) ..
بينما عندما نتحدث عن السرعة ، فلا يوجد اسرع من طريقة الShared Memory وهي الطريقة التي سنطبقها لتحقيق مفهوم الIPC
كيف تعمل Shared Memory
الـ Shared Memory باختصار ، هو مشاركة منطقة محددة من الMemory بين التطبيقات.
قد يستغرب الكثيرين كيف بالامكان تحقيق فكرة الShared Memory في الدوت نت !!
لان كما نعرف تطبيقات الدوت نت (#C او فيجوال بيسك) هي تطبيقات مدارة بواسطة الGarbage collector ، فهو المسؤول عن حذف الكائنات وتغيير مواقعها في الMemory ، وذلك لاظهار اكبر كفائة ممكنة لتطبيقك ..
فليس بالامكان حجز Buffer او بالاحرى (Block) لان الGarbage Collector ستعبث به بالتأكيد ،، قد يفكر البعض بالاستعانة باحد قدرات السي شارب ، وهي استعمال المؤشرات مع الكلمة المفتاحية fixed لحجز block ، حيث نعلم عند تطبيق هذه الطريقة ، لن تخضع هذه المؤشرات الى الgarbage collector ولن يتم تحريكها او تبديل عناوينها .. ولكن هل هذا يحل المشكلة ؟؟
الجواب المفاجئ هو لا ،،، لان نظام التشغيل ولمبدأ الامان ، يقوم بمنع اي وصول ل Zone اخر غير الـ Zone الخاص بتطبيقك >>
كما في الصورة ، كل Process او تطبيق يعمل على جهازك له منطقة (Zone) منفصلة عن البقية (المربعات الصفراء)
ونظام التشغيل لا يسمح ابدا لاي تطبيق بالوصول الى بيانات موجودة في Zone تطبيق اخر غير تطبيقك ..
اذن لو حجزت buffer من خلال احد التطبيقات ، سيتم حجزه على الZone الخاص بهذا التطبيق
ولن يستطيع البرنامج الاخر الوصول لهذا الbuffer .
اذن تخطي هذا الموضوع صعب جدا تقنيا ، لذلك ولحسن الحظ وفرت مايكروسوفت في الـ Freamwork 4 كلاس خاص لعمل Shared Zone ، بحيث يتمكن كلا التطبيقين من الوصول الى هذا الZone المنفصل بواسطة Key خاص >>
------ير
تطبيق الـShared Memory
مع صدور Framework version 4 تم توفير Class خاص بأسم MemoryMappedFile
هذا الكلاس يقوم بحجز Zone مشترك في الذاكرة فيمكنك الاستفادة من هذا ال Zone في انشاء buffer مشترك لتبادل البيانات بين التطبيقين
بحيث يمكنك الكتابة او القراءة من buffer بسهولة تامة ، ويتم هذا الموضوع بسرعة فائقة لان دائما التعامل مع الMemory اسرع بكثير من التعامل مع الhard disk او مع الشبكة ، لذلك يعتبر الShared Memory اسرع طرق التواصل بين التطبقات على الاطلاق
في المرفقات تجدون تطبيق، يمكنه ارسال رسائل بين نسخه وذلك بواسطة الShared Memory
بالاضافة الى مشروع اخر لايوجد فيه سوى كلاس واحد باسم Message ، هذا الكلاس يمثل هيكل الرسائل التي سيتم تناقلها بين التطبيقين .
مع صدور Framework version 4 تم توفير Class خاص بأسم MemoryMappedFile
هذا الكلاس يقوم بحجز Zone مشترك في الذاكرة فيمكنك الاستفادة من هذا ال Zone في انشاء buffer مشترك لتبادل البيانات بين التطبيقين
بحيث يمكنك الكتابة او القراءة من buffer بسهولة تامة ، ويتم هذا الموضوع بسرعة فائقة لان دائما التعامل مع الMemory اسرع بكثير من التعامل مع الhard disk او مع الشبكة ، لذلك يعتبر الShared Memory اسرع طرق التواصل بين التطبقات على الاطلاق
في المرفقات تجدون تطبيق، يمكنه ارسال رسائل بين نسخه وذلك بواسطة الShared Memory
بالاضافة الى مشروع اخر لايوجد فيه سوى كلاس واحد باسم Message ، هذا الكلاس يمثل هيكل الرسائل التي سيتم تناقلها بين التطبيقين .
تحياتي