 بسم اللہ الرحمن الرحیم آج ہم موڈیول 145 دیسکرس کریں گے موڈیول 145 ہے about deadlocks جب آپ different concurrency objects جیسے کہ ہم نے دیسکرس کیا تھا mutex's ہیں یا critical section ہیں ان کا استعمال کرتے ہیں تو ان کی وجہ سے ان کے استعمال کی وجہ سے ایسا ہوسکتے کہ deadlocks آ کرو deadlocks آپ کو پتا ہوگا ایک ایسی سیچویشن ہوتی ہے جس کے اندر کے کوئی بھی پروسیس جو ہے وہ اپنی کمپلیشن تک نہیں پانچ باتا hold and wait کی سیچویشن کے اندر تمام پروسیس ہوتے ہیں کچھ رسورس کو ایک پروسیس میں hold کیا ہوتا ہے کچھ کلی wait کرا ہوتا ہے اور کوئی بھی پروسیس جو ہے وہ اپنی کمپلیشن تک پانچ نہیں پاتا تو جب بھی آپ concurrency objects کے استعمال کرتے ہیں تو آپ کو پہلانا چاہتے ہیں کہ جب آپ نے concurrency objects کے استعمال کرتے ہیں تو اس کی وجہ سے deadlock اکرنس کی چانسیس ہے اور اس concurrency کی وجہ سے ہی deadlocks اکر ہوتے ہیں اگر concurrency نہ enforce کی جائے mutual exclusion نہ enforce کی جائے تو کبھی بھی deadlock اکر نہیں ہوگا تو کیونکہ ہمیں results جو ہے وہ accurate لینے ہیں results ہم چاہتے ہیں کہ ہمارے بالکل صحیحوں اور ساسا ہم چاہتے ہیں کہ ہمارے processes بھی optimally concurrency چلیں جس کی کئی وجہ ہوتا ہے کہ ہم processes کو concurrency کیوں ران کرنا چاہتے ہیں تو ہمیں concurrency control enforce کرنا پڑتا ہے mutual exclusion enforce کرنی پڑتی ہے اور جب mutual exclusion enforce ہوگی تو deadlock اکرنس کا بھی چانس ہے اگر وہ deadlock وہ concurrency control کے لیے objects ان کے استعمال کی وجہ سے اکر ہو رہا ہے تو اس کی وجہ یہ ہوگی کہ اگر کسی resource کو یا number of resources کو control کرنے کے لیے آپ number of concurrency objects کا استعمال کر رہا ہے جیسے ایک example ہم کنسیٹر کرتے ہیں اگر آپ کے پاس دو list سے ایک list A اور ایک list B ہے دونوں کا structure وہ same ہے اس کے اندر جو بھی اس کی ایک node ہے اس node کے اندر جو elements ہے وہ بالکل same identical دونوں کے اندر آپ ڈیٹا کو maintain کریں آپ کوئی ایسی situation ہو ستی ہے جس situation کے اندر آپ کا کوئی ایک ایسا operation ہے وہ یہ چاہتا ہے کہ ایک element ایک یا value یا a key جو ہے وہ دونوں lists کے اندر موجود جو وہ دونوں lists کے اندر موجود ہوگی تبھی وہ operation perform ہوگا یا کسی بھی list کے اندر موجود نہ ہو تبھی وہ operation perform ہوگا دوسری situation ہو سکتی ہے کہ آپ چاہتے ہیں کہ جو جس کی کیوپر operation perform کرنا چاہتے ہیں آپ چاہتے ہیں کہ ایک list کے اندر ہو اور وہ دوسری کے اندر نہ ہو تو اس situation کے اندر آپ کو کیا کرنا پڑے گا ان دونوں lists کو کنٹرول کرنا پڑے گا اور جب آپ ان list کے پر کوئی operation perform کریں جسے کہ ایک element add کریں یا ایک element remove کریں تو اس operation کو بھی کنکرنٹ ہونا چاہتے ہیں اس کو mutually exclusive ہونا چاہتے ہیں کیونکہ at a time کئی processes ان lists کے اندر elements کو add کرنے کی کوشش کریں ان elements میں سے item اس list میں سے items elements ان کو remove کرنے کی کوشش کریں تو یہ operation mutually exclusive ہونا چاہتے ہیں یعنی کہ addition operation اور deletion operation یہ تمام operation mutually exclusive ہونا چاہتے ہیں اس کے لیے کیا کیا جا سکتے ہیں اب دو lists ہیں جن کو اوپر operation آپ پر پرپروم کرنا چاہتے ہیں ان کو mutually exclusive بنانا چاہتے ہیں اب کیا کیا جا سکتے ہیں تو یہ کیا جا سکتے ہیں کہ ہم ایک mutex کو استعمال کریں یا ایک کنکرنٹسی object کو استعمال کریں اور اس سے دونوں lists کو lock کرنے اور جب بھی اس نے کچھ operation پرپروم کرنے ہو سکتا ہے وہ list ایک اوپر operation پرپروم کرے ہو سکتا ہے b کے اوپر پرپروم کرے ہو سکتا ہے دونوں کے اوپر پرپروم کریں تو جو بھی اس نے operation پرپروم کرنے اس operation کو پرپروم کرنے سے پہلے list کو lock کرنے lock کرنے کا مطلب ہے کہ اس دوران کوئی دوسرا process جو ہے ان دونوں lists کو access نہیں کر سکتا ہے اب اگر ایک object کو استعمال کرتے ہیں ایک object دونوں lists کو lock کرنے کے لئے use ہو رہا تو اس کس کے اندر ہمیں یہاں پرپرومنس باریر نظر آتا ہے اس کا ایک solution ہم نے دیکھا ہے کہ ایک ہمارے پاس mutex ہو اور وہ mutex جو ہے دونوں lists کو lock کرنے کے لئے use کی جائے اب اس situation کے اندر کیا ہوگا کہ اگر کسی ایک process نے کسی ایک list کے اوپر بھی operation پرپروم کرنے تو وہ دونوں lists کو lock کر لے گا کوئی دوسرہ اگر thread ہے جو کہ دوسی list کے پر operation پرپروم کرنا چاہتی ہے وہ نہیں کر سکے گے جسے کہ آپ کے پاس ایک performance باریر بن جائے گا performance جو ہے وہ degrade ہو جا تو اس چیز سے بچنے کے لئے کیا کریں گے کیونکہ ہمارے پاس دو list ہیں تو ہمیں دو ہی concurrency objects use کرنے پڑیں گے ایک object ہم use کریں گے list 1 کو lock کرنے کے لئے اور دوسرہ object ہم use کریں گے list b کو lock کرنے کے لئے تو اس example کے اندر آپ کو بالکل یہ چیز نظر آ رہی ہے کہ آپ کے پاس بسکلی دو threads ہے ایک add shared element اور ایک delete shared element add جو ہے list کے اندر items add کرنے کے لئے use ہو رہا ہے اور delete جو ہے list میں سے item delete کرنے کے لئے use ہو رہا ہے لیکن جب آپ add کریں او لسٹ았는데 مرحبتو ہے، وہ لسٹ اور بی کے اندر بی ہوں کہ جو کہ دونوں لسک کو لوگ کرنے کے لئے use ہوگا تو وہ جو باقی دوسی تھریڈز ہیں جو سنگل سنگل لسک کو use کریں وہ ان تھریڈز کی جو پرفامنس ہے وہ رکھ جائے گی وہ بلوک ہو جائیں گی جب تاکہ آپ ادھر سے دونوں لسک کو رلیز نکاتتے تو اس سے بچنے کے لئے ہم نے کیا کیا اس سے بچنے کے لئے ہم نے دو objects بنالیئے دو objects بنالیئے اور ان objects کو ہم نے ایک لسٹ a اور لسٹ b بنالیئے اور پھر ہم ویٹ کو use کریں ویٹ for single object اور لسٹ a کے لئے جو ہم نے mutex بنائیئے اس کے اوپر اس کو call کیا اور پھر اسی طرح سے ویٹ for single object list b کے لئے call اب اگر دونوں کے اوپر آپ ویٹ پرفوم کر لیتے ہیں اور execution یہاں پر آجتی ہے تو اس کا مطلب ہے کہ دونوں list کو آپ own کریں دونوں mutexes کو آپ own کریں اور اب کوئی دوسرا process جو ہے کسی بھی اس mutex کو acquire نہیں کر سکے گا چونکہ acquire نہیں کر سکے گا تو اب آپ اس ایریہ کے اندر جو بھی آپ نے edition cooperation پرفوم کرنے وہ کر سکے اور پھر بعد میں آپ اسی reverse order کے اندر b کو بعد میں آپ نے acquire کیا تھا تو b کو پہلے release کریں کہ a کو بعد میں release کر دیں گا ایسا آپ نے add کے اندر کر لیا اور delete کے اندر آپ کیا کرتے ہیں delete کے اندر بھی آپ یہاں کام کرتے ہیں list لیکن اس کے اندر پہلے list b کے mutex کو آپ نے acquire کیا پھر list a کے mutex کو آپ نے acquire کیا اگر آپ یہاں پہن جاتے ہیں اس کا مطلب ہے آپ کے پاس دونوں کی ownership آگی ہیں اب آپ delete کر سکتے ہیں دونوں list کے اندر سے اور پھر جب آپ delete cooperation complete کرلتے ہیں تو اب آپ release کرنا شروع کر دیتے ہیں b کو بھی release کر دیتے ہیں اور a کو بھی release کر دیں اب اس میں problem کیا دیکھنے کو تو یہ سلوشن صحیح لگتا بلکل ٹیک ہے کہ آپ نے دونوں list کے اپر operation پرفوم کرنا تھا دونوں list کو علاگ علاق acquire کیا جو ہمارا پرفومنس والا aspect تا وہ بھی fulfill ہو رہا ہے اور آپ نے دونوں list کو acquire بھی کر لیا problem کہاں پہ آئے گی یہ سلوشن جو ہے یہ صحیح سلوشن نہیں ہے problem اس میں یہاں آئے گی جب آپ نے اس weight کو call کیا اس والے weight کو call کیا اور weight call کیا تو آپ نے mutex acquire کر لیا list a کیا آپ نے mutex acquire کر لیا اور just اب یہ دیکھیں یہ operation جو ہی ایرطامک نہیں ہے یہ دونوں operation ملکے یہ ہی ایرطامک نہیں ہے ان کے بیچ میں بھی switching ہو سکتی ہے یہ جو weight single object آپ نے call کیا اور اگلہ جو weight single object call کیا ان دونوں کے بیچ میں switching ہو سکتی ہے switching ہوتی ہے اور execution جو ہے وہ first کریں یہاں پہ آجاتی ہے اور weight for single object وہ call کرتا ہے list b یہاں پر list a کو اس نے acquire کر لیا اب list b کے mutex کو وہ call کر رہا ہے اس کو b یہاں پر وہ acquire کر لیا اس کو بھی یہاں پر وہ acquire کر لیا اس نے list b کو acquire کر لیا اب again switching ہوتی ہے اور execution واپس اس کے اپر آجاتی ہے اگلے والے weight for single object اور یہاں پر وہ کس کو acquire کر رہا ہے list b کو acquire کر رہا ہے list b کو وہ نہیں acquire کر سکے گا کیونکہ already اس کے اندر list b acquire ہوئی یا پھر switching ہوتی ہے اور یہاں پر execution آتی ہے اور یہ list a کو acquire کرنے کی کوشش کرتا ہے یہ list a کو نہیں acquire کر سکے گا کیونکہ اس نے list a کو acquire اس والی thread نے list a کو acquire کیا ہوا تو اس طرح سے دونوں threads وہ indefinitely block ہو جائیں گی دونوں threads اپنی execution complete نہیں کر سکیں گی اب ہم نے یہ دیکھنا ہے کہ یہ deadlock کی situation جو ہے اس کو کیسے result کیا جا سکتا ہم نے دیکھا ہے کہ اگر دو different آپ نے objects use کیا ہے اور for concurrency control تو دو objects کی مجود کی کی اندر اس طرح سے deadlock کرو سکتا ایک اس کا سب سے simple جو حال ہے وہ یہ ہے کہ آپ ایک hierarchy کو follow کریں ایک hierarchy maintain کریں for acquiring these concurrency controls ایک hierarchy کے مطابق آپ ہر thread کے اندر این objects کو acquire کریں جس طرح اگر ایک thread کے اندر پہلے آپ نے list a کے object کو mutex کو acquire کرنے کی کوشش کیا اور پھر list b کے mutex کو acquire کرنے کی کوشش کیا تو دوسی thread کے اندر بھی exactly یہ کریں ایک اس کا سب سے simple حال ہے اگر آپ hierarchy کو کہیں reverse کر دیتے ہیں ایک اندر پہلے a کو acquire کرنے کی کوشش کیا پھر بعد میں b کو acquire کرنے کی کوشش کیا دوسرے کے اندر پہلے b کو acquire کرنے کی کوشش کیا اور بعد میں a کو acquire کرنے کی کوشش کیا تو اس سورت میں deadlock کرو سکتا لیکن اگر تمام threads same hierarchy کو follow کریں تو اس میں deadlock occurrence کا چانس نہیں ہے اور پھر اسی طرح سے اسی order کے اندر reverse order کے اندر mutex کو وہ release کریں یا object کو وہ release کریں ساری thread same order follow کریں گی تو اس case کے اندر deadlock اکر نہیں ہو سکتا دوسرا ایک اور تری کا یہ ہے کہ آپ wait for single object کے استعمال نہ کریں آپ wait for multiple objects کے استعمال کریں آپ دونوں objects کو ایک اور ایک اندر رکھیں یا multiple بھی اگر objects ہیں ساروں کو ایک اور ایک اندر رکھیں اور wait for multiple object کا function use کریں اور اس function کے اندر یہ flag جو ہے f wait all flag جو ہے اس کو true رکھیں تو اس سورت کے اندر جو wait for multiple objects ہے وہ تمام objects کے لیے wait کرتا ہے تمام objects آپ اکوائر ہوں گے تو وہ آگے چلے گا اگر ان میں سے کسی کو نہیں وہ اکوائر کر پاتا تو سارے ہی release ہو جائیں گے کسی کو بھی نہیں اکوائر ایک کو بھی نہیں اکر اکوائر کر پاتا تو وہ کسی کو بھی اکوائر نہیں کریں اس ٹکنیق کو آپ critical section کے ساتھ نہیں use کر سکتے یعنی کہ wait for multiple objects والی جو ٹکنیق ہے یہ آپ critical section کے اندر نہیں use کر سکتے لیکن critical section کے اندر آپ previous technique جو hierarchical order کو follow کرنا ہے وہ والی ٹکنیق جو وہ ضرور استعمال کر سکتے