वे दो वाक्यांश हैं जो बहुत ही अलग दृष्टिकोण से एक ही बात का वर्णन करते हैं। समानांतर प्रोग्रामिंग हार्डवेयर के दृष्टिकोण से स्थिति का वर्णन कर रही है - समानांतर में एक समस्या पर काम करने वाले कम से कम दो प्रोसेसर (संभवतः एक एकल भौतिक पैकेज के भीतर) हैं। समवर्ती प्रोग्रामिंग सॉफ्टवेयर के दृष्टिकोण से अधिक चीजों का वर्णन कर रही है - दो या अधिक क्रियाएं ठीक उसी समय (समवर्ती) हो सकती हैं।
यहां समस्या यह है कि लोग दो वाक्यांशों का उपयोग करने की कोशिश कर रहे हैं ताकि कोई भी वास्तव में मौजूद न हो। वास्तविकता यह है कि वे जिस विभाजन रेखा को खींचने की कोशिश कर रहे हैं, वह दशकों से अस्पष्ट और अविभाज्य है, और समय के साथ कभी भी अधिक अस्थिर हो गई है।
वे जो चर्चा करने की कोशिश कर रहे हैं वह यह तथ्य है कि एक बार, अधिकांश कंप्यूटरों में केवल एक ही सीपीयू था। जब आप उस एकल CPU पर कई प्रक्रियाओं (या थ्रेड्स) को निष्पादित करते हैं, तो सीपीयू केवल एक बार उन थ्रेड्स में से एक निर्देश को निष्पादित कर रहा था। संगामिति की उपस्थिति एक भ्रम था - विभिन्न थ्रेड्स से निर्देश निष्पादित करने के बीच सीपीयू स्विचिंग जल्दी से मानव धारणा (जिससे 100 एमएस से कम कुछ भी या तात्कालिक लग रहा है) के लिए यह ऐसा लग रहा था कि यह एक ही बार में कई चीजें कर रहा था।
इसके विपरीत स्पष्ट कई सीपीयू के साथ एक कंप्यूटर है, या कई कोर के साथ एक सीपीयू है, इसलिए मशीन एक ही समय में कई थ्रेड्स और / या प्रक्रियाओं से निर्देशों को निष्पादित कर रही है; कोड निष्पादित करने वाला कोड दूसरे में कोड निष्पादन पर कोई प्रभाव नहीं डाल सकता है।
अब समस्या: इस तरह के एक साफ अंतर का अस्तित्व लगभग कभी नहीं रहा है। कंप्यूटर डिजाइनर वास्तव में काफी बुद्धिमान होते हैं, इसलिए उन्होंने बहुत समय पहले यह देखा था (उदाहरण के लिए) जब आपको I / O डिवाइस से कुछ डेटा पढ़ने की आवश्यकता होती है जैसे कि डिस्क, तो यह एक लंबा समय लगता है समय (सीपीयू चक्र के संदर्भ में) से लिया गया था समाप्त। ऐसा होने के दौरान सीपीयू को छोड़ने के बजाय, उन्होंने एक प्रक्रिया / धागा को I / O अनुरोध बनाने के विभिन्न तरीकों का पता लगाया, और सीपीयू पर कुछ अन्य प्रक्रिया / थ्रेड निष्पादित से कोड दें, जबकि I / O अनुरोध पूरा हो गया।
इसलिए, मल्टी-कोर सीपीयू के आदर्श बनने से बहुत पहले, हमारे पास समानांतर में होने वाले कई थ्रेड्स से ऑपरेशन थे।
हालांकि यह केवल हिमशैल की नोक है। दशकों पहले, कंप्यूटर ने समानता का एक और स्तर प्रदान करना शुरू कर दिया। फिर से, काफी बुद्धिमान लोग होने के नाते, कंप्यूटर डिजाइनरों ने देखा कि बहुत सारे मामलों में, उनके पास निर्देश थे जो एक दूसरे को प्रभावित नहीं करते थे, इसलिए एक ही समय में एक ही स्ट्रीम से एक से अधिक निर्देशों को निष्पादित करना संभव था। एक प्रारंभिक उदाहरण जो बहुत अच्छी तरह से ज्ञात हो गया वह था कंट्रोल डेटा 6600। यह 1964 में शुरू होने पर पृथ्वी पर सबसे तेज कंप्यूटर था (एक काफी विस्तृत मार्जिन के द्वारा) - और आज भी उसी मूल वास्तुकला का बहुत उपयोग किया जाता है। यह प्रत्येक निर्देश द्वारा उपयोग किए जाने वाले संसाधनों को ट्रैक करता है, और निष्पादन इकाइयों का एक सेट होता है, जो निर्देश को निष्पादित करते हैं जैसे ही वे जिस पर निर्भर थे, वे उपलब्ध हो गए, अधिकांश हाल के इंटेल / एएमडी प्रोसेसर के डिजाइन के समान।
लेकिन (जैसा कि विज्ञापन कहते थे) प्रतीक्षा करें - यह सब नहीं है। अभी और भ्रम को जोड़ने के लिए एक और डिज़ाइन तत्व है। इसे कुछ अलग-अलग नाम दिए गए हैं (उदाहरण के लिए, "हाइपरथ्रेडिंग", "SMT", "CMP"), लेकिन वे सभी एक ही मूल विचार का उल्लेख करते हैं: एक CPU जो कुछ संसाधनों के संयोजन का उपयोग करते हुए एक साथ कई थ्रेड्स निष्पादित कर सकता है, प्रत्येक थ्रेड के लिए स्वतंत्र हैं, और कुछ संसाधन जो थ्रेड्स के बीच साझा किए जाते हैं। एक विशिष्ट मामले में यह ऊपर उल्लिखित निर्देश-स्तरीय समानता के साथ संयुक्त है। ऐसा करने के लिए, हमारे पास वास्तु रजिस्टरों के दो (या अधिक) सेट हैं। फिर हमारे पास निष्पादन इकाइयों का एक सेट है जो आवश्यक संसाधन उपलब्ध होते ही निर्देश निष्पादित कर सकता है।
फिर, निश्चित रूप से, हम कई कोर के साथ आधुनिक प्रणालियों को प्राप्त करते हैं। यहाँ चीजें स्पष्ट हैं, है ना? हमारे पास एन (कहीं पर 2 और 256 या तो, इस समय) अलग-अलग कोर हैं, जो सभी एक ही समय में निर्देशों को निष्पादित कर सकते हैं, इसलिए हमारे पास वास्तविक समानता का स्पष्ट-कट मामला है - एक प्रक्रिया / थ्रेड डन में निर्देश निष्पादित करना ' t दूसरे में निष्पादन के निर्देशों को प्रभावित करता है।
अच्छी तरह की। यहां भी हमारे पास कुछ स्वतंत्र संसाधन (रजिस्टर, निष्पादन इकाइयां, कम से कम एक स्तर कैश) और कुछ साझा संसाधन (आमतौर पर कम से कम कैश का स्तर, और निश्चित रूप से स्मृति नियंत्रक और मेमोरी के लिए बैंडविड्थ) हैं।
संक्षेप में: लोगों को साझा संसाधनों और स्वतंत्र संसाधनों के बीच विपरीत करने के लिए सरल परिदृश्य वास्तव में वास्तविक जीवन में कभी नहीं होते हैं। सभी संसाधनों को साझा करने के साथ, हम MS-DOS जैसी किसी चीज़ के साथ समाप्त हो जाते हैं, जहाँ हम एक समय में केवल एक प्रोग्राम चला सकते हैं, और हमें एक को चलाने से पहले रोकना होगा, ताकि हम दूसरे को चला सकें। पूरी तरह से स्वतंत्र संसाधनों के साथ, हमारे पास एमएस-डॉस (उन्हें कनेक्ट करने के लिए भी एक नेटवर्क के बिना) चलने वाले एन कंप्यूटर हैं, जिनके बीच कुछ भी साझा करने की क्षमता नहीं है (क्योंकि अगर हम किसी फ़ाइल को साझा कर सकते हैं, तो ठीक है, यह एक साझा संसाधन है, एक कुछ भी साझा नहीं किए जाने के मूल आधार का उल्लंघन)।
प्रत्येक दिलचस्प मामले में स्वतंत्र संसाधनों और साझा संसाधनों का कुछ संयोजन शामिल है। प्रत्येक यथोचित आधुनिक कंप्यूटर (और बहुत कुछ जो सभी आधुनिक नहीं हैं) में कम से कम कुछ स्वतंत्र संचालन को एक साथ करने की क्षमता है, और एमएस-डॉस की तुलना में अधिक परिष्कृत कुछ के बारे में कम से कम लाभ उठाया है। कुछ मात्रा में या कुछ हद तक।
"समवर्ती" और "समानांतर" के बीच अच्छा, स्वच्छ विभाजन जो लोग आकर्षित करना पसंद करते हैं, उनका अस्तित्व नहीं है, और लगभग कभी नहीं होता है। लोगों को "समवर्ती" के रूप में वर्गीकृत करने के लिए क्या पसंद है आमतौर पर अभी भी कम से कम एक और अक्सर विभिन्न प्रकार के समानांतर निष्पादन शामिल हैं। वे "समानांतर" के रूप में वर्गीकृत करना पसंद करते हैं, जिसमें अक्सर संसाधनों को साझा करना शामिल होता है और (उदाहरण के लिए) दोनों के बीच साझा किए गए संसाधन का उपयोग करते हुए एक प्रक्रिया दूसरे के निष्पादन को अवरुद्ध करती है।
"समानांतर" और "समवर्ती" के बीच एक साफ अंतर खींचने की कोशिश करने वाले लोग कंप्यूटर की एक कल्पना में जी रहे हैं जो वास्तव में कभी अस्तित्व में नहीं थे।