Logo

نظام التشغيل 1 - معمل الأسبوع السادس (تزامن الخيوط والاستعصاء في C#)

6 دقائق قراءة
شرائح الدرس
1 / 15

نظام التشغيل (1) - معمل الأسبوع السادس

تزامن الخيوط والاختناق (Deadlock) في C#: الأقفال، والميوتكس، والمراقبات، والإشارات، ومشكلة الفلاسفة الآكلين

جامعة المنصورة

  • الفصل الدراسي الثاني - 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
    1. إذا كان (Tickets>0)
  • 2a. Register = Tickets
  • 2b. إنقاص قيمة الـ register
  • 2c. Tickets = register
    1. طباعة "Tickets"
    1. إذا كان (Tickets>0)
  • 2a. Register = Tickets
  • 2b. إنقاص قيمة الـ register
  • 2c. Tickets = register
    1. طباعة "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. التقاط الشوكة 1
    1. انتظار الشوكة 5
    1. التقاط الشوكة 2
    1. انتظار الشوكة 1
    1. التقاط الشوكة 3
    1. انتظار الشوكة 2
    1. التقاط الشوكة 4
    1. انتظار الشوكة 3
    1. التقاط الشوكة 5
    1. انتظار الشوكة 4
  • انتظار
  • انتظار
  • انتظار
  • انتظار
  • انتظار
  • استعصاء (Deadlock)

مثال الفلاسفة الآكلون

  • من بعض الطرق لتجنب الاستعصاء ما يلي:
  • ألا يزيد عدد الفلاسفة على الطاولة عن أربعة.
  • يلتقط الفيلسوف ذو الرقم الزوجي الشوكة اليمنى ثم اليسرى، بينما يلتقط الفيلسوف ذو الرقم الفردي الشوكة اليسرى ثم اليمنى.
  • ألا يُسمَح لفيلسوف بالتقاط شوكتيه إلا إذا كانتا متاحتين في نفس اللحظة.
  • 22

مثال الفلاسفة الآكلون (حل الاستعصاء)

  • 23
  • يلتقط الفيلسوف شوكتيه فقط إذا كانتا متاحتين في نفس اللحظة

هل من أسئلة؟

  • التالي ....
  • 24