سؤال

سؤالي مفاهيمي إلى حد ما ، كيف يتم مشاركة بيانات عملية الوالدين مع عملية الطفل التي تم إنشاؤها بواسطة أ fork() استدعاء أو مع موضوع تم إنشاؤه بواسطة pthread_create()

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

إنني أقدر إجابات جزئية وكاملة مقدمًا ، إذا فقدت أي مورد موجود ، فأنا آسف ، لقد قمت ببعض البحث على Google ولكن لم أتمكن من العثور على نتائج جيدة

شكرا مرة أخرى على وقتك وإجاباتك

هل كانت مفيدة؟

المحلول

تختلف دلالات الشوكة () و PTHREAD_CREATE () قليلاً.

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

PTHREAD_CREATE () من ناحية أخرى ، ينشئ مؤشر ترابط جديد ضمن نفس العملية. سيكون لخيط جديد مساحة مكدس منفصلة من خيوط التشغيل الأخرى لنفس العملية ، ومع ذلك يتم مشاركة المتغيرات العالمية ومساحة الكومة بين جميع مؤشرات الترابط من نفس العملية. هذا هو السبب في أنك تحتاج غالبًا إلى Mutex لتنسيق الوصول إلى قطعة مشتركة من الذاكرة بين مؤشرات الترابط المتعددة من نفس العملية.

TL ؛ إصدار DR: مع Fork () ، لا ترى تغييرات الرجل الآخر ؛ مع pthread_create () أنت تفعل.

نصائح أخرى

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

هناك فرق كبير بين العمليات التي أنشأتها fork وبين المواضيع التي تم إنشاؤها مع pthread_create. لا تشترك العمليات في المتغيرات العالمية ويجب أن تتواصل من خلال الأنابيب أو المقابس أو الأدوات الأخرى التي يوفرها نظام التشغيل. الحل الجيد هو MPI-وهي مكتبة لتصوير الرسائل للاتصال بين العمليات.

المواضيع مختلفة تماما. موضوع تم إنشاؤه مع pthread_create تشارك جميع المتغيرات العالمية مع المتصل. علاوة على ذلك ، يمكن للمتصل تمرير بنية تعسفية في الخيط ، وسيتم مشاركة هذا الهيكل أيضًا. هذا يعني أنه يجب أن يكون المرء حذراً للغاية عند البرمجة مع مؤشرات الترابط - مثل هذه المبالغ من المشاركة خطيرة وعرضة للخطأ. ال pthread يوفر API Mutexes و ظروف التزامن القوي بين المواضيع (على الرغم من أنه لا يزال يتطلب ممارسة وخبرة للتنفيذ بشكل صحيح).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top