حرف F

التفريع / استنساخ العملية

Fork

آخر تحديث: 2026-10-12
مستوى الشرح اختر المستوى التقني المناسب لك

الشرح المبسط

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

الشرح التقني المتقدم

يعد نداء النظام (System Call) المعروف باسم التفريع (Fork) أحد أهم المفاهيم الأساسية في نظام لينكس (Linux) وعائلة أنظمة يونكس (Unix). وظيفتها الأساسية هي إنشاء عملية جديدة (Process) عن طريق استنساخ العملية الحالية التي استدعت هذا الأمر.

كيف يعمل التفريع خلف الكواليس؟

عندما تستدعي عملية ما نداء التفريع، تقوم النواة (Kernel) بإنشاء نسخة متطابقة تقريبا من العملية الأصلية. تُعرف العملية الأصلية باسم العملية الأب (Parent Process)، بينما تُعرف العملية الجديدة باسم العملية الابن (Child Process).

في الأنظمة الحديثة، يستخدم لينكس تقنية النسخ عند الكتابة (Copy-on-Write) لتحسين الأداء. هذا يعني أن الذاكرة (Memory) لا تُنسخ فعليا لحظة التفريع، بل يتشارك الأب والابن نفس صفحات الذاكرة حتى يحاول أحدهما تعديلها، حينها فقط يتم إنشاء نسخة فعلية ومستقلة من تلك الصفحة.

استخدام التفريع برمجيا (بلغة سي)

في البرمجة، يتم استدعاء التفريع باستخدام الدالة fork()، والتي ترجع قيما مختلفة بناء على سياق التنفيذ لمعرفة من هو الأب ومن هو الابن لتوجيه مسار البرنامج:

أمر التنفيذ البرمجي المبسط:

#include <unistd.h>
pid_t p = fork();

توضيح للقيم المرجعة من نداء التفريع وكيفية التعامل معها:

  • القيمة صفر: تعني أننا حاليا في سياق العملية الابن (Child Process) ويمكننا البدء في تنفيذ مهامها.
  • قيمة موجبة: تمثل معرف العملية (PID) للابن، وتعني أننا في سياق العملية الأب (Parent Process).
  • قيمة سالبة: تعني فشل عملية التفريع، ويحدث ذلك غالبا بسبب بلوغ الحد الأقصى للعمليات أو نقص موارد النظام.

ملاحظة ختامية: الصورة الكبرى (نصيحة احترافية)

نادرا ما يُستخدم التفريع بمفرده لفترة طويلة كنسخة متطابقة. العادة في لينكس هي دمج fork() مع عائلة دوال exec(). يقوم التفريع بإنشاء العملية الجديدة، ثم يقوم أمر exec باستبدال مساحة الذاكرة الخاصة بالابن ببرنامج جديد كليا ليبدأ تشغيله، وهذه هي الطريقة القياسية التي تعمل بها واجهة سطر الأوامر (Shell) لتنفيذ أوامرك اليومية.