مضى على الشبكة و يوم من العطاء.

Process Synchronization

Mr_Code

مشرف سابق

السمعة:

اول شيء علشان نعرف يعني ايه Process Synchronization لازم نفهم الاول يعني ايه Cooperating processes

Cooperating Processes :

اي Process تؤثر او تتأثر ب Process اخرى تعمل علي النظام.
ال Cooperating Processes يتشاركو مكان معين في ال Memory يطلق عليه Logical Address Space.

بتبدأ تظهر عندنا مشكلة لما يكون في اكتر من Process بيحاولو يعدلو علي قيمة ال Shared Variable / Logical Address Space وينتج عنها عدم توافق او تعارض بين ال Processes وبعضها.

علشان نحل مشكلة عدم التوافق بدأنا نفكر في طرق نحافظ بيها علي التوافق وهذا ما يسمي بال Synchronization.

.Synchronization is a mechanism to ensure the orderly execution of cooperating processes that share a logical address space
بتظهر عندنا مشكلة تسمى Producer Consumer Problem "مشكلة المنتج والمستهلك".
مثالا علي "مشكلة المنتج والمستهلك" هي ال Compiler وال Assembler.
ال Compiler ينتج Assembly Code اما ال Assembler يستهلك هذا ال Code الناتج من خلال ال Compiler.
وفي هذه الحالة لا يمكن لل Assembler ان يستهلك Code لم يتم انتاجه من خلال Complier حتي هذه اللحظة.

علشان نحل المشكلة استخدمنا مكان معين في ال Memory حتي يتشاركه المنتج والمستهلك.
علشان كده استخدمنا buffer حتي يتمكن المنتج ان يملاءه ويمكن للمستهلك ان يستنفذه, وهكذا لا يمكن للمستهلك ان يستهلك ما لم يتم انتاجه.
في نوعين من ال Buffers.
Bounded buffer
And Unbounded Buffer
ال Bounded buffer يضع حدود علي مساحة ال Buffer بالتالي يجب علي المستهلك ان ينتظر في حال كان ال Buffer فارغ وكذلك علي المنتج ان ينتظر اذا كان ال Buffer ممتليء.
ال Unbounded لا يضع حدود بالتالي يمكن للمنتج ان ينتج اي كمية بينما المستهلك عليه الانتظار في حال كان ال Buffer فارغ.

خلينا نشوف ازاي مشكلة عدم التوافق في ال shared Variable بتحصل.
لو افترضنا انه المنتج يستخدم "++Function "Counter وان المستهلك بيستخدم "--Function "Counter

علي اقل مستوي يمكن ان تتعامل معه الالة "machine" ممكن نمثل ال Counter++ وال Counter-- علي النحو التالي.
++Function Counter
كود:
register1 = counter
register1 = register1 + 1
counter = register1
--Function Counter
كود:
register2 = counter
register2 = register2 - 1
counter = register2
لو افترضنا انه في البداية كان Counter يساوي 5, يمكن ان نمثل طريقة عمل ال --Counter ++ , Counter بالشكل التالي :
1701969436804.png
وبالتالي تظهر المشكلة عندما تحاول كل Process ان تعطي القيمة النهائية لل Counter. فتكون القيمة النهائية معتمدة علي الترتيب التي اخذت فيه ال Processes ادوارها.
اي انه لو كانت اخر Process هي من قامت بنداء counter-- function فستكون القيمة النهائية لل counter ب 4
اما لو كانت اخر Process هي من قامت بنداء counter++ function فستكون القيمة النهائية لل counter ب 6
وفي الحقيقة القيمة النهائية الصحيحة الوحيدة يجب ان تكون 5 عندما يتم انتاج منتج واحد "counter++" ويتم استهلاك نفس المنتج "counter--" ف يعود ال counter لقيمته الاصلية.
وهذه المشكلة تسمي بال Race Condition لانه يتم التسابق بين ال Processes وبعضها وتكون القيمة النهائية لأخر عملية حدثت.


يمكنكم الوصول الي الموضوع القادم من خلال الرابط التالي : Critical Section Problem بالعربي
 
التعديل الأخير:
اول شيء علشان نعرف يعني ايه Process Synchronization لازم نفهم الاول يعني ايه Cooperating processes

Cooperating Processes :

اي Process تؤثر او تتأثر ب Process اخرى تعمل علي النظام.
ال Cooperating Processes يتشاركو مكان معين في ال Memory يطلق عليه Logical Address Space.

بتبدأ تظهر عندنا مشكلة لما يكون في اكتر من Process بيحاولو يعدلو علي قيمة ال Shared Variable / Logical Address Space وينتج عنها عدم توافق او تعارض بين ال Processes وبعضها.

علشان نحل مشكلة عدم التوافق بدأنا نفكر في طرق نحافظ بيها علي التوافق وهذا ما يسمي بال Synchronization.

.Synchronization is a mechanism to ensure the orderly execution of cooperating processes that share a logical address space
بتظهر عندنا مشكلة تسمى Producer Consumer Problem "مشكلة المنتج والمستهلك".
مثالا علي "مشكلة المنتج والمستهلك" هي ال Compiler وال Assembler.
ال Compiler ينتج Assembly Code اما ال Assembler يستهلك هذا ال Code الناتج من خلال ال Compiler.
وفي هذه الحالة لا يمكن لل Assembler ان يستهلك Code لم يتم انتاجه من خلال Complier حتي هذه اللحظة.

علشان نحل المشكلة استخدمنا مكان معين في ال Memory حتي يتشاركه المنتج والمستهلك.
علشان كده استخدمنا buffer حتي يتمكن المنتج ان يملاءه ويمكن للمستهلك ان يستنفذه, وهكذا لا يمكن للمستهلك ان يستهلك ما لم يتم انتاجه.
في نوعين من ال Buffers.
Bounded buffer
And Unbounded Buffer
ال Bounded buffer يضع حدود علي مساحة ال Buffer بالتالي يجب علي المستهلك ان ينتظر في حال كان ال Buffer فارغ وكذلك علي المنتج ان ينتظر اذا كان ال Buffer ممتليء.
ال Unbounded لا يضع حدود بالتالي يمكن للمنتج ان ينتج اي كمية بينما المستهلك عليه الانتظار في حال كان ال Buffer فارغ.

خلينا نشوف ازاي مشكلة عدم التوافق في ال shared Variable بتحصل.
لو افترضنا انه المنتج يستخدم "++Function "Counter وان المستهلك بيستخدم "--Function "Counter

علي اقل مستوي يمكن ان تتعامل معه الالة "machine" ممكن نمثل ال Counter++ وال Counter-- علي النحو التالي.
++Function Counter
كود:
register1 = counter
register1 = register1 + 1
counter = register1
--Function Counter
كود:
register2 = counter
register2 = register2 - 1
counter = register2
لو افترضنا انه في البداية كان Counter يساوي 5, يمكن ان نمثل طريقة عمل ال --Counter ++ , Counter بالشكل التالي :
وبالتالي تظهر المشكلة عندما تحاول كل Process ان تعطي القيمة النهائية لل Counter. فتكون القيمة النهائية معتمدة علي الترتيب التي اخذت فيه ال Processes ادوارها.
اي انه لو كانت اخر Process هي من قامت بنداء counter-- function فستكون القيمة النهائية لل counter ب 4
اما لو كانت اخر Process هي من قامت بنداء counter++ function فستكون القيمة النهائية لل counter ب 6
وفي الحقيقة القيمة النهائية الصحيحة الوحيدة يجب ان تكون 5 عندما يتم انتاج منتج واحد "counter++" ويتم استهلاك نفس المنتج "counter--" ف يعود ال counter لقيمته الاصلية.
وهذه المشكلة تسمي بال Race Condition لانه يتم التسابق بين ال Processes وبعضها وتكون القيمة النهائية لأخر عملية حدثت.
حبيبنا ليك وحشة والله
بارك الله فيك على هذا الطرح الرائع ومعلومات فعلاً رائعه وشرح جميل
ننتظر جديدك بإذن الله <3
تقبل مروري
ستورم
 

آخر المشاركات

عودة
أعلى