آشنایی با مهمترین دستورهای کنترلی در زبان C و کاربرد آنها
هدفهای رفتاری
از دانشجو انتظار ميرود پس از خواند این فصل،
1. با کاربرد دستورهای کنترلی آشنا شود.
2. شکل کلی و کاربرد دستور while را بداند.
3. شکل کلی و کاربرد دستور whiledo- را بداند و تفاوت آن را با while بیان کند.
4. شکل کلی و کاربرد دستور for را بداند.
5. شکل کلی و کاربرد دستور عملگر کاما را بداند.
6. شکل کلی و کاربرد دستورهای if و if-else را بداند.
7. شکل کلی و کاربرد دستور switch را بداند.
8. شکل کلی و کاربرد دستور break را بداند.
9. شکل کلی و کاربرد دستور continue را بداند.
10. شکل کلی و کاربرد دستور goto را بداند.
11. شکل کلی و کاربرد تابع exit را بداند.
مقدمه
يکي از امکانات زبانهاي برنامهنویسی جدید، استفاده از دستورها و ساختارهاي كنترلي است و در نتيجه اين امكان را فراهم ميسازند كه قطعهای از برنامه تا موقعي كه شرط ويژهاي برقرار است چندين بار اجرا شود.
توابع کتابخانۀ C++ استاندارد به همين شکل پيادهسازي شدهاند و هنگامي که يکي از آن توابع را در برنامههايتان به کار ميبريد بايد با دستور راهنماي پيشپردازنده، فايل آن توابع را به برنامهتان ضميمه کنيد.
اين کار چند مزيت دارد:
1-اولين مزيت «مخفيسازي اطلاعات» است.
2-مزيت ديگر اين است که توابع مورد نياز را ميتوان قبل از اين که برنامۀ اصلي نوشته شود، جداگانه آزمايش نمود.
3-سومين مزيت اين است که در هر زماني به راحتي ميتوان تعريف توابع را عوض کرد بدون اين که لازم باشد برنامۀ اصلي تغيير يابد.
4-چهارمين مزيت هم اين است که ميتوانيد يک بار يک تابع را کامپايل و ذخيره کنيد و از آن پس در برنامههاي مختلفي از همان تابع استفاده ببريد.
تابع max() را به خاطر بياوريد. براي اين که اين تابع را در فايل جداگانهاي قرار دهيم، تعريف آن را در فايلي به نام max.cpp ذخيره ميکنيم. فايل max.cpp شامل کد زير است:
یک روش آدرس دهی ISA’Sاین سوال را جواب می دهد :عملوندها کجا میتوانند ذخیره شوند؟
ما دو نوع ذخیره سازی در MIPSداریم( وبیشتر ماشینهای دیگر) :ثباتها و حافظه اصلی.ما می توانیم به هریک از این دو یا هردو عملوندها برویم . یک تک عملوند می تواند با هر یک از این دو بیاید یک ثبات یا یک مکان حافظه ،و روشهای آدرس دهی راه های گوناگون تشخیص این مکانها را ارائه می کند.
دراین روشها یک مکان یا داده به طور مستقیم دریک دستورالعمل داده می شود:
Mode name
Example
Meaning
Register
mov$1, $2
R2R1
Direct (or absolute)
mov$1, (40)
M[40]R1
Immediate
mov$1,#40
40R1
روشهای آدرس دهی غیر مستقیم
در تولید یک آدرس حافظه یکی یا بیشترثباتها استفاده می شوند
عملگرهاي رابطهاي، همان طور كه از نامشان پيداست، رابطة بين دو مقدار را تعيين ميكنند. اين عملگرها در جدول 4ـ12 نشان داده شدهاند.
جدول 4ـ12 عملگرهاي رابطهاي
نام عملگر
نشانه
شکل
نتيجه
بزرگتر از
>
a > b
اگر a بزرگتر از b باشد، نتيجه 1 وگرنه 0 است.
كوچكتر از
<
a < b
اگر a كوچكتر از b باشد، نتيجه 1 وگرنه 0 است.
مساوي يا بزرگتر از
>=
a >= b
اگر a مساوي يا بزرگتر از b باشد، نتيجه 1 وگرنه 0 است.
مساوي يا كوچكتر از
=<
a<=b
اگر a مساوي يا كوچكتر از b باشد، نتيجه 1 وگرنه 0 است.
مساوي
= =
a = =b
اگر a مساوي b باشد، نتيجه 1 وگرنه 0 است.
مخالف
!=
a!=b
اگر a مخالف b باشد، نتيجه 1 وگرنه 0 است.
ايده و مفهوم اصلي در مورد عملگرهاي رابطهاي وابسته به مفهوم مقدار true و false است. در زبان C، true هر مقدار غير از صفر و false مقدار صفر است. عباراتي كه عملگرهاي رابطهاي يا منطقي را به كار ميبرند براي حالت نادرست يا false مقدار صفر و براي حالت درست يا true مقدار يك برميگردانند.
- به تعدادی نوشتپار ذیل داخلی ترین عنوان در یک شاخه از طرح اولیه بند یا متن پار گوییم . متن پار کمیتی ازمتن است که خود یک عنوان دارد ودر درونش دیگر عنوانی وجود ندارد و از تعدادی نوشتپار تشکیل شده است .
متن پار مرکب یا متن بخش:
متن پار ممکن است مرکب باشد یعنی چند متن پار در درون خود داشته باشد . در شکل زیر ساختار متن پار مرکب نشان داده شده است . می توان متن پار مرکب را متن بخش نامید .
- از تکنیک عقبگرد برای حل مسائلی استفاده می شود که در آن ها دنباله ای از اشیاء از یک مجموعه مشخص انتخاب می شود، به طوری که این دنباله ، ملا کی را در بر می گیرد.
- یک مثال کلاسیک از عقبگرد، مسئله nوزیر است.
- هدف از مسئله nوزیر ، چیدن nمهره وزیر در یک صفحه شطرنج است ، به طوری که هیچ دو وزیری یکدیگر را گارد ندهند. یعنی هیچ دو مهره ای نباید در یک سطر، ستون یا قطر یکسان باشند.
- عقبگرد حالت اصلاح شده ی جست و جوی عمقی یک درخت است.
- الگوریتم عقبگرد همانند جست و جوی عمقی است، با این تفاوت که فرزندان یک گره فقط هنگامی ملاقات می شوند که گره امید بخش باشدو در آن گره حلی وجود نداشته باشد.
که در آن statemaet_labelمتناظر با فيلد اسم دستور اسمبلي ديگري ميباشد.
دستور JMPشبيه به gotoدر پاسکال يا بيسيک است.
اگر شرايط مختلفي وجود داشته باشد که تحت آن شرايط برنامه بايد خاتمه پيدا کند، ميتوان به يک دستور اجرايي که به وسيله برچسب quit:مشخص شده است و محل اختتام برنامه ميباشد، پرش نمود.
فرمهاي درون سگمنتي وقتي توليد ميشوند که مقصد در درون سگمنت جاري قرار داشته باشد، اين فرمها در بين انواع ديگر از همه رايجتر ميباشند.
پرشهاي بين سگمنتي که به عبارتي به يک سگمنت کد ديگر پرش ميکنند، به ندرت مورد نياز ميباشند.
پرشهاي غيرمستقيم مقدار جابجايي خود از دستورالعمل مقصد را، از يک ثبات يا از يک کلمه در حافظه به دست ميآورند.
پرشهاي درون سگمنتي نسبي، از انواع ديگر معمولتر بوده و بيشتر مورد استفاده قرار ميگيرند.
۲) اجراي ادغام در بيش از يک مرحله ،کاهش دادن
مرتبه هر ادغام و افزايش دادن اندازه بافر براي هر رانش
۳) افزايش طول رانش هاي مرتب شده از لحاظ
الگوريتمي
۴) يافتن راههايي براي همپوشاني عمليات I/O
در اين بخش سه تغيير ممکن در پيکربندي سيستم را
در نظر مي گيريم که مي تواند زمان مرتب سازي را به طور چشمگيري کاهش دهد :
۱) افزايش مقدار حافظه
۲) افزايش تعداد ديسک گردان ها
۳) افزايش تعداد کانال هاي I/O
هدف اصلي اين مرتب سازي ادغامي آن است که
قادر باشيم فايلهايي را مرتب سازي کنيم که در حافظه جا نمي شوند.
در ادغام چند مرحله اي، سعي نمي کنيم همه رانش ها
را به يکباره ادغام کنيم. بلکه رانش هاي اوليه را به گروههاي کوچک تقسيم کرده
،رانش هاي موجود در اين گروه ها را جداگانه ادغام مي کنيم.
اساس
انتخاب جايگزيني ،اين ايده است :
انتخاب هميشگي کليدي از حافظه که داراي کمترين
مقدار باشد ،قرار دادن آن کليد در خروجي ،و سپس تعويض آن با يک کليد جديد از ليست
ورودي.
الگوريتم
انتخاب جايگزيني را مي توان به طريق زير پياده سازي نمود :
۱) خواندن مجموعه اي از رکوردها و مرتب سازي
آنها با استفاده از مرتب سازي هرمي
۲) به جاي نوشتن کل هرم اوليه به شکل مرتب شده
فقط رکوردي را مي نويسيم که کليد آن داراي کمترين مقدار است.
۳)
آوردن يک رکورد جديد و مقايسه مقدار کليد آن با مقدار کليدي که به تازگي
در خروجي قرار گفته است.
الف) اگر مقدار کليد جديد بزرگتر باشد
رکورد جديد را در محل مناسب آن در هرم اوليه ،به همراه رکوردهايي قرار مي دهيم که
از خروجي گزينش مي شوند.
ب) اگر مقدار کليد رکورد جديد کمتر
باشد ،رکورد را در يک هرم ثانويه از رکوردها با مقادير کليدي کمتر از آنهايي که
پيش از اين نوشته شده اند قرار مي دهيم.
۴) تا
هنگاميکه رکوردي در هرم اوليه باقي باشد و رکوردهايي براي خواندن وجود داشته باشد
مرحله۳ را تکرار مي
کنيم.
گزينش جايگزيني ابزاري سودمند براي
فايل هاي ورودي است که قدري مرتب هستند و اين گزينش فرصتي براي صرفه جويي در
زمانهاي انتقال و پيگرد فراهم مي آورد که روشهاي مرتب سازي حافظه اي فاقد آن است.
در گزينش جايگزيني اگر دو ديسک در
اختيار داشته باشيم ،بايد حافظه را نيز طوري پيکربندي کنيم که از آنها بهره برداري
شود. حافظه را چنين پيکربندي مي کنيم :
يک بافر ورودي و يک بافر خروجي اختصاص مي دهيم
تا بافردهي دوگانه امکان پذير گردد و بقيه حافظه را به تشکيل درخت انتخاب اختصاص دهيم.
اختصاص دادن بيش از يک پردازنده به يک کار
امري است متداول که به حالات زير امکان پذير است :
۱) کامپيوترهاي بزرگ که بسياري از آنها مقدار
زيادي از وقت خود را صرف مرتب سازي مي کنند ،معمولاً داراي دو يا چند پردازنده
هستند که همزمان روي بخش هاي متفاوت يک مسئله کار مي کنند.
۲) پردازنده هاي برداري و آرايه اي را مي توان
طوري برنامه ريزي کرد که انواع گوناگون الگوريتم مرتب سازي را سريعتر از پردازنده
هاي اسکالر اجرا کند.
۳) ماشين هاي موازي انبوه ،هزاران و شايد
ميليونها پردازنده دارند که مي توانند مستقل از هم کار کنند و در عين حال به شيوه
هاي پيچيده با هم ارتباط برقرار کنند.
۴) شبکه هاي محلي بسيار سريع و نرم افزارهاي
ارتباطي ،ارسال بخش هاي متفاوتي از يک فرايند به چند ماشين متفاوت را امکان پذير
مي سازد.
اگر در سيستمي برنامه نويسي چندگانه
امکان پذير باشد زمان کل براي I/O ممکن است طولاني تر باشد ،زيرا
کارما بايد منتظر بماند تا کارهاي ديگر نيز I/O خود را انجام دهند.
يکي از دلايل برنامه ريزي چندگانه آن
است که به سيستم عامل امکان دهيم تا راههايي براي افزايش بازدهي کل سيستم ،با هم
پوشاني پردازش و I/O در ميان امور متفاوت بيابد.
ليست کاملي از مجموعه جديد ابزاهايي که کارايي مرتب سازي خارجي
را بهبود مي بخشند شامل موارد زيراست :
۱) براي مرتب سازي درون حافظه اي ،از مرتب سازي
هرمي براي تشکيل ليست اوليه عناصر مرتب شده در يک رانش استفاده مي کنيم.
۲) استفاده از حداکثر حافظه ممکن
۳) اگر تعداد رانش هاي اوليه چنان بزرگ باشد که
زمان کل پيگرد و چرخش ،بسيار بزگتر از زمان انتقال کل باشد از ادغام چندمرحله اي
استفاده مي کنيم.
۴) استفاده از گزينش جايگزيني براي تشکيل رانش
هاي اوليه را در نظر بگيريم.
۵) از بيش از يک ديسک گردان و کانال I/O استفاده مي کنيم.
۶) عناصر بنيادي مرتب سازي خارجي و هزينه هاي
نسبي آنها را به خاطر مي سپاريم و به دنبال راه هايي براي بهره بردن از معماري ها
و سيستمهاي جديد ،نظير پردازش موازي مي گرديم.
درادغام موازنه شده دوجانبه ،توزيع اوليه بايد روي دو نوارگردان صورت پذيرد و
در هر مرحله از ادغام ،به جز آخري خروجي بايد روي دو نوارگردان صورت گيرد.
اين ادغام ساده ترين الگوريتم ادغام نواري
است.
ايده هاي استفاده از الگوريتم هاي ادغام مرتبه
بالاتر و ادغام رانش ها از روي يک نوار در چند مرحله مبناي دو روش معروف براي
ادغام ،موسوم به ادغام چند مرحله اي يا ادغام آبشاري است.
به طور
کلي اين ادغام ها در ويژگي هاي زير با هم مشترکند :
۱) توزيع اوليه رانش ها چنان است حداقل ادغام
اوليه يک ادغام 1-j جانبه است که در آن j تعداد نوارگردان ها است.
۲) توزيع رانش ها در ميان نوارها چنان است که
نوارها غالباً حاوي تعداد متفاوتي از رانش ها هستند.
چون ديسک ها دستگاههاي دستيابي مستقيم
هستند ادغام هاي با مرتبه بسيار بزرگ را مي توان انجام داد ،حتي اگر فقط يک
ديسک گردان وجود داشته باشد.
چون نوارها دستگاه هاي دستيابي مستقيم
نيستند براي هر رانش اضافي که بخواهيم ادغام کنيم به يک نوارگردان اضافي نياز
داريم.
بنابر اين ديسک ها بهترند.
شاخص بندي چند سطحي و درختهاي B
مشکل اصلي نگهداشتن شاخص در حافظه جانبي اين
است که دستيابي به حافظه جانبي کند است.
اين مشکل مي تواند به دو مشکل ويژه تقسيم شود :
۱) جستجو بر حسب شاخص بايد سريعتر از جستجوي
دودويي باشد.
۲) درج وحذف بايد با سرعت جستجو کردن انجام شود.
درخت
جستجوي دودويي چه اشکالي دارد؟
۱) براي شاخص بندي روي ديسک سرعت لازم را ندارد.
۲) يک راهبرد مؤثر براي موازنه کردن درخت وجود
ندارد.
تلاشهايي براي حل مشکلات درخت جستجوي
دودوييانجام گرفت که دو تا از آنها
عبارتند از :
۱) درخت هاي AVL
۲) درخت هاي دودويي صفحه صفحه
درخت AVL درختي با ارتفاع موازنه شده است.
يعني اينکه ،اختلاف مجاز ميان هر دو زيردرخت که
ريشه مشترکي دارند محدوديت دارد و حداکثر تفاوت مجاز ۱ است.
دو
مزيت که درخت هاي AVL را با اهميت مي کنند عبارتند از :
۱) با تعيين کردن حداکثر تفاوت مجاز در ارتفاع
هر دو زيردرخت ،درخت هاي AVL حداقل
کارايي را در جستجو تضمين مي کنند.
۲) براي اينکه هنگام درج در درخت AVL،ويژگي خود را حفظ کند ،مستلزم چهار نوع چرخش است.
درخت دودويي صفحه اي ،سعي مي کند با قرار دادن چندين گره دودويي در
يک صفحه ديسک ،مشکل را حل کند.
واضح است که تقسيم کردن درخت به چندين صفحه
امکان جستجوي سريعتر در حافظه جانبي را فراهم مي کند وبه دست آوردن
اطلاعات را سريعتر از هر روش ديگر دستيابي با استفاده از کليد امکان پذير
مي کند.
مشکل اصلي درخت هاي صفحه اي هنوز هم استفاده
از ديسک است.
درخت هاي B شاخص هاي چند سطحي هستندکه مشکل هزينه خطي درج و حذف کردن را حل مي کنند.
اين ويژگي باعث جذابيت درخت B مي شود ،زيرا اکنون درخت هاي B
روش استاندارد شاخص سازي هستند و از پايين به بالا ساخته مي شوند و عملياتي
نظي درج و حذف ،در حافظه روي گره هاي درخت B
اعمال مي شود.
+ نوشته شده در دوشنبه سوم تیر ۱۳۸۷ ساعت 22:25 توسط میلاد
|
برنامههاي واقعي و تجاري بسيار بزرگتر از برنامههايي هستند که تاکنون بررسي کرديم. براي اين که برنامههاي بزرگ قابل مديريت باشند، برنامهنويسان اين برنامهها را به زيربرنامههايي بخشبندي ميکنند. اين زيربرنامهها «تابع» ناميده ميشوند. توابع را ميتوان به طور جداگانه کامپايل و آزمايش نمود و در برنامههاي مختلف دوباره از آنها استفاده کرد.
2-توابع كتابخانهاي C++ استاندارد
«كتابخانۀ C++ استاندارد» مجموعهاي است که شامل توابع از پيش تعريف شده و ساير عناصر برنامه است. اين توابع و عناصر از طريق «سرفايلها» قابل دستيابياند.
قبلا برخي از آنها را استفاده كردهايم: ثابت INT_MAX که در <climits> تعريف شده ، تابع ()sqrt که در <cmath> تعريف شده است و... .
آشنایی با عبارتها، دستورهای ساده و ساختیافته، و عملگرهای مختلف
هدفهای رفتاری
انتظار میرود پس از خواندن این فصل دانشجو بتواند،
1. مفهوم عبارت را تعریف کند.
2. عبارتهای محاسباتی، قیاسی، و منطقی را بشناسد.
3. مفهوم دستور را تعریف کند.
4. انواع دستورهای ساده را بشناسد.
5. انواع دستورهای ساختیافته را بشناسد.
6. مفهوم عملگر را تعریف کند.
7. عملگرهای محاسباتی را بشناسد.
8. عملگرهای انتساب را بشناسد.
9. عملگرهای یکانی را بشناسد.
10. چند عملگر تکعملوندی را نام ببرد.
11. عملگرهای رابطهای (مقایسهای) را بشناسد.
12. عملگر منطقی را بشناسد.
13. عملگر شرطی را بشناسد.
14. عملگر کاما را بشناسد.
15. عملگرهای حافظه را بشناسد.
عبارت
در زبان برنامهنويسي، عبارت مجموعهاي معنيدار از دادهها (مقادير عددي و متغيرها) است كه با استفاده از نشانهها يا عملگرهاي محاسباتي، قياسي و منطقي با يكديگر تركيب شدهاند. در زبان C عبارات را به شکل زير دستهبندي میکنند.
عبارت محاسباتي
تركيبي از مقادير ثابت، متغيرهاي صحيح و اعشاري با استفاده از مجموعه عملگرهاي محاسباتي است كه با قاعدة خاصي تشكيل ميشود، مانند مثالهاي زير.
1.a * x + b
2.(a + b) / c
در مثال اول مقدار a در مقدار x ضرب و نتيجه با مقدار b جمع ميشود.
در مثال دوم ابتدا مقدار b با مقدار aجمع و سپس بر مقدار c تقسيم ميشود.
مثال 4ـ1 جدول 4ـ1 نمونههايي از عبارات محاسباتي را نشان میدهد.
جدول 4ـ1 چند عبارت محاسباتی
عبارات قياسي
عبارات قياسي تركيبي است از عبارات محاسباتي با استفاده از عملگرهاي قياسي و با رعايت قوانين مربوط به نحوة به كار بردن عملگرها. نتيجة حاصل از اجراي عبارت قياسي هميشه درست يا نادرست است؛ يعني، اگر شرط يا شرطهاي به كار رفته در عبارت قياسي برقرار باشد، نتيجة عبارت مزبور درست است وگرنه نادرست میشود، كه در اغلب زبانها (مانند پاسكال) آنها را به ترتيب true يا false نامند. ولي، در زبان C مقدار true برابر يك و مقدار false برابر صفر است. در عبارات قياسي حق تقدم اجرا، اول با عبارات محاسباتي است و سپس عمل مقايسة مورد نظر انجام ميگيرد.
مثال 4ـ2نمونههايي از عبارات قياسي در جدول 4ـ2 نشان داده شده است.
جدول 4ـ2 چند عبارت قیاسی
معادل در زبان C
عبارت رياضي
a >15
a > 15
a+ b - c <= 3.14
a + b - c ≤ 3.14
3*a + b != 2
3a + b ≠ 2
عبارت منطقي
عبارت منطقي مجموعهاي از عبارات محاسباتي و قياسي است كه در آن حداقل يك عملگر منطقي نيز به كار رفته است. معمولاً اين گونه عبارات از دو گروه قبلي پيچيدهترند. در اغلب زبانها، عبارات قياسي كه در طرفين عملگر منطقي قرار ميگيرند بايد در داخل پرانتز محصور شوند.
مثال 4ـ3نمونههايي از عبارات منطقي در جدول 4ـ3 نشان داده شده است.
جدول 4ـ3 چند عبارت منطقی
معادل در زبان C
عبارت رياضي
(a<5) && (a>3) يا (a>3) && (a<5)
5 > a > 3
(a <= 3.14) | | (a>=15)
(a ≤ 3.14)
a ≥ 15
دستور
دستور حكمي است كه سبب ميشود كامپيوتر عملي انجام دهد. دو گروه دستور داریم: دستورهاي ساده و دستورهاي ساختيافته.
دستورهاي ساده
دستورهاي ساده دستورهاي غيرشرطياند كه متداولترين آنها عبارتاند از:
- جايگزين كردن مقداري معين به يك متغير كه به آن دستور انتساب ميگويند.
- خواندن و نوشتن
- فراخواني تابع
- انتقال كنترل به نقطهاي از برنامه
مثال 4ـ4 نمونههايي از دستورهای ساده در زير نشان داده شده است.
A = B * C ;
scanf("%d%d ", &a , &b) ;
printf("%d%f",a , b) ;
fact(b) ;
goto a ;
دستورهاي ساختيافته
دستورهاي ساختيافته دستورهايياند كه از انواع ساختارهاي الگوريتمي ساخته شدهاند و متداولترين آنها عبارتاند از:
- دستور مركب كه شامل دو يا چند دستور متوالي است و در داخل يك زوج آكولاد محصور است. در زبان C هر دستور ساده به يك سميكولون ختم ميشود.
{
scanf("%d %d" , &a , &b) ;
s = a * b ;
p = 2 * (a+b) ;
printf("%d %d", s , p) ;
}
- دستور حلقة تكرار
for (i =0 ; i<=10 ; i++)
sum = sum + i ;
- دستور شرطي.
if (a>b)
c = a + b ;
else
c = a – b ;
عملگر
عملگر يا اپراتور نشانههايياند كه در عبارات به كار ميروند و به كمك آنها ميتوان اعمالي را روي انواع داده انجام داد. انواع عملگرها عبارتاند از: محاسباتی، انتساب، یکانی، رابطهای (مقایسهای)، منطقی، شرطی، کاما، و حافظه.
عملگرهای محاسباتی
فهرست عملگرهاي محاسباتي در جدول 4ـ4 نشان داده شده است.
جدول 4ـ4 عملگرهاي محاسباتي
نام عملگر
نشانه
شکل
نوع عمل
جمع
+
a + b
a جمع با b
تفريق
ـ
a - b
a منهاي b
منهاي يكاني
ـ
-a
منهاي a
جمع يكاني
+
+a
مقدار عملوند a
ضرب
*
a* b
a ضرب در b
تقسيم
/
a / b
a تقسيم بر b
باقيماندة تقسيم
%
a % b
باقيماندة تقسيم a بر b
يك واحد افزايش
++
a++ , ++a
افزايش يك واحد به مقدار a
يك واحد كاهش
--
a-- , --a
كاهش يك واحد از مقدار a
چهار عملگر / , * , - , +تقريباً روي همه نوع دادههاي استاندارد موجود در زبان Cبه كار میرود. در صورتي که عملگر "/" روي مقادير صحيح يا كاراكتر به كار رود، جزء اعشار حذف ميشود. مثلاً مقدار 10/3برابر 3 خواهد بود يعني فقط جزء صحيح آن درنظر گرفته خواهد شد و قسمت اعشار بريده ميشود.
عملگر %باقيماندة تقسيم را به دست ميآورد و هر دو عملوند آن بايد مقدار صحيح باشد. مثلاً مقدار 10%3برابر يك خواهد بود. يعني باقيماندة تقسيم 10 بر 3 مساوي يك است.
دو عملگر ++ و -- در ساير زبانهاي برنامهنويسي وجود ندارند. عملگر ++ يك واحد به عملوند خود اضافه ميكند و عملگر -- يك واحد از عملوند خود كم ميكند. هر دو عملگر تكعملوندياند. درواقع دو دستور+ +a ; و a+ + ;معادل اين دستورند: a = a + 1 ;.همچنين دو دستور – –a ; و a– – ;معادل اين دستورند a = a – 1 ; .
توجه داشته باشيد سرعت عمل دو عملگريکاني ++ و -- از سرعت عمل عملگر انتساب (يعني عملگر =) بالاتر است.
مثال 4ـ5به خروجي قطعه برنامة زير توجه کنيد.
a = 5 ;
printf ("%d %d\n", a , a+ +) ;
printf ("%d", a) ;
خروجی برنامه
5
5
6
مثال 4ـ6به خروجي قطعه برنامة زير توجه کنيد.
a = 5 ;
printf ("%d %d\n", a , + +a) ;
printf ("%d", a) ;
خروجي برنامه
6
5
6
با توجه به دو مثال بالا ملاحظه ميکنيد که از نظر کاربرد دو دستور + +a ; و a+ + ; با يکديگر تفاوت دارند؛ يعني، در مثال اول با اجراي دستور printf اولي مقدار a (كه مساوي 5 است) چاپ ميشود و سپس دوباره همان مقدار a چاپ ميگردد و پس از انجام عمل چاپ مقدار آن يك واحد افزايش مييابد. با اجراي دستور printf دوم كنترل به آغاز خط جديد انتقال مييابد، سپس مقدار a كه اكنون برابر 6است چاپ ميشود. در مثال دوم با اجراي دستور printf اولي مقدار a (كه مساوي 5 است) چاپ و سپس دستور + +a اجرا ميشود؛ يعني، به a يك واحد افزوده ميشود بعد مقدار آن كه برابر 6 شده است چاپ ميشود. دستور printf دوم در اينجا نيز مشابه مثال اول عمل ميكند. عملكرد دو دستور --a و a-- نيز به همين روش است.
ترتيب تقدم اين گروه از عملگرها در جدول 4ـ5 نشان داده شده است.
جدول 4ـ5 ترتیب تقدم عملگرها
--++
بالاترين تقدم
ـ
* / %
- +
پايين ترين تقدم
در مورد عملگرهاي همتقدم ترتيب تقدم از چپ به راست است. درصورت وجود پرانتز، تقدم پرانتز از تقدم همة عملگرها بالاتر است.
مثال 4ـ7با توجه به مقادير داده شده، چند عبارت محاسباتي همراه با مقادير آنها در جدول 4ـ6 نشان داده شده است.
int a = 10 , b = 3 ;
float C = 12.5 , d = 2.0 ;
جدول 4ـ6
مقدار
عبارت محاسباتي
مقدار
عبارت محاسباتي
14.5
C + d
13
a + b
10.5
C - d
7
a - b
25.0
C * d
30
a * b
6.25
C / d
3
a / b
error
C % d
1
a % b
مثال 4ـ8 با توجه به اعلان داده شده،چند عبارت محاسباتي همراه با مقادير آنها در جدول 4ـ7 نشان داده شده است.
char c1 = 'A' , c2 = 'E' ;
جدول 4ـ7
مقدار
عبارت محاسباتي
65
c1
134
c1 + c2
139
c1 + c2 + 5
187
’5’ c1 + c2 +
در عبارات مورد نظر هر كجا c1 و c2 به كار رفته، به جاي آنها کد اسكي معرف كاراكتر مربوط به آنها به كار برده شده است؛ يعني، در مورد متغير c1 كه معرف كاراكتر Aاست عدد 65 (کد اسكي حرف A) و در مورد متغير c2 نيز كه معرف كاراكتر Eاست عدد 69 (کد اسكي حرف E) به كار برده شده است. همچنين ملاحظه ميکنيد كه عدد5، با کاراکتر 5 که کد اسكي آن 53است تفاوت دارد.
مثال 4ـ9 با توجه به اعلان داده شدهچند عبارت محاسباتي همراه با مقادير آنها در جدول 4ـ8 نشان داده شده است.
int a = 11 , b = -3 ;
جدول 4ـ8
مقدار
عبارت محاسباتي
8
a + b
14
a - b
-33
a * b
-3
a / b
2
a % b
در مثال بالا اگر مقدار a برابر -11 و مقدار b برابر 3 باشد، مقدار a / b باز هم برابر -3 ميشود، اما مقدار a % b برابر -2 خواهد شد. به طريق مشابه اگر a و b هر دو مقدار منفي (متناظراً -11 و -3) داشتند، مقدار a / b برابر 3 ميشد، ولي مقدار a % b باز هم برابر -2 باقي ميماند.
عملگرهاي انتساب
در زبان C علامت ’=’ به مفهوم مساوي نيست، بلكه عملگر جايگذاري يا عملگر انتساب است. اين عملگر موجب ميگردد كه مقدار عملوند سمت راست آن در محل حافظهاي كه با عملوند سمت چپ مشخص شده است قرار گيرد. براي مثال دستور K = 123 ;مقدار 123 را به متغير k اختصاص ميدهد؛ يعني، آنچه در سمت چپ علامت قرار دارد، نام يك شناسه يا متغير و آنچه در سمت راست آن قرار دارد، مقدار يا value متغير مزبور است. پس دستور بالا به مفهوم k " مساوي 123" نیست بلکه یعنی "مقدار 123 به k اختصاص داده شود". پس بايد به تمايز بين نام متغير و مقدار متغير توجه كرد.
حال دستور متعارف K = K+1 ; را درنظر بگيريد. از نظر رياضي اين دستور مفهوم نيست. اما از ديدگاه برنامهسازي، دستور مزبور دستور جايگذاري و بدين مفهوم است كه متغيري را كه نام آن K است پيدا كنيد. سپس به مقدار آن يك واحد اضافه کنید و مقدار جديد را به متغيري كه نام آن K است (درواقع به همان متغير) اختصاص دهيد.
به طور كلي در زبان C چندين عملگر مختلف انتساب يا جايگذاري وجود دارد كه همة آنها براي تشكيل يك عبارت انتساب يا عبارت جايگذاري به كار میروند و مقدار يك عبارت را به يك شناسه يا متغير اختصاص يا نسبت ميدهند. متداولترين عملگر انتساب عملگر ’=’ است. فرم كلي دستور انتساب به صورت زير است.
identifier = expression ;
variable = expression ;
توجه داشته باشيد كه عملگر انتساب، يعني ’=’، كاملاً با عملگر مساوي كه علامت ’= =’ است فرق دارد. عملگر انتساب براي اختصاص و نسبت دادن يك مقدار به يك شناسه يا متغير به كار میرود، درحالي كه عملگر تساوي يا برابري، براي تعيين اينكه آيا دو عبارت مقدار يكسان دارند يا نه به كار ميرود. پس اين دو عملگر نميتوانند به جاي يكديگر به كار روند.
اگر دو عملوند عملگر انتساب از نظر نوع يكسان نباشند، مقدار عبارت يا عملوند طرف راست به طور خودكار به نوع شناسه يا متغير طرف چپ عملگر تغيير مييابد. بنابراين اگر نتيجة عبارت سمت راست عملگر مزبور از نوع float و عملوند سمت چپ آن از نوع int باشد، جزء اعشاري آن حذف خواهد شد.
مثال 4ـ10 با توجه به اعلان داده شده، نمونههايي از دستور انتساب در جدول 4ـ9 نشان داده شده است.
int a , b = 5 ;
جدول 4ـ9
مقدار
عبارت
مقدار
عبارت
-25
a = -25.9 ;
5
a = 5.56 ;
5
a = 2*b /2 ;
2
a = b/2 ;
4
a = 2*(b/2) ;
120
;’x’a =
-3
-52’0’ -’a’ a =
48
;’0’ a =
47
3/’B’-’E’ a =
32
’’ a =
ملاحظه ميکنید كه در عبارات بالا در مورد كاراكترها، کد اسكي آنها جايگزينميشود. مثلاً در آخرين عبارت، به جاي E و B به ترتيب مقادير 69 و 66 قرار ميگيرد و در نتيجه
69 - 66/3 = 69-22 = 47.
همچنين در عبارت a = 2 * (b/2) ;از آنجايي که پرانتز تقدم بالاتري دارد، اول مقدار b/2 محاسبه ميشود كه نتيجة آن برابر 2 خواهدشد وسپس نتيجةحاصل در 2 ضربميشودو بنابراين نتيجة نهايي برابر4 خواهد شد.
در زبان C ميتوان دستورهاي انتساب چندگانه به كار برد مانند a = b = 5 ;. شکل كلي اين گونه دستورهاي انتساب به صورت زير است.
V1 = V2 =... = Vn = expression ;
در چنين حالتي، تقدم عمل انتساب از راست به چپ است. بنابراين دستور a = b = c = 5 ;معادل a = (b = (c = 5)) ;است.
در زبان C، ميتوان عملگر انتساب را با عملگرهاي محاسباتي تركيب كرد و عملگرهاي+ = ، -، = ،*= ، /= ، %=را به دست آورد که آنها را عملگرهاي محاسباتيانتسابنامند و در جدول 4ـ10 نشان داده شدهاند.
جدول 4ـ10 عملگرهاي محاسباتي انتساب
عملگر
نام عملگر
دستور انتساب
معادل
+ =
انتساب جمع
a += b ;
a = a+b ;
-=
انتساب تفريق
a -= b ;
a = a-b ;
*=
انتساب ضرب
a *= b ;
a = a*b ;
/=
انتساب تقسيم
a /= b ;
a = a/b ;
%=
انتساب باقيماندة تقسيم
a %b ;
a = a%b ;
مثال 4ـ11 اگر متغيرهاي a و b از نوع int باشند و مقدار آنها به ترتيب برابر 10 و 5 باشد، دستور a += b ;معادل دستور a = a + b ; است؛يعني، a = 15.
عملگرهاي يكاني
زبان C مجموعهای عملگر دارد كه فقط روي يك عملوند عمل ميكنند و آنها را عملگرهاي يكاني يا تكعملوند نامند. اين عملگرها اغلب در جلوي عملوند خود قرار ميگيرند. متداولترين عملگر تكعملوندي علامت منفي است كه در جلوي يك مقدار ثابت عددي، يا يك متغير و يا يك عبارت قرار ميگيرد.
مثال 4ـ12در زير نمونههايي از عملگر منهاي يکاني نشان داده شده است.
–915– 3.1415– 10.25–2e –4
–sum– (x+y)–3 * (x + y)
اگر جلوي مقادير علامتي قرار نگيرد، علامت آنها مثبت در نظر گرفته ميشود، ولي به هرحال ميتوان جلوي آنها يك علامت "+" قرار داد كه در اين صورت "+" را كه فقط داراي يك عملوند است جمع يكاني نامند.
مثال 4ـ13 در زير نمونههايي از عملگر جمع يکاني نشان داده شده است.
+915+3.1415+10.25+2e – 4
+sum+(x+y)+3 * (x + y)
اگر عملگر مزبور به كار نمیرفت، مقدار اقلام بالا باز هم تغيير پيدا نميكرد و به همين دليل كاربرد اين عملگر متداول نيست.
از عملگرهاي تكعملوندي ديگر عملگر "cast" است كه آن را عملگر تبديل نوع نيز گويند و در خودآزمایی 2 فصل 3 بررسي کردیم.
يكي ديگر از عملگرهاي تكعلموندي عملگرsizeofاست كه بزرگي عملوند خود را برحسب بايت برميگرداند. عملوند اين عملگر معمولاً با نوع داده همراه است، مانند
int , unsignded int , long , float , unsigned
و مشابه آنها، كه در اين صورت عملگر مزبور بزرگي اين نوع ساختمان دادههاي استاندارد را برميگرداند، يا اينكه عملوند آن عبارت است كه در اين صورت بزرگي آن عبارت را برحسب بايت برميگرداند. جدول 4ـ11 نحوة كاربرد اين عملگر را نشان ميدهد.
جدول 4ـ11 کاربرد عملگر sizeof
نام عملگر
نشانه
شکل
نوع عمل
بزرگي (sizeof)
sizeof
sizeof (t)
sizeof x
بزرگي نوع داده t يا عبارت
x را برحسب بايت برميگرداند.
مثال 4ـ14 به دستورهای زير توجه کنید.
k1 = sizeof (char) ;
k2 = sizeof (short) ;
k3 = sizeof (float) ;
k4 = sizeof (int);
k5 = sizeof (int *) ;
k6 = sizeof (double) ;
با اجراي دستورهاي بالا مقادير k3 , k2 , k1 بهترتيب برابر 4 , 2 , 1 خواهد بود كه بهترتيب معرف طول نوع داده char و short و float است. در مورد k4 نيز اگر نوع int گونهاي از زبان C به طول 2 بايت باشد، مقدار k4 برابر 2 خواهد بود و اگر به طول 4 بايت باشد، مقدار آن 4 خواهد بود. k5 نيز بزرگي يك اشارهگر به يك داده از نوع integerاست كه برحسب ماشين مورد نظر ممكن است 4 بايت و يا عدد ديگري باشد.
مثال 4ـ15 درنتيجة اجراي دو دستور زير
float a ;
printf ("%d%d", sizeof a , sizeof (float)) ;
مقادير 44 نمايش داده خواهد شد، كه 4 اول معرف طول متغير a است (كه از نوع floatاست) و 4 دوم معرف طول نوع داده floatاست. درضمن ملاحظه ميگردد كه اگر عملوند اين عملگر معرف نوع داده مانند int، float باشد، عملوند در داخل پرانتز محصور ميگردد و اگر معرف متغير (مانند a در مثال بالا) باشد، نياز نيست كه در درون زوج پرانتز قرار داده شود.
يكي ديگر از عملگرهاي متداول تكعملوندي عملگر منطقي "!" به مفهوم نقيض است كه در عملگرهاي منطقي توضيح میدهیم.
+ نوشته شده در جمعه سی و یکم خرداد ۱۳۸۷ ساعت 20:35 توسط میلاد
|
به هر فرآیند یک آدرس مجازی برای نگهداری تصویر فرآیند می دهد.
- توزیع وقت فرآیند:( نخ یا فرآیند سبک وزن )
فرآیند مسیر اجرای یک یا چند برنامه است و توسط سیستم عامل مورد زمان بندی و توزیع قرار می گیرد.
چند نخی:
به قابلیتی از سیستم که امکان اجرای چند نخ را حمایت می کند.
تک نخی: به رویکرد سنتی یک نخ اجرا در هر فرآیند .
مانند MS-DOSاز فرآیند تک کاربره و از یک نخ حمایت می کند.
UNIXاز چند کاربر ولی تنها از یک نخ حمایت می کند.
موتور زمان اجرا یjavaنمونه سیستمی از یک فرآیند چند نخی است.
در سيستمهاي عامل هايزیرازسيستم جند نخي استفاده شده است
Windows NT ; solaris ; Mach ; os/2
موارد همراه فرآیند:
فضای آدرس مجازی که تصویر فرآیند را در بر دارد.
دسترسی حفاظت شده به فرآیند.
حالت اجرای نخ.
متن ذخیره شده.
پشته اجرا.
مقداری حافظه ایستا برای متغییرهای محلی هر نخ.
دسترسی به منابع و حافظه فرآیند.
مقاسیه فرآیند تک نخی و چند نخی:
فرآیند چند نخی:
یک بلوک کنترل فرآیند،فضای آدرس فرآیند،برای هر نخ پسته جدا گانه و بلوک کنترل جدا گانه و ... وجود دارد.
تمام نخ های فرآیند ،در حالت و منابع آن فرآیند شریک هستند.
در یک فضای آدرس هستندوبه داده های یکسانی دسترسی دارند.
فرآیند تک نخی:
شامل بلوک کنترل ،فضای آدرس فرآیند،فضای آدرس فرآیند،پشته کاربر،هسته یرای مدیریت و ... است.
حالات نخ :
ایجاد (زایش):
با ایجاد یک فرآیند ،نخ هم ایجاد می شود.
مسدود شدن:
تا بروز حادثه نخ مسدود می شود.
رفع مسدود بودن:
اتفاق حادثه لازم.
پایان:
با تکمیل یک نخ ،متن ثبات و پشته هایش آزاد می شود.
همگام سازی نخ ها
تمامنخ ها یک فرآیند در فضای آدرس و در منابع دیگر شریک هستند به همین تغییر در هر یک از منابع توسط یک نخ در محیط سایرین تغییر ایجاد می کند لذا همگام سازی فرآیند ها ضروری است.
به دو دلیل از نخ جداگانه برای رسم مجدد صفحه نمایش استفاده می کنند:
1-page makerتعدادشیء هایی که در روی یک صفحه است را محدود نکند.
2-استفاده از نخ جداگانه،امکان قطع کردن رسم را در اختیار می گذارد.
نخهای سطح کاربر
کار مدیریت توسط کاربر انجام می شود.
هسته از وجود این نخ ها بی اطلاع است.
از کتابخانه ها برای مدیریت نخها استفا ده می کنند.
هر کاربردی با یک نخ شروع می شود و شروع اجرایش از همان نخ است.
هرگاه این نخ در حال اجرا باشد می توان نخ جدیدی را ایجاد کرد که به احضار کتابخانه منجر می شود.
الگوریتم زمانبندی آن ایجاد می شود تا آماده اجرا می شود.
نخهای سطح هسته
تمام کار مدیریت نخ توسط هسته انجام می شود.
کد مدیریت در ناحیه کاربرد وجود ندارد.
یک نخ واسط برنامه سازی کاربردی به نخ هسته وجود دارد.
امتیاز نخ سطح کاربر به سطح هسته:
تعویض نخ به حالت ممتاز نیاز ندارد.
کاربرد می تواند زمانبندی خاص داشته باشد
نخ های سطح کاربر می توانند روی هر سیستم عامل اجرا گردند.
اشکال نخ های سطح کاربر به سطح هسته:
اکثر فراخوانی های سیستم مسدود کننده هستند.
کاربرد چند نخی نمی تواند از امتیازات چند پردازشی استفاده کند.
رفع اشکال نخ های سطح کاربر به سطح هسته
نوشتن کاربردها به صورت فرآیندهای متعدد به جای نخ های متعدد که امتیاز اصلی نخ ها را از بین می برد.
راه حل غلبه بر نخ های مسدود کننده : استفاده از روشی به نام جلد کردن که هدف آن تبدیل فراخوانی سیستم از مسدود کننده به غیر مسدود کننده.
امتیاز نخ های سطح هسته:
(تمام کارمدیریت نختوسط هسته انجام می شود.)
هسته می تواند به صورت هم زمان،نخ های چند گانه یک فرآند واحد را روی پردازنده های متعدد زمانبندی کند.
اگر نخی در یک فرآیند مسدود شد ،هسته می تواند نخ دیگری از آن فرآیند را بار گئاری کند.
<خود روالهای هسته نیز می تواند چند نخی باشد.
عیب اصلی نخ های سطح هسته:
انتقال کنترل از یک نخ به نخ دیگر در داخل یک فرآیند واحد نیز نیازمند تغییر به حالت هسته است.
رویکردهای ترکیبی:
ترکیبی از امکانات نخ سطح کاربر و نخ سطح هسته را فراهم می کند. مانند solaris .
ایجاد نخ به طور کامل در فضای کاربرد در داخل یک کاربرد صورت می گیرد.
به تعداد (کمتر یا مساوی) از نخ های سطح هسته نگاشته می شود.
نخ ها به موازات هم روی پردازنده های متعدد اجرا می شود.
یک فراخوانمسدود کننده کل سیستم را مسدود نمی کند.
رابط بین نخ ها و فرآیندها:
نخها:فرآیندها شرح مثال سیستم های عامل
یک به یکهر نخ اجرا یک فرآیندunix
چند به یکیک فرآیند یک فضای آدرس Windows NT
یک به چندیک نخ از یک محیط به دیگر رود )Ra(clouds
چند به چند ترکیب چند به یک ویک به چندTRIX
روش های پیاده سازی رابط چند به چند:
تمام برنامه به صورت یک فرآیند واحد پیاده سازی شود.
از نظر مدیریت حافظه اشکالاتی دارد.
برنامه اصلی و زیر برنامه ورودی /خروجی به صورت دو فرآیند جداگانه پیاده سازی شوند. مستلزم سر بار اضافی است.
برنامه اصلی و زیر برنامه ورودی / خروجی به عنوان یک فعالیت و به صورت یک نخ پیاده سازی شود. ولی یک فضای آدرس ویکی برای زیربرنامه ورودی/خروجی ایجاد گردد. (بهترین روش است.)
معماری چند پردازشی متقارن:
FLYNNگروههای زیر را پیشنهاد کرده است:
جریان دستورالعمل واحد و داده های واحد: یک پردازنده دستورات واحدی را برای داده ها دریافت می کند.
جریان دستورالعمل چند گانه و داده های واحد: اجرای هم زمان تعدادی از دستورات پردازشی.
جریان دستورالعمل چند گانه و داده های چند گانه: اجرای هم زمان چنددستور بر روی چندداده.
جریان دستورالعمل واحد و داده های چند گانه: اجرای هم زمان چنددستور بر روی داده.
سازمان چند پردازنده متقارن:
هر یک واحد کنترل ،واحد حساب و منطق و ثباتهای خاص خود را دارند.
به یک حافظه اصلی مشترک دسترسی دارد.
پردازنده ها از طریق حافظه با یکدیگر در ارتباط هستند.
امکان تبادل مستقیم وجود دارد.
هر پردازنده از طریق یک گذرگاه مشترک به یک حافظه اصلی متصل است.
امکان دسترسی به بلوک ها مهیا است.
تغییر در یک حافظه پنهان سبب تغییر در حافظه پنهان دیگر می شود.(وابستگی حافظه پنهان)
با آن در سخت افزار بر خورد می شود.
ملاحظات طراحی سیستم عامل چند پردازنده ای:
هم زمانی فرآیند ها یا نخ ها: توسط هر یک از پردازنده ها انجام شود .
زمانبندی: توسط هر یک از پردازنده ها انجام شود .
همگام سازی::ابزاری است برای تنظیم انحصار متقابل و تنظیم حادثه ها.
مدیریت حافظه: باید سخت افزار مناسب را بهره جوید.
قابلیت اطمینان و تحمل خرابی: در برخورد با خرابی با ید اقدام کند.
ریز هسته ها:
ریز هسته سیستم عامل کوچکی است که بنیان لازم برای گسترشهای مولفه ای را به وجود می آورد.
رویکرد ریز هسته با به کارگیری آن در سیستم عامل Machمورد توجه عمومی قرار گرفت.
سیستم عامل windows NT نیز داردای ریز هسته است که مدعی قابلیت حمل و مولفه ای بودن است.
معماری ریز هسته:
در این سیستم های عامل یکپارچه، مجازا هر رویه ای می توانست هر رویه دیگری را فراخوانی کنند.
در سیستم عامل های لایه ای،عمل ها به صورت سلسله مراتبی طراحی شده است و تنها سطوح مجاوربا یکدیگر محاوره داشته باشند.
فلسفه ریز هسته این است که تنها اعمال کاملا اصلی سیستم عامل باید در هسته باشد.
کاربردها روی ریز هسته ساخته شده.
بخشهایی از سیستم عامل که درخارجریز هسته قرار دارند به صورت فرآیند خدمتگذار پیاده سازی می شوند.
بر مبنای برابری و از طریق ریز هسته با هم ارتباط برقرار می کنند.
ریز هسته به عنوان یک مبادله کننده پیام عمل می کند.
مزایای ریز هسته:
واسط یکنواخت. (برای درخواستهای فرآیند)
قابلیت گسترش. (مجاز دانستن افزایش خدمات)
قابلیت انعطاف. (به قابلیت گسترش مربوط است)
قابلیت حمل. (تمام کد مربوط به ویژگی های خاص پردازنده در هسته وجود دارد)
قابلیت اطمینان.
حمایت سیستم توزیعی:(توسط سیستم عامل توزیعی)
سیستم عامل شیء گرا.
کارایی ریز هسته:
ریز هسته خیلی کوچک سببشده که کاهش کارایی را حذف و انعطاف و فابلیت اطمینان را بهتر کند.
به دلیل اینکه ریز هسته های مختلف طیفی از اعمال و اندازه را نشان می دهند، نمی توان هیچ قاعده محکم و سریعی در مورد اعمالی که ریز هسته باید ارائه کند و ساختار پیاده سازی آن اظهار داشت.
طرح ریز هسته:
ریز هسته مستقیما به سخت افزار بستگی دارد و اعمال زیر را حمایتمی کند:
1- مدیریت حافظه اولیه.
2- ارتباط بین فرآیندها.
3- ورودی / خروجی.
4- مدیریت وقفه.
سه روش زیر برای حمایت مدیریت حافظه مجازی و صفحه بندی خارجی:
اهدا: هر فرآیند می تواند تعدادی از صفحات خود را به دیگری دهد.
نگاشت: یک فرآیند می تواند هر یک از صفحات خود را به فضای دیگری بنگارد.
مطالبه: هر صفحه که قبلا استفاده شده را مطالبه کند.
ارتباط داخلی فرآیند:
پیام شکل اصلی ارتباط بین فرایندها یا نخهاست.
1-سرآمد =>فرآیندهای گیرنده –فرستنده
را مشخص می کند.
پیام=>
2-بدنه=>اشاره گری به بلوک داده ها
یا بعضی اطلاعات کنترلی
مدیریت ورودی و خروجی و وقفه ها:
اداره وقفه های سخت افزاری به صورت پیام و درگاه های ورودی و خروجی در فضاهای آدرس میسر می شود.
ریز هسته وقفه را تشخیص می دهد ولی آنها را اداره نمی کند.
پیامی را برای فرآیند سطح کاربر مربوط به آن وقفه تولید می کند.
مدیریت نخ و چند پر دازشی متقارن درWindows NT ویژگیهای فرآیندهای NT عبارتند از:
فرآیند NTبه صورت شیءپیاده سازی شده اند.
هر فرآیند قابل اجرا،می تواند حاوی یک نخ یا بیشتر یاشد.
هم شیء های فرآیند و هم شیء های نخ ،دارای راهکارهای پیش ساخته همگام سازی هستند.
به هر فرآیند مجموعه بلوک های حافظه مربوط است.
به هر فرآیند یک نشانه امنیتی دست یابی نسبت داده می شود.
فرآیند شامل یکجدول شیء هم هست که دستگیره های به دیگرشیءهایشناخته شده این فرایند دارد. برای هر یک از نخهای که در این شیء هست یک دستگیره وجود دارد.
اگر فرآیندی برای باز کردن چنین دستگیرهای تلاش کند، سیستم امنیتی مجاز بودن آنودر نتیجه امکان تغییرخصوصیا تش را تعیین می کند.
فرآیند نمی تواند مستقیما ساختار ها را تغییر دهد.
فرایند شامل یک جدول شیء است .
خصوصیات شیء فرایند
مقدار یکتای فرآیند
توصیف چه کسی به این فرآیند....
برای نخ های این فرآیند
مجموعه پردازنده های پیش فرض
حداکثر منابع
مجموع زمان اجرا نخ
متغییر و... ثبت شده توسط فرآیند
تعداد و نوع عملیات انجام شده
کانالهای ارتباطی بین فرایندها
دلیل پایان یافتن یک فرآیند
شناسه فرآیند
توصیف امنیت
اولویت پایه
وابستگی فرآیند به پردازنده
حداکثر سهم
زمان اجرا
شمارنده های I/O
شمارنده عملیات حافظه مجازی
درگاههای استثنا/اشکالزدایی
وضعیت خروج
خصوصیت شیء نخ :
شناسه نخ: مقدار یکتای نخ.
متن نخ:مجموع مقادیر نخ و....
اولویت پویا:اولویت اجرای نخ در هر لحظه.
اولویت پایه:کمترین اولویت نخ.
وابستگی نخ به پردازنده:پردازتده هایی که می توان در روی نخ انجام شود.
زمان اجرای نخ:زمان اجرای آن در هسته و در حالت کاربرد.
وضعیت هشدار:فراخوانی رویه نا همگام .
شماره تعلیق :تعداد دفعات تعلیق اجرای نخ.
نشانه جعل هویت: دستیابی موقت .
درگاه پایان: یک کانال ارتباطی بین فرآیندها.
وضعیت خروجی نخ: دلیل پایان یافتن نخ.
حالت های نخ:
آماده: برای اجرا زمانبندی گردیده.
جانشین: برای هر پردازنده خاص ،یک نخ جانشین
اجرا: با تعویض به مرحله اجرا می رود.
انتظار: یک نخ موقعی به حالت اجرا می رود که:
1- روی حادثه مسدود کردد.
2- به منظور همگام سازی ،داوطلبانه منتظر شود.
3- توسط یک زیر سیستم محیط وادار به تعلیق گردد.
انتقال: منابع فراهم نیست.
پایان: توسط خودش یا پدر.
مدیریت نخ و جند پردازشی متقارن در Solaris
فرآیند: همان فرآیند معمولی
نخ های سطح کاربر: به وسیله کتابخانه ای ار نخهادر فضای آدرس یک فرآیند پیاده سازی می شوند.
فرآیند سبک وزن: نگاشتی بین نخ های سطح کاربر و نخ های هسته در نظر گرفت.
نخ های هسته: موجودیتهای بنیادی.
اجرای نخ:
همگام سازی: جهت هما هنگ کردن فعالیت.
تعلیق : معلق شدن و منتظر درخواست.
قبضه : عملی که موجب به اجرا در آمدن فعالیت اولویت دار شود.
واگذاری.
راه حل solarisبرای اداره وقفه
برای اداره وقفه ها solarisمجموعه ای نخ های هسته را به کارگرفته است.
با استفاده از اولیه های انحصار متقابل ،هسته دسترسی به ساختمان داده ها را کنترل می کند.
اولویت وقفه ها ،از اولویت دیگر نخ های هسته بیشتر است.
+ نوشته شده در جمعه سی و یکم خرداد ۱۳۸۷ ساعت 13:44 توسط میلاد
|
کدبرداری از دستورالعمل: بررسی دستورالعمل برای مشخص شدن اینکه:
چه عملی باید توسط دستورالعمل انجام گیرد (به عنوان مثال جمع)
چه عملوندهایی مورد نیازند، و نتایج باید کجا قرار گیرند.
واکشی عملوندها: عملوندها برداشت می شوند.
اجرا: اجرای عملیات بر روی عملوندها
بازنویسی نتیجه: نوشتن نتیجه در محل مخصوص
دستورالعمل بعدی: تعیین اینکه دستورالعمل بعدی از کجا گرفته شود.
چه چیزی در یک ISA(معماری مجموعه دستورالعمل) مشخص می شود؟
کدبرداری از دستورالعمل: اعمال و عملوندها چگونه تعیین می گردند؟
واکشی عملوندها: عملوندها ممکن است کجا باشند؟ چه تعداد؟
اجرا: چه اعمالی می تواند انجام گیرد؟ چه نوع داده و چه اندازه هایی؟
بازنویسی نتایج: نتایج کجا نوشته می شوند؟ چه تعداد؟
دستورالعمل بعدی: دستورالعمل بعدی را چگونه می توان انتخاب نمود؟
یک ISA ساده:حافظه به حافظه
چه عملیاتی می تواند اجرا شود؟ عملیات پایه ریاضی (برای این لحظه)
چه نوع داده و چه اندازه ای؟ نوع داده صحیح 32 بیتی (integer 32)
عملوندها و نتایج کجا می توانند قرار گیرند؟ حافظه
چه تعداد عملوند و نتیجه؟ 2 عملوند، 1 نتیجه
اعمال و عملوندها چگونه مشخص می شوند؟
OP DEST,SRC1,SRC2 عملمقصد,منبع1,منبع2
چگونه می توانیم دستورالعمل بعدی را انتخاب کنیم؟ بعدی به ترتیب
مدل حافظه
حافظه را به عنوان یک آرایه بزرگ از nعدد صحیح در نظر بگیرید، که بوسیله اندیس قابل دستیابی است.(حافظه با دستیابی تصادفی موسوم به ram)
به عنوان نمونه ، M[1]شامل مقدار 3 است. ما می توانیم در این مکانها نوشتن و خواندن را انجام دهیم. این مکانها صرفا در دسترس ماست. تمام مکانهای “مجرد” (از قبیل متغیرها در C) باید مکانهایی را در Mتعیین کنند.
Address Contents
14
13
99
.
.
.
0
0
1
2
.
.
.
N - 1
ترجمه کد ساده
کد C مفروض
A = B + C;
ما می توانیم تصمیم بگیریم که متغیر A مکان 100 ، B مکان 48 و C مکان 76 را
اشغال می کند. کد بالا را به معادل کد اسمبلی آن تبدیل می کنیم:
ADD M[100], M[48], M[76]
چگونه می توانیم عبارت زیر را تبدیل کنیم
A = (B + C) * (D + E);
استفاده از یک مکان موقتی
فرض کنید ما A را در 100، B را در 48 ، C را در 76، D را در 20 و E را
در32 قرار می دهیم.
اکنون یک مکان بدون استفاده را انتخاب می کنیم (مثلا 84)
ADD M[100], M[48], M[76] # A = B + C
ADD M[84], M[20], M[32] # temp = D + E
MUL M[100], M[100], M[84] # A = A * temp
مشکلات در معماری حافظه به حافظه
حافظه اصلی خیلی کندتر از مدارات محاسباتی است
- این مطلب از سال 1950 تا 2003 درست است!
خانه های زیادی برای مشخص نمودن آدرسهای حافظه گرفته می شوند.
معمولا نتایج یک یا دو دستورالعمل بعد مورد استفاده قرار می گیرند.
به خاطر داشته باشید: بخشهای اشتراکی را سریعتر نمائید!
راه حل: نتایج میانی یا موقتی را در حافظه های سریع و نزدیک به واحد محاسبه ذخیره نمائید.
ماشینهای مبتنی بر انباشتگر(Accumulator)
یک ماشین انباشتگر، یک بافر پرسرعت واحد (مانند یک مجموعه از D latchها یا فلیپ فلاپها ، هر کدام برای یک بیت داده) را نزدیک واحد محاسبه منطق نگهداری می کند.
در ساده ترین حالت، فقط یک عملوند می تواند مشخص گردد;انباشتگر به صورت مجازی به مفهوم “OP Operand” می باشد یعنی:
acc. = acc. OP operand
Example:
LOAD M[48] # Load B into acc.
ADD M[76] # Add C to acc. (now has B+C)
STORE M[100] # Write acc. To A
LOAD M[20] # Load D into acc.
بارگذاری D در انباشتگر
ADD M[32] # Add E to acc. (now has D+E)
جمع Eبا انباشتگر.(اکنون داریم D+E)
STORE M[100] # Write acc. To A
نوشتن محتوای انباشتگر در A.
LOAD M[48] # Load B into acc.
بارگذاری Bدر انباشتگر.
ADD M[76] # Add C to acc. (now has B+C)
جمع نمودن Cبا انباشتگر.(اکنون داریم B+C)
MUL M[100] # Multiply A to acc.
ضرب کردن A در انباشتگر.
STORE M[100] # Write (B+C) * (D+E) to A
نوشتن نتیجه در A
ضعف ماشینهای مبتنی بر انباشتگر
هنوز نیازمند ذخیره سازی بسیاری مقادیر موقتی و میانی در حافظه می باشیم
در واقع انباشتگر فقط برای یک ترتیب از محاسبات که در آن نتیجه یکی، ورودی برای بعدی است، مفید می باشد.
ماشینهای مبتنی بر انباشتگر هنوز در کامپیوترهای اولیه معمول بودند
یک طراحی ساده، و بنابراین محبوب ، مخصوص برای
- کامپیوترهای اولیه
- میکروپروسسرهای اولیه (4004 ، 8008)
- مدلهای Low-end (ارزان)
پیشنهادات برای ماشینهای مبتنی بر انباشتگر
اگر منابع سخت افزاری بیشتری در دسترس است، مکانهای ذخیره سازی سریع را در کنار انباشتگر قرار دهید:
ماشینهای مبتنی بر پشته
ماشینهای مبتنی بر ثبات
- خاص منظوره
- عام منظوره
ماشینهای مبتنی بر پشته
ایده: یک ستون از مکانهای ذخیره سازی سریع دارای یک بالا(top) و یک پایین (bottom)
یک دستورالعمل فقط از مقدار بالای پشته(top) قابلیت برداشت دارد، یا شاید دو یا سه مقدار به عنوان بالای پشته در نظر گرفته شوند.
ما می توانیم مقادیر جدید را در بالای پشته قرار دهیم (“push”) یا از بالای پشته برداریم (“pop”) اما فقط همین. ما نمی توانیم به مکانهایی در زیر پشته دسترسی داشته باشیم مگر اینکه هر چیز بالای آن را خارج کنیم.
Address Contents
14
3
99
.
.
.
0
Top
2nd from top
3rd from top
.
.
.
bottom
معماری مجموعه دستورالعمل ماشینهای مبتنی بر پشته
اعمال اصلی شامل:
بارگذاری: برداشت مقدار از حافظه و قرار دادن آن بر روی پشته
ذخیره سازی: برداشت مقدار از پشته و ذخیره آن در حافظه
حسابی: خارج کردن یک یا دو مقدار از پشته؛ قرار دادن نتیجه روی پشته
دونسخه ای (Dup): گرفتن مقدار از بالای پشته بدون حذف آن؛ قرار دادن یک کپی جدید از آن در روی پشته (چرا این عمل کاربردی است؟)
ماشین مبتنی بر پشته که A=(B+C)*(D+E)را انجام می دهد
ماشین مبتنی بر پشته
کاربرد ماشینهای مبتنی برپشته
بسیاری از کامپیوترهای اولیه
واحد ممیز شناور در 8086 (تقریبا)
ماشین مجازی جاوا
ماشینهای مبتنی بر ثبات
ایده:به کار بردن مکانهای ذخیره سازی زیاد(”ثباتها“)نزدیک انباشتگر
ثبات ها نام / شماره های مشخصی دارند که می توانند به جای حافظه استفاده می شوند
دستیابی نسبت به حافظه اصلی
خیلی سریعتر است
(1-2 CPU cycles vs. ~ 100 CPU cycles on PC)_
ثبات ها نسبت به مکان های حافظه خیلی نزدیک ترند
MIPS_32 تا ثبات 32 بیتی دارد
_ثبات های کمتر آدرس های کوچکتر وتعداد بیتهای کمتر برای نام گذاری آنها
_منابع استفاده کمتر است و باید با دقت ار آنها استفاده شود!
ثباتهای عام منظوره_خاص منظوره
یک ثبات خاص_ منظوره برای اهداف مشخص استفاده می شود و ممکن است عملیاتی را که استفاده می شود را محدودکند
طراحی آسانتر سخت افزار: ثبات را در جایی که دقیقا نیازاست قرار بده
به منظور استفاده موثر برای کامپایلر خیلی سخت تر است.
یک ثبات عام منظوره می تواند دربیشتر مسیرهای عملیاتی استفاده شود بنابراین مسیریابی خیلی مشکل است
ثبات های خاص منظوره The z_80 cpu
هفت تا ثبات 8 بیتی: (می توانند جفت شوند A,B,C,D,E,H,LBC,DE,HL).
سه تا ثبات 16 بیتی:62 PC (شمارنده برنامه).
جمع ,تفریق,شیفت تنها با Aمی تواند انجام شود (شمارنده 8 بیتی ).
افزایش و کاهش می تواند با تمام ثبات ها وجفتهای ثبات انجام شود .
می توانند از حافظه آدرس (HL)را واکشی کنند و در هر8بیت ثبات قرار دهند.
یک واکشی از آدرس(BC)یا(DE)تنها می تواند به Aبرود.
واکشی ها از (BC),(HL)و (IX) تعداد چرخه های متفاوتی می گیرد
چه کسی می خواهد برای این یک کامپایلر بنویسد؟
ثبات عام منظوره ماشین های (GPR)
MIPS(وپردازشگرهای مشابه)32تا ثبات عمومی دارند (GPRs)هر32بیتlongهستند.همه می توانند نوشته یا خوانده شوندبه جز ثبات صفر که همیشه صفراست ونمی تواند تغییر کند.زمان دستیابی به ثبات ثابت است.
Address Contents
0
3
99
.
.
.
14
$0
$1
$2
$31
ماشین GPRA=(B+C)*(D+E) راانجام می دهد
ADD $1 M[48], M[76] #R1 = B + C
ADD $2 M[20], M[32] #R2 = D + E
MUL M[100], $1, $2 #A = R1 * R2
اندازه های داده های متفاوت
چطورباید با اندازه های داده های متفاوت رفتارکنیم؟
انتخاب یک اندازه برای یک واحد ذخیره شده در یک آدرس تنها
ذخیره کردن داده بزرگ در یک مجموعه از مکانهای همجوارحافظه
ذخیره کردن داده کوچک در یک مکان:
use shift & mask ops
امروزه تقریبا همه ماشینها(شاملMIPS)دارای آدرس دهی بایتی
“Byte_Adressable”هستند هر مکان آدرس دهی ،در حافظه 8بیتی نگهداری می شود.
حافظهMIPS
روی یک ماشین قابل آدرس دهی بایتی ازقبیلMIPSاگرما بگوییم یک کلمه (32بیت) درآدرس80 ذخیره شده به این معنااست که مکانهای 80تا83را اشغال کرده.(کلمه بعدی از84 شروع می شود).
به طور نرمال بارگذاری وذخیره چندین بیت باید ”تنظیم“ شود.آدرس nبایتی بارگذاری یا ذخیره باید مضربی ازnباشد.برای نمونه نیم کلمه تنها در آدرسهای زوج ذخیره میشود.
MIPSاجازه بارگذاری شدن و ذخیره شدن برای استفاده مخصوص دستورالعمل ها را نمی دهند اما آنها ممکن است کندترشوند(بیشتر پردازشگرها این را برای همیشه اجازه نمی دهند!).
Byte-Order (“Endianness”)
برای یک داده چند بایتی کدام قسمت به کدام بایت می رود؟
اگر$1محتوی1000000(F4240H )و ما آن را در آدرس 80 ذخیره کنیم :
در یک ماشین “Big Endian” “Big End”به آدرس 80 می رود