Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> सी प्रोग्रामिंग

निहित सूत्रण और भाषा आधारित सूत्र

अंतर्निहित थ्रेडिंग

कठिनाइयों को दूर करने और मल्टीथ्रेडेड अनुप्रयोगों के डिजाइन का बेहतर समर्थन करने का एक तरीका एप्लिकेशन डेवलपर्स से कंपाइलर और रन-टाइम लाइब्रेरी में थ्रेडिंग के निर्माण और प्रबंधन को स्थानांतरित करना है। यह, जिसे निहित सूत्रण कहा जाता है, आज एक लोकप्रिय प्रवृत्ति है।

अंतर्निहित थ्रेडिंग धागे के प्रबंधन को छिपाने के लिए मुख्य रूप से पुस्तकालयों या अन्य भाषा समर्थन का उपयोग होता है। सी के संदर्भ में सबसे आम निहित थ्रेडिंग लाइब्रेरी ओपनएमपी है।

ओपनएमपी संकलक निर्देशों का एक सेट है और साथ ही सी, सी ++, या फोरट्रान में लिखे गए कार्यक्रमों के लिए एक एपीआई है जो साझा-स्मृति वातावरण में समांतर प्रोग्रामिंग के लिए समर्थन प्रदान करता है। OpenMP समानांतर क्षेत्रों को कोड के ब्लॉक के रूप में पहचानता है जो समानांतर में चल सकते हैं। एप्लिकेशन डेवलपर समानांतर क्षेत्रों में अपने कोड में कंपाइलर निर्देश सम्मिलित करते हैं, और ये निर्देश OpenMP रन-टाइम लाइब्रेरी को क्षेत्र को समानांतर में निष्पादित करने का निर्देश देते हैं। निम्नलिखित सी प्रोग्राम प्रिंटफ () स्टेटमेंट वाले समानांतर क्षेत्र के ऊपर एक कंपाइलर निर्देश दिखाता है:

उदाहरण

#include <omp.h>
#include <stdio.h>
int main(int argc, char *argv[]){
   /* sequential code */
   #pragma omp parallel{
      printf("I am a parallel region.");
   }
   /* sequential code */
   return 0;
}

आउटपुट

I am a parallel region.

जब OpenMP निर्देश का सामना करता है

#pragma omp parallel

यह कई धागे बनाता है जो सिस्टम में कोर को संसाधित कर रहे हैं। इस प्रकार, एक डुअल-कोर सिस्टम के लिए, दो थ्रेड बनाए जाते हैं, क्वाड-कोर सिस्टम के लिए, चार बनाए जाते हैं; इत्यादि। फिर सभी धागे समानांतर क्षेत्र को एक साथ निष्पादित करते हैं। जब प्रत्येक धागा समानांतर क्षेत्र से बाहर निकलता है, तो इसे समाप्त कर दिया जाता है। OpenMP समानांतर में कोड क्षेत्रों को चलाने के लिए कई अतिरिक्त निर्देश प्रदान करता है, जिसमें समानांतर लूप शामिल हैं।

समानांतरकरण के लिए निर्देश प्रदान करने के अलावा, ओपनएमपी डेवलपर्स को समानता के कई स्तरों में से चुनने की अनुमति देता है। उदाहरण के लिए, वे मैन्युअल रूप से धागे की संख्या निर्धारित कर सकते हैं। यह डेवलपर्स को यह पहचानने की भी अनुमति देता है कि डेटा थ्रेड के बीच साझा किया जाता है या थ्रेड के लिए निजी है। OpenMP Linux, Windows और Mac OS X सिस्टम के लिए कई ओपन-सोर्स और कमर्शियल कंपाइलर पर उपलब्ध है।

ग्रैंड सेंट्रल डिस्पैच (GCD)

ग्रैंड सेंट्रल डिस्पैच (जीसीडी) - ऐप्पल के मैक ओएस एक्स और आईओएस ऑपरेटिंग सिस्टम के लिए एक तकनीक - सी भाषा, एक एपीआई और एक रन-टाइम लाइब्रेरी के एक्सटेंशन का एक संयोजन है जो एप्लिकेशन डेवलपर्स को कोड के अनुभागों को चलाने के लिए स्पॉट करने की अनुमति देता है। समानांतर। ओपनएमपी की तरह, जीसीडी भी थ्रेडिंग के अधिकांश विवरणों का प्रबंधन करता है। यह ब्लॉक के रूप में जानी जाने वाली C और C++ भाषाओं के एक्सटेंशन की पहचान करता है। एक ब्लॉक केवल कार्य की एक स्व-निहित इकाई है। यह एक कैरेट द्वारा निर्दिष्ट किया जाता है जो ब्रेसिज़ की एक जोड़ी के सामने डाला जाता है { }। एक ब्लॉक का एक सरल उदाहरण नीचे दिखाया गया है -

{
   ˆprintf("This is a block");
}

यह एक प्रेषण कतार पर रखकर रन-टाइम निष्पादन के लिए ब्लॉक शेड्यूल करता है। जब GCD किसी कतार से किसी ब्लॉक को हटाता है, तो यह ब्लॉक को उस थ्रेड पूल से उपलब्ध थ्रेड को असाइन करता है जिसे वह प्रबंधित करता है। यह दो प्रकार की प्रेषण कतारों की पहचान करता है:धारावाहिक और समवर्ती। सीरियल कतार में रखे ब्लॉक FIFO क्रम में हटा दिए जाते हैं। एक बार एक ब्लॉक को कतार से हटा दिए जाने के बाद, दूसरे ब्लॉक को हटाने से पहले उसे निष्पादन पूरा करना होगा। प्रत्येक प्रक्रिया की अपनी धारावाहिक कतार होती है (जिसे मुख्य कतार के रूप में जाना जाता है)। डेवलपर अतिरिक्त सीरियल क्यू बना सकता है जो विशेष प्रक्रियाओं के लिए स्थानीय हैं। सीरियल कतार कई कार्यों के क्रमिक निष्पादन को सुनिश्चित करने के लिए उपयोगी हैं। समवर्ती कतार में रखे गए ब्लॉक को भी FIFO क्रम में हटा दिया जाता है, लेकिन एक समय में कई ब्लॉकों को हटाया जा सकता है, इस प्रकार कई ब्लॉक समानांतर में निष्पादित हो सकते हैं। तीन सिस्टम-व्यापी समवर्ती प्रेषण कतारें हैं, और उन्हें प्राथमिकता के अनुसार प्रतिष्ठित किया जाता है:निम्न, डिफ़ॉल्ट और उच्च। प्राथमिकताएं ब्लॉकों के सापेक्ष महत्व के अनुमान का प्रतिनिधित्व करती हैं। काफी सरलता से, उच्च प्राथमिकता वाले ब्लॉकों को उच्च प्राथमिकता वाली प्रेषण कतार में रखा जाना चाहिए। निम्न कोड खंड डिफ़ॉल्ट-प्राथमिकता समवर्ती कतार प्राप्त करने और प्रेषण async() फ़ंक्शन का उपयोग करके कतार में एक ब्लॉक सबमिट करने को दर्शाता है:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch async(queue, ˆ{ printf("This is a block."); });

आंतरिक रूप से, GCD का थ्रेड पूल POSIX थ्रेड्स से बना होता है। जीसीडी सक्रिय रूप से पूल का प्रबंधन करता है, जिससे आवेदन की मांग और सिस्टम क्षमता के अनुसार थ्रेड्स की संख्या बढ़ने और सिकुड़ने की अनुमति मिलती है।

वस्तुओं के रूप में धागे

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

जावा थ्रेड्स

जावा एक थ्रेड श्रेणी और एक रननेबल इंटरफ़ेस प्रदान करता है जिसका उपयोग किया जा सकता है। प्रत्येक को एक सार्वजनिक शून्य रन () तकनीक को लागू करने की आवश्यकता होती है जो थ्रेड के प्रवेश उद्देश्य को परिभाषित करती है। एक बार ऑब्जेक्ट का एक उदाहरण आवंटित हो जाने के बाद, उस पर स्टार्ट () तकनीक को लागू करके थ्रेड शुरू किया जाता है। Pthreads की तरह, थ्रेड की शुरुआत अतुल्यकालिक है, कि निष्पादन की अस्थायी व्यवस्था गैर-निर्धारक है।

पायथन थ्रेड्स

पायथन अतिरिक्त रूप से मल्टीथ्रेडिंग के लिए दो तंत्र प्रदान करता है। एक दृष्टिकोण पर्थ्रेड शैली के बराबर है, जहां भी एक फ़ंक्शन नाम को लाइब्रेरी विधि थ्रेड में पास किया जाता है। start_new_thread ()। यह दृष्टिकोण बहुत अधिक है और एक बार शुरू होने के बाद इसमें शामिल होने या समाप्त करने के लिए लचीलेपन की कमी होती है। एक अतिरिक्त लचीली तकनीक थ्रेडिंग का विस्तार करने वाले वर्ग की रूपरेखा तैयार करने के लिए थ्रेडिंग मॉड्यूल का उपयोग करना है। धागा। लगभग जावा दृष्टिकोण की तरह, श्रेणी में एक रन () विधि होनी चाहिए जो थ्रेड के प्रवेश उद्देश्य को प्रदान करे। एक बार जब कोई वस्तु इस श्रेणी से त्वरित हो जाती है, तो उसे स्पष्ट रूप से शुरू किया जा सकता है और बाद में जोड़ा जा सकता है।

भाषा डिजाइन के रूप में समरूपता

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

गोरआउट्स

गो भाषा में निहित थ्रेडिंग के लिए एक तुच्छ तंत्र शामिल है:कीवर्ड को कॉल से पहले रखें। नया धागा एक संदेश-पासिंग चैनल के लिए एक एसोसिएशन पास कर दिया गया है। फिर, अधिकांश थ्रेड सफलता कहते हैं :=<-संदेश, जो चैनल पर एक हस्तक्षेप स्कैन करता है। एक बार जब उपयोगकर्ता सात का सही अनुमान दर्ज कर लेता है, तो कीबोर्ड ऑडिटर थ्रेड चैनल को लिखता है, जिससे अधिकांश थ्रेड प्रगति की अनुमति देता है।

चैनल और गोरोइन गो भाषा के मुख्य घटक हैं, जिसे इस विश्वास के तहत डिजाइन किया गया था कि लगभग सभी कार्यक्रम बहु-थ्रेडेड होंगे। यह शैली विकल्प इवेंट मॉडल को सुव्यवस्थित करता है, जिससे भाषा स्वयं को अप-टू-डेट थ्रेड्स और प्रोग्रामिंग के प्रबंधन की जिम्मेदारी देती है।

जंग संगामिति

एक अन्य भाषा रस्ट है जिसे हाल के वर्षों में केंद्रीय डिजाइन सुविधा के रूप में संगामिति के साथ बनाया गया है। निम्न उदाहरण एक नया थ्रेड बनाने के लिए थ्रेड ::स्पॉन () के उपयोग को दिखाता है, जिसे बाद में इसमें शामिल होने () को शामिल करके जोड़ा जा सकता है। थ्रेड का तर्क ::स्पॉन () || . से शुरू होता है एक क्लोजर के रूप में जाना जाता है, जिसे एक अनाम फ़ंक्शन के रूप में माना जा सकता है। यानी, यहां चाइल्ड थ्रेड a का मान प्रिंट करेगा।

उदाहरण

use std::thread;
fn main() {
   /* Initialize a mutable variable a to 7 */
   let mut a = 7;
   /* Spawn a new thread */
   let child_thread = thread::spawn(move || {
      /* Make the thread sleep for one second, then print a */
      a -= 1;
      println!("a = {}", a)
   });
   /* Change a in the main thread and print it */
   a += 1;
   println!("a = {}", a);
   /* Join the thread and print a again */
   child_thread.join();
}

हालाँकि, इस कोड में एक सूक्ष्म बिंदु है जो रस्ट के डिजाइन के लिए केंद्रीय है। नए थ्रेड के भीतर (क्लोजर में कोड को निष्पादित करते हुए), a वेरिएबल इस कोड के अन्य भागों में a से अलग है। यह एक बहुत सख्त मेमोरी मॉडल ("स्वामित्व" के रूप में जाना जाता है) को लागू करता है जो कई थ्रेड्स को एक ही मेमोरी तक पहुंचने से रोकता है। इस उदाहरण में, मूव कीवर्ड इंगित करता है कि स्पॉन्डेड थ्रेड को अपने स्वयं के उपयोग के लिए a की एक अलग प्रति प्राप्त होगी। दो थ्रेड्स के शेड्यूलिंग के बावजूद, मुख्य और चाइल्ड थ्रेड्स एक-दूसरे के संशोधनों में हस्तक्षेप नहीं कर सकते, क्योंकि वे अलग-अलग प्रतियां हैं। दो थ्रेड के लिए एक ही मेमोरी तक पहुंच साझा करना संभव नहीं है।


  1. मुद्रण कार्य कैसे रद्द करें और प्रिंटर कतार को कैसे हटाएं

    कोई फर्क नहीं पड़ता कि आप किस प्रिंटर का उपयोग करते हैं, आपको ऐसी परिस्थितियों का सामना करना पड़ सकता है जहां आपको प्रिंट कार्य को रद्द करने की आवश्यकता होती है। हो सकता है कि आपने गलत दस्तावेज़ भेजा हो, या कोई प्रिंट कार्य बहुत अधिक समय ले रहा हो और प्रिंट कतार में अन्य दस्तावेज़ों को अवरुद्ध कर रह

  1. हल किया गया:प्रिंट कतार विंडोज 10 और 11 को हटा नहीं सकता

    प्रिंटर काम नहीं कर रहा है त्रुटि उपयोगकर्ताओं के बीच आम है, लेकिन एक समस्या यह भी है कि दस्तावेज़ प्रिंट कतार विंडोज 10 या विंडोज 11 से नहीं हटेगा। सामग्री: प्रिंट कतार को हटाया नहीं जा सकता अवलोकन: प्रिंट जॉब्स कतार में क्यों फंस जाते हैं? विंडोज 10 को ठीक करने के 4 तरीके प्रिंट कतार को साफ

  1. सी भाषा में निहित और स्पष्ट प्रकार के रूपांतरण क्या हैं?

    एक डेटा प्रकार को दूसरे डेटा प्रकार में परिवर्तित करना प्रकार रूपांतरण कहलाता है। अंतर्निहित प्रकार रूपांतरण स्पष्ट प्रकार का रूपांतरण अंतर्निहित प्रकार रूपांतरण जब ऑपरेंड विभिन्न डेटा प्रकार के होते हैं, तो कंपाइलर निहित प्रकार के रूपांतरण प्रदान करता है। यह छोटे डेटा प्रकार को बड़े डेटा प्