![]() |
سوال هشتم از فصل دوم - نسخهی قابل چاپ |
سوال هشتم از فصل دوم - hatami - 06 شهریور ۱۳۹۰ ۱۲:۰۲ ق.ظ
اگر ۲ فرایند با کد زیر به صورت همروند اجرا شوند و SUM متغییر مشترک و I متغییر محلی باشد با فرض اینکه مقدار اولیه SUM صفر است پس از اجرای ۲ فرایند به طور کامل کدام گزینه حداقل مقدار SUM را نشان میدهد کد: [align=left] ۱/۲ ۲/۱۰ ۳/۵ ۴/۲۰ چرا ؟ |
سوال هشتم از فصل دوم - ehsan_nekooee - 07 شهریور ۱۳۹۰ ۰۲:۴۰ ق.ظ
فک میکنم باید گزینه ۴ درست باشه. به این دلیل که متغییر I محلیه و هر فرایند به صوررت جداگانه این حلقه رو تکرار میکنن. در نتیجه متغییر sum که مشترک هست باید بیست بار یعنی به تعداد دوتا حلقه با یک جمع بشه. |
سوال هشتم از فصل دوم - رضا_ایرانی - ۲۰ شهریور ۱۳۹۰ ۰۲:۲۰ ق.ظ
بیست مقدار حداکثر این اجراست. در این مورد باید اسمبلی فکر کرد: عبارت sum=sum+1 رو یه صورت اسمبلی میشه نوشت: mov ax,sum inc ax mov sum,ax فرض کنیم فرایند اول مقدار sum رو برمیداره (مقدار صفر) و داخل ax میزاره. قبل از انجام عمل inc وقفه اتفاق میفته و مقدار صفر در ریجستر ax باقی میمونه. فرایند دوم میاد و با ۹ دور اجرای حلقه for خودش مقدار ۹ رو در متغیر sum میزاره و باز با یک وقفه CPU به فرایند اول برمیگرده و مقادیر رجیسترها احیا میشه. حالا مقدار صفر در ax قرار داره (چون هر فرایند ریجستر خودشو داره و با تعویض متن رجیسترها احیا میشن با مقادیر همون فرایند) و با یک بار اجرا شدن فرایند اول مقدار یک در sum میشینه. حالا باز وقفه میاد و سراغ فرایند دوم میریم، که با اجرای دستور mov ax,sum مقدار یک در ax فرایند دوم میشینه وقبل از اجرای دستور inc و mov sum,ax باز وقفه میاد، و فرایند اول cpu رو میگیره و نه دور باقی مونده شو انجام میده و مقدار Sum رو میزاره ده و کارش تموم میشه. حالا cpu به فرایند دوم برمیگرده که مقدار ریجستر axش بود یک، و تنها یک دور باقی مونده شو میزنه و مقدار sum رو میزاره دو. |