الوحدة 3: وصف وإدارة العمليات

Process Description and Control

📚 مستندة إلى الفصل الثالث من كتاب: Operating Systems: Internals and Design Principles – William Stallings – الإصدار التاسع

أهداف الوحدة

  • تعريف العملية (Process) ومكوناتها الأساسية.
  • التمييز بين حالات العمليات المختلفة (States).
  • فهم كيفية تمثيل العمليات داخل أنظمة التشغيل.
  • وصف آليات التحكم في العمليات (Process Control).
  • التعرف على تنفيذ العمليات في نظم UNIX SVR4 كنموذج عملي.

1️⃣ ما هي العملية؟

🔹 تعريف:

العملية (Process) هي ببساطة **برنامج في حالة تنفيذ (Program in Execution)**. إنها ليست مجرد الكود الثابت للبرنامج الموجود على القرص، بل هي كيان ديناميكي حي في الذاكرة يتضمن عدة مكونات أساسية:

  • الكود (Code): التعليمات البرمجية الفعلية للبرنامج.
  • البيانات (Data): المتغيرات، الثوابت، ومساحة الذاكرة التي يستخدمها البرنامج.
  • المؤشر (Program Counter - PC): سجل خاص يشير إلى التعليمات التالية التي سيتم تنفيذها.
  • الحالة (State): الحالة الحالية للعملية (جاهزة، قيد التنفيذ، تنتظر، إلخ).
  • الموارد (Resources): أي موارد يمتلكها أو يستخدمها البرنامج، مثل الملفات المفتوحة، أجهزة الإدخال/الإخراج، ومساحات الذاكرة المخصصة.

🔸 الفرق بين البرنامج والعملية:

البرنامج (Program) = مجموعة من التعليمات الثابتة المخزنة على القرص الصلب.

العملية (Process) = تنفيذ حي ونشط للبرنامج في الذاكرة، مع بياناته الخاصة وحالته الحالية أثناء التنفيذ.

📌 مثال واقعي: عندما تقوم بفتح برنامج Microsoft Word، فإنك تقوم بإطلاق **عملية** لبرنامج Word. إذا قمت بفتح ملفين مختلفين في Word، فسيقوم نظام التشغيل بإنشاء **عمليتين مختلفتين** لبرنامج Word، كل واحدة لها حالتها وبياناتها ومواردها الخاصة، حتى لو كانتا تستخدمان نفس الكود الأساسي للبرنامج.


2️⃣ حالات العمليات (Process States)

تمر العملية خلال دورة حياتها بعدة حالات مختلفة تعكس نشاطها الحالي. نظام التشغيل مسؤول عن إدارة هذه الحالات والانتقال بينها:

🔹 الحالات الرئيسية للعملية:

الحالة الوصف
New (جديدة) العملية قيد الإنشاء، لم يتم تحميلها بالكامل في الذاكرة بعد.
Ready (جاهزة) العملية جاهزة للتنفيذ وتنتظر أن يخصص لها المعالج (CPU).
Running (قيد التنفيذ) العملية تُنفذ حاليًا بواسطة المعالج.
Waiting (Blocked) (تنتظر/محظورة) العملية تنتظر حدثًا معينًا ليحدث، مثل اكتمال عملية إدخال/إخراج (مثل قراءة من القرص) أو تلقي بيانات من الشبكة.
Terminated (منتهية) العملية انتهت من التنفيذ أو تم إنهاؤها بواسطة نظام التشغيل.

🔹 بعض الأنظمة قد تضيف حالات أخرى مثل Suspended (معلقة)، حيث يتم إخراج العملية من الذاكرة مؤقتًا.

📌 رسم بياني للحالة: عادة ما يُعرض الانتقال بين هذه الحالات في مخطط يوضح كيف تتغير حالة العملية حسب الأوامر والموارد المتاحة. على سبيل المثال، يمكن أن تنتقل عملية من "Running" إلى "Waiting" إذا احتاجت إلى قراءة من القرص، ثم تعود إلى "Ready" بعد اكتمال القراءة، وتنتظر دورها لتصبح "Running" مرة أخرى.

🔗 مصدر خارجي: Process State Diagram – TutorialsPoint


3️⃣ وصف العملية (Process Description)

لكي يتمكن نظام التشغيل من إدارة العمليات بفعالية، فإنه يحتفظ بجميع المعلومات الضرورية لكل عملية في بنية بيانات تُسمى **كتلة تحكم العملية (Process Control Block - PCB)**. كل عملية لها PCB خاص بها.

مكونات PCB الأساسية:

  • معرف العملية (Process ID - PID): رقم فريد يُعرف العملية داخل النظام.
  • حالة العملية (Process State): حالتها الحالية (New, Ready, Running, Waiting, Terminated).
  • سجلات المعالج (CPU Registers): قيم جميع السجلات الداخلية للمعالج (مثل Program Counter, Stack Pointer) عند آخر مرة توقفت فيها العملية عن التنفيذ.
  • معلومات إدارة الذاكرة: مؤشرات إلى مساحات الذاكرة المخصصة للعملية (مثل Base/Limit registers أو جداول الصفحات).
  • معلومات جدولة المعالج: أولوية العملية، وقت المعالج الذي استخدمته، وغيرها من البيانات المتعلقة بالجدولة.
  • معلومات إدارة الإدخال/الإخراج: قائمة بالملفات المفتوحة، الأجهزة المخصصة للعملية.

🔸 أهمية PCB:

تُعد PCB حيوية لعملية التبديل السياقي (Context Switching)، حيث يستخدمها نظام التشغيل لحفظ حالة العملية التي يتم إيقافها واستعادة حالة العملية التي ستبدأ في التنفيذ.

📌 مثال تطبيقي: عندما تنتقل من تصفح الإنترنت (عملية المتصفح) إلى محرر النصوص (عملية المحرر)، يقوم نظام التشغيل بحفظ جميع سجلات المعالج وحالة عملية المتصفح في PCB الخاص به. ثم يستعيد سجلات وحالة عملية محرر النصوص من PCB الخاص بها، مما يسمح للمحرر بالاستئناف من حيث توقف.


4️⃣ التحكم في العمليات (Process Control)

يتضمن التحكم في العمليات مجموعة من الآليات التي يستخدمها نظام التشغيل لإدارة دورة حياة العمليات والتفاعل بينها.

🔹 التبديل السياقي (Context Switch):

هو عملية حفظ حالة العملية الحالية (في PCB الخاص بها) واستعادة حالة عملية أخرى (من PCB الخاص بها) للسماح لها بالبدء في التنفيذ على المعالج. هذه العملية تحدث بسرعة كبيرة جدًا وتسمح بتعدد المهام.

🔹 أحداث تحكم العمليات الرئيسية:

  • الإنشاء (Process Creation): إطلاق عملية جديدة، عادةً نتيجة لطلب من المستخدم أو من برنامج آخر (مثل تشغيل برنامج).
  • الإنهاء (Process Termination): إنهاء عملية، إما لأنها أكملت مهمتها، أو بسبب خطأ، أو بطلب من المستخدم/النظام.
  • التبديل (Switching): الانتقال من تنفيذ عملية إلى أخرى (Context Switch).
  • المقاطعات (Interrupts): يمكن أن تؤدي المقاطعات (من الأجهزة أو البرمجيات) إلى إيقاف العملية الحالية مؤقتًا للسماح لنظام التشغيل بالتعامل مع الحدث.

🔸 أمثلة على أوامر التحكم في العمليات (خاصة في UNIX):

  • fork(): دالة نظام (System Call) تُستخدم لإنشاء عملية جديدة تكون نسخة طبق الأصل من العملية الأصلية (العملية الأم). العملية الجديدة تُسمى "العملية الابنة".
  • exec(): دالة نظام تُستخدم لتحميل برنامج جديد في مساحة ذاكرة العملية الحالية، مما يؤدي إلى استبدال الكود والبيانات الخاصة بالعملية الحالية ببرنامج جديد.
  • wait(): دالة نظام تُستخدم لجعل العملية الأم تنتظر حتى تنتهي عملية ابنة معينة من التنفيذ.

📌 مثال في UNIX: عند تشغيل أمر في الـ Shell (مثل ls)، يقوم الـ Shell (وهو عملية) بعمل fork() لإنشاء عملية ابنة. ثم تقوم العملية الابنة بعمل exec("ls") لتحميل وتنفيذ برنامج ls. عندما ينتهي ls، تعود العملية الابنة وتُنهي نفسها، ويمكن للـ Shell (العملية الأم) استخدام wait() لمعرفة متى انتهت العملية الابنة.

🔗 مصدر خارجي: Fork vs Exec in UNIX – DigitalOcean


5️⃣ تنفيذ نظام التشغيل

كيف يعمل نظام التشغيل نفسه؟ يمكن أن يتم تنفيذ نظام التشغيل بطرق مختلفة، تؤثر على أدائه وأمانه:

🔸 نماذج تنفيذ النواة (Kernel):

  • النواة المتجانسة (Monolithic Kernel): في هذا التصميم، يتم دمج جميع وظائف نظام التشغيل (مثل إدارة العمليات، إدارة الذاكرة، إدارة الملفات، تعريفات الأجهزة) في جزء واحد كبير من الكود يعمل في وضع النواة (Kernel Mode). هذا التصميم يوفر أداءً عاليًا ولكنه قد يكون أقل مرونة وأكثر عرضة للأخطاء.
  • النواة المصغرة (Microkernel): في هذا التصميم، يتم فصل وظائف نظام التشغيل الأساسية فقط في النواة (مثل إدارة العمليات الأساسية والتواصل بين العمليات)، بينما يتم تشغيل معظم الوظائف الأخرى (مثل إدارة الملفات، تعريفات الأجهزة) كـ "خدمات" في مساحة المستخدم (User Mode). هذا يزيد من الاستقرار والأمان ولكن قد يؤثر قليلاً على الأداء بسبب زيادة التواصل بين العمليات.

🔹 مكونات نظام التشغيل:

  • خيوط النواة (Kernel Threads): هي خيوط (Threads) تُنفذ داخل النواة نفسها، وتُستخدم لتنفيذ مهام نظام التشغيل الداخلية (مثل جدولة العمليات، إدارة الذاكرة).
  • عمليات المستخدم (User Processes): هي البرامج التي يُشغلها المستخدمون، وتعمل في مساحة المستخدم (User Mode) المعزولة عن النواة.
  • معالجات المقاطعات (Interrupt Handlers): هي أجزاء من الكود داخل النواة تُنفذ عند حدوث مقاطعة للتعامل مع الحدث الطارئ.

📌 أمثلة على التنفيذ:

  • في Windows: تستخدم النواة خدمات متعددة للمهام، وتجمع بين عناصر النواة المتجانسة والمصغرة في تصميم هجين.
  • في Linux: يتم إدارة العمليات ككائنات kernel ذات بيانات خاصة، وتتبع نواة Linux تصميمًا متجانسًا بشكل أساسي ولكنه معياري.


6️⃣ إدارة العمليات في UNIX SVR4

يعتبر نظام **UNIX System V Release 4 (SVR4)** نموذجًا كلاسيكيًا ومهمًا لفهم إدارة العمليات في أنظمة التشغيل الشبيهة بـ UNIX.

🔹 نموذج UNIX الكلاسيكي يتضمن:

  • عملية init: هي العملية الأولى التي يتم تشغيلها عند بدء تشغيل نظام UNIX. تُعد init العملية الأم لجميع العمليات الأخرى في النظام.
  • fork(): كما ذكرنا سابقًا، تُستخدم هذه الدالة لإنشاء عملية ابنة تكون نسخة طبق الأصل من العملية الأم.
  • exec(): تُستخدم هذه الدالة لتحميل برنامج جديد في العملية الابنة التي تم إنشاؤها بواسطة fork().
  • wait(): تُستخدم هذه الدالة بواسطة العملية الأم لانتظار انتهاء عملية ابنة معينة من التنفيذ قبل أن تستمر العملية الأم في عملها.
  • exit(): تُستخدم لإنهاء العملية الحالية.

📌 سلسلة حياة عملية نموذجية في UNIX:

  1. يقوم نظام التشغيل بتشغيل عملية init.
  2. تقوم عملية init أو أي عملية أخرى (مثل الـ Shell) بعمل fork() لإنشاء عملية ابنة.
  3. تقوم العملية الابنة بتحميل برنامج جديد (مثل ls أو grep) باستخدام exec().
  4. تنفذ العملية الابنة البرنامج الجديد.
  5. عند انتهاء العملية الابنة من تنفيذ برنامجها، تقوم بعمل exit().
  6. تعود السيطرة إلى العملية الأم (التي كانت تنتظر باستخدام wait())، وتستمر في عملها.

ملخص الوحدة

في هذه الوحدة، تعمقنا في مفهوم **العملية (Process)** كوحدة أساسية في نظام التشغيل، وفهمنا أنها ليست مجرد كود بل كيان ديناميكي له حالة وبيانات وموارد. استعرضنا **حالات العمليات** المختلفة ودورة حياتها، وكيف يحتفظ نظام التشغيل بمعلوماتها في **كتلة تحكم العملية (PCB)**. كما تعلمنا عن آليات **التحكم في العمليات** مثل التبديل السياقي ودوال fork() وexec(). وأخيرًا، ألقينا نظرة على كيفية **تنفيذ نظام التشغيل** نفسه داخل النواة، وتناولنا نموذج **إدارة العمليات في UNIX SVR4**. فهم هذه المفاهيم ضروري للانتقال إلى مفاهيم أكثر تعقيدًا مثل التزامن (Concurrency) وإدارة الخيوط.