PDA

View Full Version : آموزش ناحیه بحرانی ::Critical Section



Farhad_Mohammadi
جمعه 04 اسفند 1385, 13:17 عصر
باسلام.
به درخواست یکی از دوستان می خواهم یک آموزش کوچکی راجع به نواحی بحرانی و استفاده آن در برنامه نویسی بدهم.
همانطور که میدانیم در برنامه نویسی چند نخه Multi Threading هر نخ در هر زمانی میتواند در حال اجرا باشد و در هر ناحیه ای از اجرای خوذ باشد.
مثلا فکر کنید یک نخ نوشته اید که یک عکس را سیاه و سفید کند. حال می خواهیم از این نخ چند نمونه ایجاد کنیم یا یک عکس بزرگ را سریع تر سیاه سفید کند. به کد زیر دقت کنید :
Procedure BandW(a,b,c)
begin
do black and white
write on image canvas
end;
زمانی که هر نخ می خواهد در canvas بنویسد می تواند در هر زمانی از اجرای خود به این نقطه برسد در حالیکه فقط در یک زمان باید یک نخ بتواند در Canvas بنویسد !!!
خلاصه برای اینکه قاطی پاطی نشه از یک سیستم به نام Monitor یا سمافورها و ... استفاده می کنیم تا دیگر نخ ها قبل از ورود به ناحیه بحرانی از حضور دیگر نخ ها در این ناحیه آگاه شوند و اگر نخ دیگری در این ناحیه بود Suspend شوند.
مثل یک جور پل باریک می مونه که فقط یک ماشین می تونه روش باشه !!!
کد زیر درست شده :
Procedure BandW(a,b,c)
begin
do black and white
Monitor.Enter ();
/*Enter Critical Section */
write on image canvas
/*Exit critical Section*/
Monitor.leave ();
end;

zman123456
شنبه 05 اسفند 1385, 11:12 صبح
سلام
اگه میشه لطفا در مورد این نوع برنامه نویسی از ابتدا یک توضیحی بدهید ممنون میشم

Farhad_Mohammadi
شنبه 05 اسفند 1385, 19:42 عصر
این نوع برنامه نویسی یا استفاده از سمافورها و مانیتورها یک مشکل قدیمی در سیستم عامل ها و مراجع آن است. برای داشتن اطلاعات بیشتر راجع به این میتواند کتاب سیلبرشاتس را در مورد طراحی سیستم های عامل بررسی کنید چون مبحث مربوط به ناحیه بحرانی یک بحث طولانی و گسترده ای است. یکسری از مسائلی که روی این داستان مطرح شده و حل شده است : 1 - مسئله غذا خوردن فیلسوفان 2 - مسئله سیگاریها 3 - مسئله آرایشگر منصف 4 - مسئله پل و ...