نشانبر
در علم رایانه نشانبر یا سمافور (به انگلیسی: Semaphore) به متغییری گفته میشود که در محیطهای همروند برای کنترل دسترسی فرایندها به منابع مشترک به کار میرود. سمافور میتواند به دو صورت دودویی (که تنها دو مقدار صحیح و غلط را دارا است) و یا شمارنده اعداد صحیح باشد. از سمافور برای جلوگیری از ایجاد وضعیت رقابتی میان فرایندها استفاده میگردد. به این ترتیب، اطمینان حاصل میشود که در هر لحظه تنها یک فرایند به منبع مشترک دسترسی دارد و میتواند از آن بخواند یا بنویسد (انحصار متقابل)
سمافورها اولین بار بهوسیلهٔ دانشمند علوم رایانه هلندی، ادسخر دیکسترا معرفی شدند.[۱] و امروزه به طور گستردهای در سیستم عاملها مورد استفاده قرار میگیرند.
محتویات |
شیوهٔ عملکرد سمافور[ویرایش]
اصل اساسی این است که دو یا چند فرایند میتوانند به وسیلهٔ سیگنالهای ساده با یکدیگر همکاری کنند. هر فرایند را میتوان در نقطهٔ خاصی از اجرا متوقف نموده، و تا رسیدن سیگنال خاصی از اجرای آن جلوگیری نمود. برای ایجاد این اثر، از متغییرهای خاصی به نام سمافور استفاده میگردد.
هر فرایندی که بخواهد به منبع مشترک دسترسی داشته باشد، اعمال زیر را انجام خواهد داد:
- مقدار سمافور را بررسی میکند.
- در صورتی که مقدار سمافور مثبت باشد، فرایند میتواند از منبع مشترک استفاده کند. در این صورت، فرایند یک واحد از سمافور میکاهد تا نشان دهد که یک واحد از منبع مشترک را استفاده نموده است.
- در صورتی که مقدار سمافور صفر یا کوچکتر از صفر باشد، فرایند به خواب میرود تا زمانی که سمافور مقداری مثبت به خود بگیرد. در این حالت فرایند از خواب بیدار شده و از مرحلهٔ یک شروع میکند.
هنگامی که فرایند کار خود را با منبع تمام نمود، یک واحد به سمافور اضافه میگردد. هر زمان که مقدار سمافور به صفر و یا بیشتر برسد، کلیهٔ فرایندهایی که به خواب رفته بودند بیدار میشوند.
پیاده سازی[ویرایش]
سمافور متغییری است که میان چند فرایند به اشتراک گذاشته میشود. سمافور باید مستقل از فرایندها بوده و در فضایی از حافظه قرار گیرد که فرایندها بتوانند به آن دسترسی داشته باشند، همچنین عملیاتی که روی سمافور انجام میگیرد باید به صورتی پیاده سازی گردد که هیچ گونه وقفهای هنگام انجام آن عملیات به وجود نیاید (اتمیک باشد). به همین دلیل، سمافور در هسته سیستمعامل پیاده سازی میگردد و کنترل آن نیز توسط سیستم عامل صورت میگیرد. به این معنی که فرایندها تنها میتوانند توسط فراخوانی سیستم با سمافورها کار کنند.
در سیستم عاملهایی که از استاندارد پوزیکس پیروی میکنند، دو فراخوان سیستمی semget و semctl برای کار با سمافورها وجود دارد.[۲]
کاربردها[ویرایش]
از سمافورها برای حل مسائل همزمانی میان فرایندها به کار میرود و امروزه در تمامی سیستمعاملها پیاده سازی شده است. سمافورها معمولاً به طور مستقیم مورد استفاده قرار نمیگیرند، مگر در جایی که راه حل سطح بالایی وجود نداشته باشد. چرا که برنامه نویس میتواند با ایجاد شرایطی، به بنبست رسیده و یا فرایندهایی را گرسنه نگاه دارد (اجازهٔ دسترسی به منبع را برای مدتی طولانی ندهد.)
همچنین ببینید[ویرایش]
منابع[ویرایش]
- ↑ http://www.cs.utexas.edu/users/EWD/transcriptions/EWD01xx/EWD123.html E. W. Dijkstra, Cooperating sequential processes. Technological University, Eindhoven, The Netherlands, September 1965.
- ↑ W. Richard Stevens & Stephen A. Rago, Advanced Programming in the UNIX Environment: Second Edition, Addison Wesley Professional, 2005, ISBN 0-201-43307-9
|
|||||||||||||||||||||||||||||||||