وضعیت رقابتی: تفاوت میان نسخهها
FreshmanBot (بحث | مشارکتها) جز اصلاح فاصله مجازی + اصلاح نویسه با استفاده از AWB |
Amir.Vector (بحث | مشارکتها) بدون خلاصۀ ویرایش |
||
خط ۳۴: | خط ۳۴: | ||
[[رده:دروازههای منطقی]] |
[[رده:دروازههای منطقی]] |
||
[[رده:زمانبندی در مدار الکترونیکی]] |
[[رده:زمانبندی در مدار الکترونیکی]] |
||
[[رده:سختافزار رایانه]] |
|||
[[رده:سوءاستفاده امنیتی از رایانه]] |
[[رده:سوءاستفاده امنیتی از رایانه]] |
||
[[رده:ضد الگو]] |
[[رده:ضد الگو]] |
نسخهٔ ۲۲ فوریهٔ ۲۰۲۱، ساعت ۲۰:۲۲
یک وضعیت رقابتی[۱] به انگلیسی Race Condition یا Race Hazard یک نقص در سیستم الکترونیکی یا رایانهای است که به موجب آن نتیجه خروجی And یا Or بهطور غیرمنتظرهای به زمانبندی و ترتیب رویدادهای دیگر بستگی دارد. این اصطلاح در اصل به حالتی گفته میشود که دو سیگنال با هم رقابت میکنند تا هر یک زودتر به خروجی تأثیر بگذارند.
الکترونیک
به عنوان مثال، یک دروازه And با دو ورودی که در یک ورودی با سیگنال A و در ورودی دیگر با سیگنال Á تغذیه میشود. در این تئوری خروجی هیچ وقت نباید یک شود. هر چند که، اگر تغییر در مقدار A از مقدار انتشار به ورودی دوم بیشتر طول بکشد، هنگامی که مقدار A از صفر به یک تغییر پیدا کند، در یک زمان کوتاه، هر دو ورودی در حالت یک قرار میگیرد و همچنین خروجی دروازه نیز مقدار یک میشود.
رایانه
وضعیت رقابتی در نرمافزار هنگامی ناشی میشود که پردازشهای مختلفی به یک وضع مشترک بستگی داشته باشد. به عنوان مثال بگذارید دو رشته T۱ و T۲ را فرض کنیم. هر کدام مقدار سراسری i را میخواهند یک واحد اضافه کنند. بهطور ایدهآل، مجموعه دستورهای زیر باید انجام شود:
- integer i=۰ (حافظه)
- T۱ مقدار i را از حافظه خوانده و به Register۱ انتقال میدهد.
- T۱ مقدار i را که در Register۱ است، یک واحد اضافه میکند. Register1=۱
- T۱ مقدار Register۱ را در حافظه ذخیره میکند. i=۱
- T۲ مقدار i را از حافظه خوانده و به Register۲ انتقال میدهد.
- T۲ مقدار i را که در Register۲ است، یک واحد اضافه میکند. Register2=۲
- T۲ مقدار Register۲ را در حافظه ذخیره میکند. i=۲
- i=۲
در حالت بالا همانطور که انتظار میرفت مقدار i مساوی ۲ است، با اینکه، اگر دو رشته بهطور همزمان و بدون فقل کردن داده و همگام سازی اجرا شوند، خروجی دستور باید اشتباه شود که مجموعه دستورهای دیگر زیر این سناریو را نشان میدهد:
- integer i=۰ (حافظه)
- T۱ مقدار i را از حافظه خوانده و به Register۱ انتقال میدهد.
- T۲ مقدار i را از حافظه خوانده و به Register۲ انتقال میدهد.
- T۱ مقدار i را که در Register۱ است، یک واحد اضافه میکند. Register1=۱
- T۲ مقدار i را که در Register۲ است، یک واحد اضافه میکند. Register2=۱
- T۱ مقدار Register۱ را در حافظه ذخیره میکند. i=۱
- T۲ مقدار Register۲ را در حافظه ذخیره میکند. i=۱
- i=۱
مقدار نهایی i مساوی یک شدهاست به جای اینکه انتظار میرفت مساوی ۲ شود.