Mr_Code
مشرف سابق




السمعة:
في الموضوع السابق تعرضنا لمفهوم جديد يسمى بال Critical Section, وملخصه هو ان ال Critical Section هي منطقة بال Code تقوم العمليات "Processes" بالتعديل على متغير مشترك فيما بينها ولا يمكن لأكثر من عملية ان تدخل هذه المنطقة في آن واحد. رابط الموضوع كامل من هنا ---> Critical Section Problem بالعربي
في هذا الموضوع سنشرح طريقة لحل هذه المشكلة باستخدام حل برمجي "Software Solution"
وبذلك يمكننا حل مشكلة عدم الاتساق بين العمليات المتعاونة مع بعضها.
هذا المتغير يمكن الوصول اليه من خلال عمليتين محددتين Two Methods وهما ()wait() , signal ويرمز لهما ب ()P -Proberen-to-Test For Wait و ()V-Verhogen-To increment For Signal
والكلمتان Proberen و Verhogen يعود أصلهما للغة الهولندية اللغة الام لمخترع هذا الحل وهو Edsger Dijkstra.
سنتعرض الآن الى عمليتي wait , signal حتي نستطيع فهم طريقة عمل ال Semaphore.
كما نرى في الصورة التالية فإن تعريف عملية wait ما هو إلا while loop وبها سؤال عن قيمة المتغير Semaphore ويرمز له بالرمز S والسؤال هو هل قيمة المتغير أقل من أو تساوي الصفر؟ ان كانت كذلك فهذا يعني انه توجد بالفعل عملية في ال Critical Section الخاص بها وهي تقوم الآن باستخدام ال Shared Variable او ال Shared Resource وبالتالي فإن العملية الحالية عليها الانتظار حتى تنتهي العمليات الأخرى من التنفيذ.
أما إذا كانت قيمة ال Semaphore S موجبة فهذا يعني أنه يمكن للعملية ان تدخل ال Critical Section الخاص بها وتقوم العملية بإنقاص قيمة ال Semaphore S حتى تخبر باقي العمليات بأنها موجودة بالفعل في ال Critical Section.
أما بالنسبة لعملية ال Signal فهي بكل بساطة طريقة لاخبار أي عملية أو Process منتظرة أن العملية الحالية قد اتمت بالفعل تنفيذ ما تريد وأنه يمكن للعملية المنتظرة ان تبدأ بتنفيذ عملياتها في ال Critical Section.
مثال على طريقة عمل البرمجية:
اذا افترضنا انه قيمة ال Semaphore S الابتدائية ب 2.
وبهذا نكون قد انتهينا من شرح الـ Semaphores والشكر الله تعالى على ما قد منَّ علينا من نِعَمِه وعونه لنا على كتابة هذا الموضوع والسلام عليكم.
في هذا الموضوع سنشرح طريقة لحل هذه المشكلة باستخدام حل برمجي "Software Solution"
Semaphores
ال Semaphore هو ببساطة حل برمجي يمثل في هيئة متغير من نوع رقم int للدلالة على إمكانية دخول العملية الى الـ Critical Section الخاص بها واستخدام المتغير المشترك Shared Variable.وبذلك يمكننا حل مشكلة عدم الاتساق بين العمليات المتعاونة مع بعضها.
هذا المتغير يمكن الوصول اليه من خلال عمليتين محددتين Two Methods وهما ()wait() , signal ويرمز لهما ب ()P -Proberen-to-Test For Wait و ()V-Verhogen-To increment For Signal
والكلمتان Proberen و Verhogen يعود أصلهما للغة الهولندية اللغة الام لمخترع هذا الحل وهو Edsger Dijkstra.
سنتعرض الآن الى عمليتي wait , signal حتي نستطيع فهم طريقة عمل ال Semaphore.
كما نرى في الصورة التالية فإن تعريف عملية wait ما هو إلا while loop وبها سؤال عن قيمة المتغير Semaphore ويرمز له بالرمز S والسؤال هو هل قيمة المتغير أقل من أو تساوي الصفر؟ ان كانت كذلك فهذا يعني انه توجد بالفعل عملية في ال Critical Section الخاص بها وهي تقوم الآن باستخدام ال Shared Variable او ال Shared Resource وبالتالي فإن العملية الحالية عليها الانتظار حتى تنتهي العمليات الأخرى من التنفيذ.
أما إذا كانت قيمة ال Semaphore S موجبة فهذا يعني أنه يمكن للعملية ان تدخل ال Critical Section الخاص بها وتقوم العملية بإنقاص قيمة ال Semaphore S حتى تخبر باقي العمليات بأنها موجودة بالفعل في ال Critical Section.
أما بالنسبة لعملية ال Signal فهي بكل بساطة طريقة لاخبار أي عملية أو Process منتظرة أن العملية الحالية قد اتمت بالفعل تنفيذ ما تريد وأنه يمكن للعملية المنتظرة ان تبدأ بتنفيذ عملياتها في ال Critical Section.
مثال على طريقة عمل البرمجية:
اذا افترضنا انه قيمة ال Semaphore S الابتدائية ب 2.
- في البداية تأتي اول عملية Process تريد ان تدخل ال Critical Section الخاص بها, فتنادي ()Function Wait ف تجد ان الرد علي سؤال هل قيمة ال Semaphore S اقل من او يساوي صفر هو لا بالتالي يمكنها ان تبدأ بتنفيذ مهمتها في ال Critical Section وإنقاص قيمة ال Semaphore S الحالي بمقدار 1.
- مع ثاني عملية تريد الدخول تنادي Function Wait وتسأل نفس السؤال فتجد أن قيمة ال Semaphore الحالية موجبة وتساوي 1 فبالتالي تبدأ بتنفيذ مهمتها هي الاخرى وتنقص مقدار ال Semaphore S بمقدار 1 فتصبح القيمة الحالية له ب صفر 0.
- عندما تأتي ثالث عملية تجد ان قيمة ال Semaphore الحالية ب صفر ف تظل بداخل ال While Loop لا يمكنها الخروج إلا عندما تنتهي عملية أخرى موجودة بالفعل.
- في حال انتهاء أول مهمة من تنفيذ عملياتها, بإمكانها مناداة Function Signal لتخبر أي عملية اخرى في الانتظار انه مسموح لها ان تبدأ بالدخول وتنفيذ عملياتها الآن.
وبهذا نكون قد انتهينا من شرح الـ Semaphores والشكر الله تعالى على ما قد منَّ علينا من نِعَمِه وعونه لنا على كتابة هذا الموضوع والسلام عليكم.
المرفقات
التعديل الأخير بواسطة المشرف: