সি প্রোগ্রামিং সহ POSIX সেমাফোরস

Posix Semaphores With C Programming



POSIX OS এর পোর্টেবল ইন্টারফেসকে বোঝায়, যা একটি IEEE স্ট্যান্ডার্ড, যা বিভিন্ন অ্যাপ্লিকেশনের পোর্টেবিলিটিকে সহায়তা করার জন্য তৈরি করা হয়েছে। পসিক্স হল বিক্রেতাদের সহযোগিতার মাধ্যমে ইউনিক্সের একটি সাধারণ মানসম্পন্ন সংস্করণ তৈরির প্রচেষ্টা। এটি হার্ডওয়্যার প্ল্যাটফর্মের মধ্যে অ্যাপ্লিকেশনগুলিকে পোর্টিং করা সহজ করে তুলবে যদি সেগুলি কার্যকর হয়। হিউলেট-প্যাকার্ড POSIX কে তার লাইসেন্সপ্রাপ্ত MPE/iX OS সংস্করণ 5.0 এবং HP/UXX সংস্করণ 10.0, যথাক্রমে (এর UNIX) সংহত করছে।

পসিক্স স্ট্যান্ডার্ডের দশটিরও বেশি অংশ রয়েছে, তবে দুটি সহজেই পাওয়া যায়। POSIX.1 ফাইল, পদ্ধতি এবং I/O টার্মিনালের জন্য C প্রোগ্রামিং ইন্টারফেস (যেমন, একটি সিস্টেম কল লাইব্রেরি) বর্ণনা করে। POSIX প্ল্যাটফর্মের জন্য C POSIX প্যাকেজ লাইব্রেরি হল C স্ট্যান্ডার্ড লাইব্রেরির একটি কাঠামো। এটি স্ট্যান্ডার্ড এএনএসআই সি -এর মতোই একই সময়ে প্রতিষ্ঠিত হয়েছে পজিক্সকে স্ট্যান্ডার্ড সি -এর সাথে সঙ্গতিপূর্ণ করতে, বেশ কয়েকটি প্রচেষ্টা করা হয়েছে। POSIX স্ট্যান্ডার্ড C তে বাস্তবায়িতদের জন্য অতিরিক্ত বৈশিষ্ট্য প্রদান করে।







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

একটি সেমফোর হল একটি ডেটা স্ট্রাকচার যা প্রায়শই প্রক্রিয়াগুলিকে সিঙ্ক্রোনাইজ করার জন্য এবং থ্রেডগুলিকে একে অপরের সাথে যোগাযোগ না করে একসঙ্গে কাজ করার জন্য সাহায্য করে। সেমফোরের জন্য ইন্টারফেস POSIX মান দ্বারা নির্দিষ্ট করা হয়। এটি Pthreads এর অংশ নয়। যাইহোক, বেশিরভাগ ইউনিক্স যা Pthreads সমর্থন করে এমনকি সেমাফোর সরবরাহ করে। ইউনিক্স-এর মতো কাঠামোতে, লিনাক্সের মতো, সেমফোরগুলি ইন্টারপ্রসেস কমিউনিকেশন (আইপিসি) পরিষেবার নীচে বার্তার সারি এবং সাধারণ স্মৃতির সাথে একত্রিত হয়। পুরাতন ফ্রেমওয়ার্ক V সেমাফোরস এবং আধুনিক POSIX সেমাফোরস দুই ধরনের সেমাফোর হয়ে যায়। POSIX সেমাফোর কলিং সিস্টেম V সেমাফোর কলগুলির চেয়ে অনেক সহজ। যদিও, সিস্টেম ভি সেমফোরগুলি পাওয়া সহজ, বিশেষ করে আগের ইউনিক্সের মতো প্ল্যাটফর্মগুলিতে। Pthix লাইব্রেরিতে POSIX সেমাফোর ব্যবহার করে প্রোগ্রামগুলিকে সংযুক্ত করার প্রয়োজন আছে। আমরা এই নিবন্ধে POSIX সেমাফোরগুলি একবার দেখে নেব।



POSIX সেমাফোরস কেন?

থ্রেডের চারপাশে একটি বড় সমস্যা রয়েছে, যা জাতি অবস্থা। এটি এমন একটি পরিস্থিতি যেখানে দুটি থ্রেড একই তথ্য পেতে এবং পরিবর্তন করতে চায়, যার ফলে এটি দ্বন্দ্বপূর্ণ হয়। একটি জাতি অবস্থা এড়ানোর জন্য, আমরা একটি খুব দীর্ঘ সময়ের জন্য semaphores ব্যবহার করা হয়েছে।



সেমাফোরগুলি 2 প্রকারে পাওয়া যায়:





বাইনারি সেমাফোর :

এটি মিউটেক্স লক হিসেবেও স্বীকৃত। এর মাত্র দুটি সম্ভাব্য মান থাকবে, 0 এবং 1। মানটি 1 হিসাবে আরম্ভ করা হবে। এটি গুরুতর বিভাগের সমস্যা সমাধানের জন্য অসংখ্য প্রক্রিয়া প্রয়োগ করতে ব্যবহৃত হচ্ছে।



সেমাফোর গণনা :

একটি সীমাহীন ডোমেন জুড়ে এর আকার পরিবর্তিত হতে পারে। এটি অসংখ্য উদাহরণ সংস্থায় অ্যাক্সেসের উপর কর্তৃত্বের জন্য ব্যবহৃত হচ্ছে।

লিনাক্স পসিক্স ফ্রেমওয়ার্ক এর ইন্টিগ্রেটেড সেমাফোর রিপোজিটরি আছে। এটি ব্যবহার করার জন্য, আমাদের অবশ্যই:

  • Semaphore.h যোগ করুন
  • -Lpthread -lrt এর সাথে সংযোগ করে কোডটি পাইল করুন।

প্রায় সব পোসিক্স সেমাফোর পদ্ধতি এবং ফর্ম প্রোটোটাইপ করা আছে বা 'সেমাফোর.এইচ' তে নির্দিষ্ট করা আছে। আমরা একটি সত্তা বা বস্তুর বর্ণনা দিতে সেমাফোর ব্যবহার করব:

>>sem_t sem_name;

POSIX সেমাফোরে আমরা বিভিন্ন ফাংশন ব্যবহার করব।

Sem_init

একটি সেমফোর আরম্ভ করার জন্য, আপনাকে sem_init পদ্ধতি ব্যবহার করতে হবে। এই ফাংশনে, সেম একটি আরম্ভকৃত সেমাফোর বস্তুর সাথে মিলে যায়। Pshared হল একটি ব্যানার বা পতাকা যা নির্দিষ্ট করে যে সেমাফোরকে ফর্কযুক্ত () পদ্ধতির সাথে ভাগ করা যায় কি না। ভাগ করা সেমাফোরগুলি বর্তমানে LinuxThreads দ্বারা বন্ধ করা হয় না। আর্গুমেন্ট ভ্যালু হল সেই শুরুর মান যেখানে সেমাফোর ঠিক করা হয়।

>> intsem_init(sem_t*sem, intভাগ করা, স্বাক্ষরবিহীন intমান);

সেম_ওয়েট

আমরা সেম-ওয়েট পদ্ধতি ব্যবহার করে একটি সেমাফোর ধরে রাখতে/লক করতে বা অপেক্ষা করতে থাকব। যদি সেমাফোরকে negativeণাত্মক মান প্রদান করা হয়, তাহলে কল চক্র স্বয়ংক্রিয়ভাবে ব্লক হয়ে যাবে। যখনই অন্য কোন থ্রেড sem_post কল করে, ইতিমধ্যে আটকে থাকা প্রক্রিয়াগুলির মধ্যে একটি জেগে ওঠে।

>> intsem_wait(sem_t*sem);

সেম_পোস্ট

সেমফোরের মান বাড়ানোর জন্য আমরা sem_post পদ্ধতি ব্যবহার করব। কল করার পরে, sem_post মান বৃদ্ধি করবে, এবং ইতিমধ্যে আটকে থাকা বা অপেক্ষার প্রক্রিয়াগুলির মধ্যে একটি জেগে উঠবে।

>> intsem_post(sem_t*sem);

Sem_getvalue

আপনি যদি সেমাফোরের মান সম্পর্কে জানতে চান, তাহলে আপনাকে নিচের sem_getvalue ফাংশনটি ব্যবহার করতে হবে। এটি সেমাফোরের বর্তমান মান পাবে এবং ভাল্প-পয়েন্টেড গন্তব্যে স্থাপন করবে।

>>Int sem_getvalue(sem_t*sem, int *কুকুরছানা);

Sem_destroy

আপনি sem_destroy পদ্ধতি ব্যবহার করা উচিত যদি আপনি semaphore ধ্বংস করতে চান। যদি সেমাফোরের মৃত্যু এগিয়ে যেতে হয়, সেমাফোরে কোন থ্রেড অপেক্ষা করবে না।

>>Int sem_destroy(sem_t*sem);

GCC ইউটিলিটি ইনস্টল করুন

POSIX সেমাফোর সি কোড কম্পাইল করার জন্য, আপনার অবশ্যই আপনার লিনাক্স সিস্টেমে gcc ইউটিলিটি ইনস্টল থাকতে হবে। এই উদ্দেশ্যে, আপনার কমান্ড টার্মিনাল খুলুন এবং নীচের কমান্ডটি চেষ্টা করুন।

$sudo apt-get install gcc

আঘাত করে আপনার কর্ম নিশ্চিত করুন এবং

উবুন্টুতে সি প্রোগ্রামিং সহ POSIX সেমাফোর বাস্তবায়ন

একেবারে শুরুতে, আপনাকে উবুন্টু 20.04 সিস্টেমে .cpp এক্সটেনশন সহ একটি নতুন ফাইল তৈরি করতে হবে। এর জন্য, আপনাকে আপনার হোম ডিরেক্টরিতে যেতে হবে এবং new.cpp নামে একটি নতুন খালি ফাইল তৈরি করতে হবে। আপনি আপনার কমান্ড টার্মিনালে টাচ কমান্ড ব্যবহার করে এটি তৈরি করতে পারেন।

আপনি দেখতে পারেন যে new.cpp ফাইলটি হোম ডিরেক্টরিতে তৈরি করা হয়েছে।


.Cpp ফাইল তৈরির পরে, এটি আপনার লিনাক্স সিস্টেমে একটি টেক্সট এডিটর হিসাবে খুলুন এবং এই ফাইলটিতে নিচের কোডটি যেমন আছে তেমন লিখুন। এর পরে, এটি সংরক্ষণ করুন এবং বন্ধ করুন।

উবুন্টু 20.04 এ POSIX সেমাফোর সি প্রোগ্রাম চালান

উবুন্টু 20.04 এ আপনার টার্মিনাল খুলুন এবং ফাইলের নাম অনুসরণ করে নিচের gcc কমান্ডটি চালান।

$gccfilename.c –lpthread –lrt

এখানে 2 টি থ্রেড গঠিত হয়, একটি অন্যটির 2 সেকেন্ড পরে গঠিত হয়। বোল্ট পাওয়ার পর, প্রথম থ্রেড 4 সেকেন্ডের জন্য ঘুমায়। সুতরাং, এটি ডাকা হওয়ার পরে, দ্বিতীয় থ্রেডটি সরাসরি যোগ হবে না এবং এটি কল করার 4-4 = 2 সেকেন্ড পরে উপস্থিত হবে। এখানে আউটপুট:

যদি আমরা সেমেফোর ব্যবহার না করতাম, প্রসঙ্গ সুইচিং অনুযায়ী, ফলাফলটি পর্যবেক্ষণের মতো হতে পারে:

উপসংহার

এই গাইডে, উবুন্টু 20 এ সি প্রোগ্রামিং সহ POSIXSemaphore ব্যবহারের একটি বিস্তারিত ওভারভিউ দেওয়া হয়েছে। শুধুমাত্র নির্দিষ্ট সি কোড জুড়ে POSIX বা Pthread লাইব্রেরি ব্যবহার করে, POSIX সেমাফোর কোডিংয়ের সময় রেস কন্ডিশন রোধ করতে বেশ সহজেই ব্যবহার করা যেতে পারে।