📚 مستندة إلى الفصل الثالث من كتاب: Operating Systems: Internals and Design Principles – William Stallings – الإصدار التاسع
العملية (Process) هي ببساطة **برنامج في حالة تنفيذ (Program in Execution)**. إنها ليست مجرد الكود الثابت للبرنامج الموجود على القرص، بل هي كيان ديناميكي حي في الذاكرة يتضمن عدة مكونات أساسية:
البرنامج (Program) = مجموعة من التعليمات الثابتة المخزنة على القرص الصلب.
العملية (Process) = تنفيذ حي ونشط للبرنامج في الذاكرة، مع بياناته الخاصة وحالته الحالية أثناء التنفيذ.
📌 مثال واقعي: عندما تقوم بفتح برنامج Microsoft Word، فإنك تقوم بإطلاق **عملية** لبرنامج Word. إذا قمت بفتح ملفين مختلفين في Word، فسيقوم نظام التشغيل بإنشاء **عمليتين مختلفتين** لبرنامج Word، كل واحدة لها حالتها وبياناتها ومواردها الخاصة، حتى لو كانتا تستخدمان نفس الكود الأساسي للبرنامج.
🔗 مصدر خارجي: Introduction to Processes – GeeksforGeeks
تمر العملية خلال دورة حياتها بعدة حالات مختلفة تعكس نشاطها الحالي. نظام التشغيل مسؤول عن إدارة هذه الحالات والانتقال بينها:
| الحالة | الوصف |
|---|---|
| New (جديدة) | العملية قيد الإنشاء، لم يتم تحميلها بالكامل في الذاكرة بعد. |
| Ready (جاهزة) | العملية جاهزة للتنفيذ وتنتظر أن يخصص لها المعالج (CPU). |
| Running (قيد التنفيذ) | العملية تُنفذ حاليًا بواسطة المعالج. |
| Waiting (Blocked) (تنتظر/محظورة) | العملية تنتظر حدثًا معينًا ليحدث، مثل اكتمال عملية إدخال/إخراج (مثل قراءة من القرص) أو تلقي بيانات من الشبكة. |
| Terminated (منتهية) | العملية انتهت من التنفيذ أو تم إنهاؤها بواسطة نظام التشغيل. |
🔹 بعض الأنظمة قد تضيف حالات أخرى مثل Suspended (معلقة)، حيث يتم إخراج العملية من الذاكرة مؤقتًا.
📌 رسم بياني للحالة: عادة ما يُعرض الانتقال بين هذه الحالات في مخطط يوضح كيف تتغير حالة العملية حسب الأوامر والموارد المتاحة. على سبيل المثال، يمكن أن تنتقل عملية من "Running" إلى "Waiting" إذا احتاجت إلى قراءة من القرص، ثم تعود إلى "Ready" بعد اكتمال القراءة، وتنتظر دورها لتصبح "Running" مرة أخرى.
🔗 مصدر خارجي: Process State Diagram – TutorialsPoint
لكي يتمكن نظام التشغيل من إدارة العمليات بفعالية، فإنه يحتفظ بجميع المعلومات الضرورية لكل عملية في بنية بيانات تُسمى **كتلة تحكم العملية (Process Control Block - PCB)**. كل عملية لها PCB خاص بها.
تُعد PCB حيوية لعملية التبديل السياقي (Context Switching)، حيث يستخدمها نظام التشغيل لحفظ حالة العملية التي يتم إيقافها واستعادة حالة العملية التي ستبدأ في التنفيذ.
📌 مثال تطبيقي: عندما تنتقل من تصفح الإنترنت (عملية المتصفح) إلى محرر النصوص (عملية المحرر)، يقوم نظام التشغيل بحفظ جميع سجلات المعالج وحالة عملية المتصفح في PCB الخاص به. ثم يستعيد سجلات وحالة عملية محرر النصوص من PCB الخاص بها، مما يسمح للمحرر بالاستئناف من حيث توقف.
يتضمن التحكم في العمليات مجموعة من الآليات التي يستخدمها نظام التشغيل لإدارة دورة حياة العمليات والتفاعل بينها.
هو عملية حفظ حالة العملية الحالية (في PCB الخاص بها) واستعادة حالة عملية أخرى (من PCB الخاص بها) للسماح لها بالبدء في التنفيذ على المعالج. هذه العملية تحدث بسرعة كبيرة جدًا وتسمح بتعدد المهام.
fork(): دالة نظام (System Call) تُستخدم لإنشاء عملية جديدة تكون نسخة طبق الأصل من العملية الأصلية (العملية الأم). العملية الجديدة تُسمى "العملية الابنة".exec(): دالة نظام تُستخدم لتحميل برنامج جديد في مساحة ذاكرة العملية الحالية، مما يؤدي إلى استبدال الكود والبيانات الخاصة بالعملية الحالية ببرنامج جديد.wait(): دالة نظام تُستخدم لجعل العملية الأم تنتظر حتى تنتهي عملية ابنة معينة من التنفيذ.📌 مثال في UNIX: عند تشغيل أمر في الـ Shell (مثل
ls)، يقوم الـ Shell (وهو عملية) بعملfork()لإنشاء عملية ابنة. ثم تقوم العملية الابنة بعملexec("ls")لتحميل وتنفيذ برنامجls. عندما ينتهيls، تعود العملية الابنة وتُنهي نفسها، ويمكن للـ Shell (العملية الأم) استخدامwait()لمعرفة متى انتهت العملية الابنة.
🔗 مصدر خارجي: Fork vs Exec in UNIX – DigitalOcean
كيف يعمل نظام التشغيل نفسه؟ يمكن أن يتم تنفيذ نظام التشغيل بطرق مختلفة، تؤثر على أدائه وأمانه:
📌 أمثلة على التنفيذ:
- في Windows: تستخدم النواة خدمات متعددة للمهام، وتجمع بين عناصر النواة المتجانسة والمصغرة في تصميم هجين.
- في Linux: يتم إدارة العمليات ككائنات kernel ذات بيانات خاصة، وتتبع نواة Linux تصميمًا متجانسًا بشكل أساسي ولكنه معياري.
يعتبر نظام **UNIX System V Release 4 (SVR4)** نموذجًا كلاسيكيًا ومهمًا لفهم إدارة العمليات في أنظمة التشغيل الشبيهة بـ UNIX.
init: هي العملية الأولى التي يتم تشغيلها عند بدء تشغيل نظام UNIX. تُعد init العملية الأم لجميع العمليات الأخرى في النظام.fork(): كما ذكرنا سابقًا، تُستخدم هذه الدالة لإنشاء عملية ابنة تكون نسخة طبق الأصل من العملية الأم.exec(): تُستخدم هذه الدالة لتحميل برنامج جديد في العملية الابنة التي تم إنشاؤها بواسطة fork().wait(): تُستخدم هذه الدالة بواسطة العملية الأم لانتظار انتهاء عملية ابنة معينة من التنفيذ قبل أن تستمر العملية الأم في عملها.exit(): تُستخدم لإنهاء العملية الحالية.📌 سلسلة حياة عملية نموذجية في UNIX:
- يقوم نظام التشغيل بتشغيل عملية
init.- تقوم عملية
initأو أي عملية أخرى (مثل الـ Shell) بعملfork()لإنشاء عملية ابنة.- تقوم العملية الابنة بتحميل برنامج جديد (مثل
lsأوgrep) باستخدامexec().- تنفذ العملية الابنة البرنامج الجديد.
- عند انتهاء العملية الابنة من تنفيذ برنامجها، تقوم بعمل
exit().- تعود السيطرة إلى العملية الأم (التي كانت تنتظر باستخدام
wait())، وتستمر في عملها.
🔗 مصدر خارجي: UNIX Process Model – Operating Systems Review (PDF)
في هذه الوحدة، تعمقنا في مفهوم **العملية (Process)** كوحدة أساسية في نظام التشغيل، وفهمنا أنها ليست مجرد كود بل كيان ديناميكي له حالة وبيانات وموارد. استعرضنا **حالات العمليات** المختلفة ودورة حياتها، وكيف يحتفظ نظام التشغيل بمعلوماتها في **كتلة تحكم العملية (PCB)**. كما تعلمنا عن آليات **التحكم في العمليات** مثل التبديل السياقي ودوال fork() وexec(). وأخيرًا، ألقينا نظرة على كيفية **تنفيذ نظام التشغيل** نفسه داخل النواة، وتناولنا نموذج **إدارة العمليات في UNIX SVR4**. فهم هذه المفاهيم ضروري للانتقال إلى مفاهيم أكثر تعقيدًا مثل التزامن (Concurrency) وإدارة الخيوط.