logo

Mutex مقابل الإشارة

وفقًا لمصطلحات نظام التشغيل، تعد كائنات المزامنة والإشارات من موارد النواة التي توفر خدمات المزامنة، وتسمى أيضًا بدايات المزامنة . تلعب مزامنة العمليات دورًا مهمًا في الحفاظ على اتساق البيانات المشتركة. توجد حلول البرامج والأجهزة للتعامل مع مشكلات القسم الحرجة. لكن حلول الأجهزة لمشاكل الأقسام الحرجة يصعب تنفيذها. يوفر كل من Mutex وsemaphore خدمات المزامنة، لكنهما ليسا متماثلين.

ما هو موتيكس؟

Mutex هو كائن استبعاد متبادل يقوم بمزامنة الوصول إلى المورد. يتم إنشاؤه باسم فريد في بداية البرنامج. تضمن آلية قفل كائن المزامنة (mutex) أن يتمكن مؤشر ترابط واحد فقط من الحصول على كائن المزامنة (mutex) والدخول إلى القسم الحرج. يقوم هذا الخيط بإصدار كائن المزامنة (mutex) فقط عند خروجه من القسم الحرج.

Mutex مقابل الإشارة

وهو نوع خاص من الإشارة الثنائية يستخدم للتحكم في الوصول إلى المورد المشترك. يتضمن آلية وراثة الأولوية لتجنب مشاكل انعكاس الأولوية الموسعة. فهو يسمح بإبقاء المهام ذات الأولوية الأعلى الحالية في الحالة المحظورة لأقصر وقت ممكن. ومع ذلك، فإن وراثة الأولوية لا تصحح انعكاس الأولوية ولكنها تقلل فقط من تأثيرها.

مثال

ويظهر ذلك بمساعدة المثال التالي،

 wait (mutex); ..... Critical Section ..... signal (mutex); 

استخدام موتيكس

يوفر كائن المزامنة (mutex) الاستبعاد المتبادل، سواء للمنتج أو المستهلك الذي يمكنه الحصول على المفتاح (mutex) ومواصلة عملهم. وطالما أن المنتج يملأ المخزن المؤقت، يحتاج المستخدم إلى الانتظار، والعكس صحيح. في قفل Mutex، يمكن لخيط واحد فقط العمل مع المخزن المؤقت بأكمله طوال الوقت.

عندما يبدأ برنامج ما، فإنه يطلب من النظام إنشاء كائن كائن المزامنة (mutex) لمورد معين. يقوم النظام بإنشاء كائن mutex باسم أو معرف فريد. عندما يريد مؤشر ترابط البرنامج استخدام المورد، فإنه يحتل القفل على كائن Mutex، ويستخدم المورد وبعد الاستخدام، يقوم بتحرير القفل على كائن Mutex. ثم يُسمح للعملية التالية بالحصول على القفل على كائن المزامنة.

وفي الوقت نفسه، حصلت العملية على القفل على كائن كائن المزامنة (mutex)، ولا يمكن لأي مؤشر ترابط أو عملية أخرى الوصول إلى هذا المورد. إذا كان كائن المزامنة مقفلاً بالفعل، فإن العملية التي ترغب في الحصول على القفل على كائن المزامنة يجب أن تنتظر ويتم وضعها في قائمة الانتظار من قبل النظام حتى يتم إلغاء قفل كائن المزامنة.

مزايا موتكس

فيما يلي المزايا التالية لـ Mutex، مثل:

  • Mutex هو مجرد أقفال بسيطة يتم الحصول عليها قبل الدخول إلى قسمها الحرج ثم تحريرها.
  • نظرًا لوجود مؤشر ترابط واحد فقط في القسم الحرج الخاص به في أي وقت محدد، فلا توجد حالات سباق، وتظل البيانات متسقة دائمًا.

عيوب موتيكس

لدى Mutex أيضًا بعض العيوب، مثل:

  • إذا حصل الخيط على قفل وانتقل إلى وضع السكون أو تم استباقه، فقد لا يتحرك الخيط الآخر للأمام. وهذا قد يؤدي إلى المجاعة.
  • لا يمكن قفله أو فتحه من سياق مختلف عن الذي حصل عليه.
  • يجب السماح بموضوع واحد فقط في القسم الحرج في كل مرة.
  • قد يؤدي التنفيذ العادي إلى حالة انتظار مزدحمة، مما يؤدي إلى إهدار وقت وحدة المعالجة المركزية.

ما هو سيمافور؟

الإشارة هي ببساطة متغير غير سلبي ومشترك بين سلاسل العمليات. الإشارة هي آلية إرسال إشارات، ويمكن لخيط آخر أن يشير إلى خيط ينتظر على الإشارة.

Mutex مقابل الإشارة

تستخدم الإشارة عمليتين ذريتين،

1. انتظر: تقوم عملية الانتظار بتخفيض قيمة الوسيطة S الخاصة بها إذا كانت موجبة. إذا كانت S سالبة أو صفر، فلن يتم إجراء أي عملية.

 wait(S) { while (S<=0); s--; } < pre> <p> <strong>2. Signal for the process synchronization:</strong> The signal operation increments the value of its argument S.</p> <pre> signal(S) { S++; } </pre> <p>A semaphore either allows or reject access to the resource, depending on how it is set up.</p> <h3>Use of Semaphore</h3> <p>In the case of a single buffer, we can separate the 4 KB buffer into four buffers of 1 KB. Semaphore can be associated with these four buffers, allowing users and producers to work on different buffers simultaneously.</p> <h3>Types of Semaphore</h3> <p>Semaphore is distinguished by the operating system in two categories <strong>Counting semaphore</strong> and <strong>Binary semaphore</strong> .</p> <p> <strong>1. Counting Semaphore:</strong> The semaphore S value is initialized to the <strong>number of resources</strong> present in the system. Whenever a process wants to access the resource, it performs <strong>the wait()</strong> operation on the semaphore and <strong>decrements</strong> the semaphore value by one. When it releases the resource, it performs <strong>the signal()</strong> operation on the semaphore and <strong>increments</strong> the semaphore value by one.</p> <p>When the semaphore count goes to 0, it means the processes occupy all resources. A process needs to use a resource when the semaphore count is 0. It executes the <strong>wait()</strong> operation and gets <strong>blocked</strong> until the semaphore value becomes greater than 0.</p> <img src="//techcodeview.com/img/operating-system/67/mutex-vs-semaphore-3.webp" alt="Mutex vs Semaphore"> <p> <strong>2. Binary semaphore:</strong> The value of a semaphore ranges between <strong>0</strong> and <strong>1</strong> . It is similar to mutex lock, but mutex is a locking mechanism, whereas the semaphore is a signaling mechanism. In binary semaphore, if a process wants to access the resource, it performs <strong>the wait()</strong> operation on the semaphore and decrements the value of the semaphore from 1 to 0. When it releases the resource, it performs a <strong>signal</strong> <strong>()</strong> operation on the semaphore and increments its value to 1. Suppose the value of the semaphore is 0 and a process wants to access the resource. In that case, it performs <strong>wait()</strong> operation and block itself till the current process utilizing the resources releases the resource.</p> <img src="//techcodeview.com/img/operating-system/67/mutex-vs-semaphore-4.webp" alt="Mutex vs Semaphore"> <h3>Advantages of Semaphore</h3> <p>Here are the following advantages of semaphore, such as:</p> <ul> <li>It allows more than one thread to access the critical section.</li> <li>Semaphores are machine-independent.</li> <li>Semaphores are implemented in the machine-independent code of the microkernel.</li> <li>They do not allow multiple processes to enter the critical section.</li> <li>As there is busy and waiting in semaphore, there is never wastage of process time and resources.</li> <li>They are machine-independent, which should be run in the machine-independent code of the microkernel.</li> <li>They allow flexible management of resources.</li> </ul> <h3>Disadvantage of Semaphores</h3> <p>Semaphores also have some disadvantages, such as:</p> <ul> <li>One of the biggest limitations of a semaphore is priority inversion.</li> <li>The operating system has to keep track of all calls to wait and signal semaphore.</li> <li>Their use is never enforced, but it is by convention only.</li> <li>The Wait and Signal operations require to be executed in the correct order to avoid deadlocks in semaphore.</li> <li>Semaphore programming is a complex method, so there are chances of not achieving mutual exclusion.</li> <li>It is also not a practical method for large scale use as their use leads to loss of modularity.</li> <li>Semaphore is more prone to programmer error</li> <li>, and it may cause deadlock or violation of mutual exclusion due to programmer error.</li> </ul> <h3>Difference between Mutex and Semaphore</h3> <p>The basic difference between semaphore and mutex is that semaphore is a signalling mechanism, i.e. processes perform wait() and signal() operation to indicate whether they are acquiring or releasing the resource. In contrast, a mutex is a locking mechanism, and the process has to acquire the lock on a mutex object if it wants to acquire the resource. Here are some more differences between semaphore and mutex, such as:</p> <img src="//techcodeview.com/img/operating-system/67/mutex-vs-semaphore-5.webp" alt="Mutex vs Semaphore"> <br> <table class="table"> <tr> <th>Terms</th> <th>Mutex</th> <th>Semaphore</th> </tr> <tr> <td>Definition</td> <td>The mutex is a locking mechanism, as to acquire a resource, a process needs to lock the mutex object, and while releasing a resource process has to unlock the mutex object.</td> <td>Semaphore is a signalling mechanism as wait() and signal() operations performed on the semaphore variable indicate whether a process is acquiring or releasing the resource.</td> </tr> <tr> <td>Existence</td> <td>A mutex is an object.</td> <td>Semaphore is an integer variable.</td> </tr> <tr> <td>Function</td> <td>Mutex allows multiple program threads to access a single resource but not simultaneously.</td> <td>Semaphore allows multiple program threads to access a finite instance of resources.</td> </tr> <tr> <td>Ownership</td> <td>Mutex object lock is released only by the process that has acquired the lock on the mutex object.</td> <td>Semaphore value can be changed by any process acquiring or releasing the resource by performing wait() and signal() operation.</td> </tr> <tr> <td>Categorize</td> <td>Mutex is not categorized further.</td> <td>The semaphore can be categorized into counting semaphore and binary semaphore.</td> </tr> <tr> <td>Operation</td> <td>The mutex object is locked or unlocked by the process of requesting or releasing the resource.</td> <td>Semaphore value is modified using wait() and signal() operation apart from initialization.</td> </tr> <tr> <td>Resources Occupied</td> <td>If a mutex object is already locked, then the process desiring to acquire resource waits and get queued by the system till the resource is released and the mutex object gets unlocked.</td> <td>Suppose the process acquires all the resources, and no resource is free. In that case, the process desiring to acquire resource performs wait() operation on semaphore variable and blocks itself till the count of semaphore become greater than 0.</td> </tr> </table> <hr></=0);>

تسمح الإشارة بالوصول إلى المورد أو ترفضه، اعتمادًا على كيفية إعداده.

استخدام السيمافور

في حالة وجود مخزن مؤقت واحد، يمكننا فصل المخزن المؤقت بسعة 4 كيلو بايت إلى أربعة مخازن مؤقتة بسعة 1 كيلو بايت. يمكن ربط الإشارة بهذه المخازن المؤقتة الأربعة، مما يسمح للمستخدمين والمنتجين بالعمل على مخازن مؤقتة مختلفة في وقت واحد.

أنواع الإشارة

يتميز Semaphore بنظام التشغيل في فئتين عد الإشارة و إشارة ثنائية .

1. عد الإشارة: تتم تهيئة قيمة الإشارة S إلى عدد الموارد موجودة في النظام. عندما تريد إحدى العمليات الوصول إلى المورد، فإنها تنفذ ذلك الإنتظار() العملية على الإشارة و يتناقص قيمة الإشارة بمقدار واحد. عندما يطلق المورد، فإنه ينفذ الإشارة() العملية على الإشارة و الزيادات قيمة الإشارة بمقدار واحد.

عندما يصل عدد الإشارة إلى 0، فهذا يعني أن العمليات تشغل جميع الموارد. تحتاج العملية إلى استخدام مورد عندما يكون عدد الإشارة 0. وتقوم بتنفيذ الأمر انتظر() العملية ويحصل محظور حتى تصبح قيمة الإشارة أكبر من 0.

Mutex مقابل الإشارة

2. الإشارة الثنائية: تتراوح قيمة الإشارة بين 0 و 1 . إنه مشابه لقفل كائن المزامنة (mutex lock)، لكن كائن المزامنة (mutex) عبارة عن آلية قفل، في حين أن الإشارة عبارة عن آلية إشارات. في الإشارة الثنائية، إذا أرادت إحدى العمليات الوصول إلى المورد، فإنها تقوم بالتنفيذ الإنتظار() العملية على الإشارة وتقلل قيمة الإشارة من 1 إلى 0. عندما تقوم بتحرير المورد، فإنها تنفذ الإشارة () العملية على الإشارة وزيادة قيمتها إلى 1. لنفترض أن قيمة الإشارة هي 0 وأن هناك عملية تريد الوصول إلى المورد. في هذه الحالة، فإنه ينفذ انتظر() العملية وحظر نفسها حتى تقوم العملية الحالية باستخدام الموارد بتحرير المورد.

Mutex مقابل الإشارة

مميزات السيمافور

فيما يلي المزايا التالية للإشارة، مثل:

  • يسمح لأكثر من موضوع بالوصول إلى القسم الحرج.
  • الإشارات مستقلة عن الآلة.
  • يتم تنفيذ الإشارات في الكود المستقل عن الآلة للنوية الدقيقة.
  • أنها لا تسمح لعمليات متعددة بالدخول إلى القسم الحرج.
  • نظرًا لأن هناك انشغالًا وانتظارًا في الإشارة، فلا يوجد أي إهدار لوقت العملية ومواردها.
  • وهي مستقلة عن الآلة، ويجب تشغيلها في التعليمات البرمجية المستقلة عن الآلة للنوية الدقيقة.
  • أنها تسمح بإدارة مرنة للموارد.

مساوئ الإشارات

وللإشارة أيضًا بعض العيوب، مثل:

  • أحد أكبر قيود الإشارة هو انعكاس الأولوية.
  • يجب على نظام التشغيل تتبع جميع مكالمات الانتظار والإشارة إلى الإشارة.
  • ولا يتم فرض استخدامها أبدًا، ولكن يتم ذلك بموجب الاتفاقية فقط.
  • يجب تنفيذ عمليتي الانتظار والإشارة بالترتيب الصحيح لتجنب حالة توقف تام في الإشارة.
  • برمجة الإشارة هي طريقة معقدة، لذلك هناك فرص لعدم تحقيق الاستبعاد المتبادل.
  • كما أنها ليست طريقة عملية للاستخدام على نطاق واسع لأن استخدامها يؤدي إلى فقدان النمطية.
  • الإشارة أكثر عرضة لخطأ المبرمج
  • ، وقد يتسبب في توقف تام أو انتهاك للاستبعاد المتبادل بسبب خطأ مبرمج.

الفرق بين موتكس وسيمافور

الفرق الأساسي بين الإشارة وكائن المزامنة هو أن الإشارة هي آلية إشارات، أي أن العمليات تؤدي عملية الانتظار () والإشارة () للإشارة إلى ما إذا كانت تحصل على المورد أو تطلقه. في المقابل، كائن المزامنة (mutex) عبارة عن آلية قفل، ويجب على العملية الحصول على القفل على كائن المزامنة (mutex) إذا أرادت الحصول على المورد. فيما يلي بعض الاختلافات الإضافية بين الإشارة وmutex، مثل:

Mutex مقابل الإشارة
شروط موتيكس إشارة
تعريف كائن المزامنة (mutex) عبارة عن آلية قفل، للحصول على مورد، تحتاج العملية إلى قفل كائن المزامنة (mutex)، وأثناء تحرير عملية المورد يجب فتح كائن المزامنة (mutex). الإشارة هي آلية إشارات حيث تشير عمليات الانتظار () والإشارة () التي يتم إجراؤها على متغير الإشارة إلى ما إذا كانت العملية تحصل على المورد أو تحرره.
وجود كائن المزامنة هو كائن. الإشارة هي متغير عدد صحيح.
وظيفة يسمح Mutex لسلاسل برامج متعددة بالوصول إلى مورد واحد ولكن ليس في وقت واحد. يسمح Semaphore لسلاسل برامج متعددة بالوصول إلى نسخة محدودة من الموارد.
ملكية يتم تحرير قفل كائن Mutex فقط من خلال العملية التي حصلت على القفل على كائن Mutex. يمكن تغيير قيمة الإشارة عن طريق أي عملية تحصل على المورد أو تطلقه عن طريق إجراء عملية الانتظار () والإشارة ().
تصنيف لم يتم تصنيف Mutex كذلك. يمكن تصنيف الإشارة إلى عدد الإشارة والإشارة الثنائية.
عملية يتم قفل كائن المزامنة (mutex) أو إلغاء قفله من خلال عملية طلب المورد أو تحريره. يتم تعديل قيمة الإشارة باستخدام عملية الانتظار () والإشارة () بصرف النظر عن التهيئة.
الموارد المحتلة إذا كان كائن كائن المزامنة (mutex) مقفلًا بالفعل، فإن العملية التي ترغب في الحصول على المورد تنتظر وتوضع في قائمة الانتظار من قبل النظام حتى يتم تحرير المورد وإلغاء تأمين كائن المزامنة (mutex). لنفترض أن العملية تكتسب جميع الموارد، ولا يوجد مورد مجاني. في هذه الحالة، تقوم العملية الراغبة في الحصول على المورد بتنفيذ عملية الانتظار () على متغير الإشارة وتحجب نفسها حتى يصبح عدد الإشارة أكبر من 0.