دعونا نجد بعض الاختلافات بين شوكة () و vfork () بمساعدة من الرسم البياني المقارنة المبين أدناه.
رسم بياني للمقارنة
أساس للمقارنة | شوكة() | vfork () |
---|---|---|
الأساسية | تتضمن عملية الطفل وعملية الأصل مساحات عناوين منفصلة. | تشارك عملية الطفل وعملية الأصل في نفس مساحة العنوان. |
إعدام | تنفيذ عملية الوالدين والطفل في وقت واحد. | لا تزال عملية الوالدين معلّقة حتى يكمل عملية الطفل تنفيذه. |
تعديل | إذا قامت العملية الفرعية بتغيير أي صفحة في مساحة العنوان ، فإنها تكون غير مرئية للعملية الأصلية حيث تكون مساحة العنوان منفصلة. | إذا أدت عملية الطفل إلى تبديل أي صفحة في مساحة العنوان ، فإنها تكون مرئية للعملي الأصل أثناء مشاركتهما نفس مساحة العنوان. |
النسخ عند الكتابة | يستخدم fork () النسخ عند الكتابة كبديل حيث يشارك الوالد والطفل نفس الصفحات حتى يقوم أي منهم بتعديل الصفحة المشتركة. | vfork () لا يستخدم النسخ على الكتابة. |
تعريف شوكة ()
شوكة () هو استخدام نظام الاتصال لإنشاء عملية جديدة . العملية الجديدة التي تم إنشاؤها بواسطة استدعاء fork () هي عملية تابعة ، من العملية التي استدعت استدعاء النظام fork (). رمز عملية الطفل مطابق لرمز عملية الأصل الخاصة به. بعد إنشاء عملية الطفل ، تبدأ كلتا العمليتين أي عملية الوالدين والطفل تنفيذها من العبارة التالية بعد الشوكة () ويتم تنفيذ كلتا العمليتين في وقت واحد .
تحتوي عملية الأصل وعملية الأطفال على مساحة عنوان منفصلة . ومن ثم ، عندما تقوم أي من العمليات بتعديل أي بيان أو متغير في الكود. لن ينعكس في رموز العملية الأخرى. لنفترض إذا كانت عملية الطفل تعدل الشفرة فلن تؤثر على العملية الرئيسية.
بعض عمليات الطفل بعد الإنشاء مباشرة استدعاء exec () . يستبدل استدعاء النظام exec () العملية مع البرنامج المحدد في المعلمة الخاصة به. ثم مساحة عنوان منفصلة لعملية الطفل هو أي فائدة. البديل الوحيد هنا هو النسخ على الكتابة.
تتيح عملية النسخ عند الكتابة السماح لعملية الوالدين والطفل بمشاركة نفس مساحة العنوان. إذا كان أي من العمليات يكتب على الصفحات في مساحة العنوان يتم إنشاء نسخة مساحة العنوان للسماح بالعملية بشكل مستقل.
تعريف vfork ()
الإصدار المعدل من fork () هو vfork (). يتم استخدام استدعاء النظام vfork () أيضًا لإنشاء عملية جديدة. على غرار الشوكة () ، هنا أيضا العملية الجديدة التي تم إنشاؤها هي عملية الطفل ، من العملية التي استدعت vfork (). رمز العملية التابعة هو أيضاً متطابق مع رمز العملية الأصل. هنا ، تقوم العملية الفرعية بتعليق تنفيذ العملية الأصل حتى تكمل تنفيذها حيث تشترك العملية في نفس مساحة العنوان لاستخدامها.
أثناء مشاركة عملية الطفل والوالدين في نفس مساحة العنوان . إذا كان أي من العمليات يعدل الشفرة ، فسيكون مرئيًا للعملية الأخرى التي تتشارك في نفس الصفحات. دعونا نفترض إذا كانت عملية الأصل يغير الشفرة ؛ سوف ينعكس في قانون عملية الطفل.
باستخدام vfork () لا يقوم بإنشاء مسافات عناوين منفصلة لعمليات الطفل والوالدين. ومن ثم ، يجب أن يتم تنفيذها حيث تستدعي عملية الطفل exec () مباشرة بعد إنشائها. لذلك ، لن يكون هناك إهدار في مساحة العنوان ، وهي الطريقة الفعالة لإنشاء عملية. vfork لا يستخدم النسخ على الكتابة .
الاختلافات الأساسية بين fork () و vfork ()
- يتمثل الاختلاف الأساسي بين شوكة و vfork في أن العملية الفرعية التي تم إنشاؤها بواسطة الشوكة تحتوي على مساحة ذاكرة منفصلة عن العملية الأصل. ومع ذلك ، فإن العملية الفرعية التي تم إنشاؤها بواسطة مكالمة نظام vfork تتشارك في نفس مساحة العنوان الخاصة بعملية الأصل الخاصة بها.
- يتم تنفيذ العملية الفرعية التي تم إنشاؤها باستخدام الشوكة في نفس الوقت مع العملية الأصل. من ناحية أخرى ، فإن عملية الطفل التي تم إنشاؤها باستخدام vfork تعلق تنفيذ العملية الرئيسية حتى يتم الانتهاء من تنفيذها.
- نظرًا لأن مساحة الذاكرة الخاصة بعملية الوالدين والطفل عبارة عن تعديل منفصل يتم إجراؤه بأي من العمليات لا يؤثر على صفحات الآخرين. ومع ذلك ، أثناء مشاركة عملية الأصل والطفل نفس تعديل عنوان الذاكرة الذي تم إجراؤه بواسطة أي عملية تعكس في مساحة العنوان.
- يستخدم شوكة استدعاء النظام () النسخ عند الكتابة كبديل ، مما يتيح مشاركة عملية الطفل والوالدين في نفس مساحة العنوان حتى يقوم أي منهم بتعديل الصفحات. من ناحية أخرى ، لا يستخدم vfork النسخ عند الكتابة.
استنتاج:
يجب تنفيذ استدعاء النظام vfork () عند exec () استدعاء العملية التابعة مباشرة بعد إنشائه باستخدام شوكة (). نظرًا لأن مساحة العنوان المنفصلة لعملية الطفل والوالدين لن تكون ذات فائدة هنا.