فصل 4
عبارت، دستور، عملگر
هدف کلی
آشنایی با عبارتها، دستورهای ساده و ساختیافته، و عملگرهای مختلف
هدفهای رفتاری
انتظار میرود پس از خواندن این فصل دانشجو بتواند،
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 در مثال بالا) باشد، نياز نيست كه در درون زوج پرانتز قرار داده شود.
يكي ديگر از عملگرهاي متداول تكعملوندي عملگر منطقي "!" به مفهوم نقيض است كه در عملگرهاي منطقي توضيح میدهیم.
فصل چهارم
نخها، چندپردازشی متقارن و ریز هسته ها
فرآیندها و نخ ها:
فرآیند دو خصوصیت زیر را دارد:
- تملک منبع: ( فرآیند یا وظیفه )
به هر فرآیند یک آدرس مجازی برای نگهداری تصویر فرآیند می دهد.
- توزیع وقت فرآیند: ( نخ یا فرآیند سبک وزن )
فرآیند مسیر اجرای یک یا چند برنامه است و توسط سیستم عامل مورد زمان بندی و توزیع قرار می گیرد.
چند نخی:
به قابلیتی از سیستم که امکان اجرای چند نخ را حمایت می کند.
تک نخی: به رویکرد سنتی یک نخ اجرا در هر فرآیند .
مانند 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 مجموعه ای نخ های هسته را به کارگرفته است.
با استفاده از اولیه های انحصار متقابل ،هسته دسترسی به ساختمان داده ها را کنترل می کند.
اولویت وقفه ها ،از اولویت دیگر نخ های هسته بیشتر است.
فصل دوم
معماری مجموعه دستورالعملها
مراحل اجرای یک دستورالعمل
واکشی دستورالعمل: برداشت دستورالعمل بعدی از حافظه
کدبرداری از دستورالعمل: بررسی دستورالعمل برای مشخص شدن اینکه:
چه عملی باید توسط دستورالعمل انجام گیرد (به عنوان مثال جمع)
چه عملوندهایی مورد نیازند، و نتایج باید کجا قرار گیرند.
واکشی عملوندها: عملوندها برداشت می شوند.
اجرا: اجرای عملیات بر روی عملوندها
بازنویسی نتیجه: نوشتن نتیجه در محل مخصوص
دستورالعمل بعدی: تعیین اینکه دستورالعمل بعدی از کجا گرفته شود.
چه چیزی در یک 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
.
.
.
معماری مجموعه دستورالعمل ماشینهای مبتنی بر پشته
اعمال اصلی شامل:
بارگذاری: برداشت مقدار از حافظه و قرار دادن آن بر روی پشته
ذخیره سازی: برداشت مقدار از پشته و ذخیره آن در حافظه
حسابی: خارج کردن یک یا دو مقدار از پشته؛ قرار دادن نتیجه روی پشته
دونسخه ای (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
ماشین GPR A=(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 می رود
در یک ماشین “Little Endian” از سوی دیگر است.
Big-Endian vs. Little-Endian
ماشینهای Big Endian:MIPS,SPARC,68000
ماشینهای :Little Endianبیشتر پردازشگر های intel,Alpha,Vax
سازگاری مشکلات انتقال چندین بایت داده بین ماشینهای Big Endian,Little Endian
فصل چهارم
دستورالعمل هاي اساسي
انتقال داده ها بين مكانهاي مختلف حافظه
كارايي زمان و فضا (حافظه ) دو مفهوم اساسي اين فصل مي با شند .
دستورالعملmov در زبان اسمبلي براي كپي كردن داده ها از محلي به محل ديگر مورد استفاده قرار مي گيرد.
دستورالعمل xchg ، دستور مفيد ديگري است كه درزبان اسمبلي براي تعويض داده هاي منبع ومقصد كاربرد دارد.
نكته : مي توان اندازه ي داده ي مورد نظر را از يك كلمه به يك بايت و يا بالعكس تغيير داد.
....
• ادامه مبحث سازماندهي فايلها براي
کارايي
• شاخص گذاري
براي
بازيابي سريعتر فضا به وارد زير نيازمنديم :
۱)
راهي که بلافاصله بدانيم که حفره هاي خالي در فايل وجود دارد يا نه
۲)
راهي که اگر چنين حفره اي وجود دارد مستقيماً به آن پرش کنيم.
استفاده
از ليست هاي پيوندي براي پيوند دادن تمام رکوردها هر دو نياز فوق را
برآورده مي کند.
آسان
ترين راه براي کار کردن با ليست استفاده از آن به صورت پشته است.
پشته ليستي است که در آن اضافه و حذف گره
ها از يک انتهاي ليست انجام مي شود.
براي
بازيابي رکوردها از طريق ليست پيوندي به موارد زير نياز داريم :
۱) راهي براي پيوند دادن رکوردهاي حذف شده و
تبديل آنها به يک ليست
۲) الگوريتمي براي اضافه کردن رکوردهاي حذف شده
به ليست
۳) الگوريتمي براي پيدا کردن و خارج کردن يک
رکورد از ليست هنگامي که مي خواهيم از آن رکورد استفاده کنيم.
براي مقابله با پراکندگي خارجي يک روش متراکم
کردن فايل است و دو راه ديگر به قرار زير است:
۱) اگر دو حفره رکورد در ليست به صورت فيزيکي کنار هم قرار
گيرند آنها را با هم يکي مي کنيم تا يک حفره رکورد بزرگتر ايجاد شود. به اين کار ادغام
حفره ها در فايل ميگوييم.
۲) سعي مي کنيم پراکندگي را به حداقل برسانيم.
به اين ترتيب که يک راهبرد انتخاب جا را در نظر مي گيريم که برنامه با استفاده از
آن يک حفره رکورد را از ليست انتخاب کند.
هنگامي که نياز داريم يک حفره رکورد را
از ليست خارج کنيم با شروع از ابتداي فايل عمل جستجو را انجام مي دهيم تا رکوردي
به اندازه کافي بزرگ پيدا کنيم يا به انتهاي ليست برسيم. اين راهبرد انتخاب جا به عنوان
راهبرد اولين جاي مناسب( first fit)
ناميده مي شود.
سه مشکل اساسي مربوط به مرتب سازي و جستجوي
دودويي عبارتند از :
۱) جستجوي دودويي نياز به بيش از يک يا دو
دسترسي به ديسک دارد.
۲) نگهداري يک فايل به صورت مرتب شده خيلي گران
تمام مي شود.
۳) مرتب سازي داخلي تنها در مورد فايل هاي کوچک
عملي است.
مرتب
سازي کليدي که گاهي به آن مرتب سازي با برچسب مي گويند بر اين ايده
استوار است که وقتي فايلي را در حافظه مرتب مي کنيم تنها چيزيکه واقعاً به آن نياز
داريم کليد رکوردها است.
عيب مرتب
سازي کليدي اين است که مرتب کردن فايلي با n
رکورد نياز به n دستيابي تصادفي به فايل اصلي دارد
که مي تواند بسيار بيشتر از خواندن ترتيبي همان تعداد رکورد وقت بگيرد.
شاخص گذاري
همه شاخص ها بر اساس يک مفهوم اصلي واحد عمل مي
کنند: کليدها و آدرس فيلدها.
انواع شاخص هايي که در اين فصل بررسي مي کنيم شاخص
ساده ناميده مي شوند زيرا با استفاده از آرايه هاي ساده اي از ساختمان ها نشان
داده مي شوند ،که حاوي کليدها و آدرس فيلدها هستند.
چون شاخص ها به طور غير مستقيم عمل مي کنند ،
بدون دستکاري محتويات فايل ،به فايل نظم و ترتيب مي بخشند.
کاتالوگ کارتي در واقع مجموعه اي از سه
شاخص است که هر کدام از يک فيلد کليد متفاوت استفاده مي کنند و همه انها از
يک شماره کاتالوگ يکسان به عنوان فيلد آدرس بهره مي گيرند.
بنابراين کاربرد ديگر شاخص بندي اين است که مي
توان از طريق مسيرهاي گوناگوني به فايل دست يافت.
در جستجوي دودويي لازم است امکان پرش به وسط فايل را داشته
باشيم.
راه
ديگر براي مرتب سازي ، ايجاد شاخص براي فايل است.
ساختار
شيء شاخص بسيار ساده است.
اين
ساختار ليستي است که هر عنصر آن دو فيلد دارد:
يک فيلد کليد و يک فيلد براي آفست بايت.
عملياتي
که براي يافتن داده هاي مورد نظر ،از طريق شاخص لازمند عبارتند از :
۱) ايجاد فايل داده ها و شاخص خالي اوليه
۲) باز کزدن فايل شاخص در حافظه ،قبل از به
کارگيري آن
۳) نوشتن فايل شاخص بر روي ديسک ،پس از به
کارگيري آن
۴) افزودن رکوردهايي به فايل و داده ها
۵) حذف رکوردها از فايل داده ها
۶) بهنگام کردن رکوردها در فايل داده ها
۷) بهنگام کردن شاخص براي انعکاس تغييرات به
عمل آمده در فايل داده ها.
مزيت بزرگي که روش شيء گرا دارد آن است
که براي اجراي اين عمليات به هرچه نياز داشته باشيم مي توانيم در متدهاي کلاس خود
بيابيم.
در
ايجاد فايل ها بايد دو فايل ايجاد شوند :
۱) فايل داده ها براي نگهداري اشياي داده اي
۲) فايل شاخص براي نگهداري شاخص کليد اوليه
بهنگام
سازي رکوردها به دو صورت انجام مي شود :
۱) بهنگام سازي ،تعداد فيلد و کليد را تغيير مي
دهد.
۲) بهنگام سازي ،در فيلد و کليد تأثير نمي
گذارد.
آشکارترين
بهينه سازي ،استفاده از جستجوي دودويي در متد find است که توسط :
insert , search و remove به کار گرفته مي شود.
منبع ديگر بهينه سازي ،چنانچه رکورد شاخص
تغيير نکرده باشد ، نوشتن درباره رکورد شاخص در فايل شاخص است.
دستيابي
به شاخص روي ديسک داراي معايب زير است :
۱) جستجوي دودويي شاخص به جاي آنکه با سرعت
حافظه صورت پذيرد ،نياز به چندين پيگرد دارد.
۲) ترتيب مجدد شاخص که از حذف يا افزودن رکورد
ناشي مي شود نياز به جابه جا کردن يا مرتب سازي رکوردها در حافظه ثانويه
دارد که اين کار ميليونها بار گران تر از اجراي اين عمليات در حافظه است.
هرگاه
يک شاخص ساده در حافظه جا نشود بايد از موارد زير استفاده کرد :
۱) در صورتي که سرعت دستيابي در اولويت قرار
داشته باشد ،از سازماندهي درهمسازي استفاده شود.
۲) در صورتي که به هر دو نوع دستيابي کليدي و
ترتيبي نياز داشته باشيد ،از يک شاخص چند سطحي با ساختار درختي نظير
درخت B استفاده شود.
شاخص هاي ساده نسبت به استفاده از فايل داده
اي که بر حسب کليد مرتب شده اند مزاياي چشمگيري دارد :
۱) شاخص ساده استفاده از جستجوي دودويي را براي
دستيابي کليدي به يک رکورد در فايلي که طول رکوردهاي آن متغير است امکان پذير مي
سازد.
۲) اگر ورودي هاي شاخص بسيار کوچکتر از
رکوردهاي فايل داده ها باشد ،مرتب سازي و نگهداري شاخص نسبت به مرتب سازي و
نگهداري فايل داده ها زمان کمتري مي برد.
۳) اگر در فايل داده ها رکوردهايي وجود دارند
که در جاي خود مستقر هستند ،با استفاده از شاخص مي توان ترتيب کليدها را بدون
جابجايي رکوردهاي داده ها عوض کرد.
هنگاميکه شاخص ثانويه اي موجود باشد
،افزودن يک رکورد به فايل به معناي افزودن يک ورودي شاخص ثانويه است. زمان لازم
برا انجام اين کار بسيار مشابه زمان لازم براي افزودن ورود يي به شاخص اوليه است.
يک اختلاف مهم شاخص ثانويه و شاخص اوليه آن
است که شاخص ثانويه مي تواند حاوي کليدهاي دوگانه باشد.
حذف يک رکورد معمولاً به معناي حذف تمامي آدرس
هاي آن رکورد در سيستم فايل است.
بنابراين حذف رکوردي از فايل داده ها نه تنها
به معناي حذف ورودي مربوط در شاخص اوليه بلکه به معناي حذف همه ورودي هاي
موجود در همه شاخص هاي ثانويه اي است که به اين ورودي از شاخص
اوليه رجوع مي کنند.
مشکل اين است که شاخص هاي ثانويه همانند شاخص
اوليه به ترتيب کليدها نگهداري مي شوند. در نتيجه حذف يک ورودي شامل ترتيب مجدد
ورودي هاي موجود ،به منظور بستن فضاي باقيمانده از حذف است.
بهنگام سا زي فايل داده ها فقط هنگامي شاخص
ثانويه را تحت تأثير قرار مي دهد که کليد اوليه يا ثانويه تغيير يابند. که سه
وضعيت ممکن است پيش بيايد :
۱) بهنگام سازي باعث تغيير کليد ثانويه مي شود.
۲) بهنگام سازي باعث تغيير کليد اوليه مي شود.
۳) بهنگام سازي محدود به فيلدهاي ديگر
ساختارهاي
شاخص ثانويه اي که تا کنون ارائه کرديم دو مشکل دارند :
۱)
هربارکه رکورد جديدي به فايل افزوده مي شود ،بايد فايل شاخص را دوباره مرتب کنيم
،حتي اگر رکورد جديد به يک کليد ثانويه موجود مربوط باشد.
۲) اگر
کليدهاي ثانويه وجود داشته باشد ،فيلد کليد ثانويه براي هر ورودي تکرار مي شود.
اين کار باعث هدر رفتن فضا مي شود.
درسيستم فايلي که طي اين فصل طراحي کرديم ، انقياد
کليدهاي اوليه به آدرس در زمان ايجاد شدن فايل ها رخ مي دهد ولي کليدهاي
ثانويه در زمان استفاده ،به آدرس خود پيوند مي يابند.
پردازش کمک ترتيبي و مرتب سازي فايل هاي بزرگ
عمليات کمک ترتيبي شامل پردازش هماهنگ دو يا
چند ليست ترتيبي براي ايجاد يک ليست خروجي است.
گاهي پردازش منجر به ادغام يا اتحاد
اقلام موجود در ليست هاي خروجي مي شود ،گاهي هدف ،تطابق يا جايگذاري اقلام در ليست
ها است ،گاهي نيز عمليات شامل ترکيبي از تطابق و ادغام مي شود.
اين نوع عمليات روي ليست هاي ترتيبي ،مبناي
بسياري از پردازش هاي فايل ها را تشکيل مي دهند.
گرچه روال همخواني بسيار ساده به نظر مي رسد
،براي آن که اين روال بهتر عمل کند به چند نکته بايد توجه داشت :
۱) آماده سازي
۲) دستيابي به عضو بعدي ليست
۳) همزمان سازي
۴) کنترل شرايط پايان فايل
۵) تشخيص خطاها
اگر قرار باشد تعداد زيادي از ليست ها با هم
ادغام شوند ،مي توان به جاي حلقه مقايسه ها از درخت انتخاب استفاده
کرد.
مرتب
سازي در حافظه شامل سه مرحله است :
۱) خواندن کل فايل از روي ديسک به حافظه
۲) مرتب سازي رکوردها با استفاده از يک روال
مرتب سازي استاندارد ،مثل مرتب سازي shell
۳) نوشتن دوباره فايل روي ديسک
آيا يک الگوريتم مرتب سازي داخلي وجود دارد که
به قدر کافي سريع باشد و بتواند مرتب سازي اعداد را بلافاصله پس از خوانده شدن
آنها آغاز کند و منتظر قرار گرفتن کل فايل در حافظه نشود؟
بله ،نام آن مرتب سازي هرمي (heapsort) است و مبتني بر همان اصل درخت انتخاب است.
هرم
درختي دودويي با ويژگي هاي زير است :
۱) هر
گره داراي کليدي است که آن کليد بزگتر يا مساوي کليد واقع در گره پدرش است.
۲) يک
درخت دودويي کامل است.
۳) به
خاطر ويژگيهاي ۱ و ۲ ،در نگهداري درخت مي توان آرايه اي اختصاص داد که در آن ،گره ريشه ،انديس ۱ و انديسهاي فرزندان چپ و راست
گره i ،به ترتيب برابر با
i۲ و ۱ + i۲ باشند.

الگوريتم مرتب سازي هرمي دو بخش دارد:
ابتدا هرم را ايجاد مي کنيم سپس کليدها را به
صورت مرتب شده در خروجي قرار مي دهيم.
بازيابي
ترتيبي کليدها به صورت زير انجام مي شود :
۱) تعيين مقدار کليد موجود در اولين موقعيت هرم
. اين مقدار کوچکترين مقدار هرم است.
۲) انتقال بزرگترين مقدار هرم به اولين محل آن
و کم کردن يک واحد از تعداد عناصر.
۳) ترتيب دوباره هرم. با اينکار بزرگترين عنصر با فرزند
کوچکش جابجا مي شود.
هر بار
که اين سه مرحله اجرا مي شود ،کوچکتري مقدار بازيابي شده از هرم حذف مي گردد.
مرتب
سازي کليدي دو نارسايي دارد :
۱) هنگاميکه کليدها مرتب سازيمي شوند ،بايد
زمان زيادي صرف اين موارد شود. پيگرد هر رکورد در رکوردهاي مرتب شده ،خواندن هر
رکورد به حافظه و نوشتن آن روي فايل مرتب شده جديد شود.
۲) در مرتب سازي کليدي ،اندازه فايلي که
قابل مرتب سازي است به تعداد جفت کليد/اشاره گري که در حافظه جا شود ،محدود مي
شود. در نتيجه هنوز نمي توانيم فايل هاي واقعاً بزرگ را مرتب سازي کنيم.
رانش
داراي ويژگي هاي زير است :
۱) واقعاً قادر به مرتب سازي فايل هاي بزرگ هست
و به فايل هايي به هر اندازه قابل بسط است.
۲) خواندن فايل ورودي در مرحله ايجاد
رانش ،ترتيبي است و لذا بسيار سرعتر از ورودي است ،زيرا ورودي به ازاي هر رکورد
نياز به پيگرد دارد.
۳) خواندن هر رانش طي مرحله ادغام و نوشتن رکوردهاي مرتب شده نيز ترتيبي
است.
۴) اگر براي بخشي از ادغام که در حافظه انجام
مي شود از مرتب سازي هرمي استفاده شود مي توانيم اين عمليات را با I/O همپوشاني کنيم تا زمان ادغام افزايش پيدا نکند.
۵) چون I/O
تا حد زيادي ترتيبي است ،در صورت نياز مي توان براي هر دو عمليات ورودي و خروجي از
نوار نيز استفاده کرد.
I/O چهار بار اجرا مي
گردد.
در
مرحله مرتب سازي :
۱) خواندن همه رکوردها به حافظه براي مرتب سازي و تشکيل
رانش ها
۲) نوشتن رانش هاي مرتب شده روي ديسک.
در
مرحله ادغام :
۱) خواندن رانش هاي مرتب شده به حافظه براي
ادغام
۲) نوشتن فايل مرتب شده روي ديسک
جلسه چهارم
طرح اوليه متن اصلي
فراروند
ایجاد متن نوعی تولید و خلاقیت است . از این نقطه نظر نیاز به طراحی دارد یعنی
باید یک طرح اولیه برای متنی که می خواهیم تهیه نماییم . در مرحله تهیه طرح اولیه
کارهای زیر را انجام می دهیم :
فصل چهارم:
روش حریصانه در طراحی الگوریتم
الگوریتم حریصانه ، به ترتیب عناصر را گرفته ، هر بار آن عنصری را که طبق ملاکی معین ”بهترین“ به نظر می رسد، بدون توجه به انتخاب هایی که قبلا انجام داده یا در آینده انجام خواهد داد، بر می دارد.
الگوریتم حریصانه ، همانند برنامه نویسی پویا غالبا برای حل مسائل بهینه سازی به کار می روند، ولی روش حریصانه صراحت بیشتری دارد.
در روش حریصانه ، تقسیم به نمونه های کوچک تر صورت نمی پذیرد.
.....
جلسه چهارم
«تكرار»
مقدمه
تكرار، اجراي پي در پي يك دستور يا بلوكي از دستورالعملها در يك برنامه
است. با استفاده از تکرار ميتوانيم کنترل برنامه را مجبور کنيم تا به خطوط قبلي
برگردد و آنها را دوباره اجرا نمايد.
C++ داراي سه دستور تكرار است:
دستور while، دستور do_while و دستور for. دستورهاي تکرار به علت طبيعت چرخهمانندشان، حلقه نيز ناميده ميشوند.
1- دستور while
تابع scanf()
در زبان C دادههاي ورودي ميتوانند به كمك تابع كتابخانهاي scanf از طريق دستگاه ورودي استاندارد وارد كامپيوتر شوند. تابع scanf نيز تابع فرمتدار و مشابه تابع printf است ولي در جهت عكس عمل ميكند. به كمك اين تابع ميتوان دادههاي عددي، كاراكترها، رشتهها يا تركيبي از آنها را وارد كامپيوتر كرد. فرمت اين تابع مشابه فرمت تابع printf و فرم كلي آن به صورت زير است.
scanf ("control string", arguments list) ;
يا
scanf ("control string", argl , arg2 ,…, arg n) ;
در اينجا نقش رشتة كنترل مشابه تابع printf و شامل اطلاعات قالببندي خاص است. مشابه printf اين تابع نيز ميتواند هر تعداد آرگومان را دارا باشد، كه در آن اولين آرگومان رشتة فرمت يا رشتة كنترل است. همچنين اين تابع، اغلب همان كد فرمت تابع printf را به كار ميبرد؛ براي مثال كدهاي فرمت %s, %c , %f , %d که به ترتيب براي خواندن دادههايي از نوع مقادير صحيح، اعشاري، كاراكتر و رشته به كار میروند. تفاوت مهم بين اين دو تابع آن است كه در جلوي آرگومانها، اپراتور آدرس يعني "&" نيز قرار ميگيرد.
البته اگر بخواهيد مقداري را براي متغير رشتهاي بخوانيد، نيازي به اپراتور "&" نخواهد بود زيرا رشتهها در زبان ِC به صورت آرايهاي از نوع كاراكتر معرفي ميگردند و نام آرايه نيز معرف آدرس آرايه (يعني آدرس اولين عنصر آن) است.
مثال 3ـ8 برنامة زير نحوة کاربرد عملگر & را در تابع scanf نشان ميدهد.
#include
main ()
{
int x ;
char name[6] ;
scanf("%d" , &x) ;
scanf("%s", name) ;
printf("%d %s", x , name) ;
}
دستور scanf اول سيستم را هدايت ميكند كه داده ورودي را به صورت عدد صحيح از طريق ترمينال دريافت كند و اين مقدار را در متغير x ذخيره کند. دستور scanf دوم به دليل استفاده از آرايه، بدون عملگر & به کار میرود و اگر در اين برنامه براي متغير name رشتة "book" را وارد كرده باشيم، خروجي آن كلمة book خواهد بود.
جدول 3ـ3 فرامين يا کاراکترهاي فرمت براي دادههاي ورودي را كه کاراکترهاي تبديل نيز ناميده ميشوند نشان میدهد.
جدول 3ـ3 كاراكترهاي فرمت در تابع scanf ()
|
شـــرح |
كد فرمت |
|
داده ورودي به صورت تككاراكتر تعبير ميشود. |
%c |
|
داده ورودي به صورت عدد صحيح علامتدار (در مبناي 10) تعبير ميشود. |
%d |
|
داده ورودي به صورت عدد صحيح علامتدار تعبير ميشود. |
%i |
|
داده ورودي به صورت عدد صحيح بدون علامت دهدهي تعبير ميشود. |
%u |
|
داده ورودي به صورت عدد صحيح اعشاري با مميز شناور (floating_point) تعبير ميشود. |
%f , %e, %g |
|
داده ورودي به صورت عدد صحيح كوتاه (short integer) تعبير ميشود. |
%h |
|
داده به صورت رشته تعبير ميشود. ورودي با يك كاراكتر non_white_space آغاز ميگردد و با اولين كاراكتر white_space خاتمه ميپذيرد (به پايان رشته به طور خودكار كاراكتر "\0" افزوده خواهد شد). |
%s |
|
داده ورودي به صورت عدد صحيح در مبناي 8 تعبير ميشود. |
%0 |
|
داده ورودي به صورت عدد صحيح در مبناي 16 تعبير ميشود. |
%x , %X |
|
داده ورودي اشارهگر تعبير ميشود. |
%p |
مثال 3ـ9 برنامة زير يك خط متن حداكثر به طول 79 كاراكتر را ميخواند و آن را به همان صورت چاپ ميكند.
#include
main () /* read a line of text */
{
char line[80] ;
int count , k ;
/* read in the line */
for (k=0 ; line[k]=getchar ()!=’\n’ ; + +k)
count = k ;
for (k=0 ; k
putchar(line[k]) ;
}
در حلقة for، شمارندة k از صفر شروع ميشود و مقدار آن در هر تكرار يك واحد افزايش مييابد و در هر تكرار يك كاراكتر با تابع getchar از طريق ورودي استاندارد دريافت ميشود و به line[k] نسبت داده ميشود و وقتي كه كاراكتر خط جديد (يعني \n) وارد شد، عمل ورود كاراكترهاي رشته خاتمه مييابد كه در اين لحظه مقدار k برابر تعداد كاراكترهاي واقعي رشته خواهد بود. سپس در حلقة بعدي محتواي آراية line[ ] كه دربردارندة رشتة دريافت شده است چاپ ميگردد (دو تابع getchar و putchar دوباره بررسي خواهد شد). راه ديگر براي ورود رشتهها به حافظة كامپيوتر استفاده از تابع gets است كه در مبحث رشتهها بحث میکنیم.
براي خواندن رشتههايي كه در آنها فضاي خالي (space يا blank) وجود داشته باشد، ميتوان به طريقي از تابع scanf نيز استفاده کرد. براي اين كار ميتوان به جاي كاراكتر تبديل نوع s در رشتة كنترلي، دنبالهاي از كاراكترها را در داخل كروشه به صورت [...] قرار داد كه در اين صورت رشتة مورد نظر هريك از كاراكترهاي موجود در داخل كروشه ازجمله blank را شامل میشود.
با چنين روشي وقتي كه برنامه اجرا ميگردد، تا زماني كه كاراكترهاي متوالي خوانده شده از طريق دستگاه ورودي با يكي از كاراكترهاي موجود در درون كروشهها يكسان باشد، عمل خواندن رشتهها ادامه مييابد. فضاي خالي نيز در داخل رشتهها منظور میشود. به محض اينكه كاراكتري خوانده شود كه در داخل كروشهها وجود نداشته باشد، عمل خواندن خاتمه ميپذيرد. درضمن يك كاراكتر null به طور خودکار به پايان رشته افزوده میشود.
مثال 3ـ10 برنامة زير كاربرد تابع scanf را براي خواندن رشتههايي كه شامل حروف بزرگ و فضاي خالي است نشان ميدهد. طول اين رشته با درنظر گرفتن كاراكتر پايان رشته 80 كاراكتر خواهد بود.
#include
main ()
{
char line[80] ;
..........
scanf("%[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ]", line) ;
..........
}
حال اگر از طريق ورودي، رشتة COMPUTER SCIENCE وارد شود، وقتي كه برنامه اجرا ميگردد، تمامي رشتة مزبور به آراية line نسبت داده ميشود. به هرحال اگر يكي از حروف رشتة مزبور به حرف كوچك تايپ شود، ورود رشته در همان كاراكتر خاتمه ميپذيرد. مثلاً اگر در مثال بالا p بهصورت كوچك تايپ شود، فقط سه حرف com به آراية line نسبت داده ميشود و عمل خواندن در حرف چهارم (حرف p) خاتمه خواهد يافت.
راه ديگر آن است كه به جاي اينكه كاراكترهاي مجاز در رشتة مورد نظر را در داخل كروشه ذكر كنيم، فقط كاراكترهايي را كه مجاز نيستيم در رشتهها به كار ببريم مشخص میکنيم. براي اين كار كافي است كاراكترهاي مورد نظر را به دنبال نماد "^" كه circumflex ناميده ميشود، در داخل كروشه قرار دهيم. يعني در اينجا نقش كاراكترهاي كروشهاي عكس حالت قبلي است و وجود هركدام از آنها در داخل يك رشته موجب قطع ورود بقية كاراكترهاي رشته ميگردد و عمل خواندن رشته خاتمه ميپذيرد.
اگر كاراكتر داخل كروشهها كه بعد از "^" ميآيد، فقط كاراكتر خط جديد "\n" باشد، رشتهاي كه از طريق دستگاه ورودي استاندارد وارد ميشود هر كاراكتر اسكي به جز كاراكتر خط جديد را شامل میشود. بنابراين، كاربر ميتواند هرچه خواست بهعنوان كاراكترهاي رشته وارد كند و در پايان كليد Enter را فشار دهد. اين كليد كاراكتر خط جديد را صادر ميكند و درنتيجه پايان رشته را اعلام خواهد كرد.
مثال 3ـ11 فرض كنيد كه يك برنامة C شامل دستورهاي زير است.
#include
main ()
{
char line[80] ;
..........
..........
scanf("%[^\n]", line) ;
..........
..........
}
وقتي كه تابع scanf در برنامة بالا اجرا ميگردد، رشتهاي به طول نامشخص (ولي حداكثر 79 كاراكتر) از طريق دستگاه ورودي استاندارد وارد ميگردد و به line نسبت داده ميشود. هيچ گونه محدوديتي در مورد كاراكترهاي تشكيلدهندة رشته وجود نخواهد داشت، فقط بايد در يك خط بگنجد. براي مثال رشتة زير از طريق صفحهكليد وارد و به line نسبت داده میشود.
WE LEARN MATHEMATICS.
تابع getchar()
براي خواندن يك كاراكتر از دستگاه ورودي، ميتوان علاوه بر تابع scanf از تابع getchar نیز استفاده کرد. تابع مزبور كه جزء كتابخانة I/O زبان استاندارد C است، كاراكتری از دستگاه ورودي استاندارد که معمولاً صفحهكليد است ميخواند. اين تابع آرگومان ندارد و به طور متعارف در يك دستور انتساب يا جايگذاري به كار میرود و كاراكتر دريافتي از ورودي را به متغيري كه در سمت چپ دستور جايگذاري مورد نظر است اختصاص ميدهد. شکل كلي آن به صورت زير است.
character variable = getchar() ;
= getchar() ; متغير كاراكتري
كه در آن متغير كاراكتري نام متغيري از نوع كاراكتر است كه بايد از قبل توصيف شده باشد.
مثال 3ـ12 به دستورهاي زير توجه کنيد.
char ch ;
ch = getchar() ;
در عبارت اول، متغير ch از نوع كاراكتر توصيف شده است. وقتي كه اجراي برنامه به دستور دوم برسد، برنامه منتظر فشار دادن كليدي از صفحهكليد ميشود. حال كاراكتر كليد فشار داده شده، به متغير ch اختصاص مییابد. چنانچه متغير ch از نوع int معرفي گردد، کد اسكي كاراكتر مربوط به كليد فشار داده شده، به آن متغير اختصاص مييابد.
اگر هنگام خواندن كاراكتر با تابع getchar، شرايط پايان فايل پيش آيد مقدار سمبوليكي EOF به طور خودكار برگشت داده میشود (اين مقدار در داخل فايل stdio.h اختصاص مییابد. به طور متعارف مقدار 1- به EOF اختصاص داده ميشود، اگرچه ممكن است اين مقدار از کامپایلری به کامپایلر ديگر فرق كند). ظاهر شدن EOF بهاين طريق، راه سادهاي براي تشخيص پايان فايل در هنگام اجراي آن است ( در اين مورد، در مبحث فايلها بيشتر بحث خواهیم کرد. لذا به هيچ وجه نگران آن نباشيد). ميتوان تابع getchar را نيز براي خواندن رشتة چند كاراكتري به صورت حلقة تكرار به كار برد كه در هر تكرار یک كاراكتر را بخواند.
تابع putchar()
اين تابع براي شمارش يك كاراكتر روي خروجي استاندارد كه معمولاً صفحه نمايش است به كار میرود و نقش آن مشابه تابع getchar اما در جهت عكس است. طبيعي است كاراكتري كه انتقال مييابد به صورت ثابت كاراكتر يا متغيری از نوع كاراكتر که آرگومان تابع مزبور است به كار میرود. شکل كلي اين تابع به صورت زير است.
putchar (character variable) ;
; (متغير كاراكتري) putchar
البته ميتوان ثابت كاراكتري را نيز به عنوان آرگومان تابع مزبور به كار برد. اين تابع با استفاده از آرايه يک رشته را در خروجي چاپ میکند.
مثال 3ـ13 برنامة زير به تدريج در هر بار يك كاراكتر ميخواند و سپس آن را در خروجي چاپ ميكند.
#include
main ()
{
char ch ;
while (1)
{
ch = getchar() ;
putchar(ch) ;
}
}
در اين برنامه ch كاراكتر اعلان شده است. هر بار كه يك كاراكتر از طريق دستگاه ورودي استاندارد خوانده ميشود، به همان طريق به خروجي انتقال مييابد. اما به لحاظ اينكه عبارت مربوط به while، يعني مقدار داخل پرانتز بعد از while، برابر "1" و هميشه غيرصفر است، براساس قوانين زبان C، اين عبارت هميشه درست يا true است. بنابراين ساختار while(1) حلقهای بينهايت است و تنها راه متوقف ساختن برنامه وقفهای است كه با کليدهاي control-c عملي خواهد شد.
راه ديگر براي نوشتن برنامة بالا به صورت زير است.
#include
main ()
{
int ch ;
while ((ch=getchar()) != EOF)
putchar(ch) ;
}
این برنامه تركيب دو عمل در يك دستور را در حلقه نشان ميدهد. گفتیم EOF در برنامة بالا علامت سمبوليك پايان فايل است. آنچه در واقعيت نشانة پايان فايل را نشان میدهد تابع سيستم است. براي اين كار اغلب عدد 1- به كار میرود، ولي سيستمهاي مختلف ممکن است مقادير متفاوتي داشته باشند. با گنجانيدن فايل stdio.h و به كار بردن ثابت سمبوليكي EOF، برنامه را قابل حمل يا قابل اجرا ساختهايم. يعني، فايل مبنا روي سيستمهاي مختلف بدون تغيير اجرا میشود.
ملاحظه ميكنيد كه در روش اخير، متغير ch به جاي char به صورت int معرفي شده است. هرچه براي نشان دادن پايان فايل به كار میرود، نميتواند مقداري باشد كه يك كاراكتر را معرفي نمايد. حال چون C بهصورت int معرفي شده است، ميتواند مقادير تمام كاراكترهاي ممكن و همين طور مقدار ويژة EOF را نگهداري کند.
همان طور كه گفتیم، هر دو تابع getchar و putchar در فايل stdio.h تعريف شدهاند و ممكن است در بعضي سيستمها در فايلهاي ديگري نيز مانند فايل conio.h تعريف شده باشند.
مثال 3ـ14 برنامة زير يك خط متن را از ورودي با حروف كوچك دريافت و آن را به حروف بزرگ تبديل ميكند.
#include
main ()
{
char line[80] ;
int count , k ;
/* read in the line */
for (k=0 ; (line[k]=getchar())!=’\n’ ; + + k) ;
count = k ;
/* write out the line in upper-case */
for(k=0 ; k
putchar(toupper(line[k])) ;
}
در برنامة بالا از حلقة for و تابع کتابخانهاي toupper استفاده شده است. نقش اين تابع آن است كه حروف كوچك را به بزرگ تبديل ميكند. بنابراين اگر حروف ورودي هنگام تايپ حروف بزرگ يا ارقام و مشابه آن باشند، به شکل اولية خود نمايش داده خواهند شد. براي مثال اگر ورودي به صورت Advanced programming باشد، خروجي به صورت ADVANCED PROGRAMMING خواهد بود.
مثال 3ـ15 برنامة زير يك خط از متن را ميخواند و در آن هر كاراكتر را (به غير از كاراكتر فضاي خالي يا space) به كاراكتر بعدي تبديل ميكند و نمايش ميدهد (درواقع متن را به شکلی به صورت رمز در ميآورد و نمايش ميدهد).
#include
#define space ’ ’
main ()
{
char ch ;
ch = getchar () ; /* read a character from i/o */
while(ch!=’\n’) /*while not end of line */
{
if (ch= =space) /* leave the space */
putchar(ch) ; /* character unchanged */
else
putchar(ch+1) ; /* change other characters */
ch = getchar() ; /* get next character */
}
}
برای مثال اگر computer science2 ورودي باشد، خروجي dpnqvufs tdjfodf3 خواهد بود.
با تركيب دو دستور خواندن و تست كردن پايان متن در يك عبارت، برنامة مزبور را ميتوان به صورت ساده و فشردهتر زير نوشت.
#include
#define space ’ ’
main ()
{
char ch ;
while ((ch=getchar()) != ’\n’)
{
if (ch = = space) /* leave the space */
putchar(ch) ; /* character unchanged */
else
putchar(ch+1) ; /* change other characters */
}
}
که در اين برنامه دستور while ((ch=getchar()) != ’\n’) تركيب دو عمل در يك دستور را نشان ميدهد كه روشی متداول در زبان C است. اين دو عمل آن است كه اول به كمك تابع getchar مقداري به ch نسبت داده ميشود و سپس مقدار ch با كاراكتر خط جديد مقايسه میشود. وجود پرانتز دور عبارت ch = getchar() آن را اپراند چپ اپراتور != ميسازد. اگر آن را حذف كنيم نتيجة مطلوب به دست نميآيد زيرا اپراتور != نسبت به اپراتور = تقدم بالاتري دارد. بنابراين اگر دستور مزبور را به صورت while (ch = getchar()!= ’\n’) بنويسيم، اول عبارت ’\n’ getchar()!= ارزيابي ميشود كه عبارتی رابطهاي است (بنابراين كاراكتر خط جديد برنميگرداند، بلكه يك مقدار برميگرداند) كه ارزش آن يك يا صفر (درست يا نادرست يعني true يا false) خواهد بود. سپس اين مقدار به ch نسبت داده ميشود كه هدف مورد نظر ما را از دستور مزبور تأمين نميكند.
مثال 3ـ16 برنامة زير كاراكترها را از طريق ورودي صفحهكليد دريافت ميكند و آنها را به صفحة نمايش ميفرستد. اين برنامه با دريافت كاراكتر $ از ورودي خاتمه ميپذيرد.
#include
main ()
{
char ch ;
while ((ch=getchar()) != ’$’)
putchar(ch) ;
}
در اين برنامه نيز از ترکيب دو دستور در يک دستور در درون حلقة while استفاده شده است.
در زبان C علاوه بر تابع getchar دو تابع getch و getche نيز براي خواندن يك كاراكتر از ورودي به كار ميرود که در ادامه بررسي میکنیم.
تابع getche()
اگر بخواهيم كاراكتري به كمك تابع scanf يا تابع getchar خوانده شود، بايد پس از تايپ كاراكتر مورد نظر، كليد Enter را نيز استفاده کنیم. يعني، درواقع دو تابع مزبور تا موقعي كه كليد برگشت (كه به آن carriage return يا به اختصار CR گویند) فشرده نشود ورودي را در بافر نگه ميدارند. پس از زدن كليد برگشت، دادة تايپ شده در اختيار برنامه قرار ميگيرد. حسن اين روش آن است كه اگر كليدي را اشتباه وارد كرده باشيم، ميتوانيم آن را با backspace تصحيح كنيم. يعني، قبلي را پاك كنيم و دوباره كاراكتر صحيح مورد نظر را تايپ كنيم. عيب اين كار آن است كه اين عمل در محيط محاورهاي امروز وقتگير و دردسرزاست. ازاين رو تابع getche بهوجود آمد كه در آن ديگر نيازي به تحرير كليد برگشت يا CR نيست. اشكال اين تابع آن است كه اگر كاراكتر اشتباه تحرير شود امكان تصحيح وجود ندارد. همچنين كاراكتر تحرير شده، روي صفحة تصوير نمايش داده ميشود كهاين عمل echoing ناميده ميشود. در واقع حرف e در آخر نام تابع getche به مفهوم echo (عكسالعمل) است.
تابع getch()
اين تابع همانند تابع getche است با اين تفاوت كه كاراكتر تحرير شده در صفحة تصوير ظاهر نميگردد. در مورد هريك از اين سه تابع وقتي كه كنترل اجراي برنامه به اين توابع ميرسد، برنامه منتظر فشردن كليدي در صفحهكليد ميشود. اگر متغير مورد نظر از نوع كاراكتري باشد، يعني در برنامه با فرمت %c توصيف شده باشد، مقدار كاراكتري كليد فشرده شده بهاين متغير نسبت داده ميشود و درصورتي كهاين متغير از نوع عددي باشد کد اسكي كاراكتر مربوط به كليد فشرده شده در اين متغير قرار ميگيرد.
توابع puts() و gets()
اين دو تابع اين امكان را فراهم ميسازند كه بتوان رشتههايي از كاراكترها را از طريق كنسول خواند يا در خروجي نوشت (دستگاههاي ورودي و خروجي استاندارد را كنسول نامند كه در مورد ريزكامپيوترها معمولاً صفحهكليد ورودي استاندارد و مانيتور خروجي استاندارد را تشكيل ميدهند).
تابع gets() يك رشته از كاراكترها را كه از طريق صفحهكليد وارد ميشود، ميخواند و آنها را در آدرسي قرار ميدهد كه با آرگومانهاي آن تعيين شده است و اشارهگری كاراكتری است. كاراكترهاي رشتة مورد نظر را تايپ ميكنيد و در پايان، كليد Enter را میزنید. با اين عمل به طور خودكار كاراكتر null يا ’\0’ نيز در پايان رشته قرار میگیرد. در اينجا اگر كاراكتری اشتباه تايپ شود، ميتوان آن را قبل از فشردن كليد Enter با استفاده از كليد backspace تصحيح كرد. در واقع در اينجا نيز كاراكترهاي تايپ شده در بافر ميماند و تا موقعي كه كليد برگشت فشرده نشده است در اختيار برنامه قرار نميگيرد.
تابع puts() آرگومانهاي رشتهاي خود را به صفحه نمايش ميفرستند و سپس قلم نوشتار به خط جديد انتقال مييابد.
مثال 3ـ17 برنامة زير رشتهاي را از طريق صفحهكليد ميخواند و در آراية line قرار ميدهد. سپس آن را روي خروجي نمايش ميدهد.
#include
main()
{
char line[80] ;
gets(line) ;
puts(line) ;
}
فراخواني تابع puts در مقايسه با فراخواني printf داراي overhead كمتري است و درنتيجه سريعتر از آن عمل ميكند زيرا تابع puts فقط يك رشته از كاراكتر را به خروجي میفرستد و نميتواند مشابه printf تبديل فرمت انجام دهد. همچنين نميتواند مقادير عددي را به عنوان خروجي داشته باشد. بنابراين چون puts فضاي كمتري ميگيرد و سريعتر از printf اجرا ميگردد، هنگامي كه در برنامهسازي حالت خيلي بهينه مورد نظر باشد، از اين تابع استفاده ميشود.
خودآزمایی 3
1. برنامهاي بنويسيد كه با استفاده از تابع printf و تابع puts رشتة زير را در دو خط جداگانه چاپ کند.
"Payam noor university"
2. برنامهاي بنويسيد كه كاراكتري از ورودي بخواند و کاراکتر بعدي آن را در خروجي چاپ كند.
3. برنامهاي بنويسيد كه عدد صحيح m1 وعدد اعشاري m2، اطلاعات كاراكتري و آدرس متغير m3 را در خروجي چاپ كند.
4. خروجي برنامة زير چيست ؟
# include < stdio. h>
main ()
{
double x ;
x = 2e + 004 ;
printf ("\n x1 = %e" , x) ;
printf ("\n x2 = %E" , x) ;
printf ("\n x3 = %g" , x) ;
}
5. خروجي برنامة زير چيست ؟
# include < stdio. h>
main ()
{
float x = 123.456 ;
printf ("%f %.3f %7.2f" , x , x , x) ;
}
6. برنامهاي بنويسيد كه سه عدد صحيح را از ورودي بخواند و ميانگين آنها را چاپ کند.
7. برنامهاي بنويسيدكه دو متغير صحيح را از ورودي بخواند و محتويات آنها را بدون استفاده از متغير كمكي عوض کند و نتيجه را در خروجي نمايش دهد.
8. برنامهاي بنويسيد كه سن شما را برحسب روز از ورودي بخواند و مشخص كند كه چند سال، چند ماه، چند هفته و چند روز دارید.
.....
فصل سوم
شرح و کنترل فرآیند
- تمام نیازمندی های اصلی که سیستم عامل باید پاسخگو باشد به وسیله فرایند قابل یبان است.
سیستم عامل باید در بین اجرای فرآیند قرار گیرد.
سیستم عامل باید با بهره گیری از یک سیاست خاص منابع در اختیار سیستم قرارداده واز وقوع بن بست جلوگیری کند.
سیستم عامل بلید از ارتباط بین فرایند هاو ایجاد فذایندها توسط کاربر حمایت کند.
حالات فرآیند:
- اساسی ترین عمل پردازنده اجرای دستورالعمل های موجود در حافظه است.
- اجرا شامل دنباله ای از دستورالعمل های همان برنامه است.
به اجرای یک فرایند خاص فرایند یا وظیفه گویند.
- رفتار یک فرآیند به خصوص را می توان با فهرست کردن دنباله دستورالعمل ها یی که برای آن فرآیند اجرا می شود مشخص نمود که به آن رد آن فرآیند گویند.
- مسئولیت اصلی سیستم عامل کنترل یک فرآیند است.
- یک فرآیند ممکن است در یکی از دو حالت اجرا وغیر اجرا باشد.
- وقتی یک سیستم عامل فرآیندی را دریافت می کند آن را در حالت غیر اجرا قرار می دهد.
- پس از رسیدن نوبت فرآیند فعلی را به حالت غیر اجرا برده و فرآیند را به حالت اجرا برده.
- در مورد هر فرآیندی باید اطلاعاتی را ذخیره کرد.
- فرآیندی که در حال اجرا نیست باید در صفی به انتظار نوبت قرار گیرد.
- گاهی صفی است که حاوی جداولی است که وضعیت فرآیند ها را نمایش می دهد.
- وقتی یک فرآیند در معرض وقفه قرار می گیرد به صف انتظار می رود.
- اگر یک فرآیند کارش تمام شود کنار گذاشته می شود.
نمو دار تغییر حالت:
نمودار صف بندی:
ایجاد و پایان فرآیند:
عمر یک فرآیند محدود به زمان ایجاد تا زمان خاتمه دادن به آن است.
در هنگام ایجاد سیستم عامل ساختمان داده مربوط به آن فرآیند را ساخته و فضای آدرس مربوط به آن را تخصیص می دهد.
معمولا چهار حادثه موجب به ایجاد فرآیند می گردد:
1-در محیط دسته ای: یک فرآیند جدید در پاسخ به یک کار
2-برقراری ارتباط محاورهای: کار از طریق پایانه با سیستم ارتباط برقرار کند
3-ارائه یک خدمت به وسیله سیستم عامل: فرآیندی را برای خدمت ایجاد کند
4-زایش توسط فرآیند موجود: برای بهره گیری از توازی یا تفکیک.
پایان فرآیند:
هر کار دسته ای باید حاوی دستورالعمل توقف یا فراخوانی صریح یک خدمت سیستمی برای پایان باشد.
در بعضی از سیستم عامل ها ممکن است فرآیندی به وسیله فرآیند ایجاد کننده اش و با پایان فرآیند پدرش نیز پایان یابد.
زایش فرزند:
فرآیندی با درخواست فرآیند دیگر به وجود می آید
فرزند:
فرایند زاینده را پدر و فرایند ایجاد شده را فرزند گویند
انواع خطا:
خطای محاسباتی: محاسبات غیر مجاز
گذشت زمان: بیش از حد برای بروز حادثه منتظر مانده
خطای ورودی و خروجی
و...
پنج حالت ممکن برای فرآیند:
اجرا : فرآیندی هم اکنون در حالت اجرا است.
آماده : با گرفتن فرصت به اجرا درمی آیند.
مسدود: با تمام شدن وقت و یا بروز حادثه اتفاق می افتد.
جدید: فرآیندی که هم اکنون ایجاد شده.
خروج: به علت دستور توقف یا به دلیلی قطع شده.
مدل پنج حالته برای فرایند:
انواع حوادثی که منجر به تغییر حالت شده:
تهی آماده: فرایند جدیدی را برای اجرای یک برنامه ایجاد می کند.
جدید آماده: آمادگی برای گرفتن یک برنامه.
<آماده اجرا: زمان انتخاب یک فرآیند رسیده.
اجرا خروج: فرآیند جاری اعلام می کند که تمام شده. اجرا آماده: اتمام زمان مجاز برای یک فرآیند .
(متداولترین)
اجرا مسدود:درخواست یکمنبع با انتظار.
مسدود آماده:حادثه مورد نظر اتفاق افتاده.
آماده خروج:با تصمیم پدر.
مسدود خروج:توضیح تغییر حاتت قبل در اینجا نیز صادق است.
در اکثر اوقات پردازنده بی کار می ماند برای این کار راه حل های زیر پیشنهاد می شود:
1- حافظه اصلی را گسترش داد: كه دو عیب دارد:
1-با افرایش هزینه همراه است.
2-درخواست برای حافظه زیاد شده.
2- مبادله: انتقال بخشی از یک فرآیند به دیسک.
هنگامی که هیچ یک از فرآیند ها در صف آماده نيستند منع لازم را دریافت نکرده به حالت معلق می روند. و فرآیند ديكري ازحالت معلق به حات آماده برده و اجرا می شود.
عیب:
مبادله یک ورودی وخروجی است.
امتیاز:
ورودی و خروجی عموما سریعتر از سیستمی است و باعث افزایش کارایی می شود.
فرآیند معلق:
فورا آماده اجرا نیست.
یک فرآیند ممکن است منتظر یک حادثه باشد یا نباشد.
توسط عاملی در حالت معلق گذاشته شده تا از اجرای آن جلوگیری کند.
منتظر فرمان باشد.
دلایل تعلیق فرآیند:
مبادله: سیستم عامل نیاز به حافظه کافی دارد.
دلایل دیگر سیستم عامل: فرآیندی را که سودمند یا لازم و... است را معلق کند.
درخواست کاربر محاورهای: کاربر به منظور استفاده از منبع برنامه را معلق کند.
ترتیب زمانی: فرآیند به طور دوره ای اجرا شود.
درخواست فرآیند پدر: فرآیند فرزند زا به تعلیق بیندازد.
ساختارهای کنترلی سیستم عامل:
برای کنترل فرآیندها باید اطلاعات مربوط به فرآیند در جدولی ذخیره شود.تمام سیستم عامل ها اطلاعات در جهار گروه ذخیره می کنند.
از جداول حافظه برای دنبال کردن اطلاعات حافظه اصلی و ثانویه استفاده می کنند ، قسمتی برای سیستم عامل و یقیه برای فرآیند
جداول حافظه بايد حاوی اطلاعات زیر باشد:
1-تخصیص حافظه اصلی به فرآیند.
2- تخصیص حافظه ثانویه به فرآیند.
3-ویژگی های حفاظتی فرآیند.
4-اطلاعات مورد نیاز برای مدیریت حافظه مجازی.
انواع جداول:
جداول ورودی / خروجی: برای نگهداری و مدیریت دستگاه های ورودی وخروجی و... استفاده می شود.
جداول پرونده: اطلاعات مربوط به پرونده های موجود،محل آنها در حافظه ثانویه ،وضعیت جاری و...نگهداری کنند.
جداول فرآیند: مدیریت فرآیندها استفاده می شود.
ساختار کنترلی فرآیند:
هر فرآیند دارای یک صفات است که معمولا همراه آن به سیستم عامل می آید که به مجموعه این صفات بلوک کنترل فرآیند می گویند.
به مجموعه داده برنامه،داده ها ،پشته وصفت ،تصویر فرآیند می گویندو محل آن به مدیر حافظه بستگی داردو در حافظه ثانویه نگهداری می شود و برای اجرا باید به حافظه اصلی به رود.
اجزای متداول تصویر یک فرآیند:
داده های کاربر: بخش قابل تغییر فضای کاربر.
برنامه کاربر: برنامه ای که قرار است اجرا شود.
پشته سیستم: برای ذخیره پارامترها و آدرس و...
بلوک کنترل فرآیند: اطلاعات لازم برای کنترل فرآیند.
اطلاعات مربوط به یک بلوک فرآیند حاوی:
1- شناسایی فرآیند
2-اطلاعات وضعیت پردازنده
3-اطلاعات کنترل فرآیند
1-شناسایی فرآیند: یک شناسه عددی یکتا نسبت می دهند.
مزایای شناسه:
مراجعات به جداول تحت کنترل است.
از طریق شناسه می توان پی به بر قراری ارتباط بین فرآیندها برد.
به فرآیندی یک شناسه کاربر نسبت داد.
2-اطلاعات وضعیت پردازنده:
محتوی ثباتهای پردازنده می باشد.
برای اطلاعات وضعیت می باشد.(PSW)
حاوی کد شرایط و دیگر اطلاعات است.
3-اطلاعات کنترل فرآیند:
بلوک کنترل فرآیند گفته می شود.
موجب ایجاد هماهنگی بین فرآیندهای فعال می شود.
نقش بلوک کنترل فرآیند:
بلوک کنترل فرآیند نقش مهم در ساختمان سیستم عامل دارد.
وضعیت سیستم را تعریف می کند.
از شناسه یکتای فرآیند به عنوان شاخص استفاده می کنند.
مشكلات بلوك كنترل فرايند دارای برای حفاظت
1- وجود اشکال در یک بلاک منجر به لطمه زدن به تمام بلاک ها می شود.
2- تغییر در یک بلوک منجر به تغییر در بسیاری از مولفه ها می شود.
کنترل فرآیند:
حالت اجرا:
- به سیستم عامل مربوط می شود.
- بعضی از دستورات تنها در حالت ممتازتر قابل اجرا هستند.
- به حالت کم امتیازتر حالت کاربر می گویند.
به حالت متمایز،حالت سیستم ،حالت کنترل یا حالت هسته گویند که نرم افزار کنترل بردازنده ؛ دستورالعملها؛ ثباتها ؛ حافظه را دارد.
در ثبات PSW یک بیت برای حالت اجرا وجود دارد که بیت حالت به بیت هسته واگذار می شود و دستورالعمل حالت را تغییر می دهد.
ایجاد فرآیند:
تخصیص شناسه یکتا به فرآیند.
تخصیص فضا برای تمام اجزای تصویر فرآیند.
بلوک کنترل فرآیند مقدار گذاری می شود.
برقراری پیوندهای لازم.
ایجاد وگسترش ساختمان داده های دیگر.
تعویض فرآیند:
ابتدا باید وقفه های سیستم را در نظر بگیریم که به نوع دیگر تله می باشد.
وقفه نوع اول : مستقل از فرآیند در حال اجرا حاصل می شود.
وقفه نوع دوم : به خطا یا شرایط استثنایی مربوط است.
با هر وقفه معمولی،ابتدا کنترل به یک گرداننده وقفه منتقل می شود و به یک روال که مخصوص سیستم عامل آن وقفه است منتقل می شود.
وقفه ساعت: فرایند جاری تعویض و فرآیند دیگر بار گذاری
وقفه ورودی /خروجی: دادن ورودی /خروجی به یک فرایند.
نقص حافظه: اشتباه بودن آدرس.
تغییر حالت فرآیند:
ذخیره سازی متن پردازنده.
بهنگام سازی بلوک های کنترل فرایندی در حالت اجرا.
انتقال بلوک فرآیند مربوط به این فرآیند به صف مناسب.
انتخاب فرآیند دیگر برای اجرا.
بهنگام سازی بلوک های کنترل فرایند انتخاب شده.
بهنگام سازی ساختمان داده های مدیریت حافظه .
بار گذاری مجدد متن پردازنده.
مدیریت فرآیند در UNIX SVR4:
بخش اعظم سیستم عامل ،در داخل محیط یک فرآیند کاربردی اجرا می شود.
از دو گروه فرآیند سیستمی و کاربردی استفاده می کند.
فرایند های سیستمی در کد هسته اجرا می شود.
فرآیند های کاربر در حالت کاربر برای اجرای برنامه های کاربر.
حالات فرآیند در UNIX:
اجرای کاربر
اجرای هسته
آماده در حافظه(بعد از زمانبندی حافظه)
خفته و در حافظه(تا بروز حادثه قابل اجرا نیست)
آماده اجرا و مبادله شد(به حافظه اصلی منتقل می شود)
قبضه شده(از هسته به کاربر می رود)
ایجاد شده(برای اجرا آماده نیست)
جادویی(فرآیندی دیگر وجود ندارد)
تصویر فرآیند در :UNIX
هر فرآیند مجموعه ای از ساختمان داده هایی است که تمام اطلاعات لازم برای مدیریت و توزیع وقت پردازنده و فرآیند را در اختیار سیستم عامل قرار میدهد.
جدولی که در صفحه بعد وجود دارد،عناصر تصویر فرآیند را که سه بخش متن سطح کاربر،متن ثابت و متن سطح سیستم سازماندهی شده ،خلاصه کرده است.
متن سطح کاربر:حاوی عناصر پایه ای کاربر است.
متن ثابت:هنگامی که فرآیندی در حال اجرا نیست در آن ذخیره می شود.
متن سطح سیستم : حاوی اطلاعاتی برای مدیریت سیستم است و شامل یک بخش پویا و یک بخش ایستا است.
|
متن سطح کاربر دستورات قابل اجرا داده های قابل دستیابی حاوی نشانوند و ... کاربر حافظه مورداشتراک با دیگر |
متن فرایند داده های فرآیند پسته کاربر حافظه مشترک |
|
متن ثابت آدرس دستورالعمل کار بعدی حاوی وضعیت سخت افزار در زمان قبضه به بالای پشته کاربر یا هسته اشاره دارد وابسه یه سخت افزار |
شمارنده برنامه ثبات وضعیت پردازنده اشاره گر پشته ثباتهای همه منظوره |
|
متن سطح سیستم وضعیت فرایند را تعریف می کند اطلاعات کنترل فرایند نگاشت از حافظه مجازی به آدرس فیزیکی حاوی قاب پشته |
مدخل جدول فرآیند ناحیه کاربر جدول منطق هر فرآیند پشته هسته |
مدخل جدول فرآیند در UNIX:
اطلاعات کنترل فرآیند که همواره در دسترس هسته است را در بردارد.
در حافظه اصلی قرار دارد.
ناحیه کاربر(یا ناحیه U)حاوی اطلاعات اضافی کنترل است.
این اطلاعات موقع صفحه بندی در حافظه اصلی قرار می گیرد.
هسته UNIX همیشه در متن فرآیندی اجرا می گردد.
جدول بعدی نمایشگر این اطلاعات خواهد بود.
|
حالت فعلی به ناحیهUو ناحیه فرآیند فضا را به سیستم عامل نشان می دهد کاربر مسئول را مشخص می کند شناسه پدر مقدار گذاری می شود به حات آماده می رود(در حات خفته) زمانبدی فرآیند شمارش علامتهای رسیدگی نشده زمان اجرای فرآیند و استفاده منبع و... اشاره به عنصر بعدی تصویر یا انتقال فذآیند به حافظه اصلی |
وضعیت فرآیند اشاره گر ها اندازه فرآیند شناسه های کاربر شناسه های فرآیند توصیفگر حادثه اولویت علامت زمان سنج ها پیوند P وضعیت حافظه |
ناحیه Uدر UNIX:
|
مبین مدخلی که به ناحیه U مربوط است شناسه واقعی کاربر زمان لازم برای اجرا عکس اتعمل های فرآیند را مشخص می کند مبین پایه برقراری ارتباط پایانه با کامپیوتر برای کاربر خطا ها زا ثبت می کند حاوی نتیجه فراخوانی مقدار داده که باید منتقل شو د و... جدول راهنمای جاری و... پرونده های باز شده را ثبت می کند اندازه پرونده و فرآیند را که می توانید بنویسید را محدود می کند حالت پرونده های ایجاد شده را تنظیم می کند |
اشاره گر جدول فرآیند شناسه های کاربر زمان سنج ها آرایه گرداننده فرآیند پایانه کنترل فیلد خطا مقدار بازگشت پارامتر های I/O پارامترهای پرونده جدول توصیفگر پرونده کاربر فیلد های حد فیلد های حالت مجاز |
کنترل فرآیند:
ایجاد فرآیند توسط FORK( ) که یک فراخوان هسته سیستم است انجام می شود و اعمال زیر انجام می شود:
6- شماره شناسه فرزند را پدر و مقدار صفر می دهد.
تمام این اعمال در حات هسته فرآیند پدر انجام می شود.
وموقع توزیع فرآیند یکی از اعمال زیر انجام می شود:
1-ماندن در فرآیند پدر.
2-انتقال کنترل به فرآیند فرزند.
3-انتقال کنترل به فرآیند دیگر.
Intel 486™ DX CPU

Design 1986 – 1989
25 MHz, 33 MHz
1.2 M transistors
1.0 micron
5 stage pipeline
Unified 8 KByte code/data cache (write-through)
First IA-32 processor capable of executing 1 instruction per clock cycle
Pentium® Processor

Design 1989 – 1993
60 MHz, 66 MHz
3.1 M transistors
0.8 micron
5 stage pipeline
8 KByte instruction and 8 KByte data caches (writeback)
Branch predictor
Pipelined floating point
First superscalar IA-32: capable of executing 2 instructions per clock
Pentium® II Processor

Design 1995 – 1997
233 MHz, 266 MHz, 300 MHz
7.5 M transistors
0.35 micron
16 KByte L1I, 16 KByte L1D, 512 KByte off-die L2
First compaction of P6 microarchitecture
Pentium® III Processor (Katmai)

Introduced: 1999
450 MHz, 500 MHz, 533 MHz, 600MHz
9.5 M transistors
0.25 micron
16 KByte L1I, 16 KByte L1D, 512 KByte off-chip L2
Addition of SSE instructions.
SSE: Intel Streaming SIMD Extensions to the x86 ISA
Pentium® III Processor (

Introduced: 1999
500MHz … 1133MHz
28 M transistors
0.18 micron
16 KByte L1I, 16 KByte L1D, 256KByte on-chip L2
Integrate L2 cache on chip, It topped out at 1GHz.
Pentium® IV Processor

Introduced: 2000
1.3GHz … 2GHz … 3.4GHz
42M … 55M … 125 M transistors
0.18 … 0.13 … 0.09 micron
Latest one: 16 KByte L1I, 16 KByte L1D, 1M on-chip L2
Very high clock speed and SSE performance
Intel® Itanium® Processor
Design 1993 – 2000
733 MHz, 800 MHz
25 M transistors
0.18 micron
3 levels of cache
16 KByte L1I, 16 KByte L1D
96 KByte L2
4 MByte off-die L3
Superscalar degree 6, in-order machine
First implementation of 64-bit Itanium architecture
Intel® Itanium 2® Processor

Introduced: 2002
1GHz
221 M transistors
0.18 micron
3 levels of cache
32 KByte I&D L1
256 KByte L2
integrated 1.5MByte L3
Based on EPIC architecture
Enhanced Machine Check Architecture (MCA) with extensive Error Correcting Code (ECC)
یک بازبینی از جریان طراحی پردازنده
چگونه یک CPU طراحی می شود
• طراحی معماری مجموعه دستورالعمل (ISA design)
• طراحی در سطح وظایف (function-level) RTL design
• طراحی در سطح اجزاء ترکیب دهنده
• طراحی gate-level/switch-level
• طراحی در سطح مدار
روش کلاسیک طراحی مرحله ای معماری مجموعه دستورالعمل
• انتخاب یک الگوی ساخت A
• تعریف A برای تطبیق با:
• کارایی مورد تقاضای جدید و تکنولوژی جدید
• ارزیابی (شبیه سازی معماری مجموعه دستورالعمل)
• تکرار تا کسب رضایت
کل استراتژی شبیه سازی
1.شبیه ساز در سطح دستورالعمل (ISA): این روش برای ارزیابی کارایی در سطح مجموعه دستورالعمل برای شرح بیشتر مدل سازی استفاده می شود.
2.شبیه سازی در سطح سیستم: مدلهای این شبیه ساز جزئیات مربوط به محیط سیستم شامل برخی چیزها مانند وقفه ها و مدیریت حافظه را مدل سازی می کند.
کارایی شبیه سازها

کارایی دستورالعمل بر چرخه (IPC)
• ایجاد مدل کارایی که:
- قابل انعطاف
- پذیرای پارامتر(Parameterized ) از طریق دستگیره
- دارای دقت ساعت در مقایسه با RTL برابر با 95% باشد
- به صورت قابل توجهی سریعتر از RTL
• مدلها مرکب از دو بخش هستند.
- شبیه ساز مجموعه دستورالعمل -> اجرا کننده محک(benchmark)
- شبیه ساز خط لوله -> “حسابدار” برای چرخه های ساعت
• سرعت های شبیه سازی
• اجرای محک ها(benchmark)، به روز رسانی ریز معماری بر طبق آن
• چرخۀ : کد -> شبیه ساز -> characterize -> وفق دادن(tune)
ادامه مبحث حافظه جانبي و نرم افزار سيستم
زمان پيگرد عبارت است از زمان لازم انتقال بازوي دستيابي ،به سيلندر مناسب.
تأخير در چرخش عبارت است از زمان لازم براي چرخش ديسک ،تا سکتور مورد نظر زير هد خواندن/نوشتن قرار گيرد.
علي رغم افزايش کارايي ديسک ها ،سرعت شبکه ها به حدي بالا رفته است که دستيابي به ديسک غالباً تنگناي مهمي در کل سيستم I/O به شمار مي رود.
چند تکنيک براي مقابله با اين مشکل وجود دارد :
۱) نواربندي
۲) استفاده از ديسک RAM
۳) حافظه نهان
نوارهاي مغناطيسي به دستگاه هايي تعلق دارند که دستيابي مستقيم به داده ها را فراهم نمي آورند ولي دستيابي ترتيبي به سرعت انجام مي شود. نوارها فشرده اند ،شرايط محيطي متفاوت را خوب تحمل مي کنند،نگهداري و حمل آنها آسان است و ارزانتر از ديسک ها هستند.
نقاط قوت CD-ROM شامل ظرفيت ذخيره سازي بالا،بهاي کم و دوام آن است. نقطه ضعف اصلي آن اين است که جستجو در CD-ROM بسيار کند است،يعني غالباً هر جستجو نيم تا يک ثانيه طول مي کشد.
در قالب سرعت خطي ثابت (CLV) ،سرعت چرخش ديسک هنگام خواندن لبه هاي بيروني ،کندتر از هنگام خواندن لبه هاي داخلي است.
در سرعت زاويه اي ثابت (CAV) ،ديسک با شيارهاي متحدالمرکز و سکتورهاي مدور خود ،داده ها را با تراکم کمتري در شيارهاي خارجي نسبت به شيارهاي داخلي مي نويسد.
بافر I/O سيستم ،به مديريت فايل اين امکان را مي دهد تا داده ها را در واحدهايي به اندازه سکتور يا بلوک بخواند يا بنويسد.
عمل کنترل عمليات ديسک توسط دستگاهي انجام مي شود که کنترلگر ديسک ناميده مي شود.
سيستم هاي I/O تقريباً هميشه حداقل دو بافر دارند. يکي براي ورودي و ديگري براي خروجي. برخي سيستم هاي فايل از يک طرح بافردهي موسوم به استخر بافري (buffer spooling) استفاده مي کنند.
با پراکنش ورودي ،با يک بار خواندن ،نه يک بار بافر بلکه مجموعه اي از بافرهايي که داده هاي يک بلوک بايد در آن ها پخش شود شناسايي مي شود.
با تمرکز خروجي ،چند بافر را مي توان گردهم آورد و يکباره بر روي همه آنها نوشت ،بدين ترتيب لازم نيست آنها را در يک بافر خروجي کپي کرد.
هسته به نوبت به اين چهار جدول زير مراجعه مي کند تا اطلاعاتي را که براي نوشتن در فايل موجود در ديسک نياز دارد به دست آورد :
۱) جدول توصيف گر فايل
۲) جدول فايل هاي باز
۳) جدول تخصيص فايل
۴) جدول گره هاي انديسي
اشاره گري از يک فهرست به اينود فايل را اتصال سخت (hard link) مي نامند و اتصال نرم (soft link) يا اتصال سمبوليک ، نام فايل را به جاي فايل واقعي ،به يک نام فايل ديگر مرتبط مي سازد.
سه نوع سيستم I/O متفاوت داريم :
۱) سيستم I/O بلوکي
۲) سيستم I/O کاراکتري
۳) سيستم I/O شبکه اي
براي هر دستگاه جانبي مجموعه اي از روال هاي جداگانه وجود دارد که راه انداز دستگاه ناميده مي شود.
مفاهيم اساسي ساختار فايل
واحد اصلي داده ها،فيلد است که حاوي يک مقدار داده است.
فيلدها به صورت مجموعه اي از داده ها يا به صورت کپي هاي متعددي از يک فيلد (آرايه) يا ليستي از فيلدهاي متفاوت (رکورد)سازماندهي مي شوند.
هنگامي که رکوردي در حافظه نگهداري شد آن را يک شيء و فيلدهاي آن را اعضاي آن مي نامند.
راههاي فراواني براي افزودن ساختار به فايل وجود دارد تا هويت فيلد حفظ شود.
چهار روش متداول عبارتند از :
۱) ثابت کردن طول فيلدها
۲) قرار دادن نشانگر طول فيلد در ابتداي هر فيلد
۳) جدا کردن فيلدها با فاصل
۴) استفاده از عبارت کليدي براي شناسايي فيلدها
رکورد مجموعه اي از فيلد ها است و مجموعه اي از رکوردها فايل را نشان مي دهند.
بعضي از روش هاي سازماندهي رکوردهاي فايل عبارتند از :
۱) قابل پيش بيني کردن طول رکوردها بر حسب بايت
۲) قابل پيش بيني کردن طول رکوردها بر حسب فيلدها
۳) شروع هر رکورد با نشانگر طول
۴) استفاده از انديس براي نگهداري آدرس ها
۵) قرار دادن فاصل در انتهاي هر رکورد
دو روش براي نمايش طول رکورد وجود دارد :
۱) طول رکورد به صورت يک عدد صحيح دو بايتي ، قبل از هر فيلد ديگر رکورد نوشته شود.
۲) تبديل طول به يک کاراکتر رشته اي با استفاده از خروجي فرمت بندي شده
با روبرداري فايل مي توان بايت هاي واقعي نگهداري شده در آن را مشاهده کرد.
C++ وراثت را در اختيار قرار مي دهد تا چندين کلاس مي توانند از اعضا و متدهاي مشترک استفاده کنند.
مديريت فايلهايي از رکوردها
هنگامي که کارايي جستجوهاي انجام شده در حافظه الکترونيکي را توصيف مي کنيم معمولاً از تعداد مقايسه هاي مورد نياز براي جستجو ،به عنوان واحد کار استفاده مي کنيم.
به طورکلي ،کار مورد نياز براي جستجوي ترتيبي ، در فايلي با n رکورد با n متناسب است :
حداکثر n مقايسه و به طور ميانگين n/2 مقايسه مورد نياز است.
در تحليل و بحث درباره بلوک بندي رکورد چند چيز را بايد مورد توجه قرار داد :
۱) گرچه بلوک بندي مي تواند منجر به بهبود چشمگير کارايي شود ،مرتبه عملکرد جستجوي ترتيبي را تغيير نمي دهد.
۲) بلوک ساري ،اختلاف ميان سرعت دستيابي در حافظه و زمان دستيابي در حافظه ثانويه را نشان مي دهد.
۳) بلوک سازي تعداد مقايسه هايي را که بايد در حافظه انجام شوند ،تغيير نمي دهد و احتمالاً مقدار داده هاي انتقال يافته ميان حافظه و ديسک را افزايش مي دهد.
۴) با بلوک سازي ،در زمان صرفه جويي مي شود زيرا مقدار جستجو کاهش مي يابد.
جستجوي ترتيبي براي اکثر شرايط بازيابي زمان بسيار مي برد.
اين که آيا جستجوي ترتيبي توصيه مي شود يا خير تا حد زيادي به چگونگي استفاده از فايل ،سرعت سيستم عامل در انجام جستجو ،و چگونگي ساختار فايل بستگي دارد.
متداول ترين ساختار فايل که در يونيکس وجود دارد ، يک فايل اسکي با کاراکتر خط جديد به عنوان فاصل رکوردها و در صورت امکان ،فضاي خالي به عنوان فاصل فيلدها است.
روش ديگري که با جستجوي ترتيبي تفاوت بنيادي دارد ، دستيابي مستقيم است.
هنگامي که بتوانيم مستقيماً به ابتداي يک رکورد برويم و آن را به حافظه وارد کنيم ،به آن رکورد دستيابي مستقيم داريم.
غالباً لازم است از برخي اطلاعات عمومي مربوط به فايل آگاه باشيم تا در آينده به استفاده از فايل کمک شود ، رکورد سرآيند غالباً در آغاز فايل قرار داده مي شود تا اين نوع اطلاعات را نگهداري کند.
هر فايل داراي يک رکورد سرآيند (header) است که حاوي سه مقدار در پايين است :
۱) اندازه سرآيند
۲) تعداد رکوردها
۳) اندازه هر رکورد
دو ساختار مختلف از رکوردها که حاوي فيلدهاي طول متغير در يک رکورد با طول ثابت است :
۱) فايل حاوي سرآيند ۳۲ بيتي و دو رکورد طول ثابت است که شامل فيلدهاي طول متغيري است که به NULL ختم مي شوند.
۲) فايل حاوي سرآيند ۶۶ بيتي و رکوردهايي با طول ۶۸ بايت است که با فيلدي دو بايتي شروع مي شوند.
يک طراحي شيءگراي خوب ،براي ماندگار شدن اشياء بايد عملياتي براي خواندن و نوشتن مستقيم اشياء فراهم آورد.
تا کنون عمل نوشتن نيازمند به دو عمل جداگانه بود :
۱) فشرده سازي در يک بافر ۲) نوشتن بافر روي فايل
در اين بخش ،کلاس recordfile را معرفي مي کنيم که نوعي عمل خواندن را پشتيباني مي کند که شيئي از يک کلاس را گرفته، آن را در يک فايل مي نويسد. کاربرد بافرها در داخل کلاس پنهان مي شود.
در بحث هايي که طي اين فصل و فصل قبل داشتيم به موارد زير پرداختيم :
۱)رکوردهاي طول متغير
۲) رکوردهاي طول ثابت
۳) دستيابي ترتيبي
۴) دستيابي مستقيم
دو مورد اول به سازماندهي فايل و دو مورد آخر به دستيابي به فايل مربوط مي شود.
داده هايي مثل صوت ،تصاوير ،و اسناد به صورت فيلدها و رکوردها ذخيره نمي شوند.
اگر در زبان برنامه نويسي امکان داشته باشد، مي توانيم اطلاعات کاربردي بيشتري درباره ساختار فايل در سرآيند قرار دهيم.
هنگامي که سرآيند فايل حاوي اين نوع اطلاعات باشد، گفته مي شود اين فايل ،خود- توصيفگر است.
شبه داده ها را مي توان با هر فايلي همراه ساخت ،که داده هاي اصلي آن نياز به اطلاعات پشتيبان دارد .
تصوير راستر رنگي ،آرايه اي راست گوشه از نقاط رنگي يا پيکسل ها است ،که روي صفحه به نمايش در مي آيند.
انواع متفاوت فراواني از شبه داده ها وجود دارند که مي توانند با يک تصوير همراه شوند ،از جمله :
۱) تعداد بيت هاي به کار رفته در توصيف هرپيکسل
۲) ابعاد تصوير- تعداد پيکسل ها به ازاي هر سطر و تعداد سطرها
۳) يک جدول جستجوي رنگ يا جعبه رنگ (pallet) که نشان مي دهد کدام رنگ بايد به هر مقدار پيکسل در تصوير نسبت داده شود.
متدهايي براي کار با تصاوير به عنوان اشياي خاصي وجود دارد :
۱) نمايش يک تصوير پنجره اي در صفحه نمايش کنسول
۲) همراه کردن يک تصوير با يک جدول جستجوي رنگ خاص
۳) قرار دادن تصويري بر روي يک تصوير ديگر و ايجاد يک تصوير ترکيبي
۴) به نمايش در آوردن پياپي چند تصوير براي انيميشن (animation)
ايده دنبال کردن فايل ها براي قرار دادن دامنه وسيعي از اشياي گوناگون ،اجتناب ناپذير است ،بويژه براي کاربردهايي که نياز به مقدار زيادي از شبه داده ها يا ترکيب غير قابل پيش بيني از انواع متفاوت داده ها دارند ،زيرا به اين ترتيب ديگر لازم نيست رکوردها حتماً از يک نوع باشند.
براي توصيف ديدي که يک برنامه کاربردي از اشياي داده اي دارد ،از اصطلاح مدل داد هاي انتزاعي استفاده نموديم.
اين کار اساساً ديدي کاربردگرا و درون- حافظه اي از اشياء است و در آن از فرمت فيزيکي اشياء به آن صورت که در فايل ها نگهداري مي شود چشم پوشي مي گردد.
يکي از مزاياي استفاده از برچسب ها براي شناسايي اشياي موجود در فايل ها آن است که نيازي نيست که از پيش بدانيم همه اشيايي که نرم افزار با آنها سرو کار خواهد داشت به چه صورت خواهد بود.
اختلاف ميان زبان ها ،سيستم هاي عامل ،و معماري ماشين ،سه مشکل اصلي هستند که هنگام توليد فايل هاي قابل حمل با آن ها مواجهيم.
چند راه حل براي دستيابي به قابليت حمل :
۱) توافق بر سر يک فرمت فيزيکي استاندارد براي رکورد و وفاداري به آن
۲) توافق بر سر رمزگذاري دودويي استاندارد براي عناصر داده اي
۳) تبديل اعداد و متون
۴) تبديل ساختارهاي فايل
سازماندهي فايلها براي کارايي
فشرده سازي يک فرايند دسته اي (batch) است که براي حذف حفره هاي خالي فايلي به کار مي رود که بارها و بارها مورد حذف و بهنگام سازي قرار گرفته است.
دلايل زيادي براي کوچک کردن فايلها وجود دارد :
۱) فايل هاي کوچکتر نياز به حافظه ي کمتري دارند که باعث صرفه جويي مي شود.
۲) سريع تر انتقال داده مي شوند که زمان دسترسي را کوتاهتر مي کند يا به جاي آن مي توان با همان زمان دسترسي از پهناي باند کمتر و ارزان تر استفاده کرد.
۳) به صورت ترتيبي ،سريع تر قابل پردازش هستند.
فشرده سازي داده ها عبارت است از رمزگذاري اطلاعات در فايل ،به صورتي که جاي کمتري بگيرد.
تکنيک فشرده سازي که در آن تعداد بيت ها با استفاده از يک نمادگذاري فشرده تر کاهش مي يابد يکي از روش هاي فشرده سازي است که به عنوان کاهش زوايد شناخته مي شوند.
آرايه هاي اسپارس براي نوعي فشرده سازي به نام رمزگذاري طول رانش مناسب اند. ابتدا مقدار خاصي را براي شروع رمزگذاري طول اجرا در يک بايت ذخيره کرده سپس الگوريتم آن را اجرا مي کنيم.
الگوريتم آ رايه هاي اسپارس را به صورت زير اجرا مي کنيم :
۱) پيکسل هاي تشکيل دهنده ي شکل را خوانده آنها به ترتيب در فايل ذخيره کن.
۲) جايي که يک مقدار پيکسل بيش از يک بار پشت سر هم تکرار شود اين سه بايت را به ترتيب جايگزين کن :
الف) نشان دهنده کد طول اجرا
ب ) مقدار پيکسلي که تکرار شده
ج ) تعداد دفعاتي که اين مقدار تکرار شده است.
نوع ديگري از فشرده سازي کدهاي با طول متغير را بسته به تعداد دفعات ظاهر شدن مقادير ، به آن مقادير نسبت مي دهد. به مقاديري که بيشتر تکرار مي شوند کدهاي کوتاهتري نسبت داده مي شود بنابر اين جاي کمتري مي گيرند. کدهاي هافمن مثالي از کدهاي با طول متغير هستند.
راهي ديگر براي صرفه جويي فضا در يک فايل، بازيابي فضا در آن فايل پس از تغيير يافتن فايل است.
تغييرات فايل به سه شکل انجام مي شود :
۱) اضافه کردن رکورد
۲) بهنگام سازي رکورد
۳) حذف رکورد
متراکم کردن فايل از طريق پيدا کردن مکان هايي در فايل که حاوي هيچ داده اي نيستند و از بين بردن اين مکان هاي خالي فايل ها را کوچکتر مي کند. و مکان هاي خالي هم وقتي در فايل ايجاد مي شود که رکوردي را حذف مي کنيم.
متراکم کردن فايل آسان ترين و رايج ترين روش هاي بازيابي فضا است.
به طور کلي براي فراهم کردن مکانيسمي براي حذف رکوردها و به دنبال آن استفاده دوباره از فضاي آزاد شده بايد بتوانيم دو مسئله را تضمين کنيم :
۱) رکوردهاي حذف شده به طور خاصي علامت گذاري شوند.
۲) بتوانيم محلي را که توسط رکوردهاي حذف شده اشغال شده بود پيدا کنيم تا بتوانيم براي اضافه کردن رکوردهاي جديد از اين محل ها استفاده کنيم.
جلسه سوم
ارائه كتبي
تعریف ارائه کتبی :
نوعی
ارائه است که رسانه اصلی آن نوشتار است
هرچند در مقولات علمی – فنی معمولا از شکل هم برای
انتقال
ایده استفاده می شود . ارائه کننده به کمک یک زبان دارای خط و بر اساس سبک و سیاق
مشخص اطلاعات مورد نظر خود را منتقل می کند .
خصوصیات ارائه کتبی :
ارائه
کتبی به مثابه نوعی انتقال اطلاعات خصوصیاتی دارد به شرح ذیل :
غیابی است (ارائه کننده حضور ندارد )
قابل استناد است
با فرصت است
مشروح است (عرصه شرح و بسط وجود دارد البته باید
کنترل کمی و کیفی شود)
تعداد مخاطبین معمولا زیاد است
سبک و سیاق مشخص و معمولا واحد دارد (به ویژه در
مقولات علمی – فنی )
تاثیر گذاریش تدریجی (و طبعا غیابی ) است .
احتمال بروز اشتباه (حداقل نسبت به ارائه شفاهی )
کمتر است
امکان تبادل نظر و رویارویی وجود ندارد و اساسا نوعی
انتقال اطلاعات یکسویه است.

انواع ارائه کتبی :
ارائه
کتبی را می توان از چند جنبه رده بندی کرد از جمله فرم / صورت ، ماهیت محتوا ، سبک
، هدف ،مورد استفاده ، مخاطبین ، سطح محتوا و ... اما هدف اصلی این کتاب در ارائه
کتبی در دو رده کلی دانشگاهی ( کم وبیش
آکادمیک ) و غیر دانشگاهی می باشد .
گونه های رایج تر ارائه کتبی دانشگاهی و غیر دانشگاهی :
دانشگاهی
: کتاب ، جزوه ، مقاله ، انواع گزارشها ، رساله ، یادداشت تحقیق ، دانشنامه ( تز )
،مجله برنامه کامپیوتری و ... که بعضی از این گونه ها در سطوح پایین تر آموزش نیز
وجود دارند .
غیر
دانشگاهی : کتاب ، مجله ، روزنامه، جنگ ، بروشور ، بولتن ، کاتالوگ ، انواع
گزارشها ،
کتابهای
راهنما ، اطلس ، آلبوم ، فصل نامه ، سالنامه ، مکاتبات اداری و ...
ساختار اکثر گونه های علمی – فنی (غیر از گونه های خاص)
1-
بخش آغازین
2-
بخش میانی
3- بخش
پایانی
آنچه که در این سه بخش آورده می شود محتوای
ارائه کتبی را تشکیل می دهد که هر یک از این سه بخش
اجزایی
دارد که مهمترین بخش همان بخش میانی یا متن اصلی است که باید طی چند مرحله آن را
تولید کرد.
مراحل آماده سازی ارائه کتبی :
تعیین موضوع
تهیه منابع
تهیه طرح اولیه متن اصلی
کسب و سازماندهی اطلاعات
تولید متن اصلی
تنظیم ساختار سه بخشی
تعیین موضوع
کارهای لازم در این مرحله عبارتند از :
الف-
مشخص کردن زمینه موضوع
ب- تحدید موضوع
ج- تعیین عنوان مناسب
تحدید موضوع و عوامل مربوط به آن:
موضوع
ارائه باید محدود و کاملا تعریف شده باشد
زیرا هر موضوعی را میتوان از چند جنبه مورد مطالعه و بررسی قرار داد . میزان
تحدید موضوع بستگی به عوامل زیر دارد :
- سطح ارائه کننده
- هدف ارائه
- وضع مخاطبین
- ملاحظات فنی
- میزان گستردگی زمینه موضوع
- خواسته های مخاطبین
- مدت ارائه
- امکانات آماده سازی محتوای ارائه
- ملاحظات مدیریتی
- سطح ارائه
ضوابط موجود برای تحدید موضوع :
مقطع تاریخی
محدوده جغرافیایی
خصوصیاتی از مخاطب
جنبه یا جنبه هایی از خود موضوع
اعمال
ضوابط تحدید می تواند بر اساس انتخاب خود ارائهکننده یا درخواست فرد دیگری یا
سازمان خواستار ارائه صورت پذیرد .
تعیین عنوان مناسب :
عنوان
موضوع را باید با جمله یا عبارتی حتي الامکان کوتاه و گویا بیان کرد . این جمله یا
عبارت می تواند بصورت زیر باشد :
جمله گزاره ای
جمله پر سشی
عبارت مصدری
خصوصیات عنوان موضوع :
- گویا وصریح
- کوتاه
- فاقد کلما ت زائد
- واقعی ، صادقانه ، و نه مبالغه آمیز
- حتی الامکان فاقد علائم کوته نویسی /فرمول و ...
- دارای حدود پانزده کلمه و از این میان حدود 4 کلمه
اصلی
تهیه منابع :
برای
تهیه منابع کارهای زیر باید انجام شود :
شناسایی منبع
جستجو و دستیابی به منبع
ضبط مشخصات منبع
ارزیابی منبع
شناسایی منبع :
برای
شناسایی منبع از امکانات زیر می توان استفاده کرد :
کتابخانه ( عمومی یا شخصی )
فهرستهای دوره ای ناشران
کتابنامه ( کتابشناسی )
فرد متخصص در موضوع
کتابدار
کتابشناس
رسانه های عمومی
مراکز اسناد ملی ، موزه ها و غیره
سیستمهای اطلاع رسانی
جستجوی منبع و دستیابی به آن :
برای
این کار می توان از شاخصهای زیر استفاده کرد :
شماره منبع در کتابخانه
مشخصات مولف یا مترجم
عنوان منبع
موضوع ( از طریق جستجوی موضوعی )
ضبط مشخصات منبع :
روش
رایج برای ضبط مشخصات منبع استفاده از
کارت یا فیش منبع است . اطلاعاتی که در این کارت درج می شود در اساس عبارتست از :
نام مولف ، عنوان منبع و مشخصات ناشر و نشر.
ارزیابی منبع :
منبع
را قبل از استفاده به منظور کسب اطلاع باید به دقت ودر عین حال با سرعت ارزیابی
کرد . برای این کار باید جنبه های زیر را در نظر گرفت :
نوع منبع از نظر صورت (فرم ) : مقاله ، کتاب ، جزوه
، سند خطی و غیره
اعتبار علمی – فنی مولف ( و مترجم )
سال اولین و آخرین ویراست
اعتبار ناشر
مکان ناشر ( کشور و شهر )
میزان ارتباط منبع با موضوع ارائه
فصل سوم:
برنامه نویسی پویا
برنامه نویسی پویا، از این لحاظ که نمونه به نمونه های کوچکتر تقسیم می شود ، مشابه روش تقسیم و حل است ولی در این روش ، نخست نمونه های کوچک تر را حل می کنیم ، نتایج را ذخیره می کنیم و بعدا هر گاه به یکی از آن ها نیاز پیدا شد، به جای محاسبه دوباره کافی است آن را بازیابی کنیم.
مراحل بسط یک الگوریتم برنامه نویسی پویا به شرح زیر است:
......
فصل سوم
استفاده از اسمبلر
دستورالعملهاي زبان اسمبلي
هر دستورالعمل زبان اسمبلي در روي يک خط فايل کد منبع وارد ميشود. يک خط ميتواند حداکثر 128 کاراکتر داشته باشد.
وجود خطوط خالي مجاز است و استفاده از آنها براي جدا کردن بخش هاي مختلف کد برنامه مفيد است.
توضيحات براي مستندسازي و فهم بيشتر برنامه به کار ميروند و ميتوانند در هر جايي از برنامه وجود داشته باشند. هر توضيحي با کاراکتر ';' شروع ميشود و تا انتهاي خط ميتواند ادامه داشته باشد.
حالت های آدرس دهی
بلاواسطه
ثبات
مستقیم
دارای مبنا
دارای اندیس
دارای مبنا و اندیس
زبان اسمبلي داراي سه نوع دستور ميباشد:
دستورالعمل
دستور اسمبلر
ماکرو
دستورالعمل: به وسيله اسمبلر به کد هدف ترجمه ميگردد و اين کدها هستند که در زمان اجرا، اجرا ميگردند.
دستور اسمبلر: به اسمبلر ميگويد که عملي را انجام دهد. و اغلب هيچ اثري بر روي کد هدف ندارد.
ماکرو: نوعي دستورالعمل است که در آن تعدادي دستورالعملها، دستورات اسمبلر يا حتي ماکروهاي ديگر قرار گرفتهاند.
يک دستورالعمل ميتواند شامل عناصر زير باشد:
توضيحات عملوند(ها) نام دستورالعمل اسم
[;comment] [operand(s)] mnemonic [name]
يک کاربرد فيلم اسم آن است که ميتوان آدرس دستورالعملي را به صورت نمادي بعد از اسمبل و لينک شدن برنامه با يک برچسب نشان داد. دستورالعملهاي ديگر به راحتي ميتوانند به دستورالعمل مزبور رجوع کنند.
دستورالعملهاي داراي برچسب ميتوانند مقصد يک دستورالعمل پرش در زبان اسمبلي باشند.
ساختار حلقه در زبان اسمبلي وجود ندارد، اما ميتوان حلقهها را با استفاده از jmp و يا دستورالعملهاي ديگر پيادهسازي کرد.
برچسب نميتواند به وسيله عدد شروع شود. و اگر نقطه استفاده شود، حتماً بايد اولين کاراکتر باشد.
بغيراز اعداد و نقطه، کاراکترهاي ديگر ميتوانند در هر موقعيتي استفاده شوند.
فقط 31 کاراکتر اول اسم مورد استفاده قرار خواهد گرفت.
مقادير عددي در دستورات زبان اسمبلي، دهدهي فرض ميشوند و فقط زماني اين فرض کنار گذاشته ميشود که در برنامه منبع حالت ديگري خواسته شده باشد.
يک مقدار شانزده شانزدهي بايد با يک عدد بغير از اعداد شانزدهشانزدهي «a» تا «f»، شروع شود تا اسمبلر بتواند آنها را از يک اسم تشخيص دهد.
شکل کلی برنامه
START
STACK _ SEG SEGMENT
اندازه پشته.
STACK _ SEG ENDS
DATA _ SEG SEGMENT
متغیر ها
DATA _ SEG ENDS
EXTRA _ SEG SEGMENT
متغیرهای رشته ها
EXTRA _ SEG ENDS
CODE _ SEG SEGMENT
دستورالعمل های برنامه
CODE _ SEG ENDS
END START
يک برنامه از قسمتهاي مختلفي تشکيل شده است: هر کدام از اين قسمتها با دستورات اسمبلر SEGMENTو ENDS شروع شده و خاتمه يافتهاند:
Segment_name SEGMENT
.
.
Segment_name ENDS
دستور ENDS هيچ وقت داراي عملوند نيست؛ ولي دستور SEGMENT در بعضي کاربردها با عملوند به کار ميرود.
آخرين دستور برنامه، دستور اسمبلر زير است:
start END
دستور END به اسمبلر ميگويد که پردازش دستورات کد منبع را خاتمه دهد.
در يک برنامه منبع فقط يک دستور END وجود دارد و آن آخرين دستور است.
عملوند start مشخص کننده اولين دستور برنامه است که بايد اجرا شود. زماني که برنامه بار ميشود، سيستمعامل ثبات سگمنت کد را با سگمنتي که حاوي اين دستورالعمل است مقداردهي کرده و ثبات اشارهگر دستورالعملها، IP را با آفست اين دستورالعمل از ابتداي سگمنت مزبور شروع مينمايد.
Number1 DW ?
Number2 DW ?
هرکدام يک کلمه را در سگمنت داده ذخيره ميکنند.
علامت سؤال به اسمبلر ميگويد که هيچ مقدار اوليهاي به اين دو کلمه نسبت داده نشود.
هر کدام از دستورات DB چند بايت را با مقادير اوليه داده شده ذخيره مينمايند. در هر مورد، عملوندها، مقادير اوليه را تعيين ميکنند.
سگمنت کد با دستور اسمبلر زير شروع ميشود:
ASSUME CS:Code,DS:data
اين دستور به اسمبلر ميگويد در صورتيکه يک دستورالعمل از يک برچسب که در داخل سگمنت کد قرار دارد استفاده بکند آدرس واقعي عملوند مزبور بايد به وسيله حاصلجمع ثبات سگمنت CS و آفست برچسب از ابتداي سگمنت کد محاسبه شود.
سيستمعامل وظيفه مقداردهي اوليه ثبات سگمنت کد را به واسطه عملوند موجود در دستور END به عهده دارد ولي سيستمعامل همين کار را براي ثبات سگمنت داده DS انجام نميدهد. اينکار را بايد برنامهنويس انجام دهد.
شماره واقعي سگمنت داده تا زماني که برنامه بار نشده باشد قابل تعيين نيست، در آن زمان است که اين آدرس به وسيله DOS براي برنامه تعيين ميشود.
هيچ دستورالعملي نميتواند يک عملوند بلاواسطه را در يک ثبات سگمنت قرار دهد.
ماکروي itoa يک رشته شش کاراکتري کدهاي اسکي براي عدد مکمل دو ايجاد ميکند.
در يک سگمنت، ترتيب دستورالعملها دقيقاً ترتيب کدهاي حاصله را تعيين ميکند.
عملوندهاي دستورات DB و DW
اسمبلر، اعداد را دهدهي فرض ميکند مگر در حالتي که داراي پسوندي باشند که به معناي ديگري اشاره کند يا اينکه به وسيله دستور اسمبلر RADIX پيشفرض را تغيير داده باشيم.
يک عملوند عددي براي دستور DB ميتواند در محدوده دهدهي 255- تا 255 باشد. يک عدد بدون علامت صفر تا 255 ميتواند دريک بايت ذخيره شود.
در مورد دستور DW، محدوده مجاز براي عملوندي از 65535- تا 65535 ميباشد. اعداد بدون علامت صفر تا 65535 در يک کلمه جاي ميگيرند.
عملگر DUP ميتواند براي توليد چندين بايت يا کلمه با مقادير اوليه معين و يا بدون مقدار اوليه، مورد استفاده قرار بگيرد. کاربرد اين عملگرد به DB، DW و دستورات اسمبلر ديگري که فضا را ذخيره ميکنند محدود ميشود.
دستور DW به برنامهنويس اجازه ميدهد که يک مقدار اوليه را که برابر آفست قسمت ديگري از حافظه است، نسبت دهد. اينکار شبيه به داشتن يک متغير اشارهگر است که مقدار آن آدرس بلوکي از حافظه ميباشد.
دستورات
Array DB 100 DUP(?)
Pointer DW OFFSET array
100 بايت را براي array و يک کلمه را براي pointer ذخيره ميکنند و pointer با آفست array مقداردهي اوليه ميشود.
دستور اسمبلر DD: يک کلمه مضاعف را ذخيره ميکند
DQ: هشت بايت را ذخيره ميکند.
DT: ده بايت را ذخيره ميکند.
عملوند دستورالعملها
عملوندها داراي انواع مختلف هستند: بعضي ثابت بوده، بعضي مشخصکننده ثباتهاي CPU ميباشند و برخي به حافظه رجوع مينمايند.
به طور کلي عملوند اول، مقصد عمليات را تعيين ميکند و عملوند دوم منبع عمليات را.
يک عملوند حالت بلاواسطه نميتواند بعنوان مقصد قرار گيرد.
در مواردمعدودي، برنامهنويس ممکن است يک ثبات سگمنت و يک آفست واقعي را به عنوان عملوند مستقيم بنويسد، MASM دستورالعمل زير را مجاز ميشمارد:
Mov bx,dx:0014h
اين دستورالعمل، ثبات BX را با کلمهاي که از بيستمين بايت سگمنت داده شروع ميشود، بار مينمايد. اين آدرس قابل جابجايي نيست.
يک عملوند ثبات غيرمستقيم، از داده حافظه استفاده ميکند.
فقط چهار ثبات ميتوانند براي آدرسدهي ثبات غيرمستقيم به کار بروند:
BX
BP
SI
DI
در حالت ثبات غيرمستقيم، ثبات همانند يک متغير اشارهگر در زبانهاي سطح بالا ميباشد.
وقتي اندازه عملوند حافظه مبهم باشد، عملگر PTR بايد مورد استفاده قرار گيرد تا اندازه صحيح به اسمبلر داده شود.
اسمبلر، استفاده از عملوند شمارنده موقعيت يعني $ را مجاز ميشمارد، اين عملوند در زمان اسمبل شدن مقدار آفست يک دستورالعمل را نشان ميدهد. اين عملوند ميتواند در دستورالعملها يا دستورات اسمبلر مورداستفاده قرار بگيرد
ماکروي output، محتوي هيچ ثباتي و همينطور ثبات نشانهها را تغيير نميدهد.
ماکروي inputs فقط بر روي ناحيه مقصد و ثبات CX اثر ميگذارد، هيچ ثبات ديگري از جمله ثبات نشانهها تغيير نخواهند کرد.
ماکروي inputc داراي هيچ عملوندي نميباشد. اين ماکرو يک کاراکتر را از صفحه کليد ميخواند و کد اسکي آن را در ثبات AL ذخيره مينمايد.
اگر ماکروي atoi قادر باشد که به طور موفقيتآميز يک رشته کاراکتر اسکي را تبديل کند آنگاه نشانه سرريز يعني OF صفر خواهد گرديد. در تمام موارد نشانههاي PF,ZF,SF بسته به مقداري که در AX برگردانده ميشود به ترتيب زير تغيير خواهند کرد:
اگر عدد منفي باشد SF يک خواهد شد و در غيراينصورت صفر.
اگر عدد صفر باشد ZF يک خواهد شد و در حالت غيرصفر، صفر خواهد شد.
PF نشاندهنده توازن عدد برگردانده شده در AX است.
نمونه كد ماشين
0000 000A a dw 10
0002 00 b db ?
.code
0000 8B DF mov bx,di
0002 8A F9 mov bh,cl
0004 8B 1E 0000 R mov bx,a
0008 8A 26 0002 R mov ah,b
000C 8B 12 mov dx,[si][bp]
000E A0 0002 R mov al,b
0011 8A 26 0002 R mov ah,b
0015 BB 0003 mov bx,3
0018 B1 03 mov cl,3
001A C7 06 0000 R 0064 mov a,100
0020 C6 06 0002 R FF mov b,255
مقدمه
همۀ برنامههايي که در دو جلسه اول بيان شد، به شکل ترتيبي اجرا ميشوند، يعني دستورات برنامه به ترتيب از بالا به پايين و هر کدام دقيقا يک بار اجرا ميشوند. در اين جلسه نشان داده ميشود چگونه از دستورالعملهاي انتخاب1 جهت انعطافپذيري بيشتر برنامه استفاده کنيم. همچنين در اين جلسه انواع صحيح كه در C++ وجود دارد بيشتر بررسي ميگردد.
دستور if
دستور if موجب ميشود برنامه به شکل شرطي اجرا شود. نحو آن به گونۀ زير است:
....
فصل 3
توابع ورودي و خروجي
هدف کلی
آشنایی با هشت تابع ورودی و خروجی زبان C
هدفهای رفتاری
انتظار میرود پس از مطالعة این فصل دانشجو:
1. با کاربرد و ویژگیهای تابع خروجی printf() آشنا شود.
2. فرامین فرمت را در تابع آرگوماندار printf() بشناسد.
3. با کاربرد و ویژگیهای تابع ورودی scanf() آشنا شود.
4. تفاوت و تشابه توابع printf() و scanf() را بداند.
5. با کاربرد و ویژگیهای تابع ورودی getchar() آشنا شود.
6. با کاربرد و ویژگیهای تابع خروجی putchar() آشنا شود.
7. با کاربرد و ویژگیهای تابع ورودی getche() آشنا شود.
....
این درس در مورد چیست؟
این درس در مورد ساختار وچگونگی طراحی کامپیوتر های دیجیتالی است . این مطلب معروف به “معماری کامپیوتر” است (که شامل معماری مجموعه دستورالعمل + سازماندهی سخت افزاری می باشد ) .
چرا سازماندهی کامپیوتر را بررسی می کنیم
شاید هیچکدام از شما در شرکتهای Intel و یا AMD کار نکرده اید
اما . . .
- کامپیوترهای جاسازی شده
- طراحی کامپایلر
- حتی طراحان نرم افزار
با محصولات این شرکتها در ارتباطند .
طرح كلي درس
بازنگری کلی
کارایی
مجموعه دستورالعملها
محاسبات کامپیوتر
ماشینهای تک چرخه ای
خط لوله ای
سیستمهای حافظه (RAM , Caches , Virtual Memory)
سوپر اسکالر (Superscalar/VLIW) و چند پردازنده ها
مباحث دیگر
سرفصل 1: رئوس مطالب در معماری و سازماندهی کامپیوتر
یافتن توانایی ارائه اطلاعات پایه از معماری و سازماندهی کامپیوتر در جریان طراحی کامل یک کامپیوتر
دریافتن مسئولیتهای حرفه ای و اخلاقی یک مهندس کامپیوتر (مخصوصا معمار کامپیوتر)
“معماری” به چه معناست؟
“ فن یا دانش یا ساختمان ... فن یا پرداختن به طراحی و پیاده سازی ساختارها ... “
Webster 9th New College Dictionary
“شامل نقشه ، طراحی ، ساخته و دکوراسیون چگونگی عملکرد “
“معماری کامپیوتر”
- کلمه ای که توسط Fred Brooks ابداع گردید.
“معماری کامپیوتر، یعنی کامپیوتر از دید کاربر”
- Amdhal et al, (64)
“ما بوسیله معماری، ساختارواحدهای تشکیل دهنده یک سیستم کامپیوتری را هدفمند می نمائیم .”
- Stone, H. (1987)
“معماری یک کامپیوتر عبارتست ازمحیط یا فضای بین ماشین و نرم افزار”
- Andris Padges
IBM 360/370 Architect
ساختار: نظم و ترتیب دادن به بخشهای ثابت (نقشه)
سازماندهی: فعل و انفعال پویای این بخشها و مدیریت آنها
پیاده سازی: طراحی کردن بلوک بخشهای دارای هدف خاص
ارزیابی کارایی: مطالعه رفتار سیستم (decorative treatment)
معماری (از دیدگاه معمار)
پیاده سازی
سازماندهی: منظر سطح بالا
سیستم حافظه
ساختار گذرگاه (bus)
طراحی داخلی CPU
سخت افزار
طراحی منطقی
تکنولوژی بسته بندی(packaging)
معماری مجموعه دستورالعمل
نکات مهم
به خاطر بسپارید: نکته اینست که بیاموزید چگونه معماری به مفهوم تکنولوژی موجود را ارزیابی کنید.
شناختن روش خیلی مهم است، اما پایان کار نیست.
به خاطر بسپارید: نکته اینست که بیاموزید چگونه معماری به مفهوم تکنولوژی موجود را ارزیابی کنید.
شناختن روش خیلی مهم است، اما پایان کار نیست.
مراحل در سازماندهی کامپیوتر
مفهوم ماشینهای چند سطحی
مفاهیم ماشین مجازی
انضباط در معماری
ساختار سخت افزار / نرم افزار
الگوریتم ها و پیاده سازی آنها
انتشار زبان
تصویر بزرگ
هر دوی سخت افزار و نرم افزار مرکب از لایه های سلسله مراتبی هستند، با هر لایه سطح پائینتر جزئیاتی از دید سطح بالاتر مخفی می شوند. این اصل تجرید، روشی است که طراحان سخت افزار و طراحان نرم افزار از عهده پیچیدگی سیستم های کامپیوتری بر آمدند.
یک محیط کلیدی بین لایه های انتزاعی معماری مجموعه دستورالعمل است: فضای بین سخت افزار و نرم افزار سطح پائین . این محیط مجازی توان بسیاری در پیاده سازی برای دگرگونی هزینه و کارایی در اجرای یک نرم افزار یکسان است.
John L. Hennessy
David A. Patterson
عوامل در معماری کامپیوتر
مجموعه دستورالعملها یک محیط بحرانی
مهندسی و معماری کامپیوتر کجاست؟
هماهنگی بسیاری از لایه های انتزاعی
تشریح: پنج جزء ترکیب شده کامپیوتر
تکنولوژی کامپیوتر: تغییری مهیج
پردازنده
هر یکسال و نیم، 2 برابر در سرعت(از سال 1985).
کارایی 100 برابر، در دهه گذشته
حافظه
ظرفیت DRAM: 2برابر در هر دو سال(از سال 96)
بهبود اندازه 64x در دهه گذشته
دیسک
ظرفیت: 2برابر در هر سال(از سال 97)
بهبود اندازه 250x در دهه گذشته
گرایش تکنولوژی: پیچیدگی ریزپردازنده
2X transistors/Chip Every 1.5 to 2.0 years
2برابر ترانزیستور/تراشه هر 1.5 تا 2 سال “موسوم به قانون مور”
به کجا می رویم؟
جلسه دوم
عوامل موثر در ارائه
ارائه کننده :
عامل
اصلی در سیستم ارائه است . همین عامل است که 4 فراروند پیام اندیشی ، پیام سازی ،
پیام پیرایی
و پیام
فرستی را انجام می دهد . آنچه که نهایتا به
مخاطب می رسد حاصل عملکرد کانال ارائه کننده است .
خصوصیات کلی کانال ارائه کننده :
گزینه های شناخت از وضع مخاطب :
سن
میزان
دانسته ها
باورهای فرهنگی
وضع اجتماعی و سیاسی
جنسیت
خواسته های مخاطب از ارائه
علاقه ها
گزینه های شناخت از وضع مخاطب :
سن
میزان
دانسته ها
باورهای فرهنگی
وضع اجتماعی و سیاسی
جنسیت
خواسته های مخاطب از ارائه
علاقه ها
اهمیت شناخت از مخاطب :
شناخت
از مخاطب وقتی که هدف اصلی ارائه مجاب کردن مخاطب است ویا با هدف آموزش انجام می
شود نقش بسیار اساسی در کنترل کمی و کیفی دارد .
بعضی از جنبه های مورد توجه برا مخاطبین در یک سیستم مدیریت مراکز تولید که
ارائه کننده باید آنها را در نظر بگیرد :
کاهش هزینه
بهبود کیفیت
کاهش زمان اجرا پروژه
افزایش کارایی
بازار فروش
زمینه رقابت
صرفه اقتصادی و مانند اینها
مخاطب :
دومین
عامل مهم در سیستم ارائه مخاطب است . این عامل باید فراروندهای پیام گیری ، پیام
کاوی و درک یا حس پیام را انجام دهد .
وضعیت مخاطب ارائه :
مخاطب
ارائه در مقایسه با وضع ارائه کننده نسبت به موضوع ارائه می تواند در یکی از سه
وضعیت زیر باشد :
خصوصیات شخصی – شخصیتی مخاطب:
آمادگی روحی
– جسمی
داشتن حداقل دانش اولیه لازم
داشتن ملزومات پیام گیری ، پیام کاوی ، و درک حس
اهمیت قائل شدن برای ارائه
داشتن دقت – صبر – ودر عین حال شوق در پیام گیری،
پیام کاوی، و درک یا حس پیام
داشتن شناخت از ارائه کننده
داشتن
انگیزه و هدف درست
نداشتن تعصب
بیجا
خصوصیات کلی موضوع ارائه در مقولات علمی – فنی:
اعتبار علمی – فنی
اولویت
سودمندی برای جامعه
عنوان مشخص و روشن
ارائه آن در
یک محیط اجتماعی مشخص امکانپذیر باشد
حیطه و حدود معلوم و در صورت لزوم به خوبی قابل
تعریف
قابل احاطه و پرداختن توسط ارائه کننده باشد
مورد علاقه ارائه کننده باشد
امکانات آماده سازی محتوای آن فراهم باشد
عوامل قابل توجه در انتخاب نوع ارائه:
هدف ارائه
فرصت ارائه
مکان ارائه
وضع اجتماعی محیط ارائه
امکانات آماده سازی محتوای ارائه
امکانات کمکی ارائه
وضع مخاطب
موضوع ارائه
نتیجه یا نتایج مورد انتظار و برخی عوامل دیگر
ضمنا انواع رایج تر ارائه در محافل علمی – فنی
عبارتند از ارائه شفاهی – ارائه کتبی و ارائه ترکیبی
انگیزه و اهداف در ارائه علمی – فنی عبارتند از:
انتقال دانش و فن از نسلی به نسل دیگر
نشر دانش و فن
گسترش دادن دانش و فن
آموزش افراد
خود آزمایی
دریافت واکنش مخاطبین به منظور توسعه یا تعمیق موضوع
ایجاد یا تقویت یک اندیشه
رقابت در زمینه های علمی – فنی
خدمت به نوع بشر برای بهتر زیستن و بهتر اندیشیدن
تشریک مساعی در پژوهش
ارضاء بعضی تمنیات غیر مادی
رفع نیازهای مادی
تجارت
تبلیغات
خودنمایی- فضل فروشی و تفاخر

امکانات آماده سازی محتوای ارائه:
منظور
از امکانات آماده سازی محتوای ارائه عمدتا " منابع کسب اطلاع و تولید شناخت
"برای تهیه و تنظیم مطلب ، تصویر و حتی ادای حرکت یا تولید صوت است .
وضع اجتماعی محیط ارائه :
داشتن
شناخت درست و کافی از وضع اجتماعی محیط ارائه از نظر اخلاقی ، فرهنگی، سیاسی و
اقتصادی در انجام ارائه تاثیر دارد .هر چه میزان
شناخت ارائه کننده از وضع اجتماعی محیط
ارائه بیشتر و درست تر باشد ارائه را مطلوب تر انجام خواهد داد .
شيوه ارائه مطالب علمي و فني
اهداف كلي درس
در اين
درس با مفهوم ارائه و عوامل موثر آن آشنا ميشويم. در بخش ارائه كتبي مراحل آمادهسازي
ارائه را خواهيم آموخت. ارائههاي دانشگاهي و غيردانشگاهي و گونههاي مختلف هريك،
اجزاء آنها و موارد كاربردشان را ميآموزيم. در پايان در مورد ارائه شفاهي،
خصوصيات و انواع آن مطالبي خواهيد آموخت.
جلسه اول
مفهوم ارائه
تعریف
لغوی ارائه :
در لغت به معنای نمودن – نشان دادن و نمایش دادن استو در زبان فارسی بصورت ارائه
کردن و ارائه دادن بکارمی رود.
تعریف ارائه در مورد یک موضوع :
ارائه
موضوع یعنی انتقال اطلاعات درباره موضوع و از این دیدگاه همسایگی معنایی با مفهوم
ارتباط دارد.
سیستم ارائه :
ارائه بعنوان انتقال اطلاعات سیستم خاص
خود را دارد. این سیستم در طبیعت و در جامعه انسانی همیشه
وجود داشته است. و حتی در گونه ابتدایی اش پیش از آغاز مدنیت انسان نیز وجود داشته
است .

عناصر تشکیل دهنده سیستم انتقال اطلاعات ماشینی:
1- مبدا یا فرستنده مجهز به کانال ( یا مکانیسم فیلتراژ )
2- مقصد یا گیرنده مجهز به کانال
3- پیام
4- رسانه انتقال
5- محیط انتقال
6- پارازیتها
تفاوت عناصر تشکیل دهنده سیستم انتقال اطلاعات بین ماشین و انسان:
دو عامل اصلی تر سیستم ارائه انسان می باشد که به
تعبیری ظریف ترین و پیچیده ترین " ماشین " مخلوق .
محیط ارائه : طبیعت و جامعه انسانی است همراه با
تمام ویژگیها و جنبه های گوناگون آن .

عناصر تشکیل دهنده سیستم انتقال اطلاعات در انسان:
تعريف کانال در سیستم ارائه انسانی:
عبارتست از تمام خصوصیات شخصی و شخصیتی انسان – یعنی
مجموعه ای بسیار پیچیده از عناصر
شخصی – شخصیتی انسان که در طیفی از اندیشه ای تا
فیزیکی جای می گیرند .
فراروند ارائه :
فراروند ارائه یک فراروند مرکب است . یعنی از تعدادی فراروند تشکیل شده است که هر یک
از نگاهی دقیق میتوانند از فراروندهای
دیگر تشکیل شوند .
فراروندهای تشکیل دهنده ارائه :
تعریف دیگری از ارائه :
|
مثال |
نوع ارائه |
نوع رسانه |
|
سخنراني عمومي |
شفاهي (گفتاري ) |
گفتار |
|
نامه ، داستان ... |
كتبي (نوشتار) |
نوشتار |
|
سينماي محض ، نقاشي ... |
تصويري |
تصوير |
|
موسيقي |
صوتي |
صوت |
|
پانتوميم ، زبا ن بدن |
حركتي – اشاره اي |
حركت واشاره |
|
متن علمي – فني ، سخنراني تخصصي |
تركيبي |
دو يا بيش از دو رسانه |
|
تزيين اتاق ، لباس پوشيدن ... |
نمايشي |
شيي ء |
انواع ارائه با رسانه ناشناخته
فصل دوم
نگاه کلی به سیستم عامل
وظایف سیستم عامل
اجرای برنامه های کاربردی را کنترل می کند.
رابط کاربر و سخت افزار.
سه هدف سیستم عامل
1- سهولت: استفاده از کامپیوتر ساده شود
2- کارآمدی: استفاده کارآمد از منابع
3- قابلیت رشد: سبب توسعه و آزمایش سیستم می شود
برنامه های سودمند
مجموعه برنامه های سیستمی هستند.
توابعی هستند که به دفعات استفاده می شوند و به ایجاد برنامه مدیریت پروژه و کنترل دستگاه های ورودی و خروجی کمک می کنند.
سیستم عامل مهمترين برنامه سيستمي است.
وظایف سیستم عامل
ایجاد برنامه
دسترسی به دستگاه های ورودی و خروجی
کنترل دسترسی به پرونده ها
دسترسی به سیستم عامل
کشف و پاسخ به خطا
حسابداری
سیستم عامل به عنوان مدیر منابع
سیستم عامل مسئول مديريت انتقال و ذخیره سازی و پردازش داده ها را دارد.
سیستم عامل به عنوان راهکار کنترلی ازدو جهت غیر عادی است:
1-سیستم عامل مانند نرم افزار عادی کار می کند.
2-سیستم عامل مرتبا کنترل کردن را رها می کند.
هسته سیستم عامل :
بخشی که در حافظه اصلی است.
بیشترین دفعات استفاده را دارد.
تخصیص حافظه مشترکا توسط سیستم عامل و سخت افزار مدیریت حافظه در پردازنده کنترل می شود.
در مورد زمان استفاده از I/O تصمیم می گیرد.
میزان تخصیص پردازنده به یک کار را مشخص می کند.
دلایل تغییر سیستم عامل
1-ارتقاء و انواع جدید سخت افزار .
این امکانات نیازمند حمایت پیچیده تری از طرف سیستم عامل است.
2-خدمات جدید: برای پاسخگویی به نیازهای کاربران.
3-رفع خطا: ساخت تیم مولفه ای است و رابط ها باید مشخص شود.
تکامل تدریجی سیستم عامل
1-پردازش ردیفی.
2-سیتم های دسته ای ساده.
3-سیستم های چند برنامه ای دسته ای.
4-سیستم های اشتراک زمانی.
پردازش ردیفی
- به علت دسترسی به کامپیوتر به صورت ردیفی این نام را دارند.
- در سال 1940-2950 به وجود آمد.
- کاربر با سخت افزار در ارتباط بود.
- سیتم عامل وجود نداشت.
- دارای یک میز فرمان بود.
- به زبان ماشین و به وسیله دستگاه ورودی با گذاری می شد.
- خروجی در چاپگر ظاهر می شد.
مسئله اصلی سیستم های اولیه
1-زمانبندی :
توسط برگهای نوبت گیر برای ماشین وقت می گرفتند و در زمان پیش بینی شده کارش تمام نمی شد.
2-زمان نصب :
اگر در زمان کار برای هر یک از کار ها مشکلی ایجاد شود باید از اول کارش را شروع کند.
سیستم های دسته ای:
اولین سیتم عامل دسته ای (1950) به وسیله
General motorsو برای استفاده IBM 701 به وجود آمد.
پردازش دسته ای ساده توسط نرم افزار ناظر.
کاربر دسترسی مستقیم به ماشین ندارد.
- کاربر کار را توسط نوار به متصدی کامپیوتر می دهد.
- متصدی همه کارها را روی دستگاه ورودی گذاشته و وارد کامپیوتر می شود.
- ناظر به طور خودکار بار کردن برنامه بعدی را به عهده دارد.
ناظر
- قسمت اعظم ناظر: در حافظه اصلی و آماده اجرا مي باشد
(ناظر ماندگار)
بقيه ناظر: برنامه سودمند و توابع عمومی و مشترک(زير برنامه)
زمان تنظیم شرایط اولیه کارها را ناظر انجام میدهد.
- JCL= دستورالعمل هایی از زبان کنترل کار.
- این دستورالعمل ها با $ مشخص می شود.
نحوه عملمکرد سیستم عامل دسته ای
خواندن از حافظه جانبي برنامه كاربر در حافظه جانبی
ناظر => کارتFTN $ => بار کردن مترجم => کدمقصد => ذخیره
بوسيله ناظر
کارت LOAD$ => خوانده => بارکننده => برنامه مقصد
مترجم(در حافظه اصلی) => کنترل به مترجم مقصد.
مزایای سیستم عامل دسته ای
1-حفاظت حافظه اصلی.
2-زمان سنج:
جلوگیری از انحصار سیتسم توسط یک کاربر.
3-دستورالعمل های متمایز:
دستورالعمل هایی که توسط ناظر صادر می شود.
4-وقفه ها:
این خصوصیت به سیستم انعطاف می دهد.
سیستم های چند برنامه ساده
حافظه را برای سه یا چهار برنامه تخصیص داده.
موضوع اصلی سیستم عامل های امروزی است.
باعث افزایش سرعت کار می شود
به خصوصیت سخت افزار تکیه دارد.
از سيستمهاي تك برنامه اي بيجيده تر است
نيازمند نوعي مديريت حافظه است
سیستم های اشتراک زمانی
از چند برنامگی برای رسیدن به حالت محاوره ای استفاده می کند.
پردازنده بین کاربران به اشتراک گذاشته می شود.
داشتن کاربران متعددی که از طریق پایانه خود به طور هم زمان از سیستم عامل استفاده می کنند.
اگر N کاربر داشته باشد هر كاربر 1/N از زمان مفید پردازنده استفاده می کنند.
چند برنامگی دسته ای در مقابل اشتراک زمانی
|
اشتراک زمانی |
چند برنام های دسته ای |
|
|
حداقل زمان پاسخ |
حداکثر استفاده از پردازنده |
هدف اصلی |
|
فرمان هایی که از پایانه وارد می شود |
دستورالعملهای زبان کنترل کار که همراه کار ارائه شده است |
منبع دستورات به سیستم عامل |
پنج دستاورد توسعه سیستم عامل:
1- فرآیندها.
2- مدیریت حافظه.
3- حفاظت اطلاعات و ایمنی.
4- زمانبندی و مدیریت منابع.
5- ساختار سیستم.
فرآیندها
یک مفهوم بنیادی در سیستم عامل است.
یک برنامه در حال اجرا است.
روح متحرک یک برنامه است.
موجودیتی که می توان به یک پردازنده داده شودو روی پردازنده اجرا شود.
سه محور برای ایجاد وتوسعه سیستم کامپیوتر:
1-چند برنامگی:
برای مشغول نگهداشتن هم زمان پردازنده و خروجی.
2-اشتراک زمانی:
آماده پاسخگویی هم زمان به چند کاربر.
3-سیستم های تراکنش بلا درنگ:
تعدادی از کاربران در حال وارد کردن درخواستها یا تغییرات خود روی بانک اطلاعاتی باشند.
علت بروز خطاها در سیستم نرم افزاری:
1-همگام سازی نا مناسب:
به سبب بروز یک حادثه یک کار عقب بیفتد.
2-شکست در انحصار متقابل:
استفاده بیش از دو کاربر از یک منبع به طور هم زمان.
3-عملکرد غیر قطعی برنامه:
ممکن است کاربرها در کار یک دیگر دخالت کنند.
4-بن بستها:
دو یا چند برنامه به خاطر هم معلق بمانند.
اجزاء یک فرآیند:
1-یک برنامه قابل اجرا.
2-داده های مورد نیاز این برنامه.
3-متن یا وضعیت اجرای آن برنامه.
(اصلی است وشامل تمام اطلاعاتی است که یک سیستم عامل برای مدیریت فرآیندها احتیاج دارد.)
- متن: شامل محتویات ثباتهاو...
- براي هرفرآیند یک مدخل براي فهرست فرايندها وجود دارد.
- ثبات شاخص: شامل فهرستی از فرآیندها که پردازنده را استفاده می کنند.
- ثبات شمارنده برنامه: برنامه بعدی که قرار است اجرا شود.
ثبات های پایه وحد
در ناحیه ای از حافظه قرار دارند.
شمارنده برنامه و تمام مراجعات به داده هانسبت به محتویات ثبات پایه تفسیر می شود و نباید از ثبات حد بیشتر باشد.
- از دخالت بین فرايندها جلوگیری می کنند.
پنج مسئولیت اصلی در مدیریت حافظه:
1-جداسازی فرآیندها: از دخالت فرآیندها جلوگیری می کند.
2-تخصیص و مدیریت خودکار: باید به مدیریت ها جا دهد.
3-حمایت از برنامه سازی مولفه ای: باید مولفه های برنامه را تعریف کند.
4-حفاظت و کنترل دسترسی: باید به کاربر اجازه دهد تا به بخشهایی از حافظه دسترسی داشته باشند.
5-حافظه دراز مدت: ذخیره اطلاعات برای مدت طولانی
حفاظت از اطلاعات و ایمنی:
به سه گروه زیر تقسیم می شود:
1-کنترل دسترسی: تنظیم دسترسی کار به کل سیستم.
2-کنترل جریان اطلاعات: تنظیم جریان اطلاعات در داخل سیستم و تحویل به کاربر.
3-گواهی: به صحّت اطلاعات.
زمانبندی و مدیریت اطلاعات:
سه عامل زیر را در نظر می گیرند:
1-انصاف: قرار دادن منابع به هر یک از پردازنده ها به طور عادلانه.
2-حساسیت در مقابل تفاوت ها: باید به خواسته ها جوابگو باشد.
3-کارایی: باید بکوشد تا توان عملیاتی را حداکثر زمان پاسخ را حداقل و در مورد سیستمهای اشتراکی زمانی از حداکثر تعدادکاربران حمایت کند.
اندازه یک سیستم سه مولفه نا مطلوب را در بر دارد:
1-سیستم عامل از نظر زمان تحویل تاخیر دارد.
2-سیستم ها اشکالهای پنهانی دارند که در هنگام کار اشکال خود را نشان می دهند.
3-کارایی آن از حد انتظار کم تر است.
برای رفع مشکل:
- سیستم های کوچک ساختار مولفه ای.
- سیستم های بزرگ ساختار سلسله مراتبی.
- ساختار سلسله مراتبی عملکرد سیستم را بر اساس پیچیدگی و ویژگی زمانی و سطح تجرید آنها تفکیک می کند.
- دارای چند سطح است که سطوح به هم وابستگی دارند که اعمال ابتدایی را انجام و جزئیات را پنهان می کند.
- سطوح پایین با اندازه کوتاه تر زمان سر کار دارد.
- بعضی مستقیما با سخت افزار در تبادل اطلاعات هستند.
سطوح سيستم عامل سلسله مراتبی:
سطح 1:شامل مدارات الکتریکی.
سطح 2:مجموعه دستورالعمل پردازنده.
سطح 3:مفهوم رویه یا زیر برنامه.
سطح4:وقفه ها.
سطح 5:فرآیند (یک برنامه در حال اجرا)
سطح 6:حافظه ثانویه کامپیوتر.
سطح7:یک فضای آدرس منطقی برای فرآیند.
سطح8:مبادله اطلاعات و پیامها بین فرآیند.
سطح9:ذخیره سازی دراز مدت پرونده ها.
سطح 10:دسترسی به دستگاه های خارجی.
سطح 11:نگهداری رابط بین شناسه های خارجی و داخلی.
سطح12:حمایت اطلاعات لازم برای مدیریت فرآیند ها.
سطح 13:واسط کاربر و سیستم عامل .(پوسته)
ویژگی های سیستم عامل های جدید:
معماری ریز هسته.
چند نخی.
چند پردازشی متقارن.
سیستم های عامل توزیعی.
طراحی شیء گرا.
معماری ریز هسته
موارد واگذاری به هسته:
1-دسترسی به فضای آدرس.
2-ارتباط بین فرآیند ها.
3-زمانبندی پایه ای.
رویکرد ریز هسته:
1-پیاده سازی را ساده می کند.
2-موجب انعطاف می گردد.
3-محیط توزیعی کاملا سازگار.
چند نخی
فرآیند ها به نخ هایی تقسیم می شوند که می توانند به طور هم زمان اجرا شوند
در فرآیندهایی که چند وظیفه اصلی مستقل را انجام می دهند مفید است.
فرايند : مجموعه يك يا جند نخ و منابع سيستمي تخصيص داده شده (مشابه يك برنامه حال اجرا)
چند پردازشی متقارن
1-پردازنده متعددی وجود دارد.
2-از امکانات ورودي / خروجي و حافظه اصلی به طور مشترك استفاده می کنند.
3-تمام پردازنده ها اعمال یکسانی را می توانند انجام دهند.
امتیازات چند پردازشی متقارن نسبت به معماری تک پردازنده:
کارایی:
قرار دادن ترتیب کارها به نحوی که به موازات هم انجام شوند.
دسترسی پذیری:
از آنجا که تمام پردازنده ها یک عمل را انجام می دهد خرابی در یکی از آنها موجب توقف ماشین نمی شود.
رشد:
با اضافه کردن پردازنده.
مقیاس پذیری:
قیمت ها متناسب با تعداد پردازنده ها باشد.
سیستم های عامل توزیعی
تصور یک فضای حافظه اصلی واحد و یک فضای حافظه ثانوی واحد و دیگر امکاناتی که دسترسی به آنها یکنواخت شده است را ارائه می کند.
طراحی شیء گرا
افزودن ملحقات مولفه ای به یک هسته كوچك.
محیا ساختن ابزار های توزیعی و سیستم عامل های توزیعی را آماده میکند.
نگاهی کلی بهWINDOWS NT
سیستم عامل چند کاربره چند وظیفه ای.
برای کامپیوتر شخصی طراحی شده.
اساسا از صفر طراحی شده است.
این سیستم عامل منسوب به MS-DOS یا PC XT است که توسط شرکت MIRCROSOFT برای اولین بار کامپیوتر IBM را ایجاد کرد.
اين سيستم عامل از دیسک سخت حمایت می کرد.
با بهره گیری از توان ریز پردازنده های جدید محیط تک کاربره و چند وظیفه ای کاملی به وجود آورد.
اولین گونه در سال 1993 وبا همان واسط گرافیکی WINDOWS3.1 ارائه گردید.
سپس گونه NT3.X و NT4.0 را ارائه کرد.(تغییر در مؤلفه های گرافیکی )
و در نهایت NT 5.0 را بیرون دادند.(دارای ویژگی افزایش خدمات برای توزیعی است)
معماری NT
NT نرم افزار کاربردی را از نرم افزار سیستم عامل اجرا می کند.
نرم افزار سیستم عامل که به ان مجری NT می گویند در حالت هسته اجرا می شوند.
به داده های سیستم و به سخت افزار سیستم دسترسی دارد.
نرم افزار باقیمانده که در حالت کاربر اجرا می شود به داده های سیستم دسترسی محدود دارد.
مجری NT:
یک معماری ریز هسته تغییر یافته است.
دسترسی از طریف مولفه مسئول امکان دارد.
دسترسی به داده های کلیدی از طریق توابع مناسب.
می توان مولفه ها را تغیر داد یا باز نویسی مجددسیستم و...
قابلیت حمل دارد.
دید یکسان به سخت افزار مورد استفاده دارد.
مولفه های خدمات سیستم:
مدیر ورودی و خروجی:
در خواستها را به ترتیب اولویت رسیدگی می کند.
مدیر شیء:
قواعدی را برای نگهداری و نام گذاری و.. شیءها اعمال می کند.
ناظر ایمنی:
مسئول اعمال قواعد اعتبار سنجی.
مدیر فرآیند:
ایجاد و حذف شی ء ها.
امکان فراخوانی رویه ورودی:
فراخوانی رویه از راه دور.
مدیر حافظه مجازی:
نگاشت بین آدرس های مجازی.
مولفه های پنجره ها / گرافیک:
ایجاد واسط پنجره در صفحه نمایش.
مهمترین مفاهیم شیئ گرا که در NTبه کاررفته:
در برگیری: هرشیء دارای یک یا چند فقره داده است که خصیصه نام دارد
کلاس شیءو رویداد: الگویی که خدمات را فهرست می کند.
وراثت: در داخل مجری حمایت شده است.
چند شکلی: مجموعه مشترکی از توابع API برای پردازش و...
سیستم UNIX
یک سیستم چند کاربره
برای کامپیوتر های کوچک به وجود آمد
سخت افزار توسط نرم افزار کامپیوتر احاطه شده است
این بخش را هسته گویند
برای اجرای روی یک پردازنده واحد طراحی شده.

فصل دوم:
روش تقسیم و حل
روش تقسیم و حل یک روش بالا به پایین است.
حل یک نمونه سطح بالای مسئله با رفتن به جزء و بدست آوردن حل نمونه های کوچکتر حاصل می شود.
هنگام پی ریزی یک الگوریتم بازگشتی ، باید:
.....
جلسه دوم
«انواع اصلي»
هدف کلي:
معرفي انواع متغييرها و نحوۀ بهکارگيري آنها در برنامههاي C++
هدفهاي رفتاري:
انتظار ميرود پس از پايان اين جلسه بتوانيد:
- انواع عددي صحيح در C++ را نام ببريد و متغيرهايي از اين نوعها را در برنامهها به کار ببريد.
.....
ادامه مبحث حافظه جانبي و نرم افزار سيستم
اطلاعات ذخيره شده روي ديسک ،در سطح يک يا
چند صفحه نگهداري مي شود. ترتيب کار به صورتي است که اطلاعات به صورت شيارهايي
(tracks) روي سطح ديسک نگهداري مي شوند. هر شيار غالباً به چند سکتور
(sector) تقسيم مي شود. سکتور کوچکترين بخشي از ديسک است که قابل آدرس دهي
است.
<
>
ديسک گردان ها معمولاً چند صفحه دارند.
شيارهايي که مستقيماً در بالا و پايين يکديگر قرار دارند ،يک سيلندر را
تشکيل مي دهند. اهميت سيلندر در آن است که به همه اطلاعات روي يک سيلندر مي توان بدون حرکت
دادن بازوي نگهدارنده هد (head) خواندن/نوشتن دستيابي داشت. حرکت
اين بازو پيگرد (seeking) نام دارد.
>
>
ظرفيت
ديسک تابعي از تعداد سيلندرها ،تعدا شيارها به ازاي هر سيلندر و ظرفيت هر شيار
است.
دو روش
براي سازماندهي داده ها بر روي ديسک وجود دارد :
۱) بر اساس سکتور
۲) بر اساس بلوک هاي تعريف شده توسط
کاربر
کلاستر
عبارت از تعداد ثابتي از سکتورهاي پيوسته است.
مديريت فايل براي در نظر گرفتن فايل به عنوان
مجموعه اي از کلاسترها و در عين حال حفظ حالت سکتوري ،سکتورهاي منطقي را به کلاسترهاي
فيزيکي که به آنها تعلق دارد ،به وسيله جدول تخصيص فايل (FAT) ارتباط مي دهد.
اگر فضاي زيادي روي ديسک باشد ، ممکن است
بتوان کاري کرد که فايل به طور کامل از کلاسترهاي پيوسته تشکيل شود. در چنين موردي
گفته مي شود که فايل حاوي يک حد (extent) است.
>
>
اتلاف فضا در داخل يک سکتور را پراکندگي داخلي
مي نامند. سازماندهي بلوک ها مشکلات پوشايي سکتورها و پراکندگي را ندارد ،زيرا
اندازه بلاک ها مي تواند تغيير کند تا سازماندهي منطقي داده ها امکان پذير شود.
بلوک معمولاً طوري سازماندهي مي شود که تعداد
مناسبي از رکوردهاي منطقي را نگهداري کند. براي اشاره به تعداد رکوردهايي که قرار
است در هر يک از بلاک هاي فايل نگهداري شوند ،از اصطلاح ضريب بلوک بندي
استفاده مي شود.
در الگوهاي آدرس دهي بلاکي هر بلوک از داده ها
معمولاً با يک يا چند زير بلوک (subblock) همراه است که حاوي اطلاعات اضافي
راجع به بلوک داده ها است. معمولاً يک زيربلوک شمارشي وجود دارد که تعداد
بايت هاي موجود در بلوک مربوط را نگه مي دارد. همچنين ممکن است که يک زيربلوک
کليد ،حاوي کليد مربوط به آخرين رکورد در بلوک داده ها باشد.
هم بلاک ها و هم سکتورها نيازمند آنند که
مقدار معيني از فضاي ديسک را به شکل سربار غير داده اي اشغال کنند. بخشي از اين
سربار از اطلاعاتي تشکيل مي شود که طي فرمت کردن ،بر روي ديسک نگهداري مي شود.
فرمت کردن ،پيش از آنکه ديسک بتواند مورد استفاده قرار گيرد ،صورت مي پذيرد.
فرمت کردن موجب مي شود تا شکاف (gap)
و علامت هاي هم زمان سازي ،بين فيلدهاي اطلاعاتي قرار داده شود تا مکانيزم
خواندن/نوشتن ، بين آنها تمايز قائل شود.
دستيابي به ديسک را مي توان به سه عمل فيزيکي
متمايز تقسيم کرد که هر يک هزينه خود را دارد :
۱) زمان پيگرد (seek
time)
۲) تأخير چرخشي (rotational
delay)
۳) زمان انتقال (transfer
time)
فصل اول
نگاه کلی به سخت افزار
چهارعناصر اصلی سخت افزار:
1- پردازنده (cpu): کنترل و پردازش داده ها .
2- حافظه اصلی: ذخیره داده ها و برنامه ها و نا پایدار.
3- مولفه های ورودی و خروجی: انتقال داده ها بین کامپیوتر و محیط خارجی .
4- اتصالات داخلی سیستم: جهت ارتباط بین سه مولفه دیگر .
واحد پردازش مرکزیprocessing unit control
PC: حاوی دستورالعملی که باید واکشی شود .
IR: ثبات دستور العمل حاوی آخرین دستور العمل واکشی شده .
MIR: ثبات آدرس حافظه،محل خواندن و نوشتن را مشخص می کند .
MBR: ثبات میانگیر حافظه،در برگیرنده داده ای است که قرار است خوانده یا نوشته شود.
I/O AR: ثبات آدرس ورودی خروجی،مشخص کردن یک دستگاه ورودی یا خروجی خاص .
I/O BR: ثبات میانگیر ورودی خروجی،برای تبادل داده بین پردازنده و مولفه ورودی خروجی .
ثباتهای پردازنده
حافظه سریعتر وکوچکتر از حافظه اصلی است که در داخل پردازنده قرار گرفته است.
دو وظیفه آن:
1- مراجعه به حافظه اصلی را به حداقل می رساند.
(قابل روئیت هستند)
2- کنترل عملیات پردازنده
(ثبات کنترل و وضعیت ؛ اغلب قابل رویت نیستند)
حافظه :
شامل مجموعه ای از محل هایی است ، که حاوی یک عدد دودویی است ، که می توانیم دستورالعمل یا داده تفسیر شود که بوسیله شماره آدرس هایی برای آنها مشخص می شود.
مولفه ای ورودی / خروجی
داده ای میانگیر داخلی است.
جهت نگهداری داده ها تا زمان انتقال
ثبات قابل روئیت برای کاربرد
ثباتی است که برنامه نویس می تواند به وسیله دستور العمل های ماشین به آنها مراجعه کند.
1- ثباتهای داده : برنامه ساز می تواند به بعضی توابع نسبت دهد.
2- ثباتهای آدرس : حاوی آدرس داده و دستورالعمل ها مي باشد.
3- ثبات کد وضعیت : بیتهای هستند که به عنوان نتیجه عمل ها توسط سخت افزار مقدار گذاری می شود.
(بخشهایی از آن برای کاربر قابل روئیت نیست)
ثبات های آدرس
1- ثبات شاخص ( X+ مقدار پا یه = آدرس موثر)
2- ثبات اشاره گر قطعه: حافظه به قطعاتی تقسیم شده و یک ثبات برای نگهداری آدرس پایه (محل شروع) قطعه استفاده می شود.ممکن است چند ثبات آدرس پایه وجود داشته باشد.
3- ثبات اشاره گر پشته: ثباتی خاص جهت اشاره به بالای پشته در حافظه اصلی.
ثبات های کنترل وضعیت
این ثبات قابل روئیت برای کاربر نیست.
برای کنترل عمل پردازنده به کار می روند.
- ثبات کلمه وضعیت (PSW) :حاوی اطلاعات وضعیت.
علاوه بر کد وضعیت شامل اطلاعات ذيل مي باشد
- بیت فعال و غیر فعال کردن وقفه.
- بیت حالت کار بر/ سرپرست.
تخصیص چند صد يا هزارکلمه ازابتداي حافظه برای مقاصد كنترلي متداول است
چرخه دستورالعمل:
1- چرخه واکشی: یک دستور را از حافظه می خواند
2- چرخه دستورالعمل: اجراي دستورالعمل واكشي شده
- ثبات pc آدرس حافظه که با بیتی واکشی شده را نشان می دهد.
- واکشی دستورالعمل به ثبات IR .
- معمولا پردازنده پس از واکشی دستورالعمل یک واحد به PCاضافه می کند.
- ثبات :IRدارای 4 بیت که بیت اول عمل و سه بیت دیگر آدرس حافظه را مشخص می کند .
- کد عمل : عملی را که با بیتی پردازنده انجام بدهد را نشان می دهد.
وقفه
راهکاری است که به وسیله آن دستور العملی توسط پردازنده و پس از انجام عمل دیگر به روند عادی خود باز گردد.
رایجترین وقفه ها
1- برنامه: وقفه ای است که در بعضی شرایط خاص یک دستورالعمل رخ می دهد مثل سر ریز، تقسیم بر صفر.
2- زمان سنج: وقفه ای که توسط زمان سنج داخلی پردازنده تولید می شود.
3- ورودی/خروجی: این وقفه به وسیله کنترل کننده ورودی وخروجی ایجاد می شود.
4- نقص سخت افزار: این وقفه با سخت افزار تولید میشود.
وقفه:

اعمال ریز پردازنده در یکی از چهار کرده زیر قرار دارد:
1- پردازنده – حافظه
2- پردازنده – ورودی/خروجی
3- پردازش داده ها (محاسباتی به منطقی)
4- کنترل
پردازش یک وقفه
1- یک دستگاه یک علامت وقفه برای پردازنده می دهد.
2- اجرای دستورالعمل جاری به پایان می رسد.
3- پردازنده اعلام وصول وقفه می کند.
4- محتوای ثبات (PSW) وpc در بالای پشته کنترل قرار می دهد.
5- پردازنده بر اساس وقفه مقدار pc جدید را قرار می دهد.
6-باقیمانده اطلاعات وضعیت فرایند را ذخیره می کند.
7-وقفه را پردازش می کند.
8-بازیابی اطلاعات ثباتهایی که قبلا ذخیره شده.
9-pc و psw قدیمی را دوباره پردازش کن.
وقفه های چند گانه:
(همزماني چند وقفه)
دارای دو رویکرد:
1- پردازش ردیفی وقفه: در هنگام وقوع یک وقفه بقیه وقفه ها از کار بیفتند تا کار آن تمام شود.
نکته منفی : اولویت نسبی به حساب نمی آید.
وقفه ای چند گانه:
2- پردازش وقفه تو در تو: در صورتی که وقفه دیگری رخ داد واولویت بالایی داشت به برنامه برگرداننده و وقفه اول متوقف می شود.
چند برنامگی :
چون پردازنده نسبت به قسمت های دیگر سریعتر است برای استفاده حداکثر از آن می توان در یک زمان چند برنامه از کاربر فعال باشد.
چند برنامه برای اجرا نوبت بگیرند.
|
ثباتها |
|
حافظه پنهان |
|
حافظه اصلی |
|
حافظه پنهان دیسک |
|
دیسک مغناطیس |
|
رسانه جابه جا پذیر |
سلسه مراتب حافظه
توضیحات درباره نمودار فوق
با حرکت به سطوح پایین تر این سلسله مراتب:
الف: کاهش هزینه در هر بیت
ب: افزایش ظرفیت
ج: افزایش زمان دسترسی
د: کاهش تعداد دفعات دسترسی پردازنده به حافظه
ثباتها:سریعترین و گرانترین و کوچکترین و نا پایدارند.
حافظه اصلی:دارای آدرس یکتا و نا پایدار هستند. با حافظه پنهان توسعه داده می شوند.
حافظه پنهان: قابل روئیت برای کاربران نیست و ناپایدارند.
حافظه پنهان :
این حافظه به دو صورت کارایی را افزایش می دهند: