JavaRush /جاوا بلاگ /Random-UR /ایک mutex، ایک مانیٹر اور سیمفور میں کیا فرق ہے؟

ایک mutex، ایک مانیٹر اور سیمفور میں کیا فرق ہے؟

گروپ میں شائع ہوا۔
ہیلو! جاوا رش میں ملٹی تھریڈنگ کا مطالعہ کرتے ہوئے، آپ کو اکثر "میوٹیکس" اور "مانیٹر" کے تصورات نظر آتے ہیں۔ کیا آپ اب، جھانک کر جواب دے سکتے ہیں کہ وہ کیسے مختلف ہیں؟ :) ایک mutex، ایک مانیٹر اور سیمفور میں کیا فرق ہے - 1اگر آپ کر سکتے ہیں، اچھا کیا! اگر نہیں (اور اکثر ایسا ہوتا ہے) - کوئی تعجب نہیں. "میوٹیکس" اور "مانیٹر" کے تصورات درحقیقت آپس میں جڑے ہوئے ہیں۔ مزید برآں، انٹرنیٹ پر بیرونی وسائل پر ملٹی تھریڈنگ پر لیکچرز پڑھتے ہوئے اور ویڈیوز دیکھتے ہوئے، آپ کو اسی طرح کا ایک اور تصور نظر آئے گا - "سیمفور"۔ اس کی فعالیت بھی بڑی حد تک مانیٹر اور میوٹیکس جیسی ہے۔ لہذا، آئیے ان تینوں اصطلاحات کو سمجھیں، چند مثالوں کو دیکھیں اور آخر میں اپنے ذہنوں میں یہ سمجھیں کہ وہ ایک دوسرے سے کیسے مختلف ہیں :)

Mutex

ایک mutex دھاگوں کی مطابقت پذیری کے لیے ایک خاص چیز ہے۔ یہ جاوا میں ہر آبجیکٹ کے ساتھ "منسلک" ہوتا ہے - آپ پہلے ہی جانتے ہیں کہ :) اس سے کوئی فرق نہیں پڑتا ہے کہ آپ معیاری کلاسز استعمال کرتے ہیں یا اپنی کلاسیں بناتے ہیں، کہتے ہیں، Catاور Dog: تمام کلاسز کی تمام اشیاء کا ایک mutex ہوتا ہے ۔ "میوٹیکس" کا نام انگریزی "MUtual Exclusion" - "باہمی اخراج" سے آیا ہے، اور یہ اس کے مقصد کی مکمل عکاسی کرتا ہے۔ جیسا کہ ہم نے پچھلے لیکچرز میں سے ایک میں کہا تھا کہ ایک mutex کا کام ایسا طریقہ کار فراہم کرنا ہے کہ ایک مخصوص وقت پر صرف ایک دھاگے کو کسی چیز تک رسائی حاصل ہو ۔ ایک mutex کے لئے ایک مقبول حقیقی زندگی کی مشابہت "ٹوائلٹ مثال" ہے۔ جب کوئی شخص بیت الخلا میں داخل ہوتا ہے تو دروازے کو اندر سے بند کر دیتا ہے۔ بیت الخلا ایک ایسی چیز کے طور پر کام کرتا ہے جس تک متعدد دھاگوں سے رسائی حاصل کی جاسکتی ہے۔ بیت الخلا کے دروازے پر تالا ایک میوٹیکس کا کردار ہے، اور باہر لوگوں کی قطار دھاگوں کا کردار ہے۔ دروازے پر تالا ایک ٹوائلٹ میوٹیکس ہے: یہ یقینی بناتا ہے کہ ایک وقت میں صرف ایک شخص اندر ہو سکتا ہے۔ ایک mutex، ایک مانیٹر اور سیمفور کے درمیان کیا فرق ہے - 2دوسرے الفاظ میں، ایک وقت میں صرف ایک تھریڈ مشترکہ وسائل پر کام کر سکتا ہے۔ دوسرے دھاگوں (لوگوں) کی طرف سے مقبوضہ وسائل تک رسائی کی کوششیں ناکام ہو جائیں گی۔ ایک mutex میں کئی اہم خصوصیات ہیں. سب سے پہلے ، صرف دو ریاستیں ممکن ہیں - "آزاد" اور "مصروف"۔ اس سے یہ سمجھنا آسان ہو جاتا ہے کہ یہ کیسے کام کرتا ہے: بولین متغیر سچ/غلط یا بائنری نمبر سسٹم 1/0 کے ساتھ متوازی بنائے جا سکتے ہیں۔ دوم ، ریاستوں کو براہ راست کنٹرول نہیں کیا جا سکتا۔ جاوا میں کوئی ایسا طریقہ کار نہیں ہے جو آپ کو واضح طور پر کسی چیز کو لینے، اس کا mutex حاصل کرنے اور اسے مطلوبہ حیثیت تفویض کرنے کی اجازت دیتا ہے۔ دوسرے الفاظ میں، آپ کچھ ایسا نہیں کر سکتے ہیں:
Object myObject = new Object();
Mutex mutex = myObject.getMutex();
mutex.free();
اس طرح، آبجیکٹ کا mutex جاری نہیں کیا جا سکتا. صرف جاوا مشین کو اس تک براہ راست رسائی حاصل ہے۔ پروگرامر زبانی ٹولز کا استعمال کرتے ہوئے mutexes کے ساتھ کام کرتے ہیں۔

مانیٹر

ایک مانیٹر ایک mutex میں ایک اضافی "ایڈ آن" ہے۔ درحقیقت، مانیٹر پروگرامر کے لیے "پوشیدہ" کوڈ کا ایک ٹکڑا ہے ۔ پہلے mutex کے بارے میں بات کرتے ہوئے، ہم نے ایک سادہ سی مثال دی:
public class Main {

   private Object obj = new Object();

   public void doSomething() {

       //...some logic available to all threads

       synchronized (obj) {

           //logic that is only available to one thread at a time
       }
   }
}
کوڈ کے بلاک میں جو لفظ کے ساتھ نشان زد ہوتا ہے synchronized، ہماری آبجیکٹ کا mutex پکڑا جاتا ہے obj۔ ٹھیک ہے، گرفتاری ہوتی ہے، لیکن "دفاعی طریقہ کار" کیسے حاصل کیا جاتا ہے؟ synchronizedدوسرے تھریڈز بلاک کے اندر کیوں نہیں جا سکتے جب وہ کوئی لفظ دیکھتے ہیں ؟ یہ مانیٹر ہے جو حفاظتی طریقہ کار بناتا ہے! مرتب کرنے والا لفظ کو synchronizedکوڈ کے کئی خاص ٹکڑوں میں تبدیل کرتا ہے۔ آئیے ایک بار پھر طریقہ کے ساتھ اپنی مثال پر واپس آتے ہیں doSomething()اور اس میں اضافہ کرتے ہیں:
public class Main {

   private Object obj = new Object();

   public void doSomething() {

       //...some logic available to all threads

       //logic that is only available to one thread at a time
       synchronized (obj) {

           /*выполнить важную работу, при которой доступ к an objectу
           должен быть только у одного потока*/
           obj.someImportantMethod();
       }
   }
}
کمپائلر کے اس کوڈ کو تبدیل کرنے کے بعد ہمارے پروگرام کے "انڈر دی ہڈ" میں کیا ہوگا:
public class Main {

   private Object obj = new Object();

   public void doSomething() throws InterruptedException {

       //...some logic available to all threads

       //логика, которая одновременно доступна только для одного потока:

       /*до тех пор, пока мьютекс an object занят -
       любой другой поток (кроме того, который его захватил), спит*/
       while (obj.getMutex().isBusy()) {
           Thread.sleep(1);
       }

       //пометить мьютекс an object How занятый
       obj.getMutex().isBusy() = true;

       /*выполнить важную работу, при которой доступ к an objectу
       должен быть только у одного потока*/
       obj.someImportantMethod();

       //освободить мьютекс an object
       obj.getMutex().isBusy() = false;
   }
}
مثال یقیناً حقیقی نہیں ہے۔ یہاں، جاوا نما کوڈ کا استعمال کرتے ہوئے، ہم نے یہ ظاہر کرنے کی کوشش کی کہ اس وقت جاوا مشین کے اندر کیا ہو رہا ہے۔ تاہم، یہ سیڈو کوڈ اس بات کی بڑی سمجھ دیتا ہے کہ اصل میں بلاک کے اندر موجود شے اور تھریڈز کے ساتھ کیا ہو رہا ہے synchronizedاور کس طرح کمپائلر اس لفظ کو کئی کمانڈز میں تبدیل کرتا ہے جو پروگرامر کے لیے "پوشیدہ" ہیں۔ بنیادی طور پر، جاوا میں مانیٹر لفظ کے استعمال سے ظاہر ہوتا ہےsynchronized ۔ وہ تمام کوڈ جو آخری مثال میں لفظ کے بجائے ظاہر ہوا synchronizedمانیٹر ہے۔

سیمفور

ایک اور لفظ جو آپ خود ملٹی تھریڈنگ کا مطالعہ کرتے وقت آتا ہے وہ ہے "سیمفور"۔ آئیے معلوم کریں کہ یہ کیا ہے اور یہ مانیٹر اور میوٹیکس سے کیسے مختلف ہے۔ سیمفور ایک وسائل تک رسائی کو ہم آہنگ کرنے کا ایک ذریعہ ہے۔ اس کی خاصیت یہ ہے کہ ہم وقت سازی کا طریقہ کار بناتے وقت یہ کاؤنٹر کا استعمال کرتا ہے۔ کاؤنٹر ہمیں بتاتا ہے کہ مشترکہ وسائل تک بیک وقت کتنے دھاگوں تک رسائی حاصل کی جا سکتی ہے۔ ایک mutex، ایک مانیٹر اور سیمفور کے درمیان کیا فرق ہے - 3جاوا میں سیمفورس کی نمائندگی کلاس کے ذریعہ کی جاتی ہے Semaphore۔ سیمفور آبجیکٹ بناتے وقت، ہم درج ذیل کنسٹرکٹرز استعمال کر سکتے ہیں۔
Semaphore(int permits)
Semaphore(int permits, boolean fair)
ہم کنسٹرکٹر کے پاس جاتے ہیں:
  • int permits- ابتدائی اور زیادہ سے زیادہ کاؤنٹر ویلیو۔ یعنی، کتنے دھاگے بیک وقت ایک مشترکہ وسائل تک رسائی حاصل کر سکتے ہیں؛

  • boolean fair- اس ترتیب کو قائم کرنے کے لیے جس میں تھریڈز کو رسائی حاصل ہو گی۔ اگر fair= سچ ہے تو انتظار کے دھاگوں تک رسائی اسی ترتیب سے دی جاتی ہے جس میں انہوں نے درخواست کی تھی۔ اگر یہ غلط ہے تو، ترتیب کا تعین تھریڈ شیڈولر کے ذریعے کیا جائے گا۔

سیمفورس کے استعمال کی ایک بہترین مثال لنچنگ فلسفیوں کا مسئلہ ہے ۔
ایک mutex، ایک مانیٹر اور سیمفور کے درمیان کیا فرق ہے - 4
بہتر تفہیم کے لیے ہم اس کی شرائط کو تھوڑا سا آسان کریں گے۔ تصور کریں کہ ہمارے پاس 5 فلسفی ہیں جنہیں دوپہر کے کھانے کی ضرورت ہے۔ ایک ہی وقت میں، ہمارے پاس ایک میز ہے، اور اس پر ایک ہی وقت میں دو سے زیادہ لوگ نہیں ہو سکتے۔ ہمارا کام تمام فلسفیوں کو کھانا کھلانا ہے۔ ان میں سے کسی کو بھی بھوکا نہیں رہنا چاہئے، اور نہ ہی انہیں میز پر بیٹھنے کی کوشش کرتے وقت ایک دوسرے کو "بلاک" کرنا چاہئے (ہمیں تعطل سے بچنا چاہئے)۔ ہمارا فلسفی طبقہ ایسا نظر آئے گا:
class Philosopher extends Thread {

   private Semaphore sem;

   // поел ли философ
   private boolean full = false;

   private String name;

   Philosopher(Semaphore sem, String name) {
       this.sem=sem;
       this.name=name;
   }

   public void run()
   {
       try
       {
           // если философ еще не ел
           if (!full) {
               //Запрашиваем у семафора разрешение на выполнение
               sem.acquire();
               System.out.println (name + " садится за стол");

               // философ ест
               sleep(300);
               full = true;

               System.out.println (name + " поел! Он выходит из-за стола");
               sem.release();

               // философ ушел, освободив место другим
               sleep(300);
           }
       }
       catch(InterruptedException e) {
           System.out.println ("What-то пошло не так!");
       }
   }
}
اور ہمارے پروگرام کو چلانے کا کوڈ یہ ہے:
public class Main {

   public static void main(String[] args) {

       Semaphore sem = new Semaphore(2);
       new Philosopher(sem,"Сократ").start();
       new Philosopher(sem,"Платон").start();
       new Philosopher(sem,"Аристотель").start();
       new Philosopher(sem,"Фалес").start();
       new Philosopher(sem,"Пифагор").start();
   }
}
ہم نے اس شرط کو پورا کرنے کے لیے 2 کی گنتی کے ساتھ ایک سیمفور بنایا کہ ایک ہی وقت میں صرف دو فلسفی کھا سکتے ہیں۔ یعنی بیک وقت صرف دو تھریڈز کام کر سکتے ہیں، کیونکہ ہماری کلاس Philosopherوراثت میں ملی ہے Thread! کلاس acquire()اور طریقے اس کے پرمشن کاؤنٹر کو کنٹرول کرتے ہیں۔ طریقہ سیمفور سے وسائل تک رسائی کی اجازت کی درخواست کرتا ہے۔ اگر کاؤنٹر > 0 ہے تو، اجازت دی جاتی ہے اور کاؤنٹر کو 1 تک کم کیا جاتا ہے۔ طریقہ پہلے سے دی گئی اجازت کو "ریلیز" کرتا ہے اور اسے کاؤنٹر پر واپس کرتا ہے (سیمفور کے گرانٹ کاؤنٹر کو 1 تک بڑھاتا ہے)۔ جب ہم پروگرام چلاتے ہیں تو ہمیں کیا ملتا ہے؟ کیا مسئلہ حل ہو گیا؟کیا ہمارے فلسفی اپنی باری کے انتظار میں لڑیں گے؟ :) یہ وہ کنسول آؤٹ پٹ ہے جو ہمیں موصول ہوا: سقراط میز پر بیٹھا افلاطون میز پر بیٹھا سقراط نے کھایا! وہ دسترخوان چھوڑ دیتا ہے۔ افلاطون نے کھا لیا! وہ میز چھوڑتا ہے ارسطو میز پر بیٹھا پائتھاگورس میز پر بیٹھا ارسطو کھانا کھا چکا ہے! وہ میز چھوڑ دیتا ہے پائتھاگورس نے کھایا ہے! وہ ٹیبل چھوڑتا ہے تھیلس ٹیبل پر بیٹھ گیا تھیلس نے کھایا ہے! وہ میز چھوڑ دیتا ہے۔ ہم کامیاب ہو گئے! اور اگرچہ تھیلس کو اکیلے کھانا کھانا پڑا، مجھے لگتا ہے کہ وہ ہم سے پاگل نہیں ہے :) آپ نے میوٹیکس اور سیمفور کے درمیان کچھ مماثلتیں دیکھی ہوں گی۔ عام طور پر، ان کا ایک ہی مقصد ہے: کچھ وسائل تک رسائی کو ہم آہنگ کرنا۔ فرق صرف یہ ہے کہ کسی شے کا میوٹیکس ایک وقت میں صرف ایک تھریڈ سے حاصل کیا جا سکتا ہے، جبکہ سیمفور کی صورت میں، تھریڈ کاؤنٹر استعمال کیا جاتا ہے، اور ان میں سے کئی ایک ہی وقت میں وسائل تک رسائی حاصل کر سکتے ہیں۔ اور یہ محض اتفاقی مماثلت نہیں ہے :) درحقیقت، ایک mutex ایک واحد جگہ کا سیمفور ہے ۔ یعنی یہ ایک سیمفور ہے جس کا کاؤنٹر ابتدائی طور پر 1 پر سیٹ کیا جاتا ہے۔ اسے "بائنری سیمفور" بھی کہا جاتا ہے کیونکہ اس کے کاؤنٹر کی صرف 2 قدریں ہوسکتی ہیں - 1 ("مفت") اور 0 ("مصروف")۔ بس! جیسا کہ آپ دیکھ سکتے ہیں، سب کچھ اتنا مبہم نہیں نکلا :) اب، اگر آپ انٹرنیٹ پر ملٹی تھریڈنگ کے موضوع کا مزید تفصیل سے مطالعہ کرنا چاہتے ہیں، تو آپ کے لیے تصورات کو نیویگیٹ کرنا قدرے آسان ہوگا۔ اگلے اسباق میں ملتے ہیں! release()Semaphoreacquire()release()ایک mutex، ایک مانیٹر اور سیمفور کے درمیان کیا فرق ہے - 5
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION