सी प्रोग्रामिंग के साथ पॉज़िक्स सेमाफोर

Posix Semaphores With C Programming



पॉज़िक्स ओएस के पोर्टेबल इंटरफेस को संदर्भित करता है, जो एक आईईईई मानक है, जिसे विभिन्न अनुप्रयोगों की पोर्टेबिलिटी की सहायता के लिए विकसित किया गया है। POSIX विक्रेताओं के सहयोग से UNIX का एक सामान्य मानकीकृत संस्करण बनाने का एक प्रयास है। यदि वे प्रभावी हैं तो यह हार्डवेयर प्लेटफॉर्म के बीच ऐप्स को पोर्ट करना आसान बना देगा। Hewlett-Packard POSIX को अपने लाइसेंस प्राप्त MPE/iX OS संस्करण 5.0 और HP/UXX संस्करण 10.0, क्रमशः (इसकी UNIX) में एकीकृत कर रहा है।

POSIX मानक में दस से अधिक भाग होते हैं, हालाँकि, दो आसानी से प्राप्त किए जा सकते हैं। POSIX.1 फाइलों, प्रक्रियाओं और I/O टर्मिनलों के लिए C प्रोग्रामिंग इंटरफेस (यानी, एक सिस्टम कॉल लाइब्रेरी) का वर्णन करता है। POSIX प्लेटफॉर्म के लिए C POSIX पैकेज लाइब्रेरी C मानक लाइब्रेरी का एक ढांचा है। यह मानक एएनएसआई सी के रूप में एक ही समय में स्थापित किया गया है। पॉज़िक्स को मानक सी के अनुरूप बनाने के लिए, कई प्रयास किए गए हैं। POSIX मानक C में लागू किए गए लोगों को अतिरिक्त सुविधाएँ प्रदान करता है।







पॉज़िक्स सेमाफोर्स

एक सेमाफोर एक डेटा संरचना है जिसका उपयोग अक्सर प्रक्रियाओं को सिंक्रनाइज़ करने के लिए किया जाता है और थ्रेड को एक साथ संचालित करने के लिए एक दूसरे के साथ उनकी बातचीत के बिना सहायता करता है। सेमाफोर के लिए इंटरफ़ेस POSIX मानक द्वारा निर्दिष्ट किया गया है। यह पर्थ्रेड का हिस्सा नहीं है। हालाँकि, अधिकांश UNIXes जो Pthreads का समर्थन करते हैं, यहाँ तक कि semaphores भी प्रदान करते हैं। यूनिक्स जैसे ढांचे में, लिनक्स की तरह, सेमाफोर को इंटरप्रोसेस कम्युनिकेशन (आईपीसी) सेवाओं के तहत संदेश कतारों और सामान्य मेमोरी के साथ मिला दिया जाता है। पुराने फ्रेमवर्क V सेमाफोर और आधुनिक POSIX सेमाफोर दो प्रकार के सेमाफोर बन जाते हैं। POSIX सेमाफोर कॉलिंग सिस्टम V सेमाफोर कॉल की तुलना में बहुत आसान है। हालांकि, सिस्टम वी सेमाफोर प्राप्त करना आसान है, खासकर पहले के यूनिक्स जैसे प्लेटफॉर्म पर। POSIX सेमाफोर का उपयोग करके प्रोग्राम को Pthread लाइब्रेरी से कनेक्ट करने की आवश्यकता है। हम इस आलेख में पॉज़िक्स सेमाफोर पर एक नज़र डालेंगे।



पॉज़िक्स सेमाफोर क्यों?

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



सेमाफोर 2 प्रकार में उपलब्ध हैं:





बाइनरी सेमाफोर :

इसे म्यूटेक्स लॉक के रूप में भी पहचाना जाता है। इसमें केवल दो संभावित मान होंगे, 0 और 1. मान को 1 के रूप में प्रारंभ किया जाएगा। इसका उपयोग गंभीर अनुभाग समस्या को हल करने के लिए कई प्रक्रियाओं को लागू करने के लिए किया जा रहा है।



सेमाफोर की गिनती :

इसका आकार एक अप्रतिबंधित डोमेन में भिन्न हो सकता है। इसका उपयोग कई-आवृत्ति संसाधनों तक पहुंच पर अधिकार रखने के लिए किया जा रहा है।

Linux POSIX ढांचे में इसका एकीकृत सेमाफोर भंडार है। इसका उपयोग करने के लिए, हमें चाहिए:

  • semaphore.h . जोड़ें
  • -lpthread -lrt से कनेक्ट करके कोड को ढेर करें।

लगभग सभी POSIX सेमाफोर विधियों और रूपों को 'Semaphore.h' में प्रोटोटाइप या निर्दिष्ट किया गया है। हम किसी इकाई या वस्तु का वर्णन करने के लिए सेमाफोर का उपयोग करेंगे:

>>sem_t sem_name;

यहाँ विभिन्न कार्य हैं जिनका हम POSIX सेमाफोर में उपयोग करेंगे।

सेम_इनिट

एक सेमाफोर को इनिशियलाइज़ करने के लिए, आपको sem_init विधि का उपयोग करना होगा। इस फ़ंक्शन में, sem एक आरंभिक सेमाफोर ऑब्जेक्ट से मेल खाता है। Pshared एक बैनर या ध्वज है जो निर्दिष्ट करता है कि सेमाफोर को फोर्कड () प्रक्रिया के साथ साझा किया जा सकता है या नहीं। साझा सेमाफोर वर्तमान में LinuxThreads द्वारा बांधे नहीं गए हैं। तर्क मान वह प्रारंभिक मान है जिस पर सेमाफोर तय होता है।

>> NSsem_init(sem_t*अर्ध, NSसाझा, अहस्ताक्षरित NSमूल्य);

सेम_वेट

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

>> NSsem_wait(sem_t*अर्ध);

सेम_पोस्ट

सेमाफोर का मान बढ़ाने के लिए हम sem_post विधि का उपयोग करेंगे। कॉल करने पर, sem_post मान में वृद्धि करेगा, और पहले से बंद या प्रतीक्षारत प्रक्रियाओं में से एक जाग जाएगा।

>> NSsem_post(sem_t*अर्ध);

सेम_गेटवैल्यू

यदि आप एक सेमाफोर के मूल्य के बारे में जानना चाहते हैं, तो आपको नीचे दिए गए sem_getvalue फ़ंक्शन का उपयोग करना होगा। यह सेमाफोर का वर्तमान मूल्य प्राप्त करेगा और वैल्प-पॉइंटेड गंतव्य में रखा जाएगा।

>>इंट sem_getvalue(sem_t*अर्ध, NS *कुत्ते का पिल्ला);

सेम_नष्ट

यदि आप सेमाफोर को नष्ट करना चाहते हैं तो आपको sem_destroy विधि का उपयोग करना चाहिए। यदि सेमाफोर का निधन आगे बढ़ना है, तो सेमाफोर में कोई भी धागा इंतजार नहीं कर रहा होगा।

>>इंट sem_destroy(sem_t*अर्ध);

जीसीसी उपयोगिता स्थापित करें

पॉज़िक्स सेमाफोर सी कोड को संकलित करने के लिए, आपके पास अपने लिनक्स सिस्टम में जीसीसी उपयोगिता स्थापित होनी चाहिए। इस उद्देश्य के लिए, अपना कमांड टर्मिनल खोलें और नीचे दिए गए कमांड को आज़माएं।

$सुडो उपयुक्त-स्थापित करें जीसीसी

मार कर अपनी कार्रवाई की पुष्टि करें तथा .

उबंटू में सी प्रोग्रामिंग के साथ पॉज़िक्स सेमाफोर का कार्यान्वयन

बहुत शुरुआत में, आपको उबंटू 20.04 सिस्टम पर .cpp एक्सटेंशन के साथ एक नई फाइल बनानी होगी। इसके लिए आपको अपने होम डायरेक्टरी की ओर नेविगेट करना होगा और new.cpp नाम की एक नई खाली फाइल बनानी होगी। आप इसे अपने कमांड टर्मिनल में टच कमांड का उपयोग करके भी बना सकते हैं।

आप देख सकते हैं कि होम निर्देशिका में new.cpp फ़ाइल बनाई गई है।


.cpp फ़ाइल के निर्माण के बाद, इसे अपने Linux सिस्टम में टेक्स्ट एडिटर के रूप में खोलें और इस फ़ाइल में नीचे दिए गए कोड को जैसा है वैसा ही लिखें। इसके बाद इसे सेव करके बंद कर दें।

उबंटू 20.04 में पॉज़िक्स सेमाफोर सी प्रोग्राम निष्पादित करें

अपना टर्मिनल Ubuntu 20.04 में खोलें और फ़ाइल नाम के बाद नीचे दिए गए gcc कमांड को निष्पादित करें।

$जीसीसीfilename.c –lpthread –lrt

2 धागे बनते हैं, एक दूसरे के 2 सेकंड बाद बनता है। बोल्ट प्राप्त करने के बाद, पहला धागा 4 सेकंड के लिए सोता है। इसलिए, इसे बुलाए जाने के बाद, दूसरा धागा सीधे शामिल नहीं होगा, और इसे कॉल करने के 4-2 = 2 सेकंड बाद दिखाई देगा। यहाँ आउटपुट है:

यदि हमने संदर्भ स्विचिंग के अनुसार सेमाफोर का उपयोग नहीं किया होता, तो परिणाम इस प्रकार हो सकता है:

निष्कर्ष

इस गाइड में, Ubuntu 20 में C प्रोग्रामिंग के साथ POSIXSemaphore के उपयोग का विस्तृत अवलोकन दिया गया है। केवल कुछ सी कोड में पॉज़िक्स या पाथ्रेड लाइब्रेरी का उपयोग करके, कोडिंग के दौरान दौड़ की स्थिति को रोकने के लिए पॉज़िक्स सेमाफोर का आसानी से उपयोग किया जा सकता है।