CS351 · مراجعة شاملة

مراجعة الاختبار النصفي - أنظمة التشغيل

يغطي منهج الاختبار من الوحدة 1 إلى 6

1 مقدمة وخدمات نظم التشغيل

نظام التشغيل هو الوسيط الأساسي الذي يدير موارد الحاسب ويوفر بيئة آمنة وفعالة لتنفيذ البرامج.

1.1 تعريف نظام التشغيل وأهدافه

برنامج يعمل كوسيط بين مستخدم الحاسب والأجهزة المادية (Hardware)، ويدير الموارد بكفاءة.

نظام التشغيل هو مخصص للموارد (Resource Allocator) وبرنامج تحكم (Control Program).

أهدافه الرئيسية هي: تنفيذ برامج المستخدم وتسهيل حل المشكلات، جعل نظام الحاسب مريحاً للاستخدام من خلال توفير تجريد (Abstraction) للبرامج، واستخدام الأجهزة المادية بطريقة فعالة.

لا يوجد تعريف عالمي متفق عليه، ولكن غالباً ما يُشار إلى 'النواة' (Kernel) على أنها البرنامج الوحيد الذي يعمل طوال الوقت على الحاسب.

1.2 المقاطعات وعمليات الإدخال والإخراج

إشارة تُرسل إلى المعالج (CPU) لإيقاف عمله الحالي والتعامل مع حدث مهم، مثل انتهاء عملية إدخال/إخراج.

تعمل أجهزة الإدخال والإخراج والمعالج بشكل متزامن. كل وحدة تحكم بجهاز (Device Controller) مسؤولة عن نوع معين من الأجهزة ولديها مخزن مؤقت محلي (Local Buffer).

عندما يطلب برنامج عملية إدخال/إخراج، يقوم متحكم الجهاز بنقل البيانات. بمجرد الانتهاء، يُعلم متحكم الجهاز المعالج عن طريق إحداث 'مقاطعة' (Interrupt).

يقوم نظام التشغيل بحفظ حالة المعالج (السجلات وعداد البرنامج) ثم ينقل التحكم إلى روتين خدمة المقاطعة (Interrupt Service Routine) المناسب.

1.3 هرمية التخزين والوصول المباشر للذاكرة (DMA)

تنظيم وسائط التخزين بناءً على السرعة، التكلفة، والتطاير. و DMA هي تقنية لنقل البيانات الكبيرة للذاكرة دون إشغال المعالج.

تُنظم أنظمة التخزين في هرمية: السجلات (Registers) هي الأسرع والأصغر، تليها الذاكرة المخبئية (Cache)، ثم الذاكرة الرئيسية (Main Memory)، ثم الأقراص الصلبة (Magnetic Disks).

التخزين المؤقت (Caching) هو نسخ المعلومات إلى نظام تخزين أسرع مؤقتاً.

بالنسبة لأجهزة الإدخال والإخراج السريعة، يُستخدم 'الوصول المباشر للذاكرة' (DMA)، حيث تقوم وحدة تحكم الجهاز بنقل كتل من البيانات مباشرة إلى الذاكرة الرئيسية دون تدخل المعالج، مما يولد مقاطعة واحدة لكل كتلة بدلاً من مقاطعة لكل بايت.

1.4 التشغيل المزدوج والمؤقت

آلية حماية تعتمد على الأجهزة لفصل أوامر المستخدم (User Mode) عن أوامر النظام الحساسة (Kernel Mode).

يسمح التشغيل المزدوج (Dual-mode operation) لنظام التشغيل بحماية نفسه ومكونات النظام الأخرى.

يتم توفير 'بت الوضع' (Mode bit) بواسطة الأجهزة: وضع المستخدم (User mode = 1) ووضع النواة (Kernel mode = 0).

بعض التعليمات تُصنف كـ 'تعليمات ذات امتياز' (Privileged instructions) ولا يمكن تنفيذها إلا في وضع النواة. نداء النظام (System Call) يغير الوضع إلى النواة، والعودة من النداء تعيده إلى المستخدم.

بالإضافة إلى ذلك، يُستخدم 'المؤقت' (Timer) لمنع البرامج من الدخول في حلقة لا نهائية أو احتكار الموارد، حيث يولد مقاطعة بعد فترة زمنية محددة.

1.5 نداءات النظام وواجهات برمجة التطبيقات (APIs)

الواجهة البرمجية التي تطلب من خلالها برامج المستخدم خدمات من نظام التشغيل.

نداءات النظام (System Calls) توفر واجهة للخدمات التي يقدمها نظام التشغيل. تُكتب عادةً بلغات عالية المستوى (C أو C++).

بدلاً من استخدام نداءات النظام مباشرة، تصل البرامج إليها غالباً عبر واجهة برمجة التطبيقات (API) مثل Win32 لـ Windows، و POSIX لأنظمة UNIX/Linux، و Java API.

هناك ثلاث طرق رئيسية لتمرير المعلمات (Parameters) لنظام التشغيل: عبر السجلات (Registers)، عبر كتلة/جدول في الذاكرة (Block/Table) وتمرير عنوانها في سجل، أو دفعها في المكدس (Stack) وسحبها بواسطة نظام التشغيل.

1.6 هيكلة المعالجات المتعددة

أنظمة تحتوي على أكثر من معالج لزيادة الإنتاجية والموثوقية.

تنمو أنظمة المعالجات المتعددة (Multiprocessors) في الاستخدام والأهمية. تُعرف أيضاً بالأنظمة المتوازية (Parallel systems).

مزاياها تشمل: زيادة الإنتاجية (Increased throughput)، اقتصاديات الحجم (Economy of scale)، وزيادة الموثوقية (التدهور الرشيق أو التسامح مع الأخطاء).

هناك نوعان: المعالجة المتعددة غير المتماثلة (Asymmetric Multiprocessing) حيث يُخصص لكل معالج مهمة محددة، والمعالجة المتعددة المتماثلة (Symmetric Multiprocessing - SMP) حيث يقوم كل معالج بتنفيذ جميع المهام.

2 العمليات والخيوط (المسارات)

العملية هي برنامج قيد التنفيذ، والخيوط هي وحدات تنفيذ أصغر داخل العملية تتشارك الموارد لزيادة الكفاءة.

2.1 مفهوم العملية وتخطيط الذاكرة

العملية هي برنامج قيد التنفيذ، وتتكون من أربعة أقسام رئيسية في الذاكرة: النص، البيانات، الكومة، والمكدس.

البرنامج بحد ذاته ليس عملية؛ العملية هي كيان نشط.

تنقسم ذاكرة العملية إلى: قسم النص (Text) الذي يحتوي على الكود القابل للتنفيذ، قسم البيانات (Data) للمتغيرات العامة، الكومة (Heap) للذاكرة المخصصة ديناميكياً أثناء التشغيل، والمكدس (Stack) لتخزين البيانات المؤقتة عند استدعاء الدوال (مثل المعاملات، عناوين العودة، والمتغيرات المحلية).

2.2 حالات العملية وكتلة التحكم (PCB)

تتغير حالة العملية أثناء تنفيذها (جديدة، جاهزة، قيد التشغيل، منتظرة، منتهية)، ويتم تتبع كل معلوماتها في كتلة التحكم في العملية (PCB).

الحالات الخمس هي: New (قيد الإنشاء)، Running (التعليمات قيد التنفيذ)، Waiting (تنتظر حدثاً مثل إدخال/إخراج)، Ready (تنتظر تخصيص المعالج)، و Terminated (انتهى التنفيذ).

يمثل نظام التشغيل كل عملية باستخدام PCB الذي يحتوي على: حالة العملية، عداد البرنامج (PC)، سجلات وحدة المعالجة المركزية، معلومات الجدولة، إدارة الذاكرة، المحاسبة، ومعلومات حالة الإدخال/الإخراج.

2.3 الجدولة وتبديل السياق

يختار المجدول العمليات من طابور الجاهزية لتنفيذها. تبديل السياق هو عملية حفظ حالة العملية القديمة وتحميل حالة العملية الجديدة، وهو عبء إضافي (Overhead).

الهدف من الجدولة هو تعظيم استخدام وحدة المعالجة المركزية (CPU).

يحتفظ النظام بطوابير: طابور الجاهزية (Ready Queue) للعمليات الموجودة في الذاكرة وتنتظر التنفيذ، وطوابير الانتظار (Wait Queues) للعمليات التي تنتظر حدثاً (مثل I/O).

عند التبديل بين العمليات، يقوم النظام بـ تبديل السياق (Context Switch)، حيث يحفظ حالة العملية الحالية في الـ PCB الخاص بها ويحمل حالة العملية التالية.

هذا الوقت يعتبر عبئاً صافياً (Pure Overhead) لأن النظام لا يقوم بأي عمل مفيد خلاله.

2.4 العمليات على العمليات (الإنشاء والإنهاء)

تنشئ العملية الأب عمليات أبناء. يمكن للأب أن ينتظر إنهاء الابن أو يعمل بالتزامن معه. تنتهي العملية عندما تطلب من النظام حذفها.

إنشاء العملية: العملية المنشِئة تسمى الأب (Parent) والجديدة تسمى الابن (Child). هناك احتمالان للتنفيذ: الأب يستمر بالتزامن مع الابن، أو الأب ينتظر حتى ينتهي الابن. بالنسبة لمساحة العنوان: إما أن يكون الابن نسخة مطابقة للأب، أو يتم تحميل برنامج جديد فيه.

إنهاء العملية: تنتهي العملية عند تنفيذ آخر تعليمة. يمكن للأب إنهاء الابن إذا تجاوز الابن موارده، أو لم تعد المهمة مطلوبة، أو إذا كان الأب يخرج ونظام التشغيل لا يسمح للأبناء بالاستمرار (Cascading Termination).

2.5 الاتصال بين العمليات (IPC)

تتواصل العمليات المتعاونة إما عبر مشاركة منطقة من الذاكرة (Shared Memory) أو عبر إرسال واستقبال الرسائل (Message Passing).

العمليات قد تكون مستقلة أو متعاونة. أسباب التعاون تشمل: مشاركة المعلومات، تسريع الحسابات، والنمطية (Modularity).

يوجد نموذجان رئيسيان لـ IPC:

  1. الذاكرة المشتركة (Shared Memory): منطقة ذاكرة تتشاركها العمليات. الاتصال سريع ويتم التحكم فيه بواسطة العمليات نفسها، لكنه يتطلب آليات مزامنة (Synchronization) لمنع التعارض.
  2. تمرير الرسائل (Message Passing): يتم الاتصال دون متغيرات مشتركة باستخدام عمليتي `send()` و `receive()`. يمكن أن يكون الاتصال مباشراً (تسمية العملية صراحة) أو غير مباشر (عبر صناديق البريد/المنافذ).

2.6 الخيوط والبرمجة متعددة الأنوية

الخيط (Thread) هو وحدة أساسية لاستخدام المعالج. التطبيقات متعددة الخيوط أكثر استجابة وتوفر الموارد، وتستفيد من المعالجات متعددة الأنوية.

تتشارك الخيوط داخل نفس العملية في قسم الكود، البيانات، والملفات، لكن لكل خيط سجلاته الخاصة ومكدسه (Stack) وعداد البرنامج (PC).

فوائد الخيوط: الاستجابة (استمرار التنفيذ إذا توقف جزء)، مشاركة الموارد (أسهل من IPC)، الاقتصاد (إنشاء الخيوط وتبديلها أرخص من العمليات)، وقابلية التوسع (استغلال الأنوية المتعددة).

تحديات الأنوية المتعددة: تقسيم الأنشطة، التوازن، تقسيم البيانات، الاعتمادية على البيانات، والاختبار وتصحيح الأخطاء.

2.7 نماذج تعدد الخيوط

تربط نماذج تعدد الخيوط بين خيوط المستخدم (User Threads) وخيوط النواة (Kernel Threads) بثلاث طرق: متعدد-إلى-واحد، واحد-إلى-واحد، ومتعدد-إلى-متعدد.

تُدار خيوط المستخدم بواسطة مكتبات في مساحة المستخدم (مثل POSIX Pthreads, Java threads)، بينما تُدعم خيوط النواة مباشرة من نظام التشغيل.

  1. Many-to-One: عدة خيوط مستخدم ترتبط بخيط نواة واحد. إذا توقف خيط واحد (Block)، تتوقف جميعها. لا تستفيد من الأنوية المتعددة.
  2. One-to-One: كل خيط مستخدم يرتبط بخيط نواة. يوفر تزامناً أعلى، لكن إنشاء خيط مستخدم يتطلب إنشاء خيط نواة (عبء إضافي). مستخدم في Windows و Linux.
  3. Many-to-Many: عدة خيوط مستخدم ترتبط بعدة خيوط نواة. مرن جداً لكنه معقد وغير شائع حالياً.

3 جدولة وحدة المعالجة المركزية

تحديد العملية التي ستحصل على المعالج تالياً لتعظيم الكفاءة وتقليل أوقات الانتظار والاستجابة.

3.1 مجدول وحدة المعالجة المركزية والمُرحّل

المجدول يختار العملية التالية للتنفيذ، والمُرحّل يمنحها السيطرة الفعلية على المعالج.

يقوم مجدول وحدة المعالجة المركزية (CPU Scheduler) باختيار عملية من طابور الانتظار (Ready Queue) لتخصيص المعالج لها. يمكن أن تكون الجدولة استباقية (Preemptive) حيث يمكن مقاطعة العملية، أو غير استباقية (Nonpreemptive) حيث تحتفظ العملية بالمعالج حتى تنتهي أو تنتظر.

المُرحّل (Dispatcher) هو الوحدة التي تمنح السيطرة للعملية المختارة، ويتضمن ذلك تبديل السياق (Context Switch)، التبديل لوضع المستخدم، والقفز للموقع المناسب لاستئناف البرنامج. الوقت المستغرق في هذه العملية يسمى زمن انتقال المُرحّل (Dispatch Latency).

3.2 معايير الجدولة

المقاييس المستخدمة لتقييم ومقارنة خوارزميات الجدولة المختلفة.

لتقييم خوارزميات الجدولة، نستخدم عدة معايير:

  • استخدام المعالج (CPU utilization): إبقاء المعالج مشغولاً قدر الإمكان (الهدف: الحد الأقصى).
  • الإنتاجية (Throughput): عدد العمليات المكتملة في وحدة الزمن (الهدف: الحد الأقصى).
  • وقت الاستدارة (Turnaround time): الوقت الإجمالي لتنفيذ عملية معينة من لحظة وصولها حتى اكتمالها (الهدف: الحد الأدنى).
  • وقت الانتظار (Waiting time): الوقت الذي تقضيه العملية في طابور الانتظار (الهدف: الحد الأدنى).
  • وقت الاستجابة (Response time): الوقت من تقديم الطلب حتى إنتاج أول استجابة (الهدف: الحد الأدنى).

3.3 جدولة القادم أولاً يُخدم أولاً (FCFS)

العملية التي تطلب المعالج أولاً تحصل عليه أولاً، مثل الطابور في المتجر.

خوارزمية FCFS هي أبسط خوارزميات الجدولة. يتم تنفيذ العمليات بالترتيب الذي تصل به. هي خوارزمية غير استباقية.

العيب الرئيسي لها هو تأثير القافلة (Convoy Effect)، حيث تنتظر العمليات القصيرة خلف عملية واحدة طويلة جداً، مما يؤدي إلى زيادة كبيرة في متوسط وقت الانتظار.

3.4 جدولة أقصر وظيفة أولاً (SJF)

تخصيص المعالج للعملية ذات أقصر وقت تنفيذ قادم لتقليل وقت الانتظار.

خوارزمية SJF تربط كل عملية بطول فترة استخدام المعالج القادمة لها. يتم جدولة العملية ذات الوقت الأقصر. تعتبر هذه الخوارزمية مثالية (Optimal) لأنها تعطي أقل متوسط وقت انتظار لمجموعة معينة من العمليات.

النسخة الاستباقية منها تسمى أقصر وقت متبقي أولاً (Shortest-Remaining-Time-First).

الصعوبة الرئيسية هي معرفة طول فترة المعالج القادمة، ولذلك يتم تقديرها باستخدام المتوسط الأسي (Exponential Averaging) بناءً على الفترات السابقة.

معادلة المتوسط الأسي لتقدير طول فترة المعالج القادمة. \[\tau_{n+1} = \alpha t_n + (1 - \alpha)\tau_n\]

3.5 جدولة راوند روبن (Round Robin)

إعطاء كل عملية حصة زمنية صغيرة متساوية بالتناوب.

في خوارزمية Round Robin (RR)، تحصل كل عملية على وحدة صغيرة من وقت المعالج تسمى الحصة الزمنية (Time Quantum - q)، عادة بين 10-100 مللي ثانية.

بعد انقضاء هذا الوقت، تتم مقاطعة العملية (Preempted) وإضافتها إلى نهاية طابور الانتظار. لا تنتظر أي عملية أكثر من $(n-1)q$ من الوقت.

أداء الخوارزمية يعتمد بشدة على حجم $q$.

3.6 جدولة الأولوية

تنفيذ العمليات بناءً على رقم أولوية محدد؛ الأعلى أولوية يُنفذ أولاً.

في جدولة الأولوية، يتم ربط رقم أولوية (عدد صحيح) بكل عملية. يُخصص المعالج للعملية ذات الأولوية الأعلى (عادةً الرقم الأصغر يعني أولوية أعلى). يمكن أن تكون استباقية أو غير استباقية.

المشكلة الكبرى هنا هي المجاعة (Starvation)، حيث قد لا يتم تنفيذ العمليات ذات الأولوية المنخفضة أبداً إذا استمرت العمليات ذات الأولوية العالية بالوصول.

الحل هو التقادم (Aging)، وهو زيادة أولوية العملية تدريجياً بمرور الوقت.

3.7 الطوابير متعددة المستويات

تقسيم طابور الانتظار إلى عدة طوابير منفصلة بناءً على نوع العملية.

في الطوابير متعددة المستويات (Multilevel Queue)، يتم تقسيم طابور الانتظار إلى طوابير منفصلة (مثل: عمليات النظام، العمليات التفاعلية، عمليات الدفعات). كل طابور له خوارزمية الجدولة الخاصة به. يتم جدولة العمليات في الطابور ذي الأولوية الأعلى أولاً.

طابور الملاحظات متعدد المستويات (Multilevel Feedback Queue) يسمح للعمليات بالانتقال بين الطوابير؛ فإذا استهلكت العملية وقت معالج كبير، يتم نقلها لطابور ذي أولوية أقل، مما يمنع احتكار المعالج.

3.8 جدولة المعالجات المتعددة والأنظمة متعددة النواة

توزيع العمليات على عدة معالجات أو أنوية لضمان الكفاءة وتوازن الحمل.

في المعالجة المتعددة المتماثلة (SMP)، يقوم كل معالج بجدولة نفسه. للحفاظ على الكفاءة، نستخدم موازنة الحمل (Load Balancing) عبر الترحيل بالدفع (Push migration) (دفع المهام من المعالج المزدحم) أو الترحيل بالسحب (Pull migration) (سحب المهام بواسطة المعالج الخامل).

تقارب المعالج (Processor Affinity) يعني محاولة إبقاء العملية على نفس المعالج للاستفادة من البيانات المخزنة في الذاكرة المخبئية (Cache).

في الأنظمة متعددة النواة (Multicore)، يمكن لكل نواة تشغيل عدة خيوط أجهزة (Hardware threads) للاستفادة من أوقات توقف الذاكرة (Memory Stall).

4 أدوات المزامنة

حماية البيانات المشتركة من الوصول المتزامن باستخدام أدوات برمجية وعتادية لضمان الاستبعاد المتبادل وتجنب حالات السباق.

4.1 حالة السباق ومشكلة المنطقة الحرجة

حالة السباق تحدث عندما تصل عدة عمليات لبيانات مشتركة في نفس الوقت، وتعتمد النتيجة على ترتيب التنفيذ. المنطقة الحرجة هي جزء الكود الذي يتم فيه هذا التعديل.

عندما تتنفذ العمليات بشكل متزامن، قد تتم مقاطعتها في أي وقت. إذا قامت عمليتان (مثل P0 و P1) بإنشاء عمليات أبناء وتعديل متغير مشترك مثل next_available_pid، فقد يتم تعيين نفس المعرف لعمليتين مختلفتين إذا لم تكن هناك آلية حماية.

لحل هذه المشكلة، نقوم بتعريف المنطقة الحرجة (Critical Section). يجب أن تطلب كل عملية الإذن للدخول في قسم الدخول (entry section)، ثم تنفذ المنطقة الحرجة، وتغادر عبر قسم الخروج (exit section).

pseudocode
while (true) {
    entry section
        critical section
    exit section
        remainder section
}

4.2 حل بيترسون

حل برمجي كلاسيكي لعمليتين يعتمد على متغيرين: turn (لمن الدور) ومصفوفة flag (من جاهز للدخول).

يفترض حل بيترسون أن تعليمات التحميل والتخزين (load and store) ذرية (لا يمكن مقاطعتها). تشارك العمليتان متغير int turn ومصفوفة boolean flag[2].

يشير turn إلى العملية التي لها الحق في الدخول، بينما يشير flag[i] = true إلى أن العملية Pi جاهزة للدخول.

العملية تعلن عن رغبتها بالدخول بجعل علمها true، ثم تعطي الدور للعملية الأخرى بلطف (turn = j). وتنتظر في حلقة طالما أن العملية الأخرى جاهزة ولها الدور.

pseudocode
while (true) {
    flag[i] = true;
    turn = j;
    while (flag[j] && turn == j)
        ;
    /* critical section */
    flag[i] = false;
    /* remainder section */
}

4.3 دعم العتاد للمزامنة

توفر الأنظمة تعليمات عتادية خاصة (مثل test_and_set و compare_and_swap) تُنفذ بشكل ذري لحماية المناطق الحرجة.

في المعالجات الأحادية (Uniprocessors)، يمكن تعطيل المقاطعات لمنع التبديل بين العمليات، لكن هذا غير فعال وغير قابل للتوسع في المعالجات المتعددة. بدلاً من ذلك، نستخدم تعليمات عتادية ذرية.

تعليمة test_and_set تقوم بقراءة القيمة الحالية لمتغير وتعيينها إلى true في خطوة واحدة غير قابلة للمقاطعة. كما تُستخدم المتغيرات الذرية (Atomic Variables) لتوفير تحديثات ذرية لأنواع البيانات الأساسية مثل الأعداد الصحيحة (مثل increment(&sequence)).

pseudocode
boolean test_and_set (boolean *target) {
    boolean rv = *target;
    *target = true;
    return rv;
}

// Solution using test_and_set
do {
    while (test_and_set(&lock))
        ; /* do nothing */
    /* critical section */
    lock = false;
    /* remainder section */
} while (true);

4.4 أقفال الاستبعاد المتبادل (Mutex Locks)

أداة برمجية بسيطة لحماية المنطقة الحرجة باستخدام دالتي acquire() للحصول على القفل و release() لتحريره.

بما أن الحلول السابقة معقدة للمبرمجين، يوفر نظام التشغيل أدوات جاهزة أبسطها قفل Mutex. يحتوي على متغير منطقي يشير إلى ما إذا كان القفل متاحاً أم لا.

لحماية المنطقة الحرجة، تستدعي العملية acquire() قبل الدخول، و release() بعد الخروج. يجب أن تكون هذه الاستدعاءات ذرية (تُنفذ غالباً باستخدام تعليمات العتاد مثل compare-and-swap).

pseudocode
while (true) {
    acquire lock
        critical section
    release lock
        remainder section
}

4.5 السيمافورات (Semaphores)

أداة مزامنة متقدمة تعتمد على متغير صحيح (Integer) يتم تعديله فقط عبر عمليتين ذريتين: wait() و signal().

السيمافور S هو متغير صحيح. عملية wait(S) (أو P) تقوم بإنقاص القيمة إذا كانت أكبر من الصفر، وإلا تنتظر. عملية signal(S) (أو V) تقوم بزيادة القيمة.

هناك نوعان: السيمافور العددي (Counting Semaphore) الذي يمكن أن يأخذ أي قيمة صحيحة ويُستخدم لإدارة موارد متعددة النسخ، والسيمافور الثنائي (Binary Semaphore) الذي يأخذ القيمتين 0 و 1 فقط ويعمل تماماً مثل قفل Mutex.

pseudocode
wait(S) {
    while (S <= 0)
        ; // busy wait
    S--;
}

signal(S) {
    S++;
}

5 أمثلة على المزامنة

تطبيق أدوات المزامنة لحل المشاكل الكلاسيكية مثل المخزن المؤقت المحدود، القراء والكتاب، والفلاسفة المتناولين للطعام.

5.1 مشكلة المخزن المؤقت المحدود

مشكلة مزامنة تتضمن منتجاً يضيف بيانات إلى طابور محدود ومستهلكاً يسحب منه، مع ضمان عدم الإضافة لطابور ممتلئ أو السحب من طابور فارغ.

تتكون المشكلة من $n$ من المخازن المؤقتة (Buffers)، كل منها يستوعب عنصراً واحداً.

تُستخدم ثلاثة سيمافورات للتحكم: mutex (بتهيئة

  1. لضمان الاستبعاد المتبادل، full (بتهيئة
  2. لعد العناصر الموجودة، و empty (بتهيئة n) لعد الأماكن الفارغة.

يقوم المنتج بعمل wait(empty) ثم wait(mutex) قبل الإضافة، بينما يقوم المستهلك بعمل wait(full) ثم wait(mutex) قبل السحب.

5.2 مشكلة القراء والكتاب

مشكلة مزامنة تسمح لعدة قراء بالوصول إلى البيانات المشتركة في نفس الوقت، ولكنها تتطلب وصولاً حصرياً للكاتب لمنع تعارض البيانات.

تُستخدم هذه المشكلة لإدارة الوصول إلى قاعدة بيانات مشتركة.

القراء (Readers) يقرأون فقط ولا يقومون بأي تحديثات، بينما الكتاب (Writers) يمكنهم القراءة والكتابة.

المتغيرات المشتركة هي: سيمافور rw_mutex (بتهيئة

  1. لحماية وصول الكاتب أو أول قارئ، سيمافور mutex (بتهيئة
  2. لحماية المتغير read_count، والمتغير الصحيح read_count (بتهيئة
  3. لتتبع عدد القراء النشطين.

5.3 مشكلة الفلاسفة المتناولين للطعام

نموذج كلاسيكي لتوضيح مشاكل تخصيص الموارد المتعددة (مثل الجمود والمجاعة) بين عمليات متنافسة دون تفاعل مباشر بينها.

يجلس $N$ من الفلاسفة (عادة 5) حول طاولة مستديرة مع وعاء أرز في المنتصف.

يقضون وقتهم في التفكير والأكل بالتناوب.

للأكل، يحتاج الفيلسوف إلى عودي طعام (Chopsticks) - واحد من اليمين وواحد من اليسار.

البيانات المشتركة هي مصفوفة سيمافورات chopstick[5] مهيأة بـ 1.

الخوارزمية الأساسية تجعل الفيلسوف $i$ ينتظر العود $i$ ثم العود $(i+1)\%5$.

5.4 مزامنة النواة في نظام ويندوز

يستخدم ويندوز أقنعة المقاطعة للأنظمة أحادية المعالج، وأقفال الدوران للأنظمة متعددة المعالجات، وكائنات الموزع لمزامنة مساحة المستخدم.

لحماية الموارد العالمية، يستخدم ويندوز أقنعة المقاطعة (Interrupt Masks) في الأنظمة أحادية المعالج لمنع المقاطعات.

في الأنظمة متعددة المعالجات، يستخدم أقفال الدوران (Spinlocks)، حيث لا يتم مقاطعة الخيط (Thread) الذي يمتلك القفل أبداً.

كما يوفر كائنات الموزع (Dispatcher Objects) التي تعمل كـ Mutexes، Semaphores، Events، و Timers.

الأحداث (Events) تعمل كمتغيرات شرطية، والمؤقتات (Timers) تنبه الخيوط عند انتهاء الوقت.

6 الفصل الثامن: حالات الجمود (Deadlocks)

فهم كيفية حدوث حالات الجمود في الأنظمة المتزامنة واستراتيجيات التعامل معها مثل الوقاية، التجنب، الاكتشاف، والتعافي.

6.1 توصيف حالة الجمود (Deadlock Characterization)

الجمود هو حالة تتوقف فيها مجموعة من العمليات لأن كل عملية تحتفظ بمورد وتنتظر مورداً آخر تحتفظ به عملية أخرى في نفس المجموعة.

لكي يحدث الجمود، يجب أن تتحقق أربعة شروط في وقت واحد:

  1. الاستبعاد المتبادل (Mutual Exclusion): يمكن لعملية واحدة فقط استخدام المورد في وقت واحد.
  2. الاحتفاظ والانتظار (Hold and Wait): عملية تحتفظ بمورد واحد على الأقل وتنتظر الحصول على موارد إضافية تحتفظ بها عمليات أخرى.
  3. عدم المقاطعة (No Preemption): لا يمكن سحب المورد إلا طواعية من قبل العملية التي تحتفظ به بعد إكمال مهمتها.
  4. الانتظار الدائري (Circular Wait): توجد مجموعة من العمليات المنتظرة بحيث تنتظر كل عملية مورداً تحتفظ به العملية التالية في الدائرة.

6.2 مخطط تخصيص الموارد (Resource-Allocation Graph)

رسم بياني موجه يوضح حالة تخصيص الموارد والطلبات الحالية للعمليات في النظام.

يتكون المخطط من مجموعة من العقد (Vertices) مقسمة إلى نوعين: العمليات (P) والموارد (R). يحتوي المورد على نقاط تمثل عدد النسخ (Instances) المتاحة منه.

هناك نوعان من الحواف (Edges):

  • حافة الطلب (Request Edge): تتجه من العملية إلى المورد (Pi -> Rj)، وتعني أن العملية تطلب المورد.
  • حافة التخصيص (Assignment Edge): تتجه من المورد إلى العملية (Rj -> Pi)، وتعني أن المورد مخصص حالياً للعملية.

6.3 الوقاية من الجمود (Deadlock Prevention)

تصميم النظام بطريقة تضمن عدم تحقق واحد على الأقل من الشروط الأربعة الضرورية للجمود.

طرق إبطال الشروط:

  1. 1. الاستبعاد المتبادل: لا يُطلب للموارد القابلة للمشاركة (مثل الملفات للقراءة فقط)، ولكن يجب أن يظل للموارد غير القابلة للمشاركة.
  2. 2. الاحتفاظ والانتظار: نطلب من العملية طلب جميع مواردها وتخصيصها قبل بدء التنفيذ، أو السماح لها بطلب موارد فقط عندما لا تحتفظ بأي مورد آخر.
  3. 3. عدم المقاطعة: إذا طلبت عملية تحتفظ بموارد مورداً لا يمكن تخصيصه فوراً، يتم تحرير جميع الموارد التي تحتفظ بها حالياً وتضاف لقائمة الانتظار.
  4. 4. الانتظار الدائري: فرض ترتيب كلي (Total Ordering) لجميع أنواع الموارد، واشتراط أن تطلب كل عملية الموارد بترتيب تصاعدي.

6.4 تجنب الجمود والحالة الآمنة (Deadlock Avoidance & Safe State)

التجنب يتطلب معلومات مسبقة عن أقصى احتياجات كل عملية، لضمان عدم دخول النظام أبداً في 'حالة غير آمنة' قد تؤدي للجمود.

الحالة الآمنة (Safe State): يكون النظام في حالة آمنة إذا كان هناك تسلسل لجميع العمليات بحيث يمكن تلبية طلبات كل عملية Pi باستخدام الموارد المتاحة حالياً بالإضافة إلى الموارد التي تحتفظ بها جميع العمليات Pj (حيث j < i). إذا لم تكن الموارد متاحة، تنتظر Pi حتى تنتهي Pj.

الحقائق الأساسية:

  • إذا كان النظام في حالة آمنة -> لا يوجد جمود.
  • إذا كان في حالة غير آمنة -> هناك احتمالية للجمود.

التجنب يضمن بقاء النظام دائماً في الحالة الآمنة.

6.5 خوارزمية المصرفي (Banker's Algorithm)

خوارزمية لتجنب الجمود في الأنظمة ذات النسخ المتعددة للموارد، تحاكي تخصيص الموارد للتحقق مما إذا كان الطلب سيترك النظام في حالة آمنة.

تتطلب الخوارزمية من كل عملية الإعلان مسبقاً عن الحد الأقصى لاستخدامها (Max). تستخدم هياكل البيانات التالية (حيث n=العمليات، m=الموارد):

  • Available: متجه يمثل الموارد المتاحة.
  • Max: مصفوفة تمثل أقصى طلب لكل عملية.
  • Allocation: مصفوفة تمثل الموارد المخصصة حالياً.
  • Need: مصفوفة تمثل الموارد الإضافية المطلوبة (Need = Max - Allocation).

تتكون من جزأين:

  • خوارزمية الأمان (Safety Algorithm): تبحث عن تسلسل آمن.
  • خوارزمية طلب الموارد (Resource-Request Algorithm): تتظاهر بتخصيص المورد وتتحقق من الأمان؛ إذا كان آمناً يتم التخصيص، وإلا تنتظر العملية.
حساب المصفوفة Need التي تمثل الموارد الإضافية التي قد تطلبها العملية لإكمال مهمتها. \[Need[i,j] = Max[i,j] - Allocation[i,j]\]

6.6 اكتشاف الجمود (Deadlock Detection)

السماح للنظام بالدخول في حالة جمود، ثم تشغيل خوارزمية لاكتشافه، وتطبيق آلية للتعافي منه.

تعتمد طريقة الاكتشاف على عدد نسخ الموارد:

  • نسخة واحدة لكل مورد: يتم الحفاظ على مخطط الانتظار (Wait-for graph)، وهو نسخة مبسطة من مخطط تخصيص الموارد يحتوي على العمليات فقط (Pi -> Pj يعني Pi تنتظر Pj). يتم استدعاء خوارزمية للبحث عن دورة (Cycle) بشكل دوري (تتطلب عمليات O(n^2)).
  • نسخ متعددة: تستخدم خوارزمية مشابهة لخوارزمية المصرفي، تعتمد على مصفوفات Available و Allocation و Request (الطلب الحالي وليس الأقصى). إذا كانت Finish[i] == false لبعض العمليات، فهذه العمليات في حالة جمود.

6.7 التعافي من الجمود (Recovery from Deadlock)

بمجرد اكتشاف الجمود، يجب كسر الدورة إما بإنهاء العمليات أو سحب الموارد منها.

هناك طريقتان رئيسيتان للتعافي:

  1. 1. إنهاء العمليات (Process Termination): إما إحباط (Abort) جميع العمليات المتورطة في الجمود (مكلف جداً)، أو إحباط عملية واحدة في كل مرة حتى يتم القضاء على دورة الجمود. يتم اختيار العملية بناءً على الأولوية، وقت التنفيذ، الموارد المستخدمة، ونوع العملية (تفاعلية أم دفعية).
  2. 2. سحب الموارد (Resource Preemption): اختيار 'ضحية' (Victim) لتقليل التكلفة، ثم التراجع (Rollback) بالعملية إلى حالة آمنة سابقة وإعادة تشغيلها. يجب الحذر من المجاعة (Starvation) حيث قد يتم اختيار نفس العملية كضحية دائماً.

معادلات الجدولة والأداء

المعادلة / المفهوم الوحدة LaTeX / Notation
معادلة المتوسط الأسي لتقدير طول فترة المعالج القادمة. M3 \(\tau_{n+1} = \alpha t_n + (1 - \alpha)\tau_n\)
حساب المصفوفة Need التي تمثل الموارد الإضافية التي قد تطلبها العملية لإكمال مهمتها. M6 \(Need[i,j] = Max[i,j] - Allocation[i,j]\)

مقارنة خوارزميات الجدولة

وضع المستخدم مقابل وضع النواة

المعيار User Mode Kernel Mode
بت الوضع (Mode Bit) 1 0
تنفيذ التعليمات ذات الامتياز غير مسموح (يولد فخ) مسموح
الوصول للموارد مقيد وصول كامل

طرق تمرير المعلمات لنداءات النظام

المعيار Registers Block/Table in Memory Stack
حدود حجم/عدد المعلمات محدود بعدد السجلات غير محدود غير محدود
الآلية تخزين مباشر في السجل تخزين في الذاكرة وتمرير العنوان في سجل دفع (Push) من البرنامج، سحب (Pop) من النظام

الذاكرة المشتركة مقابل تمرير الرسائل

المعيار Shared Memory Message Passing
السرعة سريعة جداً (لا تتطلب استدعاءات نظام مستمرة) أبطأ (تتطلب استدعاءات نظام لكل رسالة)
المزامنة (Synchronization) يجب على المبرمج إدارتها يدوياً تدار غالباً بواسطة نظام التشغيل
الاستخدام الأمثل نقل كميات كبيرة من البيانات في نفس الجهاز نقل كميات صغيرة أو عبر الشبكة (الأنظمة الموزعة)

مقارنة نماذج تعدد الخيوط

المعيار Many-to-One One-to-One
التوازي على أنوية متعددة غير ممكن (خيط واحد في النواة في نفس الوقت) ممكن وفعال
تأثير التوقف (Blocking) توقف خيط واحد يوقف العملية بأكملها توقف خيط لا يؤثر على الخيوط الأخرى
العبء (Overhead) منخفض (لا يتم إنشاء خيوط نواة لكل خيط مستخدم) مرتفع (إنشاء خيط نواة لكل خيط مستخدم)

الجدولة الاستباقية مقابل غير الاستباقية

المعيار Preemptive Nonpreemptive
التحكم بالمعالج يمكن مقاطعة العملية وإجبارها على التخلي عن المعالج تحتفظ العملية بالمعالج حتى تنتهي أو تنتظر
الاستجابة عالية، مناسبة للأنظمة التفاعلية منخفضة، قد تحتكر عملية واحدة النظام
التعقيد وحالات التسابق معقدة، قد تسبب حالات تسابق في البيانات المشتركة بسيطة، لا تسبب مقاطعات غير متوقعة

الترحيل بالدفع مقابل الترحيل بالسحب

المعيار Push Migration Pull Migration
المبادر بالعملية مهمة دورية تفحص الحمل وتدفع المهام من المعالج المزدحم المعالج الخامل يسحب المهام من المعالج المزدحم

التقارب المرن مقابل التقارب الصلب

المعيار Soft Affinity Hard Affinity
الضمانات يحاول النظام إبقاء العملية على نفس المعالج، لكن لا توجد ضمانات يسمح للعملية بتحديد مجموعة المعالجات التي يجب أن تعمل عليها

الانتظار النشط مقابل الحظر (طابور الانتظار)

المعيار Busy Waiting (Spinlock) Blocking (Queue/Sleep)
استهلاك المعالج (CPU) يهدر دورات المعالج في الدوران المستمر لا يستهلك المعالج أثناء الانتظار
تكلفة تبديل السياق (Context Switch) لا يوجد تبديل سياق (سريع جداً) يتطلب تبديل سياق مكلف (حفظ واسترجاع الحالة)

مزامنة ويندوز: معالج أحادي مقابل متعدد المعالجات

المعيار Uniprocessor Systems Multiprocessor Systems
آلية الحماية الأساسية أقنعة المقاطعة (Interrupt Masks) أقفال الدوران (Spinlocks)
سلوك الخيط (Thread Behavior) يمنع المقاطعات محلياً لا يتم مقاطعته أبداً أثناء امتلاك القفل

القراء مقابل الكتاب

المعيار Readers Writers
نوع الوصول قراءة فقط (بدون تحديثات) قراءة وكتابة
التزامن المسموح متعدد (عدة قراء في نفس الوقت) حصري (كاتب واحد فقط)

مقارنة طرق التعامل مع الجمود

المعيار Prevention (الوقاية) Avoidance (التجنب) Detection & Recovery (الاكتشاف والتعافي)
النهج الأساسي إبطال أحد الشروط الأربعة تجنب الحالات غير الآمنة ديناميكياً السماح بالجمود ثم حله
استغلال الموارد (Resource Utilization) منخفض (متحفظ جداً) متوسط عالي (حتى يحدث الجمود)

النسخة الواحدة مقابل النسخ المتعددة للموارد

المعيار Single Instance (نسخة واحدة) Multiple Instances (نسخ متعددة)
معنى الدورة في المخطط (Cycle Meaning) جمود مؤكد احتمالية جمود فقط
خوارزمية التجنب (Avoidance Algorithm) مخطط تخصيص الموارد (مع حواف المطالبة) خوارزمية المصرفي
خوارزمية الاكتشاف (Detection Algorithm) مخطط الانتظار (Wait-for Graph) خوارزمية اكتشاف مشابهة للمصرفي

🃏 البطاقات التعليمية

🎯 اختبر نفسك

1 / 302 🎯 نتيجتك: 0

حديث البروفيسور

أهلاً بكم يا طلاب مقرر CS351 في ليلة الامتحان النصفي! لقد وصلنا إلى محطة حاسمة في رحلتنا لاستكشاف أنظمة التشغيل. في هذه الليلة، أريدكم أن تبتعدوا قليلاً عن التفاصيل الدقيقة لتروا الصورة الكبيرة والمترابطة للوحدات الست التي درسناها. بدأنا في الوحدة الأولى بفهم نظام التشغيل كوسيط أساسي ومدير للموارد، يوفر بيئة آمنة وفعالة لتنفيذ البرامج. ولكن، ما هي هذه البرامج؟ هنا جاءت الوحدة الثانية لتشرح لنا العمليات (Processes) والخيوط (Threads)، حيث عرفنا أن العملية هي برنامج قيد التنفيذ، بينما الخيوط هي وحدات تنفيذ أصغر تتشارك الموارد لزيادة الكفاءة. احذروا من فخ الامتحان هنا: تذكروا دائماً ما تتشاركه الخيوط (مثل الذاكرة) وما تحتفظ به لنفسها (مثل المكدس). نظراً لوجود العديد من العمليات والخيوط التي تتنافس على المعالج، انتقلنا في الوحدة الثالثة إلى جدولة وحدة المعالجة المركزية (CPU Scheduling). يجب أن تفهموا جيداً كيف يقرر النظام من يحصل على المعالج لتقليل أوقات الانتظار والاستجابة. الفخ الشائع هنا هو الخلط بين خوارزميات الجدولة الاستباقية وغير الاستباقية، فركزوا عليها! وعندما تعمل هذه الخيوط معاً وتتشارك البيانات، قد تحدث كوارث برمجية. لذلك، قدمت لنا الوحدة الرابعة أدوات المزامنة (Synchronization Tools) مثل الإشارات (Semaphores) والأقفال (Mutexes) لضمان الاستبعاد المتبادل وتجنب حالات السباق (Race Conditions). في الوحدة الخامسة، قمنا بتطبيق هذه الأدوات على أمثلة كلاسيكية للمزامنة مثل مشكلة الفلاسفة المتناولين للطعام، ومشكلة القراء والكتاب. هذه الأمثلة هي مادة دسمة لأسئلة الامتحان، لذا تأكدوا من فهم كيفية تجنب المجاعة (Starvation) فيها. أخيراً، حذرتنا الوحدة السادسة من الاختناقات (Deadlocks). عندما نبالغ في استخدام أدوات المزامنة، قد تعلق العمليات إلى الأبد. راجعوا الشروط الأربعة لحدوث الاختناق، وافهموا الفرق الجوهري بين الوقاية، التجنب، والاكتشاف. تذكروا أن الفهم العميق لكيفية انتقال النظام من إدارة الموارد الأساسية إلى التعامل مع تعقيدات التزامن والاختناقات هو مفتاح التفوق. لا تدعوا التوتر يسيطر عليكم، فقد تدربتم جيداً على هذه المفاهيم طوال الأسابيع الماضية. ركزوا على قراءة الأسئلة بعناية، وتحديداً تلك التي تدمج بين الجدولة والمزامنة، فهذا فخ كلاسيكي آخر يقع فيه الكثيرون. نظام التشغيل هو سيمفونية متكاملة. خذوا نفساً عميقاً، ناموا جيداً، وثقوا بقدراتكم. بالتوفيق في امتحان الغد!

خزنة الامتحان | النقاط الحرجة

28 نقطة حرجة
🔑 مفهوم أساسي M3
في خوارزمية Round Robin، اختيار حجم الحصة الزمنية (q) هو قرار حاسم. إذا كان صغيراً جداً، سيغرق النظام في العبء الإضافي لتبديل السياق (Context Switch Overhead).
🔑 مفهوم أساسي M3
موازنة الحمل (Load Balancing) وتقارب المعالج (Processor Affinity) يعملان غالباً ضد بعضهما البعض. نقل عملية لمعالج آخر يوازن الحمل لكنه يدمر التقارب ويفقد بيانات الذاكرة المخبئية.
💡 سر الامتحان M6
رغم كل هذه الخوارزميات المعقدة (مثل المصرفي)، فإن معظم أنظمة التشغيل الحديثة (مثل Windows و Linux) تستخدم طريقة 'تجاهل المشكلة' (Ostrich Algorithm) لأن الجمود نادر الحدوث وتكلفة منعه أو تجنبه عالية جداً على الأداء.
⚠️ فخ M5
الاعتقاد بأن ترتيب عمليات `wait` في المنتج (Producer) غير مهم. إذا قمت بتنفيذ `wait(mutex)` قبل `wait(empty)`، سيحدث جمود (Deadlock) إذا كان المخزن ممتلئاً.
💡 سر الامتحان M4
الانتظار النشط (Busy Waiting) ليس دائماً سيئاً! أقفال الدوران (Spinlocks) مفيدة جداً في الأنظمة متعددة المعالجات إذا كانت المنطقة الحرجة قصيرة جداً، لأنها توفر وقت تبديل السياق (Context Switch) المكلف.
⚠️ فخ M6
احذر من الخلط بين 'الحالة غير الآمنة' و 'الجمود'. الحالة غير الآمنة تعني فقط أن الجمود **ممكن**، وليس أنه حدث بالفعل. النظام قد يكمل عمله بسلام إذا لم تطلب العمليات الحد الأقصى لمواردها.
⚠️ فخ M3
الخلط بين وقت الاستدارة (Turnaround Time) ووقت الانتظار (Waiting Time). وقت الاستدارة يشمل وقت التنفيذ الفعلي + وقت الانتظار، بينما وقت الانتظار هو فقط الوقت المقضي في طابور الانتظار.
💡 سر الامتحان M1
بت الوضع (Mode bit) ليس مجرد متغير برمجي، بل هو ميزة مدعومة من الأجهزة المادية (Hardware) في المعالج لضمان الحماية الصارمة.
🔑 مفهوم أساسي M2
في نموذج Many-to-One، إذا قام خيط مستخدم واحد بعملية حظر (Blocking I/O)، فإن العملية بأكملها تتوقف، لأن النواة لا ترى سوى خيط واحد.
⚠️ فخ M2
الخلط بين الكومة (Heap) والمكدس (Stack). تذكر: المكدس يدار تلقائياً لاستدعاء الدوال (LIFO)، بينما الكومة تدار ديناميكياً (مثل malloc/new) وتتطلب إدارة دقيقة لتجنب تسرب الذاكرة.
⚠️ فخ M4
احذر من الاعتقاد بأن حل بيترسون يعمل بشكل مثالي في الواقع. هو حل نظري ممتاز، لكنه يفشل على المعالجات الحديثة بسبب إعادة ترتيب التعليمات (Instruction Reordering).
⚠️ فخ M4
لا تخلط بين عمليتي السيمافور: wait() تقوم بـ **إنقاص** القيمة وتنتظر إذا كانت صفر، بينما signal() تقوم بـ **زيادة** القيمة وتوقظ العمليات المنتظرة.
⚠️ فخ M5
الخلط بين حالات كائنات الموزع في ويندوز. تذكر: Signaled = متاح (أخضر/انطلق)، Nonsignaled = غير متاح (أحمر/توقف).
🔑 مفهوم أساسي M1
الوصول المباشر للذاكرة (DMA) يولد مقاطعة واحدة فقط لكل 'كتلة' من البيانات المنقولة، وليس مقاطعة لكل 'بايت'، مما يوفر وقت المعالج بشكل هائل.
🔑 مفهوم أساسي M1
نظام التشغيل الحديث هو نظام 'مُقاد بالمقاطعات' (Interrupt Driven). إذا لم تكن هناك عمليات أو مقاطعات، فإن النظام يجلس خاملاً ينتظر حدوث مقاطعة.
🔑 مفهوم أساسي M6
الفرق بين خوارزمية المصرفي (للتجنب) وخوارزمية الاكتشاف: المصرفي تستخدم مصفوفة Max (أسوأ سيناريو مستقبلي)، بينما الاكتشاف تستخدم مصفوفة Request (الطلبات الحالية الفعلية).
⚠️ فخ M6
في مخطط تخصيص الموارد، وجود دورة (Cycle) لا يعني دائماً جمود! إذا كان هناك **نسخ متعددة** من المورد، فالدورة تعني احتمالية جمود فقط. الدورة تعني جمود مؤكد فقط إذا كان لكل مورد **نسخة واحدة**.
🔑 مفهوم أساسي M5
في مشكلة القراء والكتاب، يُسمح لعدد غير محدود من القراء بالوصول المتزامن، ولكن الكاتب يتطلب وصولاً حصرياً تاماً (لا قراء ولا كتاب آخرين).
💡 سر الامتحان M2
الذاكرة المشتركة أسرع من تمرير الرسائل لأنها تتجنب استدعاءات النظام (System Calls) المتكررة، لكنها تضع عبء المزامنة (Synchronization) بالكامل على عاتق المبرمج لتجنب تعارض البيانات.
⚠️ فخ M1
الخلط بين 'البرنامج' (Program) و 'العملية' (Process). البرنامج هو كيان سلبي (ملف على القرص)، بينما العملية هي كيان نشط (برنامج قيد التنفيذ في الذاكرة).
⚠️ فخ M2
الاعتقاد بأن التزامن (Concurrency) والتوازي (Parallelism) هما نفس الشيء. التزامن يعني إحراز تقدم في مهام متعددة (ممكن على نواة واحدة)، بينما التوازي يعني التنفيذ الفعلي في نفس اللحظة (يتطلب أنوية متعددة).
🔑 مفهوم أساسي M6
الشروط الأربعة للجمود (الاستبعاد المتبادل، الاحتفاظ والانتظار، عدم المقاطعة، الانتظار الدائري) يجب أن تحدث **في نفس الوقت** لكي يحدث الجمود. كسر شرط واحد فقط يكفي لمنع الجمود تماماً.
⚠️ فخ M3
الاعتقاد بأن FCFS تسبب المجاعة (Starvation). هذا خطأ! FCFS تسبب 'تأثير القافلة' (Convoy Effect). المجاعة تحدث في خوارزميات الأولوية و SJF.
💡 سر الامتحان M5
الخوارزمية الأساسية للفلاسفة المتناولين للطعام معيبة تصميماً؛ فهي تضمن حدوث حالة جمود (Deadlock) إذا قرر جميع الفلاسفة الأكل في نفس اللحظة الدقيقة.
🔑 مفهوم أساسي M4
الشروط الثلاثة لحل مشكلة المنطقة الحرجة هي: الاستبعاد المتبادل (Mutual Exclusion)، التقدم (Progress)، والانتظار المحدود (Bounded Waiting). لا يمكن قبول أي حل لا يحقق هذه الشروط الثلاثة معاً.
⚠️ فخ M1
الاعتقاد بأن المبرمجين يكتبون نداءات النظام (System Calls) مباشرة في كودهم. في الواقع، هم يستخدمون واجهات برمجة التطبيقات (APIs) مثل POSIX أو Win32 التي تقوم باستدعاء نداء النظام نيابة عنهم.
🔑 مفهوم أساسي M2
تبديل السياق (Context Switch) هو 'عبء صافٍ' (Pure Overhead). كلما كان نظام التشغيل وكتلة التحكم (PCB) أكثر تعقيداً، زاد وقت التبديل، مما يقلل من وقت المعالجة الفعلي للبرامج.
💡 سر الامتحان M3
خوارزمية SJF هي خوارزمية نظرية ومثالية، لكن لا يمكن تطبيقها بدقة في الواقع لأننا لا نستطيع معرفة طول فترة المعالج القادمة يقيناً، لذلك نلجأ للتوقع باستخدام المتوسط الأسي.