سوال 101

حل تشریحی سوال شماره 101 سیستم‌های عامل

کنکور ارشد مهندسی کامپیوتر 1402

101.

تابع () fork وقتی صدا زده میشود یک پردازه فرزند تولید میشود که هم روند با پردازه والد فراخوانده اجرا میشود که هر دو از دستور بعدی اجرا میشود. چنانچه این تابع در هر فراخوانی مقدار صفر برای فرایند فرزند و مقدار مثبت برای فرایند والد تولید کند، تکه برنامه زیر چندبار hello چاپ میکند؟

1)

20

2)

25

3)

30

4)

35

پاسخ ها

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

گزینه 1 درست است.

برای حل این تست زیبا ابتدا قسمت اول برنامه را در نظر می­گیریم:

در این قسمت سه تا fork() داریم که آنها را به ترتیب fork شماره 1 و 2 و 3 می­‌نامیم. فرایند اصلی (پدر) هر سه fork را اجرا خواهد کرد و سه فرزند شماره 1 و 2 و 3 (P11 و  P12 و P13) ایجاد خواهد کرد (چون مقدار بازگشتی fork شماره 1 و 2 وی مثبت و true خواهد بود و and آنها نیز true بوده و fork سوم به دلیل درست بودن شرط if اجرا خواهد شد). فرزند شماره 1 (P11) فقط fork شماره 2 را اجرا می­‌کند و یک فرزند (نوه فرایند اصلی)، یعنی P111، تولید می­‌کند (چون مقدار بازگشتی fork شماره 1 وی صفر بوده و شرط if برای وی false شده و fork شماره 3 را اجرا نخواهد کرد). فرزند شماره 2 فرایند اصلی (P12) نیز fork شماره 3 را اجرا نمی­‌کند چون برای وی نیز مقدار بازگشتی fork شماره 2 صفر بوده و شرط if برای وی false شده و fork شماره 3 را اجرا نخواهد کرد و هیچ فرزندی نخواهد داشت. فرزند شماره 3 (P13) هم که دیگر fork ای در کد بالا پیش رو ندارد. نوه (P111) نیز مقدار بازگشتی هر دو fork شماره 1 و 2 را صفر می­‌بیند و فرزندی تولید نخواهد کرد. نهایتاً پس از اجرای کد فوق، 5 فرایند در صحنه داریم، فرایند اصلی و 3 فرزندش و یک نوه.

حال هر یک از این 5 فرایند به طور مستقل و دقیقاً در شرایط یکسان کد زیر را اجرا می­کنند:


در این قسمت نیز سه تا fork() داریم که آنها را به ترتیب fork شماره 1 و 2 و 3 می­‌نامیم. هر کدام از 5 فرایند مذکور در بالا را جداگانه در اینجا نیز فرایند اصلی (پدر) می­خوانیم.

فرایند اصلی (پدر) هر سه fork را اجرا خواهد کرد و سه فرزند شماره 1 و 2 و 3 (P11 و  P12 و P13) ایجاد خواهد کرد (چون مقدار بازگشتی fork شماره 1 و 2 وی مثبت و true خواهد بود و or آنها نیز true بوده و fork سوم به دلیل درست بودن شرط if اجرا خواهد شد). فرزند شماره 1 (P11) دو تا fork پیش رو دارد که هر دو را اجرا خواهد کرد و دو فرزند (دو نوه فرایند اصلی)، یعنی P111 و P112، تولید می­‌کند (اگرچه مقدار بازگشتی fork شماره 1 برای وی صفر است اما چون مقدار بازگشتی fork شماره 2 برای وی مثبت است، شرط if برای وی true شده و fork شماره 3 را نیز اجرا خواهد کرد). فرزند شماره 2 فرایند اصلی (P12fork شماره 3 پیش رو را اجرا می­‌کند چون برای وی مقدار بازگشتی fork شماره 1 مثبت ارث پدر - و مقدار بازگشتی fork شماره 2 صفر است و شرط if برای وی true شده و fork شماره 3 را اجرا خواهد کرد و یک فرزند خواهد داشت (P121 که سومین نوه برای فرایند اصلی است). فرزند شماره 3 (P13) هم که دیگر fork ای در کد بالا پیش رو ندارد. نوه اول فرایند اصلی (P111) نیز مقدار بازگشتی هر دو fork شماره 1 و 2 را صفر می­بیند و فرزندی تولید نخواهد کرد. دو نوه بعدی فرایند اصلی (P112 و P121) نیز خروجی fork شماره 3 هستند و دیگر fork ای در کد بالا پیش رو ندارد. نهایتاً پس از اجرای کد قسمت دوم، 7 فرایند در صحنه داریم، فرایند اصلی و 3 فرزندش و 3 نوه. چون کد قسمت دوم برای 5 فرایند قسمت اول تکرار می­‌شود، 5 ضرب در 7 یعنی 35 فرایند خواهیم داشت که هر کدام یک  "Hello" چاپ می­‌کنند (گزینه 1).

این تست، تکرار تستی است که در کنکور ارشد IT سال 1401 آمده بود، در آنجا این جمله نیز اضافه شده بود که «فرض کنید بهینه­‌سازی کامپایلر خاموش است و همه بخش­‌ها در یک شرط if اجرا می‌شوند». اگرچه در اینجا، روی خاموش بودن بهینه­‌ساز کامپایلر تأکید نشده است، اما در پاسخ به این تست سیستم عامل نباید بدون تأکید بر جزئیات درس کامپایلر وارد پیچیدگی آن درس شویم و بهتر است ساده­‌ترین حالت را به عنوان پیش­فرض در نظر بگیریم (خاموش بودن بهینه­‌ساز کامپایلر).

ارسال پاسخ