2012-07-19 17 views
5

साझा स्मृति की पूरी अवधारणा के बारे में सोचने के बाद, एक प्रश्न आया:प्रोसेस वीएस थ्रेड: क्या दो प्रक्रियाएं समान साझा स्मृति साझा कर सकती हैं? दो धागे कर सकते हैं?

दो प्रक्रियाएं समान साझा मेमोरी सेगमेंट साझा कर सकती हैं? क्या दो धागे समान साझा स्मृति साझा कर सकते हैं?

इसके बारे में थोड़ा और स्पष्ट रूप से सोचने के बाद, मैं लगभग सकारात्मक हूं कि दो प्रक्रियाएं समान साझा मेमोरी सेगमेंट साझा कर सकती हैं, जहां पहला पिता है और दूसरा पुत्र है, जिसे fork() के साथ बनाया गया था, लेकिन दो धागे के बारे में क्या?

धन्यवाद

उत्तर

10

दो प्रक्रियाओं में एक ही साझा स्मृति खंड साझा कर सकते हैं?

हां और नहीं। आम तौर पर आधुनिक ऑपरेटिंग सिस्टम के साथ, जब पहली प्रक्रिया forked पहले से होती है, तो वे सभी पृष्ठों पर "copy-on-write" सेट के साथ एक ही मेमोरी स्पेस साझा करते हैं। किसी भी पठन-लेखन स्मृति पृष्ठों में किए गए कोई भी अपडेट पृष्ठ के लिए एक प्रतिलिपि बनाने का कारण बनता है, इसलिए दो प्रतियां होंगी और स्मृति पृष्ठ अब माता-पिता और बाल प्रक्रिया के बीच साझा नहीं किया जाएगा। इसका अर्थ यह है कि केवल पढ़ने-योग्य पृष्ठ या पृष्ठ जिन्हें लिखे गए नहीं हैं, साझा किए जाएंगे।

यदि किसी प्रक्रिया में किसी अन्य से फोर्क नहीं किया गया है तो वे किसी भी स्मृति को साझा नहीं करते हैं। एक अपवाद यह है कि यदि आप एक ही प्रोग्राम के दो उदाहरण चला रहे हैं तो वे code and maybe even static data segments साझा कर सकते हैं लेकिन कोई अन्य पृष्ठ साझा नहीं किया जाएगा।

समान स्मृति खंड साझा करने के लिए specific memory-map calls भी हैं। कॉल निर्दिष्ट करता है कि नक्शा केवल पढ़ने या पढ़ने-लिखने के लिए है या नहीं। यह कैसे करें ओएस निर्भर है।

क्या दो धागे समान साझा स्मृति साझा कर सकते हैं?

निश्चित रूप से। आम तौर पर बहु-थ्रेडेड प्रक्रिया के अंदर की सभी मेमोरी सभी धागे से "साझा" होती है। आमतौर पर धागे की परिभाषा होती है कि वे सभी एक ही स्मृति स्थान के भीतर चल रहे हैं।

थ्रेड में प्रोसेसर/कोर से जुड़ी उच्च गति मेमोरी में cached memory segments होने की अतिरिक्त जटिलता भी है। यह कैश मेमोरी नहीं सिंक्रनाइज़ेशन ऑपरेशंस के आधार पर मेमोरी पेजों के साझा और अपडेट केंद्रीय स्टोरेज में फंस जाती है।

+0

पुन "यह कैश मेमोरी साझा नहीं की जाती है और सिंक्रनाइज़ेशन ऑपरेशंस के आधार पर मेमोरी पृष्ठों को अपडेट किया जाता है": एक अच्छी या बुरी चीज? – Pacerier

+0

पुन "थ्रेड्स में प्रोसेसर/कोर से जुड़ी हाई स्पीड मेमोरी में कैश मेमोरी सेगमेंट होने की अतिरिक्त जटिलता भी है": क्या यह एक ओएस कर्नेल चीज भी है ?, या सिर्फ एक सॉफ्टवेयर भाषा लाइब्रेरी सुविधा है? – Pacerier

+0

यह @Pacerier की एक बहुत अच्छी बात है। स्थानीय सीपीयू मेमोरी कैश मल्टीथ्रेड प्रोग्राम में देखे जाने वाले अधिकांश प्रदर्शन लाभ देता है। यह _hardware_ द्वारा समर्थित है ओएस और न ही सॉफ्टवेयर। सॉफ़्टवेयर को मेमोरी कैश को स्मृति बाधाओं के मामले में ध्यान में रखना आवश्यक है जो फ्लशिंग और अपडेटिंग को नियंत्रित करते हैं लेकिन सीपीयू डिज़ाइन के कारण वे स्वचालित रूप से होते हैं। – Gray

1

हां, दो प्रक्रियाएं दोनों साझा स्मृति खंड से संलग्न हो सकती हैं। एक साझा मेमोरी सेगमेंट का अधिक उपयोग नहीं किया जाएगा यदि यह सत्य नहीं था, क्योंकि यह एक साझा मेमोरी सेगमेंट के पीछे मूल विचार है - यही कारण है कि यह आईपीसी (इंटर-प्रोसेस संचार) के कई रूपों में से एक है।

एक ही प्रक्रिया में दो धागे दोनों एक साझा मेमोरी सेगमेंट से भी संलग्न हो सकते हैं, लेकिन यह देखते हुए कि वे पहले से ही उस प्रक्रिया के पूरे पता स्थान को साझा करते हैं, जिसकी वे हिस्सा हैं, संभवत: अधिकतर बिंदु नहीं है (हालांकि कोई शायद ऐसा करने के लिए एक कम या कम वैध उपयोग मामले के साथ आने के लिए एक चुनौती के रूप में देखें)।

+0

मुझे अधिक से अधिक 'कम मान्य' संदेह है :) कृपया, कृपया डेवलपर्स को सुझाव न दें कि वे धागे के साथ और भी अजीब चीजें करते हैं, यह है –

2

सामान्य रूप से, प्रक्रियाओं का एक प्रमुख बिंदु स्मृति साझा करने से रोकने के लिए है! साझा साझा खंड के माध्यम से इंटर-प्रोसेस कॉम सबसे आम ओएस पर निश्चित रूप से संभव है, लेकिन तंत्र डिफ़ॉल्ट रूप से नहीं होते हैं। साझा क्षेत्र को व्यवस्थित करने और प्रबंधित करने में विफल होने पर, यदि आप भाग्यशाली हैं और यूबी नहीं हैं तो संभवतः सीजीएफॉल्ट/एवी में परिणाम होगा।

एक ही प्रक्रिया से संबंधित थ्रेड, हालांकि, ऐसी हार्डवेयर मेमोरी-प्रबंधन सुरक्षा ऐसी कोई भी चीज़ नहीं है जो उन्हें पसंद है, स्पष्ट नकारात्मकता यह है कि वे जो कुछ भी पसंद करते हैं उन्हें भ्रष्ट कर सकते हैं। मैंने वास्तव में यह एक बड़ी समस्या होने के लिए कभी नहीं पाया है, esp। आधुनिक ओओ भाषाओं के साथ जो ऑब्जेक्ट इंस्टेंस, (जावा, सी #, डेल्फी) के रूप में 'संरचना' पॉइंटर्स होते हैं।

0

सामान्य शब्दों में, प्रत्येक प्रक्रिया में अवांछित बातचीत से बचने के लिए सभी लोगों से पृथक स्मृति स्थान पर कब्जा होता है (जिनमें सुरक्षा समस्याएं उत्पन्न होती हैं)। हालांकि, आमतौर पर स्मृति के भाग साझा करने के लिए प्रक्रियाओं का एक माध्यम होता है। कभी-कभी यह रैम पदचिह्न को कम करने के लिए किया जाता है (VAX/VMS में "स्थापित फ़ाइलें" एक ऐसा उदाहरण था)। सह-संचालन प्रक्रियाओं के संवाद के लिए यह एक बहुत ही प्रभावी तरीका भी हो सकता है। यह साझाकरण कैसे कार्यान्वित/संरचित/प्रबंधित किया जाता है (उदा। माता-पिता/बच्चा) विशिष्ट ऑपरेटिंग सिस्टम और एप्लिकेशन कोड में लागू डिज़ाइन विकल्पों द्वारा प्रदान की गई सुविधाओं पर निर्भर करता है।

एक प्रक्रिया के भीतर, प्रत्येक थ्रेड में एक ही प्रक्रिया के सभी अन्य धागे के समान सटीक स्मृति स्थान तक पहुंच होती है। एकमात्र चीज जो थ्रेड के लिए अद्वितीय है, वह "निष्पादन संदर्भ" है, जिसका हिस्सा इसका ढेर है (हालांकि कुछ भी एक थ्रेड को उसी प्रक्रिया के दूसरे धागे से संबंधित "ढेर तक पहुंचने या छेड़छाड़ करने से रोकता है)।