بنناجح
المرحلة 2: الـ Processes والـ Scheduling · الدرس 1 من 5 · 25 دقيقة

الـ Process من جوه

البرنامج ملف على الديسك ساكت مابيعملش حاجة. أول ما تشغّله بيبقى Process: حاجة حية ليها ذاكرة، ومكان في الكود، وملفات مفتوحة، وحالة. الدرس ده بيشرح الـ Process بالظبط إيه، وبيتعمل إزاي، والحالات اللي بيمر بيها، ونظام التشغيل بيتابعه إزاي، وتشوف كل ده بعينك في /proc.

في الدرس ده هتتعلم
  • تفرّق بين Program و Process
  • تعرف مكونات الـ Process: Address Space و Registers و Open Files
  • تفهم خطوات إنشاء الـ Process
  • تعرف حالات الـ Process وتقراها في ps
  • تفهم الـ Process Control Block وتشوفه في /proc

1. Program و Process

مثال قدامك على أي سيرفر: ملف واحد /usr/sbin/php-fpm8.3 على الديسك، و 20 Process منه شغالين، كل واحد بيخدم Request مختلف، وكل واحد ليه ذاكرته ومتغيراته.

الـ Process هي الوحدة اللي نظام التشغيل بيوزّع عليها الـ CPU والذاكرة، وبيعزلها عن غيرها، وبيقتلها لو غلطت.

2. الـ Process مكونة من إيه؟

لو عايز توقف Process وترجعها بعدين بالظبط زي ما كانت (وده اللي الـ Context Switch بيعمله)، لازم تحفظ كل اللي بيحدد حالتها. ودي مكوناتها:

المكوّن فيه إيه
Address Space الذاكرة اللي الـ Process شايفاها: الكود، والداتا الثابتة، والـ Heap (اللي بيكبر مع new و malloc)، والـ Stack (المتغيرات المحلية واستدعاءات الدوال)
Registers قيم الـ CPU وقت ما اتوقفت. أهمها: Program Counter (أنهي أمر الجاي)، و Stack Pointer (فين آخر الـ Stack)
Open Files قايمة الـ File Descriptors: 0 = stdin، و 1 = stdout، و 2 = stderr، وبعدهم أي ملف أو Socket فتحته
معلومات تانية الـ PID (رقمها)، والـ Parent، والـ User اللي شغّلها، والفولدر الحالي، ومتغيرات البيئة، والأولوية
Terminal: شوف Process حقيقية
$ pgrep -n php-fpm            # آخر php-fpm Process اتعملت
48211

$ ls -l /proc/48211/fd        # الملفات المفتوحة
0 -> /dev/null
1 -> /dev/null
2 -> /var/log/php8.3-fpm.log
7 -> socket:[918273]          # الاتصال بالـ nginx
9 -> /var/www/app/storage/logs/laravel.log

$ grep -E 'State|PPid|VmRSS|Threads' /proc/48211/status
State:   S (sleeping)
PPid:    1021                 # الـ Master Process اللي عملتها
VmRSS:   61432 kB
Threads: 1

/proc مش فولدر حقيقي على الديسك. ده نظام التشغيل بيعرض معلوماته الداخلية عن كل Process كأنها ملفات، وده تطبيق لفكرة UNIX “كل حاجة ملف”.

3. إزاي Process بتتعمل؟

لما تكتب php artisan queue:work وتدوس Enter، نظام التشغيل بيعمل الخطوات دي:

  1. يحمّل البرنامج: يقرا الملف التنفيذي من الديسك، ويحط الكود والداتا الثابتة في Address Space جديد. الأنظمة الحديثة بتعمل ده بكسل (Lazily): بتحمّل كل جزء أول ما الـ Process تحتاجه فعلاً، مش كله مرة واحدة.
  2. يجهّز الـ Stack: ويحط عليه الـ Arguments (queue:work) ومتغيرات البيئة.
  3. يجهّز الـ Heap: مساحة صغيرة في الأول، وبتكبر لما الـ Process تطلب.
  4. يجهّز الملفات: يفتح 0 و 1 و 2 (أو يورّثهم من الـ Shell).
  5. يبدأ التنفيذ: يحط الـ Program Counter على أول أمر (نقطة البداية في البرنامج)، ويدّي الـ CPU للـ Process.

4. حالات الـ Process

الـ Process مش دايماً شغالة. في أي لحظة هي في حالة من دول:

الحالة معناها في ps (عمود STAT)
Running شغالة دلوقتي على CPU R
Ready جاهزة وعايزة CPU، ومستنية دورها R كمان (Linux مش بيفرّق بينهم في العرض)
Blocked مستنية حاجة: Request على الشبكة، أو قراية من الديسك، أو Timer S (نايمة وممكن تصحى بـ Signal)، أو D (مستنية I/O ومينفعش تتقاطع)
Zombie خلصت، بس الـ Parent لسه ماقراش نتيجتها Z
Stopped اتوقفت بـ Signal (زي Ctrl+Z) T
Worker بيخدم Requestجرّب بنفسك
في الداتابيزAReadyBRunningCPUB
Process A · queue worker⏱Process B · cron job
  1. 1يحسب تقرير…Running
  2. Scheduler: دور AB ← Ready
  3. SELECT * FROM jobs … (على الشبكة)Blocked3
  4. Scheduler: مين Ready؟ B
  5. Interrupt: رد الداتابيز وصلA ← Ready
  6. يكمّل معالجة الـ JobRunning6
▶

دوس ▶ شغّل، أو امشي خطوة خطوة بالأسهم.

Running = على الـ CPU دلوقتي. Ready = عايزة CPU ومستنية. Blocked = مستنية حاجة تانية خالص، ومش هتاخد CPU لحد ما الحاجة دي تحصل.

5. الـ Process Control Block

نظام التشغيل محتاج يفتكر كل حاجة عن كل Process: حالتها، والـ Registers بتاعتها لو مش شغالة، وذاكرتها فين، وملفاتها، وأولويتها، والـ Parent بتاعها. وده بيتحفظ في Structure لكل Process اسمها Process Control Block (PCB).

في Linux الـ PCB اسمها task_struct: Structure ضخمة جوه الـ Kernel، فيها مئات الحقول. و /proc/<pid>/ هي نافذة بتعرضلك جزء منها.

6. أسئلة

فكّر في إجابتك الأول، وبعدين افتح السؤال.

01الفرق بين Program و Process؟

الـ Program ملف ثابت على الديسك فيه كود وداتا. الـ Process هو البرنامج وهو شغال: ليه ذاكرة، و Registers، ومكان في الكود، وملفات مفتوحة، وحالة. وممكن يبقى فيه كذا Process من نفس البرنامج.

02إيه المكونات اللي بتحدد حالة Process؟

الـ Address Space (كود و Heap و Stack)، والـ Registers (أهمها Program Counter و Stack Pointer)، والملفات المفتوحة، ومعلومات زي الـ PID والـ Parent والأولوية والـ User.

03الفرق بين Ready و Blocked؟

Ready: عايزة CPU ومستنية دورها بس. Blocked: مستنية حدث تاني (رد شبكة، أو قراية ديسك، أو Timer)، ومش هتاخد CPU حتى لو فاضي لحد ما الحدث ده يحصل، وبعدها بترجع Ready.

04إيه هو الـ PCB؟

Process Control Block: الـ Structure اللي الـ Kernel بيحفظ فيه كل حاجة عن Process: الـ PID، والحالة، والـ Registers المحفوظة، والذاكرة، والملفات المفتوحة، والأولوية، والـ Parent. في Linux اسمه task_struct، وجزء منه بيظهر في /proc.

05Process حالتها D في ps. ده معناه إيه؟

Uninterruptible Sleep: مستنية I/O (غالباً من الديسك) ومينفعش تتقاطع بـ Signal، حتى kill -9 مش هيقتلها فوراً. لو فيه Processes كتير في D، غالباً الديسك أو الـ Storage على الشبكة بطيء، وده بيرفع الـ Load Average.

علّم عليه لما تقدر تجاوب أسئلة الإنترفيو من غير ما تبص.