بخش بحرانی
در برنامهنویسی همروند بخش بحرانی یا ناحیهٔ بحرانی قسمتی از کد یک برنامه و ساختاری در برنامهنویسی است و در برنامههایی به کار میرود که پردازشها به حافظه اشتراکی دسترسی دارد. در ناحیهٔ بحرانی پردازش میتواند مانند حالت عادی به تغییر متغییرها، بهروز کردن یک جدول، نوشتن در یک پرونده و ... بپردازد اما جنبهٔ مهم آن این است که وقتی یک پردازش در حال اجرای بخش بحرانیاش باشد هیچ پردازش دیگری مجاز نیست که در بخش بحرانی خود اجرا شود و بلوکه میشود بنابراین اجرای پردازهها در بخشهای بحرانی متقابلاً منحصر است. مهمترین استفاده از وجه تمایز ناحیه بحرانی با سایر قسمتهای برنامه، حل مسأله رقابتی یا تداخل پردازشهای سیستمعامل است.[۱][۲]
محتویات |
راهحلهای مسألهٔ بخش بحرانی [ویرایش]
راهحلهای بخش بحرانی باید بتوانند به سه نیاز زیر پاسخ دهند:[۱]
- انحصار متقابل[پ ۱]: اگر پردازشی به بخش بحرانی رسید هیچ پردازهٔ دیگری نتواند در بخش بحرانی اجرا شود.
- پیشروی[پ ۲]: اگر پردازشی در ناحیهٔ بحرانی نباشد و پردازشهای مایل به ورود به ناحیهٔ بحرانی داشته باشیم، در این صورت فقط پردازشهایی که در بخش باقیماندیشان نباشند میتوانند در تصمیمگیریای که کدام پردازش میتواند وارد ناحیهٔ بحرانی شود شرکت کنند و این انتخاب نمیتواند نامعین به تعویق بیافتد.
- انتظار مقید[پ ۳]: بر روی بارهایی که پردازشهای دیگر اجازه دارند وارد بخش بحرانی شوند بعد از آنکه پردازش تقاضای ورود به بخش بحرانی خود را کرد و قبل از آنکه این درخواست، داده شود، وجود دارد.
راهحلهای مسألهٔ بخش بحرانی عبارتند از:[۱]
- راهحلهای دو-پردازشی
- الگوریتم ۲
- الگوریتم ۳
- راهحلهای چند-پردازشی
بخش بحرانی سطح برنامهای [ویرایش]
کد نمونه برای بخش بحرانی با استفاده از کتابخانهٔ pthread در POSIX[۳]
/* Sample C/C++, Unix/Linux */ #include <pthread.h> /* This is the critical section object (statically allocated). */ static pthread_mutex_t cs_mutex = PTHREAD_MUTEX_INITIALIZER; void f() { /* Enter the critical section -- other threads are locked out */ pthread_mutex_lock( &cs_mutex ); /* Do some thread-safe processing! */ /*Leave the critical section -- other threads can now pthread_mutex_lock() */ pthread_mutex_unlock( &cs_mutex ); }
کد نمونه برای بخش بحرانی با استفاده از رابط برنامهنویسی[پ ۴] Win۳۲[۳]
/* Sample C/C++, Windows, link to kernel32.dll */ #include <windows.h> static CRITICAL_SECTION cs; /* This is the critical section object -- once initialized, it cannot be moved in memory */ /* If you program in OOP, declare this as a non-static member in your class */ /* Initialize the critical section before entering multi-threaded context. */ InitializeCriticalSection(&cs); void f() { /* Enter the critical section -- other threads are locked out */ EnterCriticalSection(&cs); /* Do some thread-safe processing! */ /* Leave the critical section -- other threads can now EnterCriticalSection() */ LeaveCriticalSection(&cs); } /* Release system object when all finished -- usually at the end of the cleanup code */ DeleteCriticalSection(&cs);
جستار وابسته [ویرایش]
معادلها [ویرایش]
منابع [ویرایش]
- ↑ ۱٫۰ ۱٫۱ ۱٫۲ سیلبرشاتس، آبراهام. مفاهیم سیستمعامل. ترجمهٔ پریسما آتاماژوری. آشیان. ISBN 964-90873-2-X.
- ↑ حمیدرضا مقسمی. «سوم». در درس و کنکور سیستمعامل. گسترش علوم پایه. ISBN 964-490-005-7.
- ↑ ۳٫۰ ۳٫۱ Wikipedia contributors, "Critical section," Wikipedia, The Free Encyclopedia, http://en.wikipedia.org/w/index.php?title=Critical_section&oldid=366845830 (accessed February 3, 2011).