وضعیت رقابتی

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری، جستجو
(شکل ۱)وضعیت رقابتی در یک مدار منطقی

یک وضعیت رقابتی[۱] به انگلیسی Race Condition یا Race Hazard یک نقص در سیستم الکترونیکی یا رایانه ای است که به موجب آن نتیجه خروجی And یا Or به طور غیرمنتظره ای به زمانبندی و ترتیب رویدادهای دیگر بستگی دارد. این اصطلاح در اصل به حالتی گفته می‌شود که دو سیگنال با هم رقابت می‌کنند تا هر یک زودتر به خروجی تأثیر بگذارند.

الکترونیک[ویرایش]

به عنوان مثال، یک دروازه And با دو ورودی که در یک ورودی با سیگنال A و در ورودی دیگر با سیگنال Á تغذیه می‌شود. در این تئوری خروجی هیچ وقت نباید یک شود. هر چند که، اگر تغییر در مقدار A از مقدار انتشار به ورودی دوم بیشتر طول بکشد، هنگامی که مقدار A از صفر به یک تغییر پیدا کند، در یک زمان کوتاه، هر دو ورودی در حالت یک قرار می‌گیرد و همچنین خروجی دروازه نیز مقدار یک می‌شود.

رایانه[ویرایش]

وضعیت رقابتی در نرم‌افزار هنگامی ناشی می‌شود که پردازش‌های مختلفی به یک وضع مشترک بستگی داشته باشد. به عنوان مثال بگذارید دو رشته T۱ و T۲ را فرض کنیم. هر کدام مقدار سراسری i را می‌خواهند یک واحد اضافه کنند. به طور ایده‌آل، مجموعه دستورهای زیر باید انجام شود:

  1. integer i=۰ (حافظه)
  2. T۱ مقدار i را از حافظه خوانده و به Register۱ انتقال می‌دهد.
  3. T۱ مقدار i را که در Register۱ است، یک واحد اضافه می‌کند. Register1=۱
  4. T۱ مقدار Register۱ را در حافظه ذخیره می‌کند. i=۱
  5. T۲ مقدار i را از حافظه خوانده و به Register۲ انتقال می‌دهد.
  6. T۲ مقدار i را که در Register۲ است، یک واحد اضافه می‌کند. Register2=۲
  7. T۲ مقدار Register۲ را در حافظه ذخیره می‌کند. i=۲
  8. i=۲

در حالت بالا همان‌طور که انتظار می‌رفت مقدار i مساوی ۲ است، با اینکه، اگر دو رشته به طور همزمان و بدون فقل کردن داده و همگام سازی اجرا شوند، خروجی دستور باید اشتباه شود که مجموعه دستورهای دیگر زیر این سناریو را نشان می‌دهد:

  1. integer i=۰ (حافظه)
  2. T۱ مقدار i را از حافظه خوانده و به Register۱ انتقال می‌دهد.
  3. T۲ مقدار i را از حافظه خوانده و به Register۲ انتقال می‌دهد.
  4. T۱ مقدار i را که در Register۱ است، یک واحد اضافه می‌کند. Register1=۱
  5. T۲ مقدار i را که در Register۲ است، یک واحد اضافه می‌کند. Register2=۱
  6. T۱ مقدار Register۱ را در حافظه ذخیره می‌کند. i=۱
  7. T۲ مقدار Register۲ را در حافظه ذخیره می‌کند. i=۱
  8. i=۱

مقدار نهایی i مساوی یک شده است به جای اینکه انتظار می‌رفت مساوی ۲ شود.

منابع[ویرایش]