سوال 98

حل تشریحی سوال شماره 98 مجموعه دروس تخصصی مشترک

کنکور ارشد مهندسی فناوری اطلاعات (IT) 1400

98.

برنامه زیر از ۳ پردازه همروند تشکیل شده است و این ۳ پردازه از ۳ سمافور بایتری که به صورت زیر مقداردهی شده اند استفاده می‌کنند. دستور (print (HELLO چند بار اجرا می‌شود؟


1)

دقیقا یک بار

2)

دقیقا 2 بار

3)

دقیقا 3 بار

4)

حداقل 2 بار

پاسخ ها

1 پاسخ
دکتر ابوالفضل حقیقت
دکتر ابوالفضل …سه شنبه 15 اردیبهشت 1405

گزينه 4 درست است.

سناریوی اول: اگر ابتدا P0 اجرا شود و wait(S0) را فراخوانی ­کند، S0®count را 0 می­کند (S0®count--) و یک بار 'HELLO' را چاپ می­کند و با signal(S1) و signal(S2) شمارنده هر دو سمافور را 1 می­کند. حال فرض کنید قبل از شروع دور دوم حلقه، کوانتوم P0 تمام شده و به فرایندهای بعد سوئیچ شود. حال دو فرایند P1 و P2 می­توانند هر کدام یک بار اجرا شوند و هر کدام یک بار signal(S0) کنند. دقت کنید با اینکه دو بار signal (معادل up یا release) پشت سر هم روی سمافور S0 انجام شده است، اما چون سمافور باینری است مقدار S0®count برابر 2 نمی­شود و 1 می­ماند. پس از آن P0 اجرا می­شود و فقط یک دور دیگر با فراخوانی wait(S0) مقدار S0®count را 0 می­کند و بنابراین یک بار دیگر 'HELLO' را چاپ می­کند (جمعاً دو بار) و در دور سوم با فراخوانی wait(S0) برای همیشه می­خوابد.

سناریوی دوم: اگر ابتدا P0 اجرا شود و wait(S0) را فراخوانی ­کند، S0®count را 0 می­کند (S0®count--) و یک بار 'HELLO' را چاپ می­کند و با siganl(S1) و signal(S2) شمارنده هر دو سمافور را 1 می­کند و در دور دوم با wait(S0) می­خوابد. حال اگر فرایند P1 اجرا شود می­تواند از wait(S1) عبور کرده و با signal(S0) فرایند P0 را بیدار کند. اکنون اگر P0 قبل از P2 اجرا شود برای بار دوم 'HELLO' را چاپ می­کند و با signal(S1) و signal(S2) شمارنده هر دو را 1 می­کند و در دور سوم با wait(S0) می­خوابد. حال اگر فرایند P2 اجرا شود می­تواند از wait(S2) عبور کرده و با signal(S0) فرایند P0 را مجدداً بیدار کند. اکنون اگر P0 اجرا شود برای بار سوم 'HELLO' را چاپ می­کند و با signal(S1) و signal(S2) شمارنده هر دو را 1 می­کند و در دور چهارم با wait(S0) برای همیشه می­خوابد. دقت کنید فرایندهای P1 و P2 در حلقه قرار ندارند و فقط یک دور اجرا می­شوند و امکان تکرار P0 بیش از سه بار وجود ندارد.

سناریوی سوم: اگر ابتدا P0 اجرا شود و wait(S0) را فراخوانی ­کند، S0®count را 0 می­کند (S0®count--) و یک بار 'HELLO' را چاپ می­کند و با signal(S1) و signal(S2) شمارنده هر دو سمافور را 1 می­کند و در دور دوم با wait(S0) می­خوابد. حال اگر فرایند P1 اجرا شود می­تواند از wait(S1) عبور کرده و با signal(S0) فرایند P0 را بیدار کند. سپس اگر فرایند P2 اجرا شود می­تواند از wait(S2) عبور کرده و با signal(S0) شمارنده S0 را برابر 1 کند (ذخیره سیگنال).  اکنون اگر P0 اجرا شود از خط بعد از wait اجرا می­شود و برای بار دوم 'HELLO' را چاپ می­کند و با signal(S1) و signal(S2) شمارنده هر دو را 1 می­کند و در دور سوم نیز wait(S0) را فراخوانی می­­کند و S0®count را 0 می­کند (S0®count--) و یک بار دیگر 'HELLO' را چاپ می­کند (جمعاً سه بار) و signal(S1) و signal(S2) شمارنده سمافورهای باینری را بیش از 1 نمی­کند و فرایند P0 در دور چهارم با wait(S0) برای همیشه می­خوابد.

اگر ابتدا فرایندهای P1 و P2 اجرا می­شدند نیز می­خوابیدند و بعداً توسط P0 بیدار می­شدند و یکی از سناریوهای فوق پیش می­آمد. نهایتاً  'HELLO' دو یا سه بار چاپ می­شود (حداقل دو بار).

ارسال پاسخ