সি-তে পসিক্স সেমাফোরস

Si Te Pasiksa Semaphorasa



“যদিও প্রতিটি প্রোগ্রামিং ভাষার নির্দিষ্ট উদ্দেশ্যে অনেক লাইব্রেরি থাকে, C-এর POSIX লাইব্রেরির জায়গা আছে। এটি প্রক্রিয়াগুলির মধ্যে একটি দুর্দান্ত সমন্বয় তৈরি করার জন্য ডিজাইন করা হয়েছে এবং প্রোগ্রামগুলির মধ্যে মাল্টিথ্রেডিং ব্যবহারে অনেক সাহায্য করে, যেমন, একাধিক থ্রেড তৈরি করা এবং তাদের সম্পাদনকে সিঙ্ক্রোনাইজ করা। আজকের এই গাইডের মধ্যে, আপনি C-তে POSIX সেমাফোর ব্যবহার করার একটি সাধারণ চিত্র দেখতে পাবেন। মৌলিক C কোড উদাহরণের জন্য, আমাদের অবশ্যই সিস্টেমে এর কম্পাইলার কনফিগার করতে হবে। কিন্তু, তার আগে, আমাদের সিস্টেমটি আপডেট করতে হবে কারণ এটি কোডের মসৃণ সম্পাদনের জন্য একটি প্রয়োজনীয় পদক্ষেপ। এইভাবে, সংযুক্ত স্ন্যাপে প্রদর্শিত প্রশ্নটি আপনার লিনাক্স অপারেটিং সিস্টেমকে 'উপযুক্ত' ইউটিলিটি সহ আপডেট এবং আপগ্রেড করতে হবে৷


এই প্রক্রিয়াটির জন্য আপনার লিনাক্স প্ল্যাটফর্মে প্রায় 55 Kb স্থান প্রয়োজন যাতে আপডেটগুলি মসৃণভাবে সম্পাদন করা যায়। আপনি যদি এতটুকু জায়গা দিতে ইচ্ছুক হন তবে চালিয়ে যেতে 'y' এ আলতো চাপুন। প্রক্রিয়াকরণ কয়েক মিনিটের মধ্যে সম্পন্ন হবে.








সিস্টেমটি সম্পূর্ণরূপে আপগ্রেড হওয়ার পরে, আমরা 'ইনস্টল' কমান্ডে apt-get ইউটিলিটি দিয়ে আমাদের সিস্টেমে C ভাষার কম্পাইলার কনফিগার করতে যাচ্ছি। একটি কীওয়ার্ড হিসাবে 'gcc' ব্যবহার করুন, এবং এটিই।





sem_init()

একটি নতুন সেমাফোর তৈরি হবে যখন 's' এ ইতিমধ্যেই একটি অজ্ঞাত সেমাফোর থাকে; অন্যথায়, ইতিমধ্যে বিদ্যমান সেমাফোরটি বাতিল করা হবে। এই পদ্ধতিতে, 's' হল একটি Semaphore দৃষ্টান্ত যা নির্মাণ করা হয়েছে, এবং শেয়ার করা হল একটি সংকেত বা পেন্যান্ট যা নির্দেশ করে যে সেমাফোর একটি কাঁটাযুক্ত() পদ্ধতি বা অন্যথায় বিতরণ করা হতে পারে কিনা। ইনপুট মান সেমাফোরের সেট প্রারম্ভিক বিন্দু হিসাবে কাজ করে।





int sem_init ( no_t * s, int শেয়ার করা, স্বাক্ষরবিহীন int মান ) ;

Sem_wait()

's' দ্বারা নির্দিষ্ট করা সেমাফোরের উপর একটি সেমাফোর লক অ্যাকশন চালানোর মাধ্যমে, sem_wait() পদ্ধতিটি সেই সেমাফোরকে ধরে রাখে। সেম-ওয়েট পদ্ধতিটি সেমাফোর ধরে রাখতে বা লাইনে দাঁড়াতে ব্যবহার করা হবে। পূর্বে ওভারলোড করা কিছু প্রক্রিয়া জাগ্রত হয় যখন অন্য কোনো প্রক্রিয়া sem_post() আহ্বান করে।



int sem_wait ( no_t * s ) ;

কোন_পোস্ট()

যখন sem পোস্ট কল করা হয়, তখন মান বৃদ্ধি করা হয়, এবং তারপরে পূর্বে ব্যাক আপ করা বা অপেক্ষা করা ক্রিয়াকলাপগুলির মধ্যে একটি চলতে শুরু করে, অর্থাৎ, ইতিমধ্যে লক করা সেমাফোর আনলক করে।

int sem_post ( no_t * s ) ;

না_ধ্বংস ()

একটি প্রাথমিক নামহীন সেমাফোর 's' ধ্বংস করা হয় sem Destro() ফাংশন নিযুক্ত করে।

int sem_destroy ( no_t * s ) ;

উদাহরণ

সেমাফোরগুলি বোঝার জন্য, আমরা প্রথমে একটি C ফাইল তৈরি করতে যাচ্ছি এবং তারপরে একটি কোড যোগ করতে যাচ্ছি। একটি তৈরি করতে, 'টাচ' ক্যোয়ারী ব্যবহার করুন এবং আপনি আপনার সিস্টেমের হোম ফোল্ডারে নতুন ফাইলটি পাবেন।


এখন, ভালো কোড জেনারেট করার জন্য আপনাকে কিছু সাধারণ সম্পাদক দিয়ে আপনার খালি C ফাইলটি খুলতে হবে। আমরা এখন পর্যন্ত 'ন্যানো' সম্পাদকের চেষ্টা করছি, যেমনটি নীচের স্ন্যাপটিতে দেখানো হয়েছে।


আমরা সবাই জানি যে সমস্ত প্রোগ্রামিং ভাষা লাইব্রেরি ছাড়া কাজ করতে পারে না কারণ এই লাইব্রেরিগুলি সামগ্রিক সিস্টেমের কাজের জন্য ব্যবহার করার জন্য প্রচুর সংখ্যক ক্লাস, কাঠামো, ফাংশন এবং অবজেক্ট ধারণ করে। তাই আমরা POSIX Semaphores-এর জন্য কিছু মৌলিক এবং অবশ্যই থাকা লাইব্রেরি ব্যবহার করে এই C প্রোগ্রামটি শুরু করছি।

কোডে এই লাইব্রেরিগুলি ব্যবহার করতে, আমাদের প্রতিটি লাইব্রেরির জন্য 'অন্তর্ভুক্ত' কীওয়ার্ড সহ '#' অক্ষর ব্যবহার করতে হবে। এই মুহূর্তে, আমরা মোট 4টি লাইব্রেরি যুক্ত করেছি যা এই প্রোগ্রামে থাকা আবশ্যক৷ অন্যথায়, আমাদের প্রোগ্রাম সঠিকভাবে কাজ করবে না। প্রথম 'stdio.h' হেডার লাইব্রেরি সাধারণত প্রতিটি সি প্রোগ্রামে থাকা আবশ্যক কারণ এটি আমাদের কোডে ইনপুট এবং আউটপুট অপারেশন করতে দেয়। অতএব, আমরা সহজে ইনপুট যোগ করতে এবং কোড থেকে আউটপুট পেতে এটি ব্যবহার করছি। আমরা এখানে যে দ্বিতীয় লাইব্রেরিটি ব্যবহার করছি তা হল 'pthread.h' যা থ্রেড প্রোগ্রামিং, অর্থাৎ মাল্টিথ্রেডিং ব্যবহারের জন্য আবশ্যক।

আমরা একটি প্রোগ্রামে থ্রেড তৈরি করতে এই লাইব্রেরিটি ব্যবহার করব। এই কোডের পরবর্তী এবং সবচেয়ে গুরুত্বপূর্ণ লাইব্রেরি হল “semaphore.h”। থ্রেডগুলিকে মসৃণভাবে সিঙ্ক্রোনাইজ করতে এটি ব্যবহার করা হয়েছে। শেষ কিন্তু অন্তত নয়, লাইব্রেরি হল 'unistd.h', যা আমাদের ব্যবহারকারী-সংজ্ঞায়িত বিবিধ ফাংশন এবং ধ্রুবক ব্যবহার করতে সক্ষম করে। এখন, আমরা সেমাফোর লাইব্রেরির অন্তর্নির্মিত বস্তু 'sem_t' ব্যবহার করে 's' সেমাফোর ঘোষণা করেছি। এখানে থ্রেড ব্যবহারকারী-সংজ্ঞায়িত ফাংশন আসে 'T' কোনো রিটার্ন টাইপ ছাড়াই। এটি সিঙ্ক্রোনাইজেশন সঞ্চালনের জন্য কিছু অন্তর্নির্মিত সেমাফোর ফাংশন ব্যবহার করছে। sem_wait() ফাংশন এখানে “&” অক্ষর ব্যবহার করে সেমাফোর “s” ধরে রাখার জন্য রয়েছে।

হোল্ডের মধ্যে, printf() স্টেটমেন্টটি 'sleep' ফাংশনের সাথে কার্যকর করা হয়েছে যাতে এই প্রোগ্রামটিকে 4 সেকেন্ডের জন্য ঘুমানো যায়। আরেকটি printf() স্টেটমেন্ট একটি নতুন বার্তা প্রদর্শন করে, এবং sem_post() ফাংশনটি সেমাফোর “s”-এ লক রিলিজ করতে কার্যকর হয়।

# অন্তর্ভুক্ত করুন
# অন্তর্ভুক্ত
#include
#include
কোনোটিই নয়;
অকার্যকর * টি ( অকার্যকর * arg ) {
sem_wait ( এবং s ) ;
printf ( 'স্বাগত! \n ' ) ;
ঘুম ( 4 ) ;
printf ( 'বাই! \n ' ) ;
sem_post ( এবং s ) ;
}



আসুন সেমাফোরের জন্য এই সি প্রোগ্রামের মূল() পদ্ধতিটি ভাল করে দেখে নেওয়া যাক। sem_init() ফাংশনটি এখানে একটি নতুন সেমাফোর 's' তৈরি করতে ব্যবহার করা হয়েছে যা একটি কাঁটাযুক্ত() পদ্ধতিতে বিতরণ করা হয়নি, যেমন, '0', এবং এর শুরুর বিন্দু 1 এ সেট করা হয়েছে। pthread_t অবজেক্টটি pthread থেকে দুটি থ্রেড অবজেক্ট, o1 এবং o2 ব্যবহার করে দুটি থ্রেড তৈরি করতে C-এর লাইব্রেরি ব্যবহার করা হয়েছে। printf() স্টেটমেন্ট এখানে দেখানো হয়েছে যে আমরা পরের লাইনে pthread_create() ফাংশন ব্যবহার করে প্রথম থ্রেড তৈরি করতে যাচ্ছি।

আমরা এই ফাংশনে o1 থ্রেড অবজেক্টকে NULL সীমাবদ্ধতা এবং কলিং ফাংশন 'T' প্যারামিটারে পাস করে দিয়েছি। 4 সেকেন্ডের ঘুমের পরে, o2 অবজেক্টের সাথে আরেকটি থ্রেড তৈরি করা হয়েছে, এবং pthread_join() ফাংশনটি এখানে একটি main() ফাংশনের সাথে থ্রেডে যোগ দিতে ব্যবহার করা হয়েছে। sem_destroy() ফাংশনটি এখানে 's' সেমাফোর ধ্বংস করার জন্য রয়েছে, এবং সমস্ত ব্লক করা থ্রেডগুলিও প্রকাশ করা হবে।

int প্রধান ( ) {
sem_init ( এবং s, 0 , 1 ) ;
pthread_t o1, o2;
printf ( 'এখন প্রথম থ্রেডে... \n ' ) ;
pthread_create ( এবং o1,NULL,T,NULL ) ;
ঘুম ( 4 ) ;
printf ( 'এখন ২য় থ্রেডে... \n ' ) ;
pthread_create ( এবং o2,NULL,T,NULL ) ;
pthread_join ( o1, NULL ) ;
pthread_join ( o2,শূন্য ) ;
না_ধ্বংস ( এবং s ) ;
ফিরে 0 ;
}



আমরা 'Gcc' কম্পাইলার দিয়ে C প্রোগ্রাম কম্পাইল করছি; '-lrt' এবং '-lpthread' বিকল্পগুলি POSIX থ্রেড ফাংশনগুলি চালানোর জন্য ব্যবহার করা হয়। '.a/.out' ক্যোয়ারী চালানোর সময়, প্রথম থ্রেড তৈরি হয়ে যায়। প্রথম বার্তা প্রিন্ট করার পরে এটি ঘুমাতে যায়।


দ্বিতীয় থ্রেডটি সিঙ্ক্রোনাইজ করা হয়েছে, এবং 4 সেকেন্ড পরে, প্রথম থ্রেডটি মুক্তি পেয়েছে এবং দ্বিতীয় থ্রেডটি 4 সেকেন্ডের জন্য লক হয়ে গেছে।


শেষ পর্যন্ত, দ্বিতীয় থ্রেডটিও মুক্তি পেয়েছে।

উপসংহার

বিভিন্ন থ্রেড সিঙ্ক্রোনাইজ করার জন্য এর কিছু প্রধান ফাংশন ব্যবহার করার সময় এটি সি-তে POSIX সেমাফোরস সম্পর্কে। এই নিবন্ধটি দেখার পরে, আপনি আরও বেশি করে POSIX বুঝতে সক্ষম হবেন।