طريقة عملنا Syncالتسلسل: مشكلة القسم الحرج في نظام التشغيل
⚡ ملخص ذكي
طريقة عملنا Syncالتزامن هو مهمة تنسيق تنفيذ العمليات بحيث لا تصل عمليتان إلى نفس البيانات أو الموارد المشتركة في الوقت نفسه. ويمنع عدم اتساق البيانات في الأنظمة متعددة العمليات من خلال التحكم في الدخول إلى القسم الحرج.

ما هي العملية Synchronization؟
طريقة عملنا Syncكرونة هي مهمة تنسيق تنفيذ العمليات بطريقة لا يمكن لأي عمليتين الوصول إلى نفس البيانات والموارد المشتركة.
وهو أمر ضروري بشكل خاص في نظام متعدد العمليات عندما تعمل عمليات متعددة معًا، وتحاول أكثر من عملية واحدة الوصول إلى نفس المورد أو البيانات المشتركة في نفس الوقت.
قد يؤدي ذلك إلى عدم اتساق البيانات المشتركة. لذا، فإن التغيير الذي يُجريه أحد العمليات لا ينعكس بالضرورة عند وصول العمليات الأخرى إلى نفس البيانات المشتركة. ولتجنب هذا النوع من عدم اتساق البيانات، يجب مزامنة العمليات فيما بينها.
كيف العملية Syncيعمل كرونة؟
على سبيل المثال، يقوم البرنامج (أ) بتغيير البيانات في موقع ذاكرة معين، بينما يحاول برنامج آخر (ب) قراءة البيانات من... نفسه موقع الذاكرة. هناك احتمال كبير أن تكون البيانات المقروءة بواسطة العملية الثانية خاطئة.
أقسام البرنامج
فيما يلي أربعة عناصر أساسية للقسم الحرج:
- قسم الدخول: إنه جزء من العملية التي تقرر دخول عملية معينة.
- جزء حرج: يسمح هذا الجزء لعملية واحدة بإدخال وتعديل المتغير المشترك.
- قسم الخروج: يسمح قسم الخروج للعمليات الأخرى المنتظرة في قسم الدخول بالدخول إلى القسم الحرج. كما يتحقق من ضرورة إزالة أي عملية انتهت من تنفيذها من خلال هذا القسم.
- قسم الباقي: جميع الأجزاء الأخرى من Codeأما الأقسام التي لا تقع في الأقسام الحرجة، وأقسام الدخول، وأقسام الخروج، فتُعرف باسم قسم الباقي.
ما هي مشكلة القسم الحرج؟
القسم الحرج هو جزء من التعليمات البرمجية يمكن الوصول إليه بواسطة عملية واحدة في وقت محدد. ويتكون هذا القسم من موارد بيانات مشتركة تحتاج العمليات الأخرى إلى الوصول إليها.
- تتم معالجة الإدخال إلى القسم الحرج بواسطة وظيفة الانتظار () ويتم تمثيله كـ P ().
- يتم التحكم في الخروج من القسم الحرج بواسطة الدالة signal()، الممثلة بالرمز V().
في القسم الحرج، يمكن تنفيذ عملية واحدة فقط. تحتاج العمليات الأخرى، التي تنتظر تنفيذ القسم الحرج الخاص بها، إلى الانتظار حتى تكتمل العملية الحالية تنفيذها.
قواعد القسم النقدي
يجب على القسم الحرج تطبيق القواعد الثلاث جميعها:
- استبعاد متبادل: الاستبعاد المتبادل هو نوع خاص من الإشارة الثنائية يُستخدم للتحكم في الوصول إلى المورد المشترك. يتضمن آلية وراثة الأولوية لتجنب مشاكل انعكاس الأولوية الموسعة. لا يمكن تنفيذ أكثر من عملية واحدة في قسمها الحرج في وقت واحد.
- التقدم: يُستخدم هذا الحل عندما لا يكون هناك أحد في القسم الحرج، ويريد شخص ما الدخول. عندئذٍ يجب على تلك العمليات غير الموجودة في قسمها المتبقي أن تقرر من يجب أن يدخل، في وقت محدد.
- الانتظار المقيد: عندما يطلب أحد العمليات الدخول إلى القسم الحرج، هناك حدٌّ أقصى لعدد العمليات التي يمكنها الدخول إلى هذا القسم. لذا، عند بلوغ هذا الحد، يجب على النظام السماح للعملية بالدخول إلى قسمها الحرج.
حلول للقسم النقدي
تحت المعالجة Syncفي عملية التزامن، يلعب القسم الحرج الدور الرئيسي، لذا يجب حل المشكلة.
فيما يلي بعض الطرق المستخدمة على نطاق واسع لحل مشكلة القسم الحرج.
حل بيترسون
يُعدّ حل بيترسون حلاً شائع الاستخدام لمشاكل المقاطع الحرجة. وقد طوّر هذه الخوارزمية عالم حاسوب يُدعى بيترسون، ومن هنا جاءت تسميتها.
في هذا الحل، عندما يتم تنفيذ عملية ما في حالة حرجة، فإن العملية الأخرى تنفذ فقط بقية التعليمات البرمجية، ويمكن أن يحدث العكس. تساعد هذه الطريقة أيضًا على التأكد من تشغيل عملية واحدة فقط في القسم الحرج في وقت محدد.
مثال
PROCESS Pi
FLAG[i] = true
while( (turn != i) AND (CS is !free) ){ wait;
}
CRITICAL SECTION FLAG[i] = false
turn = j; //choose another process to go to CS
- لنفترض أن هناك N عملية (P1، P2، ... PN) وكل عملية في وقت ما تتطلب الدخول إلى القسم الحرج.
- يتم الاحتفاظ بمصفوفة FLAG[] بحجم N، وقيمتها الافتراضية هي خطأ. لذا، عندما يحتاج أي برنامج إلى الدخول إلى القسم الحرج، عليه أن يُعيّن قيمة FLAG[i] إلى صحيح. على سبيل المثال، إذا أراد البرنامج Pi الدخول، فسيُعيّن FLAG[i]=TRUE.
- يشير متغير آخر يسمى TURN إلى رقم العملية التي تنتظر حاليًا الدخول إلى CS.
- العملية التي تدخل في القسم الحرج أثناء الخروج ستغير TURN إلى رقم آخر من قائمة العمليات الجاهزة.
- مثال: إذا كان رقم الدور 2، فإن P2 يدخل القسم الحرج وأثناء الخروج يكون رقم الدور 3 وبالتالي يخرج P3 من حلقة الانتظار.
Syncالأجهزة كرونة
أحيانًا تُحل مشاكل القسم الحرج بواسطة مكونات مادية. توفر بعض أنظمة التشغيل خاصية القفل، حيث يحصل المعالج على قفل عند دخوله القسم الحرج، ثم يُحرر القفل بعد مغادرته.
لذلك عندما تحاول عملية أخرى الدخول إلى القسم الحرج، فلن تتمكن من الدخول لأنها مقفلة. ولا يمكنه القيام بذلك إلا إذا كان مجانيًا عن طريق الحصول على القفل نفسه.
أقفال موتيكس
Syncلا تُعد أجهزة التزامن طريقة بسيطة للتنفيذ بالنسبة للجميع، لذلك تم أيضًا تقديم طريقة برمجية صارمة تُعرف باسم أقفال Mutex.
في هذا الأسلوب، في قسم إدخال التعليمات البرمجية، يتم الحصول على قفل على الموارد الهامة المستخدمة داخل القسم الحرج. في قسم الخروج يتم تحرير هذا القفل.
Semaphore الحلول
Semaphore هو ببساطة متغير غير سالب ومشترك بين الخيوط. وهو خوارزمية أو حل آخر لمشكلة القسم الحرج. وهو آلية إشارة، حيث يمكن لخيط ينتظر إشارة أن يتلقى إشارة من خيط آخر.
يستخدم عمليتين ذريتين: 1) الانتظار، و 2) الإشارة لمزامنة العملية.
مثال
WAIT ( S ): while ( S <= 0 ); S = S - 1; SIGNAL ( S ): S = S + 1;


