**انحصار متقابل** (به انگلیسی: Mutual exclusion) به اختصار *mutex* الگوریتمی است که در برنامه‌نویسی همروند برای جلوگیری از استفادهٔ همزمان از منابع مشترک مانند متغیرهای سراسری توسط قسمتی از کد رایانه که به آن بخش بحرانی گفته می‌شود به کار می‌رود. به عبارت دیگر، باید مطمئن شویم که دو فرایند یا دو ریسه به‌طور همزمان وارد ناحیه بحرانی خود نشده‌اند. خودِ بخش بحرانی، ساختار یا الگوریتمی برای انحصار متقابل نیست. یک برنامه، پردازش، یا نخ (به انگلیسی: Thread) می‌تواند بخش بحرانی داشته باشد بدون اینکه ساختار یا الگوریتمی که انحصار متقابل را پیاده‌سازی کند داشته باشد.

مسئله انحصار متقابل اولین بار توسط ادسخر دکسترا شناسایی و حل شد. یک مثال از اینکه چرا انحصار متقابل در عمل اهمیت دارد را می‌توان به کمک لیست پیوندی نشان داد. در یک لیست پیوندی یک طرفه، حذف کردن یک گره، اشاره‌گر next گره قبلی را با گره بعدی مقدار دهی می‌کنیم. برای مثال اگر بخواهیم گره i را حذف کنیم، باید اشاره‌گر next گره i-1 را طوری تغییر دهیم که به گره i+1 اشاره کند. اگر این لیست در بین چند فرایند به اشتراک گذاشته شده باشد، ممکن است دو پروسه بخواهد به شکل همزمان دو گره متفاوت را از لیست حذف کنند که مشکل زیر را ایجاد می‌کند:

اگر قرار باشد گره i و i+1 حذف شوند و هیچ‌کدام از آن‌ها هم گره سر یا گره دم نباشند (گره داخلی باشند)، اشاره‌گر next گره i-1 باید به i+1 اشاره کند و اشاره‌گر next گره i باید به گره i+2 اشاره کند. هر چند که هر دو عملِ حذف، با موفقیت انجام می‌شود، اما گره i+1 در لیست باقی خواهد ماند و حذف نخواهد شد. چرا که گره i-1، با جا انداختن گره i (که به i+2 اشاره می‌کرد)، به گره i+1 اشاره می‌کند. این مشکل در شکل روبرو نشان داده شده‌است. این مشکل را می‌توان با استفاده از انحصار متقابل حل کرد. به این صورت که باید مطمئن شویم که یک دو یا چند فرایند سعی نمی‌کنند قسمت یکسانی از لیست را به شکل همزمان تغییر دهند. در برنامه‌نویسی از سمافورها برای این کار استفاده می‌شود.

راه حل
------

این مشکل را هم می‌توان به شکل سخت‌افزاری و هم به شکل نرم‌افزاری حل کرد.

### روش سخت‌افزاری

در سیستم‌های تک‌پردازنده‌ای، راحت‌ترین راه این است که در هنگام ورود فرایند به ناحیه بحرانی، کلیه وقفه‌ها را غیر فعال کنیم. بدین ترتیب، وقتی که پروسه‌ای در ناحیه بحرانی قرار دارد، هیچ روال وقفه‌گیری اجرا نخواهد شد، حتی وقفه ساعت هم بی اثر می‌شود و فرایند قبضه نخواهد شد. هر چند که این راه حل مؤثر است، اما مشکلات زیادی را ایجاد می‌کند. اگر ناحیه بحرانی طولانی باشد، باعث می‌شود که فرایند بتواند تا هر وقتی که خواست پردازنده را در اختیار بگیرد، چرا که روال وقفه‌گیر برای وقفه ساعت اجرا نمی‌شود و پردازنده فرایند جاری را تعویض نمی‌کند. در حقیقت نمی‌توان به برنامه کاربر اطمینان کرد. همچنین اگر پروسه در حالی که در ناحیه بحرانی قرار دارد، از کار بیفتد، کنترل هیچگاه به پروسه دیگری داده نمی‌شود و در نتیجه کل سیستم از کار خواهد افتاد. یک راه حل بهتر برای برقرارسازی انحصار متقابل، استفاده از راه‌حل انتظار مشغول است.

راه حل انتظار مشغول هم برای سیستم‌های تک‌پردازنده‌ای و هم برای سیستم‌های چندپردازنده‌ای مؤثر است. استفاده از حافظه مشترک و یک دستورالعمل تجزیه‌ناپذیر آزمایش و تنظیم، (مثل TSL) ما را به انحصار متقابل می‌رساند. این‌گونه دستورالعمل‌ها توسط سخت‌افزار تضمین می‌کنند که وقتی پروسه‌ای در ناحیه بحرانی قرار دارد، دیگر پروسه‌ها نمی‌توانند وارد آن ناحیه شوند. برای مثال، پروسه می‌تواند قبل از ورود به ناحیه بحرانی، مقدار یک متغیر سراسری را ۱ کند، بدین معنی که «من در این ناحیه هستم و شما نمی‌توانید وارد آن شوید». اگر در حالی که پروسه در ناحیه بحرانی قرار دارد، پروسه دیگری بخواهد وارد آن ناحیه شود، با بررسی کردن آن متغیر سراسری، متوجه می‌شود که حق ورود به آن ناحیه را ندارد. سپس پروسه می‌تواند یا به انجام کارهای دیگر خود برسد یا مرتباً در یک حلقه انتظار مشغول متغیر سراسری را چک کند و هر وقت صفر شد، وارد ناحیه بحرانی شود. قبضه کردن پروسه‌ها هنوز هم امکان‌پذیر است، بنابراین با از کار افتادن یک پروسه در ناحیه بحرانی، سیستم هنوز می‌تواند به کار خود ادامه دهد. نکته بسیار مهم در این روش این است که عمل خواندن متغیر سراسری و تغییر دادن آن، یک عمل تجزیه‌ناپذیر (اتمی) است و این امر توسط سخت‌افزار تضمین می‌شود. (به کمک دستور TSL)

### روش نرم‌افزاری

روش‌های نرم‌افزاری از انتظار مشغول استفاده می‌کنند. برای مثال:

* الگوریتم دکر
* الگوریتم پترسون
* الگوریتم نانوایی
* الگوریتم شیمانسکی

جستارهای وابسته
---------------

* قفل (رایانه)
* الگوریتم‌های غیرمسدودکننده
* بن‌بست (علوم رایانه)
* معکوس کردن اولویت
* گرسنگی منابع

منابع
-----

1. ↑  سیلبرشاتس، آبراهام، *مفاهیم سیستم‌عامل*، ترجمهٔ پریسما آتاماژوری، آشیان، شابک ۹۶۴-۹۰۸۷۳-۲-X
2. ↑  Wikipedia contributors, "Mutual exclusion," Wikipedia, The Free Encyclopedia,  (accessed February 3, 2011).

| * ن
* ب
* و
ادسخر دیکسترا |
| --- |
| ادسخر دیکسترا | 
* *A Primer of ALGOL 60 Programming* (book)
* *Structured Programming* (book)
* *A Discipline of Programming* (book)
* *A Method of Programming* (book)
* *Predicate Calculus and Program Semantics* (book)
* *Selected Writings on Computing: A Personal Perspective* (book)
* ادسخر دیکسترا
* ادسخر دیکسترا
* *A Note on Two Problems in Connexion with Graphs*
* *Cooperating Sequential Processes*
* *Solution of a Problem in Concurrent Programming Control*
* *The Structure of the 'THE'-Multiprogramming System*
* *Goto*
* *Notes on Structured Programming*
* *The Humble Programmer*
* *Programming Considered as a Human Activity*
* *How Do We Tell Truths That Might Hurt?*
* *On the Role of Scientific Thought*
* *Self-stabilizing Systems in Spite of Distributed Control*
* *On the Cruelty of Really Teaching Computer Science*

 |
| علوم رایانه | 
* علوم نظری رایانه
* مهندسی نرم‌افزار
* علوم سامانه‌ها
* الگوریتم
* رایانش همزمان
* رایانش توزیع‌شده
* روش‌های صوری
* فرایند توسعه نرم‌افزار
* نظریه زبان‌های برنامه‌نویسی
* طراحی نرم‌افزار and توسعه نرم‌افزار
* معماری نرم‌افزار
* فلسفه علوم رایانه

 |
| ادسخر دیکسترا | 

|  |  |
| --- | --- |
| ادسخر دیکسترا | 
* الگول ۶۰ implementation
* پشته فراخوانی
* هم‌روندی
* رایانش همزمان
* Cooperating sequential processes
* بخش بحرانی
* بن‌بست (علوم رایانه) (بن‌بست (علوم رایانه))
* مسئله غذا خوردن فیلسوف‌ها
* Dutch national flag problem
* تاب‌آوری خطا
* برنامه‌نویسی ساخت‌یافته
* Guarded Command Language
* لایه انتزاع in معماری نرم‌افزار
* لایه انتزاع
* ریسه (رایانه)
* انحصار متقابل (قفل (رایانه))
* مسئله تولیدکننده-مصرف‌کننده (مسئله تولیدکننده-مصرف‌کننده)
* خط تولید نرم افزار
* Predicate transformer semantics
* همگام‌سازی (علوم رایانه)
* Self-stabilizing distributed system
* نشان‌بر
* تفکیک دغدغه‌ها
* مسئله آرایشگر خواب‌آلود
* Software crisis
* تحلیل ساختمند
* برنامه‌نویسی ساخت‌یافته
* THE multiprogramming system
* Unbounded nondeterminism
* Weakest precondition calculus

 |
| ادسخر دیکسترا | 
* الگوریتم بانکدار
* الگوریتم دکسترا
* الگوریتم پریم (الگوریتم پریم)
* الگوریتم دایکسترا – شولتن
* الگوریتم دکر (generalization)
* مرتب‌سازی روان
* الگوریتم محوطه تعویض خط
* Tri-color marking algorithm
* رایانش همزمان
* Distributed algorithms
* الگوریتم‌های جلوگیری از بن‌بست
* انحصار متقابل
* Self-stabilizing algorithms

 |

 |
| Related people | 
* Shlomi Dolev
* پر برینچ هنسن
* تونی هور
* اوله-یوهان دال
* لزلی لمپورت
* دیوید پارناس
* Adriaan van Wijngaarden
* نیکلاوس ویرت

 |
| Other topics | 
* Dijkstra Prize (Edsger W. Dijkstra Prize in Distributed Computing)
* Centrum Wiskunde & Informatica
* E.W. Dijkstra Archive (دانشگاه تگزاس در آستین)
* List of pioneers in computer science
* List of important publications in computer science
* List of important publications in theoretical computer science
* List of important publications in concurrent, parallel, and distributed computing
* International Symposium on Stabilization, Safety, and Security of Distributed Systems

 |
| 
* **Wikiquote**

 |