حل المعضلة
هذه المعضلة تسمى معضلة اللواءين Two Generals Problem، وهي معضلة ليس لها حل.. عفوا، يمكن أن توجد حلول تقلل من حدة المشكلة ولكن لا يوجد حل يضمن مزامنة الهجوم بنسبة 100%. ربما تقول "يخبر عباس عمرا في الرسالة أن يرد عليه برسول، فإن رجع رسول من عمرو إلى عباس يؤكد وصول الرسالة يهاجم، وإن لم يصل فإن الرسول الأول لم يصل ولا يهاجم.."، لكنك لم تلاحظ أن هذا ينقل المأزق من عباس إلى عمرو لا أكثر، إذ ربما لا يصل الرسول العائد من عمرو إلى عباس، حينها لن يهاجم عباس (لأنه يظن رسوله لم يصل) وسيهاجم عمرو ويقع في مأزق!
لا يوجد حل يضمن لهما المزامنة بنسبة 100% مهما فكرت أيها القارئ، فالطريقة الوحيدة هي أن تكون وسيلة التواصل بينهما توصل الرسائل باحتمالية 100%.. لكن يوجد حل يقلل حدة المشكلة: ماذا لو أرسل عباس رسولين بنفس الرسالة؟ احتمالية عدم وصول أحدهما 50% ولكن احتمالية عدم وصول كليهما معا تهبط إلى 25%، وإن أرسل ثلاثة فإن احتمالية عدم وصول الثلاثة تهبط إلى 12.5%، أما إن أرسل عشرة فإن احتمالية عدم وصول العشرة تهبط إلى 00.097%!
فكل ما على عباس هو أن يرسل سبعة أو ثمانية رسل مع نفس الرسالة (هاجم الساعة 6:00 صباحا) وأن يهاجم هو في هذه الساعة مهما كان، وأن يرجو من الله أن أحد الرسل على الأقل قد وصل إلى عمرو.
تطبيق المعضلة
لماذا تشرح هذه المعضلة؟ هذه المعضلة ليست من أجل تعليمك كيف تهاجم عندما تكون لواء، ولكنها لتعليمك المشكلات التي تواجه المهندسين عند محاولة المزامنة بين جهازين بينهما طريقة تواصل غير مضمونة.
- لنقل مثلا أنك تتصفح موقع تسوق وطلبت شراء حقيبة،
- ولنقل أن المبرمج صمم الموقع بحيث يرسل الطلب للخادوم وينتظر رسالة التأكيد من الخادوم،
- الطلب وصل للخادوم لكن رسالة التأكيد لم تصل للمتصفح
- لنقل أن المبرمج ليس بالخبرة الكافية وصمم الموقع بحيث يقول لك في هذه الحالة "الطلب لم يصل ⛔️، هل تريد المحاولة مجددا؟"
- تضغط المحاولة مجددا فيصل للخادوم طلب جديد،
- هذه المرة تصل رسالة التأكيد من الخادوم بنجاح ويخبرك الموقع أن الطلب تم ✅️
- يأتي لك رجل التوصيل ومعه لك نفس الحقيبة التي طلبتها مرتين!
من التطبيقات المعروفة للمعضلة أيضا بروتوكول (أو ميفاق) التحكم بالإرسال Transmission Control Protocol. كلنا نعلم أنه عندما يريد جهاز إنهاء الاتصال بهذا البروتوكول فإنه ينهيها بطريقة المصافحة رباعية الطرق "Four-way handshake".. كلنا نعلم ما عدا هذا القارئ
- في طريقة المصافحة رباعية الطرق يرسل الجهاز الذي يريد إنهاء الاتصال رسالة FIN،
- يرد الجهاز الآخر برسالة تأكيد ACK (اختصار Acknowledgement)،
- ثم يرسل رسالة FIN ليقطع الاتصال
- ثم يرد الجهاز الأول برسالة تأكيد ACK وينتهي الاتصال.
ربما هذا المثال بعيد قليلا عن حياتنا العملية، لنقل مثالا آخر، لنقل أن جهاز حاسوبك متصل بطابعة بالبلوتوث، وأرسلت أمر طباعة مستند، الحاسوب يخبرك أن أمر الطباعة أرسل بنجاح لكن الطابعة لم تطبع شيئا! السبب هو أن الحاسوب أرسل الأمر ولكنه لم يصل أو وصل منقوصا، فلم تنفذ الطابعة الأمر والحاسوب لا يستطيع أن يعلم أن الطابعة لم تنفذ الأمر.. إذا قلت أن ينتظر الحاسوب رسالة تأكيد من الطابعة، فهذا يصنع مأزقا آخر بحيث تكون الطابعة طبعت ولكن الحاسوب يظن أنها لم تطبع لأن رسالة التأكيد لم تصل بسلام..
بالنسبة لموضوع الطابعة.. ما رأيك؟ كيف نحل هذه المشكلة؟ ربما تقول "يرسل الحاسوب عشرات الرسائل بنفس الأمر لنحل المشكلة بنفس الطريقة"، ولكن كيف سنضمن أن الطابعة ستنفذ الأمر مرة واحدة فقط؟ حينها نحل المشكلة بطريقة رمز الهوية:
- يطلب الحاسوب من الطابعة رقم هوية،
- لنقل أن الطابعة طبعت 18 مستندا من قبل، فترد برقم "19"،
- يرسل الحاسوب عشرات الأوامر بطباعة نفس المستند برقم الهوية "19"،
- تنفذ الطابعة أول أمر يصل لها، وترفع عدد الأوامر المنفذة لديها إلى 19 بدلا من 18
- عندما يصل للطابعة أمر بنفس رقم الهوية (أو برقم هوية قديم) تتجاهل الطابعة الأمر لأنه أمر مكرر.
وبهذا نكون حللنا معضلة اللواءين بالنسبة للحاسوب والطابعة.
التعليقات:
إرسال تعليق
هنا أنت الكاتب، قل ما تريد، كن مهذبا