 بسم اللہ الرحمن الرحیم آج ہم موڈیول 133 دسکس کریں گے موڈیول 133 ہے about volatile storage یہ خاص کسم کا آسپیکٹ ہے خاص کسم کا کوالیفائر ہے اور بڑی یہ سپیسفک سرکم سانسز کے اندر ہمیں اس کوالیفائر کی ضرورت پڑے گی ہم نے پریویسلی دیکھا کہ موڈیول اکسلوشن انفورس کرنے گلیے اگر ہم کوئی سافٹر اونیونٹڈ بیتھر دیوز کرتے ہیں تو وہ کافی ہتک فیل ہو جاتا تو یہ windows یا windows کے level پہ یا compiler کے level پہ ہمیں ایک فیصلیٹی پروائیڈ گئی گی ہے of volatile storage جس کی مدہ سے ہمیں جب ہم انکریمنٹ وغیرہ کے اپریشنز پرفوم کر رہے ہیں جب شیرڈ ویریبلز کی values کو چینج کریں تو ان کو اس طریق سے چینج کیا جائے تاکہ کسی کسم کا بیچ میں کنفلکٹ آنے کا سوچنگ کی وجہ سے کسی کسم کا کنفلکٹ آنے کے چانسز وہ روڈیوز ہو جائے تو volatile storage ہمیں اس چیز کے اندر کسی لحاظ سے مدد کرتی ہیں وہ ہم دیکھیں گے کہ کس طرح سے مدد کرتی ہیں فرص لی یہ سمجھنے کی ضرورت ہے کہ اگر آپ نے سنکرونیزیشن اور میوشل اکسلویون کسی طریقے سے انفورس کر دیا even than جب آپ global variables کو انکریمنٹ کر رہے ہیں یا ان کے پر کوئی مادیفکیشنز کر رہے ہیں یا دیکریمنٹ جا جو بھی اپریشنز پرفوم کر رہے ہیں تو possible ہے کہ پھر بھی کنفلکٹ آ جائے یہ کیسے ہوتا ہے یہ اس طرح سے ہوتا ہے کہ جب for example ایک آپ نے ایک variable کے اوپر کوئی اپریشن پرفوم کرنا ہے اگر انسٹرکشن لو level انسٹرکشن کے level کے اوپر دیکھیں اگر آپ نے کہا ہے for example a is equal to a plus one آپ نے کہا ہے a plus plus تو ہو سکتے کہ اس کے بیچ میں ایک ایک سیزادہ انسٹرکشنز انوالڈ رہے ہیں ہوسکتے ایک اپریشن آپ نے پرفوم کرے ہیں اس کے بیچ میں تین انسٹرکشنز انوالڈ رہے ہیں تو انسٹرکشنز جو ہوتی ہیں وہ اٹامک نہیں ہوتی یا اگر تین انسٹرکشنز ہیں یا ہمارا جو آپ کہ لیکن ہے کہ high level language کا سٹیٹمنٹ ہے وہ اٹامک نہیں ہوتا ایک سنگل انسٹرکشنز ہوتی ہے وہ اٹامک ہوتی ہے اگر ایک سٹیٹمنٹ ٹرانسلیٹ ہوتا ہے ایانٹو تین انسٹرکشنز وہ تین انسٹرکشنز جو وہ اٹامک نہیں ہوتی ہے ابھی ان میں سے ہو سکتے ہیں کہ ابھی دو ائی انسٹرکشنز آپ ایکسیوٹ ہوسکتو ہیں ہی تھی اور سوچنگ ہوگئے جو انترمیڈیڈڈےالیوز ہے وہ ریجسٹرس کے اندر بھی پڑھی رائے گی اور جو ممری کے اندر ریویبلڈ کے انہیں وہ چیہنچ نہیں ہوئے اور سوچنگ ہو گی اور سوچنگ سے ہو سکتا ہے پھر کیونکہ ویریبلز چینج نہیں ہوئے تو دوسری تھریڈ کو ویریبلز کی پرانی کوئی اور ویلیوں ملے اور کانفلکٹ سائن تو کیا ہوتا ہے کہ یہ جو امارے کمپائلرز ہوتے ہیں یہ اپٹیمائیزیشن کے لیے ریجسٹرز کا استعمال کرتے ہیں میمبری اپریشنز جو ہوتے ہیں وہ ایک ویریبل کو ریجسٹر کے اندر لیاتے ہیں پھر ریجسٹر کے اندر یہ رکھے اس کے پر اپریشنز پرفام کرتے ہیں اور جب تک اندر اندر آپ کو ویریبل کو واپس سٹور کرنے کی ضرورت نہیں پڑھتی تو ویریبل ہو ستا ہے کافی دیر تک ریجسٹرز کے اندر ہی رہے اور ریجسٹرز میں رتے ہوئی اگر اگر سوچنگ ہو جاتی ہے تو وہ ریجسٹر میں پڑھیوی ویلیوں جو ہے اس کا آسپیکٹ جو ہے وہ میمبری کے اندر نظر نہیں آئے گا چنان چاہتے ہیں دفرنٹ اگر کوئی پروسسسر ہے دفرنٹ کور ہے اس کور کو وہ چینج ایکسیسیبل نہیں ہوگا اگر وہ چینج ایک طریقہ یہ ہو سکتا ہے کہ ہم کمپایلر کی اوبٹمائیزیشن بند کرتے ہیں کمپایلر کی اوبٹمائیزیشن بند کریں گے تو سی ہی ہوگا کہ وہ ریجسٹرز ویرہ کا استعمال کام کر دے گا اور موستلی ویریبل کو میمبری میں ہی سے ہی ایکسیس کرے گا پر the first time میمبری میں سے ایکسیس کرے گا اور جو ہی اس ویریبل کے پر ایک اپریشن پرفام ہو جاتا ہو سکتا ہے اس کو واپس میمبری کے اندر سٹور کر دے سپسیکوینٹ اوپریشن کے لیے وہ اس کو ریجسٹر کے اندر نہ رکھیں اس طرح کرنے سے بھو سکتا ہے problem solve ہو جائے لیکن اس طرح سے یہ بھی ہوگا کہ ایسے اوپریشن جو ہم چاہتے ہیں کہ اوبٹمائیز ہوں جو جہاں پہ لوکل ویریبل دیستمال ہونے ہیں جہاں پہ کسی کسم کے کنفلکٹس نہیں exist کرتے تو وہاں پہ بھی جو پرفامنس ہے وہ سلو ہو جائے گی کیونکہ اپنے اوبٹمائیزیشن across the board جو ہے وہ بند کر دی ہے تو یہ سلوشن جو ہے یہ بھی فیزبل نہیں ہے تو اس کے لیے آنسی سی جو ہے سی کا ایک qualifier ہوتا ہے وہ qualifier جو ہے وہ ہے ولیٹائل qualifier کے نام ہے ولیٹائل ایک ویریبل اگر ولیٹائل qualifier کے ساتھ اپنے دیکلیر کیا تو اس صورت کے اندر وہ ویریبل جو ہے وہ میمبری میں رہتے ہیں most of the time جو کمپائلہ رہا وہ ایک کوشش کرے گا اس کو میمبری میں رکھتے ہوئی اس کے پر operation پرفام کیا جائے جب بھی وہ first time access ہوگا میمبری میں سے access ہوگا جو ہی اس کے پر کوئی operation پرفام ہوگا تو اس کو واپس میمبری کے اندر یاک دیے جائے گا یا میمبری کے اندر ہی رہتے ہوئے اس کے پر operation پرفام کیا جائے گا پھر ولیٹائل کا مطلب یہ بھی ہے کہ جو اس طرح جو ویریبل ہوگا وہ کبھی بھی access ہو سکتا ہے یعنی کہ ایک تھرد چال رہی اس کے دوران دوسی تھرد پر سوچنگ ہوتی ہے تو دوسی تھرد پر بھی وہ ہو سکتا ہے access ہوگا تو کسی بھی انسٹنس پر اس کو access کیا جا سکتا ولیٹائل کیسم کے ویریبل کا پھر آپ اگر اس طرح جو ویریبل use کرے ہیں جو کہ ولیٹائل ہم کبھی use کرے ہیں صرف تبھی آپ use کرے ہوگا اگر وہ share ہوگا اگر number of threads اس کو share کریں ہر ویریبل کو آپ ولیٹائل نہیں بنائیں گے اگر ہر ویریبل کو آپ ولیٹائل بنائیں گے تو performance بہت de-grade ہو جائے گی کم سے کم ویریبل کو بنائیں گے صرف وہی ویریبل جن کے پر shared access ہے جس کو at a time number of threads at a time access کرنے کی کوشش کریں گے صرف ان کو ہی wallet ڈائل رکھا جائے گا اگر ایک ویریبل آپ بناتے ہیں اور وہ read only ہے کچھ threads 3 4 threads ہیں 2 3 threads ہیں انہوں نے just اس کو read کرنا ہے اس کے پر write نہیں کرنا لیکن کوئی اور thread ہے جو اس کو change کر رہی ہے اس کو change کر رہی ہے اور اس کے change کرنے سے وہ باکی threads کے operations کیوں پر اس کا effect آئے گا تو اس کس کے اندر بھی آپ کو اپنا جو ویریبل ہے وہ wallet ڈائل رکھنا نہ صرف کہ اگر وہ shared ہے اور share 3 کیسے access ہو رہا ہے اگر number of threads اس کو modify کرنے ہیں صرف تب ہی آپ کو اس کو wallet ڈائل کرنے کی زیادہ نہیں ہے اگر ہو سکتا ہے ایک ہی thread اس کو modify کرنے ہے لیکن اس کا effect read ہوننے کی وجہ سے ہی number of threads کے اوپر آ رہا ہے تو اس صورت میں بھی اس ویریبل کو wallet ڈائل رکھنے کی ضرورت پڑے گے تو wallet ڈائل ویریبل وہ ہے جس کی وجہ سے conflict exist کرا ہے اگر اس کی وجہ سے conflict exist کرا ہے تو ہم چاہیں گے کہ اس کو wallet ڈائل 3 کیسے access کریں wallet ڈائل 3 کیسے اس لئے access کریں کیونکہ compiler optimization کی وجہ سے وہ جب switching ہوتی ہے تو ہو سکتا ہے کہ وہ ویریبل register کے اندر پڑا رہا ہے اور اس ویریبل کا جو effect ہے وہ باقی threads کے اوپر جو ہے reflect now تو اس لی ضروری ہے کہ جو shared variables ہیں جن کا effect جو ہے number of threads کے اوپر ہے ان کو ہم wallet ڈائل qualifier کے ساتھ defining کریں