تالار گفتمان مانشت

نسخه‌ی کامل: ارزیابی کد استفاده از سمافور
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام
در تکه کد زیر کدام خط غلط/درسته و چـــــــــرا؟ (گزینه نمیدم چون ترجیح میدم پاسخ هامون با دلیل باشه و بررسی اش کنیم)

Semaphore s=1 LINE0
}()main
-----
-----
-----

down(s) LINE1
up(s) LINE2
if (s.count>0) up(s) LINE3

-----
-----
-----

s.count=4 LINE4


-----
-----
-----
{

البته اگرچه به ظاهر جواب مشخصی برای همه دوستان داره اما بحث روی دلایل رد/قبول هر خط ممکنه یه بحث مفهومی رو به دنبال داشته باشه که من در پی اونم.

لطفا به شیوه جواب بدید:
خط۰: غلط زیرا ..
خط۱: درست زیرا..
.
.
متغییر s سراسری برای سمافور هست نمیتواند در داخل برنامه نمیتواند خوانده یا در آن نوشته شود.

و فقط up , down یا همان(wait , signal) میتوانند به مقدار آن دسترسی داشته باشند.

پس خطوط 3 و 4 غلط هستند.
خط 1 , 2 , 3 درست هست چون دقیقا اعمالی که میشه روی سمافور انجام داد همین‌ها هست. تعریف، مقدار دهی اولیه و اجرای رویه های up و down.
خطوط 4,5 هم غلط هست چون نمیشه به داخل سمافور دسترسی داشت.
خط صفر درسته، مثل ما میتونیم به تعداد منابع فعلی به سمافور مقدار اولیه بدیم.
خطوط یک و دو هم درسته.
خطوط سه هم میتونه درست باشه. یعنی اگر طراحی سمافور و سیاستهای پنهان سازی اجازه بده و متغیر COUNT به صورت PRIVATE نباشه میتونیم مقدار سمافور رو بخونیم. مثلا در کتاب استالینگ در تفسیر مقدار جاری سمافور نوشته:
at any time, the value of s.count can be interpreted as follows:
s.count >= 0 Confused.count is the number of processes that can execute semWait(s)
without suspension (if no semSignal(s) is executed in the meantime). Such
situations will allow semaphores to support synchronization as well as mutual
exclusion.
s.count < 0:The magnitude of s.count is the number of processes suspended in
s.queue

خط چهار درست نیست.
نه سخت نیست ولی وقتی میبینی دیگران جواب درستو دادن دیگه حرفی برای گفتن نمیمونه!
قضیه چیه؟ تاحالا همچین پیغامی تو ارسال پست ندیده بودم!!!!!!!
(23 آذر 1390 01:18 ق.ظ)narges_r نوشته شده توسط: [ -> ]قضیه چیه؟ تاحالا همچین پیغامی تو ارسال پست ندیده بودم!!!!!!!
من این مشکل رو از طریق آقا فرداد در حال پیگیری هستم، نمی دونم چرا این تاپیک اینطور شده اما شما جواب بدید من سعی می گنم زودتر بیام و تایید کنم.


(23 آذر 1390 01:17 ق.ظ)narges_r نوشته شده توسط: [ -> ]نه سخت نیست ولی وقتی میبینی دیگران جواب درستو دادن دیگه حرفی برای گفتن نمیمونه!
خوب شما کمی صبور باشید و نظر خودتون رو با دلیل بفرمائید شاید دنبال نکته ای توی همین جواب‌ها بودم Smile


(22 آذر 1390 10:38 ب.ظ)رضا_ایرانی نوشته شده توسط: [ -> ]خطوط سه هم میتونه درست باشه. یعنی اگر طراحی سمافور و سیاستهای پنهان سازی اجازه بده و متغیر COUNT به صورت PRIVATE نباشه میتونیم مقدار سمافور رو بخونیم. مثلا در کتاب استالینگ نوشته:
at any time, the value of s.count can be interpreted as follows:
s.count >= 0 Confused.count is the number of processes that can execute semWait(s)
without suspension (if no semSignal(s) is executed in the meantime). Such
situations will allow semaphores to support synchronization as well as mutual
exclusion.
s.count < 0:The magnitude of s.count is the number of processes suspended in
s.queue
خوب دقیقا می خواستم به همین مطلب برسم، خط سه درسته یا غلط؟
میتونه درست باشه قطعیت نداره، این جمله اشتباهه، اگر این کد رو بدهند، در مورد خط 3 چه نظری میدید؟
اکثر دوستان فرمودید که غلطه.
خوب به من بگید اگر غلطه چه اشکالی داره مقدار count رو بخونیم؟ ما که توش ننوشتیم، فقط ازش خوندیم!
ضمنا یکی از روش های ساخت سمافور، سمافوری بود که مقدار شمارهنده منفی هم میگرفت، اگر عدد منفی میشد، تعداد فرآیند های خوابیده توی صف رو نشون میداد، حالا اگر این امکان هست، یعنی میشه اونرو خوند، و اگر نشه این رو خوند، پس چه فایده ای داره؟

خوب ادامه بحث رو روی این ابهام آخر پیش ببریم؟
تست کنم ببینم چی شده!!
مشکلی ندیدم هاتف جان . شبیه سایر تاپیکهاست.
(23 آذر 1390 09:50 ق.ظ)Fardad-A نوشته شده توسط: [ -> ]مشکلی ندیدم هاتف جان . شبیه سایر تاپیکهاست.
برای من هم عجیبه که تایید لازمه! منم بررسی کردم تنظیمات خاصی نداره برای اینکار!
بهرحال دوستان پاسخ بدند، حتما تایید خواهم شد.
تو تعریف سمافور اومده که تنها اعمال قابل انجام روی سمافورها اعمال up و down هستش و تمام اجزای داخلی سمافور از جمله متغیرهاش و صف سمافور از دید کاربر مخفی هستن.
مورد دوم اینکه اصلا نیازی نیست کاربر به متغیری مثل count دسترسی داشته باشه چون کاربردی برای کاربر نداره

(22 آذر 1390 10:38 ب.ظ)رضا_ایرانی نوشته شده توسط: [ -> ]
at any time, the value of s.count can be interpreted as follows:
s.count >= 0 Confused.count is the number of processes that can execute semWait(s)
without suspension (if no semSignal(s) is executed in the meantime). Such
situations will allow semaphores to support synchronization as well as mutual
exclusion.
s.count < 0:The magnitude of s.count is the number of processes suspended in
s.queue
تو این قسمت گفته نشده که میشه به متغیر count دسترسی داشت بلکه فقط گفته که مقدار این متغیر در هر لحظه چه معنی داره
(23 آذر 1390 02:05 ب.ظ)mfXpert نوشته شده توسط: [ -> ]مورد دوم اینکه اصلا نیازی نیست کاربر به متغیری مثل count دسترسی داشته باشه چون کاربردی برای کاربر نداره
خوب پس روشن شد که اون خط غلطه.
فایدش شاید این بود که در شمارنده های منفی می تونستیم بفهمیم چند فرآیند الان در صف سمافور خوابیدند، حالا شاید کاربرد خاصی نتونم الان براش بیارم اما

حالا سوال اینه،ما که نخواستیم مقدارش رو rewrite کنیم، اشکالی داشت اگر اجازه فقط خواندن برای این متغیر می ذاشتند؟
تو کتاب اقای حقیقت دقیقا نوشته شده که کابر فقط سه عمل میتونه روی سمافور انجام بده:
-تعریف سمافور و مقدار دهی اولیه به شمارنده
-اجرای فراخوانی سیستمی down
-اجرای فراخوانی سیستمی up
وبعد از این سه جمله دقیقا ذکر شده که برنامه های سطح کاربر نمیتونن مقدار شمارنده سمافور یا تعداد فرایندهای درون صف ان را تست یا مستقیما انهارو تغییر بدن
پس بنظر من خط 3 اشتباهه
اون توضیحی که یکی از دوستان از شمارنده سمافور از کتاب استالینگ گذاشتن فقط شمارنده سمافورو بررسی کرده و دلیلی برای اینکه به ما نشون بده خط 3 درست هست نداره!
خوب چون شمارنده سمافور یک متغییر مشترک هست دسترسی بهش حتی فقط خوندنش تولید انحصار متقابل میکنه. اگر مثلا مثل خط 3 بهش دسترسی وجود داشته باشه ممکنه بعد از اینکه شمارنده چک شد وفقه ساعت ایجاد بشه و دیگه up در خط 3 اجرا نشه و دوباره بعد از اینکه برگشتیم به خط 3 برای ادامه برنامه ممکنه شمارنده سمافور تغییر کرده باشه درحالی که ما اونو قبلا چک کردیم و الان دیگه از این تغییر باخبر نمیشیم
پس دسترسی بهش کلا جایز نیست
(23 آذر 1390 07:46 ب.ظ)narges_r نوشته شده توسط: [ -> ]پس دسترسی بهش کلا جایز نیست
خیلی خوبه، دقیقا، می خواستم به همین نکته اشاره کنم که حتی خواندن اش هم مجاز نیست، و البته دقت کنیم اگر سمافور با شماره منفی ساخته شده، فقط بخاطر زیبایی ست و هیچ فرقی نداره.
راستی در مورد خط 0 احتمال می دادم بعضی اشتباه کنند که چرا به یک استراکچر مستقیما مقداردهی شده و چطور این مقدار دقیقا داخل فیلد کانتر قرار می گیره! خواستم بگم این syntax برنامه C هست که به این صورته، کلا نباید دنبال ایراد syntax باشیم.

با اینکه بحث خاتمه یافته، یک روز مبحث باز می مونه تا اگر شبهه ای باشه مطرح بشه و بعد بسته میشه.
لینک مرجع