 بسم اللہ الرحمن الرحیم آج ہم موڈیول 67 دسکس کریں گے موڈیول 67 ہے ہیپ سائیز اور سیرلائیوزیشن پریوسلی ہم نے دیکھا کہ جی ہم ہیپ کس طرح کریٹ کریں گے اور ہیپ کے اندر کیسے علاوکیشن اور دی علاوکیشن اور ری علاوکیشن کی جا سکتی ہے اگر آپ ہیپ کو use کر رہے ہیں تو at times آپ کو کبھی یہ بھی زود پر سکتی ہے اگر ملٹپل ہیپ سستمال ہو رہی ہیں یا جو بھی آپ نے logic بنائے ہوا اس کے اندر آپ کو زود پر سکتی ہے کہ آپ دیکھنا چاہیں کہ آپ کی total ہیپ کا سائیز کیا ہے ہیپ کا سائیز میر کرنے کے آپ کو ضرورت پر سکتی ہے تو ہیپ کا سائیز لینے کے لیے بھی windows جو ہے آپ کو کچھ API's پروائٹ کرتی ہے آپ انہیں API's کی مدہ سے ہیپ کا سائیز جو ہے وہ get کر سکتے ہیں اس کے لیے جو API use ہوتی ہے اس کا نام ہے heapsize simple heapsize کی API ہے اور اس کے اندر آپ سپیسفائے کرتے ہیں جو بھی اپنا allocated block ہے اور اس کے مدہ سے آپ اس کے اندر جو allocated block اس کا سائیز جو ہے وہ get کر سکتے ہیں اس کا یہ سنٹیکس دیکھتے ہیں اس کے اندر ہیپ کا ہندل آئے گا flags آئیں گے اور location آئے گی جو block allocated ہوا ہے اس کی location آپ سپیسفائے کریں گے اس کے اندر جو flag جو use ہو سکتے ہے وہ heapsize no serialize آپ سپیسفائے کر کے اس function کو use کر سکتے ہیں each heap جو ہوگا وہ handle to the heap ہوگا جس heap کے اندر جس block کا آپ address size get کرنا چاہ رہے ہیں اور lpmem جو ہے that is the address of the block جس address کا آپ size لنہ چاہ رہے ہیں اور یہ دیکھیں جو آپ کو return کر رہا ہے وہ size t ہے اس کی type تو size t کا مطلب ہے کہ 32 bit ہوگا in case of when 34 bit ہوگا in case of when 64 یہ compatibility کیلئے رکھا گیا size t size t کے اندر جو بھی اس block کا size ہوگا وہ آپ کو return ہو جائے گا اس کے لہذا ایک اور جو important point ہے heaps کو use کرتے ہیں that is serialization serialization آپ کو required ہوتی ہے جب آپ concurrent processes کو use کرے ہیں یا concurrent threads کو use کرے ہیں کئی سارے processes ہیں جو at a time ڈان رہے ہیں اس کے اندر کوئی ایسا operation ہے conflecting operations ہیں ہم ان conflecting operations کو serialize کرتے ہیں ہم چاہتے ہیں کہ وہ conflecting operations جو ہیں concurrently not execute ہوں وہ serial execute ہوں ایک conflecting operation execute ہو تو اس دران دوسرا نہ ہو رہاو وہ complete ہوں تو پھر اگلہ execute ہوں وہ complete ہوں تو اس سے اگلہ execute ہوں and so on تو یہ چیز کلاتی ہے serialization تو ہمیں کیونکہ windows یہ ایک multitasking سسٹم ہے اس کے اندر کئی processes run ہو رہے ہیں ہار process کے اندر کئی threads run ہو رہے ہیں تو windows کے اندر ہمیں کئی دفعہ serialization کی ضرورت پڑتی ہے اگر تو threads وہ بالکل autonomous ہیں ایک دوسر سے information لیے رہے ایک دوسرے کو information لیے پاس کرے کوئی ایسی چیز شیر نہیں کرے اپس میں جو کہ کوئی non shareable resource ہو تو اس case کے اندر ان threads کو اپس میں serialize کرنے کی ضرورت نہیں ہے بالکل اگر autonomous and disjoint ہیں ان کا اپس میں کوئی link کی نہیں ہے تو ہم میں ان threads کو اپس میں serialize کرنے کا کوئی point نہیں ہے اگر بالکل serialize کریں گے تو ایک طرح سے performance de-gradation ہوگی تو ایسی threads جو بالکل autonomous ہیں انہیں ہمیں بالکل serialize کرنے کی ضرورت نہیں پڑتی یہاں میں ہم نے دیکھا کہ ایک ہمارے پاس flag تھا heap no serialize اس flag کو ہم نے use کیا اور اسے ہم نے کہا کہ جیئے اس flag کو گا use کریں گے تو serialization نہیں ہوگی اور اس سے ہمیں performance improvement ملے گی اور وہ performance improvement up to 16% ہو ستی وہ کیوں ملے گی وہ اس وجہ سے ملے گی کیونکہ جب current processes جویں وہ serialize نہیں ہو رہے ہیں although they are running concurrently جب serialization ان کی کرتے ہیں تو وہاں پہ کچھ آپ کو over hits دینے پڑتے آپ کو process کو busy wait کے اندر داننا پڑتا ہے اس کو انتظار کرنا پڑتا ہے کہ وہ دوسرا operation complete ہو تو ابھی operation start ہو کیونکہ وہ دونوں اپس میں serial connected ہیں concurrently وہ execute نہیں ہو سکے ہوتے تو دیکھا گیا ہے کہ اگر اس طرح سے ہم serialize نہ کریں ان کو ٹھیک ہے تو ہمیں کوئی 16% performance improvement نظر آتا ہے لیکن ان کو logically تبھی no serialize کیا جا سکتا ہے اگر یہ بالکل Disjoint اگر ان کا اپس میں کوئی connection ہیں اور بیچ میں کوئی non shareable resource یہ use کریں تب ان کی serialization کنی ضروری ہوتی ہے وہ ہمیں دیکھنا پڑے گا کہ کس طرح سے serialization کی جائے گی لیکن اگر Disjoint ہے تو بالکل بھی serialize کرنے کی ضرورت نہیں ہے وہاں پہ ہمیں کچھ performance improvement نظر آتی ہے تو کس طرح کے cases کے اندر آپ یہ والا flag جو ہے no serialize والا flag جو ہے اس کو use کریں گے ایک تو case ہے کہ اگر program single thread رہا ہے program کے اندر ہی thread multiple threads نہیں اس کا اپس میں کوئی competition ہی نہیں ہے ایکی program کے اندر thread چل رہی ہے تو اس thread کے اندر آپ بڑی اسانی سے ہی no serialize کا flag use کر سکتے دوسرا case ہو سکتا ہے کہ ہر thread اگر multiple threads چل رہی ہے ایک program کے اندر لیکن ہر thread کی اپنی علاق سے ہیپ ہے ایک program جو ہے وہ دوسری ہیپ کے ساتھ interfere نکا رہا ایک thread جو ہے وہ دوسری thread کی ہیپ سے information نہیں لے رہا وہ صرف اپنی ہیپ کے اوپر operations perform کر رہا اور دوسری thread والا بھی اپنی ہیپ کے اوپر operation perform کر رہا اور اپس میں کوئی information sharing نہیں ہو رہی ہے ایک دوسرے کو information pass نہیں ہو رہی تو یہ بالکل اپس میں disjoint ہیں دونوں heaps بھی اور thread بھی آپ اس case کے اندر بھی یہ والا flag use کر سکتے ہیں وہاں سے آپ پر performance improvement نظر آئے گی اور تیسرہ case ہے اگر یہ جو mutual exclusion جو ہم کر رہے ہیں among processes یا threads ان کو handle کرنے کے لیے جو logic ہے that is within the process تو ہمیں اسے border کرنے کے ذود نہیں ہے وہاں پر بھی ہم اس flag کو use کر سکتے ہیں اسی طرح ایک اور ہم نے flag دیکھا تھا جو کہ generate exception کا flag تھا یہ generate exception کا flag جو ہے اگر آپ اس کو set کر دیتے ہیں تو اس صورت کے اندر exception generate ہوتی ہیں ان case heaps کی allocation یا heaps کے کوئی operation کے دوران اگر آپ کو کسی کسم کی exception ملتی ہے تو اس کے اس میں system جو ہے exception throw کرتا ہے اگر اس particular flag کے set ہونے کی وجہ سے exception raise ہوتی ہے تو وہ دو طرح کی exceptions ہوسکتی ہیں ایک exception ہوسکتی ہے status no memory اس کا مطلب ہے کہ آپ نے memory allocate کرنے کی کوشش کی لیکن کوئی memory ہے ہی نہیں مزید allocate کرنے کے لیے تو وہاں پہ exception raise ہو جائے گی دوسرا case ہے کہ access violation access violation عام طور پر تب ہوگی اگر آپ کی heap corrupt ہوگی کوئی آپ نے غلط pointers کا استعمال کیا آپ کا دیتہ تھا اور اس کو آپ نے as code استعمال کر لیا ہے یا جو اس کی bounds ہیں ان کو exceed کرنے کیا آپ نے کوشش کیا تو اس case کے اندر access violation آئی گی اس کے لیوہ اور کئی سارے functions ہیں جو heap کی operations کے ساتھ associated ہیں for example heapset information heapset information کا جو function ہے اس کو آپ use کر سکتے ہیں low fragmentation کو enable کرنے کے لیے windows nt جو version 5 ہے اس کے اندر low fragmentation کو enable کرنے کے لیے آپ اس function کو use کر سکتے ہیں hire کے اندر by default تو more over اگر کسی وجہ سے کبھی بھی کہیں بھی heap کو corrupt ہو جاتی ہے تو اس سورت کے اندر اگر آپ set information کی function کو use کر کے اس کو اس طرح سے configure کر سکتے ہیں کہ program automatically terminate ہو جائے جب بھی کہیں اس کو detect کرتا ہے کہ heap corruption ہی ہے تو وہ خودی سے terminate ہو جائے گا اس کے لیے وہ اور کئی functions ہیں جیسے heap compact ہے heap compact جو ہے وہ use ہوتا ہے جو بھی آپ کے allocated blocks ہیں اس کے اندر سب سے بڑا block find out کرنے کے لیے heap validate ہے وہ یہ دیکھنے کے لیے کہ کوئی block جو ہے یا کوئی heap corrupt تو نہیں ہو گئی ہے heap walk ہے وہ جتنے بھی allocated blocks ہیں ان کو enumerate کرنے کے لیے heap walk use ہوتا ہے اسی طرح heap block اور heap unlock ہے یہ use ہوتا ہے serialize access کو serialize کرنے کے لیے a mutual exclusion کے لیے ان ساروں کی details جو ہے وہ msd n کے دلے بغوار دیکھ سکتے ہیں اور ان کے پر آپ مزید پریکٹس بھی کر سکتے ہیں