نظام التشغيل 1 - معمل الأسبوع السادس (تزامن الخيوط والاستعصاء في C#)
6 دقائق قراءة
شرائح الدرس
1 / 15
جامعة المنصورة
- الفصل الدراسي الثاني - 2023-2024
- قسم علوم الحاسب
- كلية الحاسبات والمعلومات
- [CS211P] نظام التشغيل (1)
- الفرقة: الثانية
- الأسبوع: 6
- م. أسماء نجيب
التزامن (Synchronization) والاستعصاء (Deadlock) في C#
جدول المحاضرة
- مقدمة
- مثال حجز التذاكر
- طرق تزامن الـ Threads (Thread Synchronization)
- مثال المنتِج والمستهلِك مع المخزن المؤقت المحدود (Bounded Buffer)
- الاستعصاء (Deadlock)
- مثال الفلاسفة الآكلون (Dining Philosophers)
- 3
مقدمة
- المعالج ثنائي النواة ورباعي النواة (متعدد الأنوية):
- ثنائي النواة (Dual Core): يحتوي الجهاز على معالجَين.
- رباعي النواة (Quad Core): يحتوي الجهاز على أربعة معالجات.
- المعالجة المتعددة (Multi Processing):
- يحتوي المعالج الواحد على أكثر من وحدة حساب ومنطق (ALU).
- تعدد المهام (Multi Tasking):
- يستطيع المعالج الواحد الانتقال من عملية (Process) إلى أخرى عبر تبديل السياق (Context Switch).
- تبديل السياق (Context Switch) هو عملية حفظ حالة عملية معيّنة، بحيث يمكن إعادة تحميلها واستئناف تنفيذها لاحقًا.
- i7 مقابل i5 مقابل i3:
- الأرقام 7 و5 و3 لا تعني عدد الأنوية.
- بل ترتبط بأداء المعالج (بما في ذلك سرعة الساعة/Clock Speed).
- المعالج في فئة i7 أسرع من فئة i5، وهذه أسرع من فئة i3.
- 4
مقدمة
- سرعة الساعة (Clock Speed):
- تقيس عدد الدورات (Cycles) التي ينفذها المعالج في الثانية، وتُقاس بالجيجاهرتز (GHz).
- مثال: معالج بسرعة ساعة 3.2 جيجاهرتز ينفذ 3.2 مليار دورة في الثانية.
- دورة ساعة المعالج (Processor Clock Cycle):
- في بعض الأحيان، تُنجَز عدة تعليمات في دورة ساعة واحدة.
- في حالات أخرى، قد تُنفَّذ تعليمة واحدة عبر عدة دورات ساعة.
- تدعم لغة C# التنفيذ المتوازي للكود عبر تعدد الـ Threads (Multithreading).
- مشكلة تعدد الـ Threads:
- يمكن للـ Threads مشاركة البيانات (فهي تملك مرجعًا مشتركًا لنفس نسخة الكائن/Object Instance).
- الحل:
- تزامن الـ Threads (Thread Synchronization).
- 5
مثال حجز التذاكر
- 6
- متغيّر مشترك (Shared Variable)
- المخرجات:
- تُباع نفس التذكرة مرتين
مثال حجز التذاكر
- 7
- متغيّر مشترك (Shared Variable)
- القسم الحرِج (Critical Section)
مثال حجز التذاكر
- 1
- 2
- 3
- 8
Thread 1
- Thread 2
-
- إذا كان (Tickets>0)
- 2a. Register = Tickets
- 2b. إنقاص قيمة الـ register
- 2c. Tickets = register
-
- طباعة "Tickets"
-
- إذا كان (Tickets>0)
- 2a. Register = Tickets
- 2b. إنقاص قيمة الـ register
- 2c. Tickets = register
-
- طباعة "Tickets"
- معالج واحد
- صحيح (True)
- صحيح (True)
- R = 6
- R = 6
- R = 5
- R = 5
- Tickets = 5
- Tickets = 5
- طباعة 5
- طباعة 5
- X
- تُباع التذكرة مرتين
- مثال: عدد التذاكر = 6
- 9
طرق تزامن الـ Threads
- القسم الحرِج (Critical Section):
- هو جزء من الكود يمكن فيه الوصول إلى المتغيّر المشترك.
- يلزم أن يكون التنفيذ داخل القسم الحرِج ذريًّا (Atomic) - أي أن ينفّذ thread واحد فقط القسم الحرِج في أي لحظة.
- يمكن جعل القسم الحرِج ذريًّا باستخدام تزامن الـ threads.
- طرق تزامن الـ threads:
- Lock
- Mutex
- Monitor
- Semaphore
- 10
طرق تزامن الـ Threads
- Lock:
- القفل الحصري (Exclusive Locking) يضمن دخول thread واحد فقط إلى القسم الحرِج في أي لحظة.
- Mutex:
- مثل أسلوب lock، فهو أيضًا قفل حصري (Exclusive Locking).
- أبطأ من أسلوب lock.
- يستخدم توابع WaitOne وReleaseMutex للحصول على القفل وتحريره.
- Monitor:
- مثل أسلوبَي mutex وlock (قفل حصري).
- يستخدم توابع Monitor.Enter وMonitor.Exit للحصول على القفل وتحريره.
- Semaphore:
- يسمح لعدد محدد من الـ threads بالدخول إلى القسم الحرِج.
- الـ semaphore الذي سعته thread واحد يُسمّى Binary Semaphore، وهو مشابه لـ lock وmutex وmonitor.
- الـ semaphore الذي سعته أكثر من thread واحد يُسمّى General Semaphore.
- 11
تزامن الـ Threads (Lock)
- 12
- المخرجات:
تزامن الـ Threads (Mutex)
- 13
- المخرجات:
تزامن الـ Threads (Monitor)
- 14
- المخرجات:
تزامن الـ Threads (Binary Semaphore)
- 15
- المخرجات:
تزامن الـ Threads (General Semaphore)
- مثال المنتِج والمستهلِك مع المخزن المؤقت المحدود (Bounded Buffer Producer and Consumer):
- المخزن المؤقت (Buffer) عبارة عن مكدّس (Stack) بأسلوب LIFO (الأخير يدخل أولًا يخرج).
- لا يستطيع المستهلِك (Consumer) استهلاك عناصر إلا بعد أن ينتجها المنتِج (Producer).
- عندما يمتلئ المخزن المؤقت تمامًا، لا يستطيع المنتِج إنتاج عنصر جديد.
- يجب ألا يصل المنتِج والمستهلِك إلى المخزن المؤقت المشترك في نفس اللحظة.
- 16
- D | Z | Y | X | | | | | |
- المنتِج (Producer)
- المستهلِك (Consumer)
- ممتلئ (Full) = 4
- فارغ (Empty) = 6
مثال المنتِج والمستهلِك مع المخزن المؤقت المحدود
- 17
- المخرجات:
الاستعصاء (Deadlock)
- الاستعصاء (Deadlock) هو حالة تحدث عندما تدخل أي عملية في حالة انتظار لأن عملية أخرى في حالة انتظار تحتجز المورد المطلوب.
- مثال: مسألة الفلاسفة الآكلين (Dining Philosophers Problem)
- 18
مثال الفلاسفة الآكلون
- 19
مثال الفلاسفة الآكلون
- 20
- يحدث الاستعصاء عندما يلتقط كل فيلسوف الشوكة اليمنى في نفس اللحظة
مثال الفلاسفة الآكلون
- 21
- يحدث الاستعصاء عندما يلتقط كل فيلسوف الشوكة اليمنى في نفس اللحظة
- الفيلسوف 1
- الفيلسوف 2
- معالج واحد
- الفيلسوف 3
- الفيلسوف 4
- الفيلسوف 5
-
- التقاط الشوكة 1
-
- انتظار الشوكة 5
-
- التقاط الشوكة 2
-
- انتظار الشوكة 1
-
- التقاط الشوكة 3
-
- انتظار الشوكة 2
-
- التقاط الشوكة 4
-
- انتظار الشوكة 3
-
- التقاط الشوكة 5
-
- انتظار الشوكة 4
- انتظار
- انتظار
- انتظار
- انتظار
- انتظار
- استعصاء (Deadlock)
مثال الفلاسفة الآكلون
- من بعض الطرق لتجنب الاستعصاء ما يلي:
- ألا يزيد عدد الفلاسفة على الطاولة عن أربعة.
- يلتقط الفيلسوف ذو الرقم الزوجي الشوكة اليمنى ثم اليسرى، بينما يلتقط الفيلسوف ذو الرقم الفردي الشوكة اليسرى ثم اليمنى.
- ألا يُسمَح لفيلسوف بالتقاط شوكتيه إلا إذا كانتا متاحتين في نفس اللحظة.
- 22
مثال الفلاسفة الآكلون (حل الاستعصاء)
- 23
- يلتقط الفيلسوف شوكتيه فقط إذا كانتا متاحتين في نفس اللحظة
هل من أسئلة؟
- التالي ....
- 24