C پروگرامنگ کے ساتھ POSIX سیمافورس۔

Posix Semaphores With C Programming



POSIX سے مراد OS کا پورٹیبل انٹرفیس ہے ، جو کہ IEEE سٹینڈرڈ ہے ، جو مختلف ایپلی کیشنز کی پورٹیبلٹی کی مدد کے لیے تیار کیا گیا ہے۔ POSIX دکانداروں کے اشتراک سے UNIX کا مشترکہ معیاری ورژن بنانے کی کوشش ہے۔ یہ ہارڈ ویئر پلیٹ فارمز میں ایپس کو پورٹ کرنا آسان بنائے گا اگر وہ موثر ہوں۔ ہیولٹ پیکارڈ POSIX کو اپنے لائسنس یافتہ MPE/iX OS ورژن 5.0 اور HP/UXX ورژن 10.0 میں بالترتیب (اس کا UNIX) ضم کر رہا ہے۔

POSIX معیار کے دس سے زیادہ حصے ہیں ، تاہم ، دو آسانی سے قابل حصول ہیں۔ POSIX.1 فائلوں ، طریقہ کار اور I/O ٹرمینلز کے لیے C پروگرامنگ انٹرفیس (یعنی سسٹم کال لائبریری) کی وضاحت کرتا ہے۔ POSIX پلیٹ فارم کے لیے C POSIX پیکیج لائبریری C معیاری لائبریری کا ایک فریم ورک ہے۔ یہ ایک ہی وقت میں معیاری ANSI C. کے طور پر قائم کیا گیا ہے POSIX کو معیاری C کے مطابق بنانے کے لیے ، کئی کوششیں کی گئی ہیں۔ POSIX معیاری C میں لاگو ہونے والوں کو اضافی خصوصیات مہیا کرتا ہے۔







POSIX سیمافورس۔

سیمفور ایک ڈیٹا ڈھانچہ ہے جو اکثر عمل کو ہم آہنگ کرنے اور دھاگوں کو ایک دوسرے کے ساتھ باہمی تعامل کے بغیر ایک ساتھ کام کرنے کے لیے استعمال کیا جاتا ہے۔ سیمفورس کے لئے انٹرفیس POSIX معیار کے ذریعہ متعین کیا گیا ہے۔ یہ Pthreads کا حصہ نہیں ہے۔ تاہم ، زیادہ تر UNIXes جو Pthreads کی حمایت کرتے ہیں یہاں تک کہ سیمفورس بھی فراہم کرتے ہیں۔ یونکس نما فریم ورکس میں ، لینکس کی طرح ، سیمافورز کو پیغام کی قطار اور انٹرپروسیس کمیونیکیشن (آئی پی سی) سروسز کے نیچے عام یادداشت کے ساتھ ملا دیا جاتا ہے۔ پرانا فریم ورک V سیمافورس اور جدید POSIX سیمفورس دو قسم کے سیمفورس بن جاتے ہیں۔ POSIX سیمافور کالنگ سسٹم V سیمافور کالز کے مقابلے میں بہت آسان ہے۔ اگرچہ ، سسٹم V سیمفورس حاصل کرنا آسان ہے ، خاص طور پر پہلے یونکس نما پلیٹ فارم پر۔ POSIX سیمافورس کا استعمال کرتے ہوئے پروگراموں کو Pthread لائبریری سے مربوط کرنے کی ضرورت ہے۔ ہم اس مضمون میں POSIX سیمافورس پر ایک نظر ڈالیں گے۔



POSIX سیمافورس کیوں؟

دھاگوں کے ارد گرد ایک بڑا مسئلہ ہے ، جو کہ نسل کی حالت ہے۔ یہ ایک ایسی صورت حال ہے جس میں دو دھاگے ایک ہی معلومات کو حاصل کرنے اور تبدیل کرنے کی کوشش کرتے ہیں ، اس طرح اسے متضاد بنا دیتا ہے۔ ریس کی حالت سے بچنے کے لیے ، ہم بہت طویل عرصے سے سیمافورس استعمال کر رہے ہیں۔



سیمافورس 2 اقسام میں دستیاب ہیں:





ثنائی سیمافور۔ :

یہ ایک mutex تالا کے طور پر بھی پہچانا جاتا ہے۔ اس کی صرف دو ممکنہ اقدار ہوں گی ، 0 اور 1۔ قیمت کو 1 کے طور پر شروع کیا جائے گا۔



سیمافور کی گنتی۔ :

اس کا سائز غیر محدود ڈومین میں مختلف ہو سکتا ہے۔ اس کا استعمال متعدد مثال کے وسائل تک رسائی حاصل کرنے کے لیے کیا جا رہا ہے۔

لینکس POSIX فریم ورک میں اس کا مربوط سیمافور ذخیرہ ہے۔ اسے استعمال کرنے کے لیے ، ہمیں:

  • semaphore.h شامل کریں۔
  • -lpthread -lrt سے منسلک کرکے کوڈ کو ڈھیر کریں۔

تقریبا تمام POSIX سیمافور طریقوں اور فارموں کو پروٹوٹائپ یا 'Semaphore.h' میں مخصوص کیا گیا ہے۔ ہم کسی ہستی یا شے کو اس طرح بیان کرنے کے لیے سیمفور کا استعمال کریں گے:

>>sem_t sem_name؛

یہاں مختلف افعال ہیں جو ہم POSIX سیمافور میں استعمال کریں گے۔

Sem_init

سیمفور شروع کرنے کے لیے ، آپ کو sem_init طریقہ استعمال کرنا ہوگا۔ اس فنکشن میں ، سیم ایک ابتدائی سیمفور آبجیکٹ سے مطابقت رکھتا ہے۔ Pshared ایک بینر یا جھنڈا ہے جو وضاحت کرتا ہے کہ سیمفور کو فورکڈ () طریقہ کار کے ساتھ شیئر کیا جاسکتا ہے یا نہیں۔ مشترکہ سیمفورس فی الحال لینکس تھریڈز کے ذریعہ نہیں بنائے گئے ہیں۔ دلیل کی قیمت ابتدائی قیمت ہے جس پر سیمفور طے کیا گیا ہے۔

>> intsem_init(sem_t*سیم، intحصہ دار، دستخط شدہ intقدر)؛

نیم_ انتظار

ہم سیمفور کو تھامنے/لاک کرنے یا اسے انتظار کرنے کے لیے سیم ویٹ کا طریقہ استعمال کریں گے۔ اگر سیمفور کو منفی قیمت فراہم کی گئی ہے ، تو کال سائیکل خود بخود بلاک ہوجائے گی۔ جب بھی کوئی دوسرا تھریڈ sem_post پر کال کرتا ہے ، پہلے سے بند عمل میں سے ایک جاگتا ہے۔

>> intsem_wait(sem_t*سیم)؛

سیم_پوسٹ

ہم سیمفورٹ کی قدر بڑھانے کے لیے sem_post طریقہ استعمال کریں گے۔ کال کرنے پر ، sem_post قیمت میں اضافہ کرے گا ، اور پہلے سے بند یا انتظار کا عمل جاگتا ہے۔

>> intsem_post(sem_t*سیم)؛

Sem_getvalue

اگر آپ سیمفور کی قدر کے بارے میں جاننا چاہتے ہیں تو آپ کو ذیل میں sem_getvalue فنکشن استعمال کرنا ہوگا۔ یہ سیمفور کی موجودہ قیمت حاصل کرے گا اور ویلپ پوائنٹ والی منزل میں رکھا جائے گا۔

>>int sem_getvalue(sem_t*سیم، int *کتے)؛

Sem_destroy

اگر آپ سیمفور کو تباہ کرنا چاہتے ہیں تو آپ کو sem_destroy طریقہ استعمال کرنا چاہیے۔ اگر سیمفور کی موت کو آگے بڑھانا ہے تو ، سیمفور میں کوئی دھاگہ انتظار نہیں کرے گا۔

>>int sem_destroy(sem_t*سیم)؛

جی سی سی یوٹیلٹی انسٹال کریں۔

POSIX سیمافور C کوڈ مرتب کرنے کے لیے ، آپ کے پاس لینکس سسٹم میں gcc یوٹیلیٹی انسٹال ہونی چاہیے۔ اس مقصد کے لیے اپنا کمانڈ ٹرمینل کھولیں اور نیچے دی گئی کمانڈ کو آزمائیں۔

$سودو apt-get install جی سی سی

مار کر اپنے عمل کی تصدیق کریں۔ اور .

اوبنٹو میں سی پروگرامنگ کے ساتھ POSIX سیمافور کا نفاذ۔

شروع میں ، آپ کو اوبنٹو 20.04 سسٹم پر .cpp ایکسٹینشن کے ساتھ ایک نئی فائل بنانی ہوگی۔ اس کے لیے آپ کو اپنی ہوم ڈائرکٹری کی طرف جانا ہوگا اور new.cpp کے نام سے ایک نئی خالی فائل بنانی ہوگی۔ آپ اسے اپنے کمانڈ ٹرمینل میں ٹچ کمانڈ کے ذریعے بھی بنا سکتے ہیں۔

آپ دیکھ سکتے ہیں کہ new.cpp فائل ہوم ڈائریکٹری میں بنائی گئی ہے۔


.cpp فائل بنانے کے بعد ، اسے اپنے لینکس سسٹم میں بطور ٹیکسٹ ایڈیٹر کھولیں اور نیچے دی گئی کوڈ کو اس فائل میں لکھ دیں۔ اس کے بعد ، اسے محفوظ کریں اور بند کریں۔

اوبنٹو 20.04 میں POSIX سیمافور سی پروگرام پر عمل کریں۔

اوبنٹو 20.04 میں اپنا ٹرمینل کھولیں اور فائل کے نام کے بعد نیچے دی گئی جی سی سی کمانڈ پر عمل کریں۔

$جی سی سیfilename.c –lpthread –lrt

2 تھریڈز بنتے ہیں ، ایک دوسرے کے 2 سیکنڈ کے بعد بنتا ہے۔ بولٹ حاصل کرنے کے بعد ، پہلا تھریڈ 4 سیکنڈ تک سوتا ہے۔ لہذا ، اسے بلایا جانے کے بعد ، دوسرا دھاگہ براہ راست شامل نہیں ہوگا ، اور یہ بلایا جانے کے 4-2 = 2 سیکنڈ بعد ظاہر ہوگا۔ یہاں آؤٹ پٹ ہے:

اگر ہم سیافور استعمال نہیں کرتے تھے ، سیاق و سباق کے مطابق ، نتیجہ شاید مشاہدے کے مطابق ہوتا:

نتیجہ

اس گائیڈ میں ، اوبنٹو 20 میں سی پروگرامنگ کے ساتھ POSIXSemaphore کے استعمال کا تفصیلی جائزہ دیا گیا ہے۔ صرف مخصوص C کوڈ میں POSIX یا Pthread لائبریری کا استعمال کرتے ہوئے ، POSIX سیمافور کوڈنگ کے دوران ریس کے حالات کو روکنے کے لیے بہت آسانی سے استعمال کیا جا سکتا ہے۔