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

نسخه‌ی کامل: سوال هشتم از فصل دوم
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
اگر 2 فرایند با کد زیر به صورت همروند اجرا شوند و SUM متغییر مشترک و I متغییر محلی باشد با فرض اینکه مقدار اولیه SUM صفر است پس از اجرای 2 فرایند به طور کامل کدام گزینه حداقل مقدار SUM را نشان میدهد
کد:
[align=left]
for(i=0;i<10;i++)
sum =sum +1;

1.2
2.10
3.5
4.20

چرا ؟
فک میکنم باید گزینه 4 درست باشه.
به این دلیل که متغییر I محلیه و هر فرایند به صوررت جداگانه این حلقه رو تکرار میکنن. در نتیجه متغییر sum که مشترک هست باید بیست بار یعنی به تعداد دوتا حلقه با یک جمع بشه.
بیست مقدار حداکثر این اجراست.
در این مورد باید اسمبلی فکر کرد:
عبارت sum=sum+1 رو یه صورت اسمبلی میشه نوشت:
mov ax,sum
inc ax
mov sum,ax

فرض کنیم فرایند اول مقدار sum رو برمیداره (مقدار صفر) و داخل ax میزاره. قبل از انجام عمل inc وقفه اتفاق میفته و مقدار صفر در ریجستر ax باقی میمونه.
فرایند دوم میاد و با 9 دور اجرای حلقه for خودش مقدار 9 رو در متغیر sum میزاره و باز با یک وقفه CPU به فرایند اول برمیگرده و مقادیر رجیسترها احیا میشه. حالا مقدار صفر در ax قرار داره (چون هر فرایند ریجستر خودشو داره و با تعویض متن رجیسترها احیا میشن با مقادیر همون فرایند) و با یک بار اجرا شدن فرایند اول مقدار یک در sum میشینه. حالا باز وقفه میاد و سراغ فرایند دوم میریم، که با اجرای دستور mov ax,sum مقدار یک در ax فرایند دوم میشینه وقبل از اجرای دستور inc و mov sum,ax باز وقفه میاد، و فرایند اول cpu رو میگیره و نه دور باقی مونده شو انجام میده و مقدار Sum رو میزاره ده و کارش تموم میشه. حالا cpu به فرایند دوم برمیگرده که مقدار ریجستر axش بود یک، و تنها یک دور باقی مونده شو میزنه و مقدار sum رو میزاره دو.
لینک مرجع