۱)
راهي که بلافاصله بدانيم که حفره هاي خالي در فايل وجود دارد يا نه
۲)
راهي که اگر چنين حفره اي وجود دارد مستقيماً به آن پرش کنيم.
استفاده
از ليست هاي پيوندي براي پيوند دادن تمام رکوردها هر دو نياز فوق را
برآورده مي کند.
آسان
ترين راه براي کار کردن با ليست استفاده از آن به صورت پشته است.
پشته ليستي است که در آن اضافه و حذف گره
ها از يک انتهاي ليست انجام مي شود.
براي
بازيابي رکوردها از طريق ليست پيوندي به موارد زير نياز داريم :
۱) راهي براي پيوند دادن رکوردهاي حذف شده و
تبديل آنها به يک ليست
۲) الگوريتمي براي اضافه کردن رکوردهاي حذف شده
به ليست
۳) الگوريتمي براي پيدا کردن و خارج کردن يک
رکورد از ليست هنگامي که مي خواهيم از آن رکورد استفاده کنيم.
براي مقابله با پراکندگي خارجي يک روش متراکم
کردن فايل است و دو راه ديگر به قرار زير است:
۱) اگر دو حفره رکورد در ليست به صورت فيزيکي کنار هم قرار
گيرند آنها را با هم يکي مي کنيم تا يک حفره رکورد بزرگتر ايجاد شود. به اين کار ادغام
حفره ها در فايل ميگوييم.
۲) سعي مي کنيم پراکندگي را به حداقل برسانيم.
به اين ترتيب که يک راهبرد انتخاب جا را در نظر مي گيريم که برنامه با استفاده از
آن يک حفره رکورد را از ليست انتخاب کند.
هنگامي که نياز داريم يک حفره رکورد را
از ليست خارج کنيم با شروع از ابتداي فايل عمل جستجو را انجام مي دهيم تا رکوردي
به اندازه کافي بزرگ پيدا کنيم يا به انتهاي ليست برسيم. اين راهبرد انتخاب جا به عنوان
راهبرد اولين جاي مناسب( first fit)
ناميده مي شود.
سه مشکل اساسي مربوط به مرتب سازي و جستجوي
دودويي عبارتند از :
۱) جستجوي دودويي نياز به بيش از يک يا دو
دسترسي به ديسک دارد.
۲) نگهداري يک فايل به صورت مرتب شده خيلي گران
تمام مي شود.
۳) مرتب سازي داخلي تنها در مورد فايل هاي کوچک
عملي است.
مرتب
سازي کليدي که گاهي به آن مرتب سازي بابرچسب مي گويند بر اين ايده
استوار است که وقتي فايلي را در حافظه مرتب مي کنيم تنها چيزيکه واقعاً به آن نياز
داريم کليد رکوردها است.
عيب مرتب
سازي کليدي اين است که مرتب کردن فايلي با n
رکورد نياز به n دستيابي تصادفي به فايل اصلي دارد
که مي تواند بسيار بيشتر از خواندن ترتيبي همان تعداد رکورد وقت بگيرد.
شاخص گذاري
همه شاخص ها بر اساس يک مفهوم اصلي واحد عمل مي
کنند: کليدها و آدرس فيلدها.
انواع شاخص هايي که در اين فصل بررسي مي کنيم شاخص
ساده ناميده مي شوند زيرا با استفاده از آرايه هاي ساده اي از ساختمان ها نشان
داده مي شوند ،که حاوي کليدها و آدرس فيلدها هستند.
چون شاخص ها به طور غير مستقيم عمل مي کنند ،
بدوندستکاري محتويات فايل ،به فايل نظم و ترتيب مي بخشند.
کاتالوگ کارتي در واقع مجموعه اي از سه
شاخص است که هر کدام از يک فيلد کليد متفاوت استفاده مي کنند و همه انها از
يک شماره کاتالوگ يکسان به عنوان فيلد آدرس بهره مي گيرند.
بنابراين کاربرد ديگر شاخص بندي اين است که مي
توان از طريق مسيرهاي گوناگوني به فايل دست يافت.
در جستجوي دودويي لازم است امکان پرش به وسط فايل را داشته
باشيم.
راه
ديگر براي مرتب سازي ، ايجاد شاخص براي فايل است.
ساختار
شيء شاخص بسيار ساده است.
اين
ساختار ليستي است که هر عنصر آن دو فيلد دارد:
يک فيلد کليد و يک فيلد براي آفست بايت.
عملياتي
که براي يافتن داده هاي مورد نظر ،از طريق شاخص لازمند عبارتند از :
۱) ايجاد فايل داده ها و شاخص خالي اوليه
۲) باز کزدن فايل شاخص در حافظه ،قبل از به
کارگيري آن
۳) نوشتن فايل شاخص بر روي ديسک ،پس از به
کارگيري آن
۴) افزودن رکوردهايي به فايل و داده ها
۵) حذف رکوردها از فايل داده ها
۶) بهنگام کردن رکوردها در فايل داده ها
۷) بهنگام کردن شاخص براي انعکاس تغييرات به
عمل آمده در فايل داده ها.
مزيت بزرگي که روش شيء گرا دارد آن است
که براي اجراي اين عمليات به هرچه نياز داشته باشيم مي توانيم در متدهاي کلاس خود
بيابيم.
در
ايجاد فايل ها بايد دو فايل ايجاد شوند :
۱) فايل داده ها براي نگهداري اشياي داده اي
۲) فايل شاخص براي نگهداري شاخص کليد اوليه
بهنگام
سازي رکوردها به دو صورت انجام مي شود :
۱) بهنگام سازي ،تعداد فيلد و کليد را تغيير مي
دهد.
۲) بهنگام سازي ،در فيلد و کليد تأثير نمي
گذارد.
آشکارترين
بهينه سازي ،استفاده از جستجوي دودويي در متد find است که توسط :
insert,searchوremoveبه کار گرفته مي شود.
منبع ديگر بهينه سازي ،چنانچه رکورد شاخص
تغيير نکرده باشد ، نوشتن درباره رکورد شاخص در فايل شاخص است.
دستيابي
به شاخص روي ديسک داراي معايب زير است :
۱) جستجوي دودويي شاخص به جاي آنکه با سرعت
حافظه صورت پذيرد ،نياز به چندين پيگرد دارد.
۲) ترتيب مجدد شاخص که از حذف يا افزودن رکورد
ناشي مي شود نياز به جابه جا کردن يا مرتب سازي رکوردها در حافظه ثانويه
دارد که اين کار ميليونها بار گران تر از اجراي اين عمليات در حافظه است.
هرگاه
يک شاخص ساده در حافظه جا نشود بايد از موارد زير استفاده کرد :
۱) در صورتي که سرعت دستيابي در اولويت قرار
داشته باشد ،از سازماندهي درهمسازي استفاده شود.
۲) در صورتي که به هر دو نوع دستيابي کليدي و
ترتيبي نياز داشته باشيد ،از يک شاخص چند سطحي با ساختاردرختي نظير
درخت B استفاده شود.
شاخص هاي ساده نسبت به استفاده از فايل داده
اي که بر حسب کليد مرتب شده اند مزاياي چشمگيري دارد :
۱) شاخص ساده استفاده از جستجوي دودويي را براي
دستيابي کليدي به يک رکورد در فايلي که طول رکوردهاي آن متغير است امکان پذير مي
سازد.
۲) اگر ورودي هاي شاخص بسيار کوچکتر از
رکوردهاي فايل داده ها باشد ،مرتب سازي و نگهداري شاخص نسبت به مرتب سازي و
نگهداري فايل داده ها زمان کمتري مي برد.
۳) اگر در فايل داده ها رکوردهايي وجود دارند
که در جاي خود مستقر هستند ،با استفاده از شاخص مي توان ترتيب کليدها را بدون
جابجايي رکوردهاي داده ها عوض کرد.
هنگاميکه شاخص ثانويه اي موجود باشد
،افزودن يک رکورد به فايل به معناي افزودن يک ورودي شاخص ثانويه است. زمان لازم
برا انجام اين کار بسيار مشابه زمان لازم براي افزودن ورود يي به شاخص اوليه است.
يک اختلاف مهم شاخص ثانويه و شاخص اوليه آن
است که شاخص ثانويه مي تواند حاوي کليدهاي دوگانه باشد.
حذف يک رکورد معمولاً به معناي حذف تمامي آدرس
هاي آن رکورد در سيستم فايل است.
بنابراين حذف رکوردي از فايل داده ها نه تنها
به معناي حذف ورودي مربوط در شاخص اوليه بلکه به معناي حذف همه ورودي هاي
موجود در همه شاخص هاي ثانويه اي است که به اين ورودي از شاخص
اوليه رجوع مي کنند.
مشکل اين است که شاخص هاي ثانويه همانند شاخص
اوليه به ترتيب کليدها نگهداري مي شوند. در نتيجه حذف يک ورودي شامل ترتيب مجدد
ورودي هاي موجود ،به منظور بستن فضاي باقيمانده از حذف است.
بهنگام سا زي فايل داده ها فقط هنگامي شاخص
ثانويه را تحت تأثير قرار مي دهد که کليد اوليه يا ثانويه تغيير يابند. که سه
وضعيت ممکن است پيش بيايد :
۱) بهنگام سازي باعث تغيير کليد ثانويه مي شود.
۲) بهنگام سازي باعث تغيير کليد اوليه مي شود.
۳) بهنگام سازي محدود به فيلدهاي ديگر
ساختارهاي
شاخص ثانويه اي که تا کنون ارائه کرديم دو مشکل دارند :
۱)
هربارکه رکورد جديدي به فايل افزوده مي شود ،بايد فايل شاخص را دوباره مرتب کنيم
،حتي اگر رکورد جديد به يک کليد ثانويه موجود مربوط باشد.
۲) اگر
کليدهاي ثانويه وجود داشته باشد ،فيلد کليد ثانويه براي هر ورودي تکرار مي شود.
اين کار باعث هدر رفتن فضا مي شود.
درسيستم فايلي که طي اين فصل طراحي کرديم ، انقياد
کليدهاي اوليه به آدرس در زمان ايجاد شدن فايل ها رخ مي دهد ولي کليدهاي
ثانويه در زمان استفاده ،به آدرس خود پيوند مي يابند.
پردازش کمک ترتيبي و مرتب سازي فايل هاي بزرگ
عمليات کمک ترتيبي شامل پردازش هماهنگ دو يا
چند ليست ترتيبي براي ايجاد يک ليست خروجي است.
گاهي پردازش منجر به ادغام يا اتحاد
اقلام موجود در ليست هاي خروجي مي شود ،گاهي هدف ،تطابق يا جايگذاري اقلام در ليست
ها است ،گاهي نيز عمليات شامل ترکيبي از تطابق و ادغام مي شود.
اين نوع عمليات روي ليست هاي ترتيبي ،مبناي
بسياري از پردازش هاي فايل ها را تشکيل مي دهند.
گرچه روال همخواني بسيار ساده به نظر مي رسد
،براي آن که اين روال بهتر عمل کند به چند نکته بايد توجه داشت :
۱) آماده سازي
۲) دستيابي به عضو بعدي ليست
۳) همزمان سازي
۴) کنترل شرايط پايان فايل
۵) تشخيص خطاها
اگر قرار باشد تعداد زيادي از ليست ها با هم
ادغام شوند ،مي توان به جاي حلقه مقايسه ها از درخت انتخاب استفاده
کرد.
مرتب
سازي در حافظه شامل سه مرحله است :
۱) خواندن کل فايل از روي ديسک به حافظه
۲) مرتب سازي رکوردها با استفاده از يک روال
مرتب سازي استاندارد ،مثل مرتب سازي shell
۳) نوشتن دوباره فايل روي ديسک
آيا يک الگوريتم مرتب سازي داخلي وجود دارد که
به قدر کافي سريع باشد و بتواند مرتب سازي اعداد را بلافاصله پس از خوانده شدن
آنها آغاز کند و منتظر قرار گرفتن کل فايل در حافظه نشود؟
بله ،نام آن مرتب سازي هرمي (heapsort) است و مبتني بر همان اصل درخت انتخاب است.
هرم
درختي دودويي با ويژگي هاي زير است :
۱) هر
گره داراي کليدي است که آن کليد بزگتر يا مساوي کليد واقع در گره پدرش است.
۲) يک
درخت دودويي کامل است.
۳) به
خاطر ويژگيهاي ۱ و ۲ ،در نگهداري درخت مي توان آرايه اي اختصاص داد که در آن ،گرهريشه ،انديس ۱ و انديسهاي فرزندان چپ و راست
گرهi،به ترتيب برابر با
i۲ و ۱ + i۲ باشند.
الگوريتم مرتب سازي هرمي دو بخش دارد:
ابتدا هرم را ايجاد مي کنيم سپس کليدها را به
صورت مرتب شده در خروجي قرار مي دهيم.
بازيابي
ترتيبي کليدها به صورت زير انجام مي شود :
۱) تعيين مقدار کليد موجود در اولين موقعيت هرم
. اين مقدار کوچکترين مقدار هرم است.
۲) انتقال بزرگترين مقدار هرم به اولين محل آن
و کم کردن يک واحد از تعداد عناصر.
۳) ترتيب دوباره هرم. با اينکار بزرگترين عنصر با فرزند
کوچکش جابجا مي شود.
هر بار
که اين سه مرحله اجرا مي شود ،کوچکتري مقدار بازيابي شده از هرم حذف مي گردد.
مرتب
سازي کليدي دو نارسايي دارد :
۱) هنگاميکه کليدها مرتب سازيمي شوند ،بايد
زمان زيادي صرف اين موارد شود. پيگرد هر رکورد در رکوردهاي مرتب شده ،خواندن هر
رکورد به حافظه و نوشتن آن روي فايل مرتب شده جديد شود.
۲) در مرتب سازي کليدي ،اندازه فايلي که
قابل مرتب سازي است به تعداد جفت کليد/اشاره گري که در حافظه جا شود ،محدود مي
شود. در نتيجه هنوز نمي توانيم فايل هاي واقعاً بزرگ را مرتب سازي کنيم.
رانش
داراي ويژگي هاي زير است :
۱) واقعاً قادر به مرتب سازي فايل هاي بزرگ هست
و به فايل هايي به هر اندازه قابل بسط است.
۲) خواندن فايل ورودي در مرحله ايجاد
رانش ،ترتيبي است و لذا بسيار سرعتر از ورودي است ،زيرا ورودي به ازاي هر رکورد
نياز به پيگرد دارد.
۳) خواندن هر رانش طي مرحلهادغام و نوشتن رکوردهاي مرتب شده نيز ترتيبي
است.
۴) اگر براي بخشي از ادغام که در حافظه انجام
مي شود از مرتب سازي هرمي استفاده شود مي توانيم اين عمليات را با I/O همپوشاني کنيم تا زمان ادغام افزايش پيدا نکند.
۵) چون I/O
تا حد زيادي ترتيبي است ،در صورت نياز مي توان براي هر دو عمليات ورودي و خروجي از
نوار نيز استفاده کرد.
I/Oچهار بار اجرا مي
گردد.
در
مرحلهمرتب سازي :
۱) خواندن همه رکوردها به حافظه براي مرتب سازي و تشکيل
رانش ها
۲) نوشتن رانش هاي مرتب شده روي ديسک.
در
مرحلهادغام :
۱) خواندن رانش هاي مرتب شده به حافظه براي
ادغام
۲) نوشتن فايل مرتب شده روي ديسک
+ نوشته شده در سه شنبه بیست و هشتم خرداد ۱۳۸۷ ساعت 21:33 توسط میلاد
|
فراروند
ایجاد متن نوعی تولید و خلاقیت است . از این نقطه نظر نیاز به طراحی دارد یعنی
باید یک طرح اولیه برای متنی که می خواهیم تهیه نماییم . در مرحله تهیه طرح اولیه
کارهای زیر را انجام می دهیم :
تعیین عناوین داخلی در سطوح مختلف تا
رسیدن به ایده ساده
الگوریتم حریصانه ، به ترتیب عناصر را گرفته ، هر
بار آن عنصری را که طبق ملاکی معین ”بهترین“ به نظرمی رسد، بدون توجه به انتخاب هایی که قبلا
انجام داده یا در آینده انجام خواهد داد، بر می دارد.
الگوریتم حریصانه ، همانند برنامه نویسی پویا غالبا
برای حل مسائل بهینه سازی به کار می روند، ولی روش حریصانه صراحت بیشتری دارد.
در روش حریصانه ، تقسیم به نمونه های کوچک تر صورت نمی
پذیرد.
تكرار، اجراي پي در پي يك دستور يا بلوكي از دستورالعملها در يك برنامه
است. با استفاده از تکرار ميتوانيم کنترل برنامه را مجبور کنيم تا به خطوط قبلي
برگردد و آنها را دوباره اجرا نمايد.
C++ داراي سه دستور تكرار است:
دستور while، دستور do_while و دستور for. دستورهاي تکرار به علت طبيعت چرخهمانندشان، حلقه نيز ناميده ميشوند.
در زبان 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. برنامهاي بنويسيد كه سن شما را برحسب روز از ورودي بخواند و مشخص كند كه چند سال، چند ماه، چند هفته و چند روز دارید.
+ نوشته شده در یکشنبه بیست و ششم خرداد ۱۳۸۷ ساعت 16:16 توسط میلاد
|
سلام امروز واستون جزوه مدار الکتریکی رو گذاشتم که خیلیها ازم خواسته بودن بذارم.این جزوه بیشتر از همه به درد دانشجویان کامپیوتر و برق می خوره . امیدوارم حداکثر استفاده رو بکنید.ضمنا نظر یادتون نره
- تمام نیازمندیهای اصلی که سیستم عامل باید پاسخگو باشد به وسیله فرایند قابل یبان است.
سیستم عامل باید در بین اجرای فرآیند قرار گیرد.
سیستم عامل باید با بهره گیری از یک سیاست خاص منابع در اختیار سیستم قرارداده واز وقوع بن بست جلوگیری کند.
سیستم عامل بلید از ارتباط بین فرایند هاو ایجاد فذایندها توسط کاربر حمایت کند.
حالات فرآیند:
- اساسی ترین عمل پردازنده اجرای دستورالعمل های موجود در حافظه است.
- اجرا شامل دنباله ای از دستورالعمل های همان برنامه است.
به اجرای یک فرایند خاص فرایند یا وظیفه گویند.
- رفتار یک فرآیند به خصوص را می توان با فهرست کردن دنباله دستورالعمل ها یی که برای آن فرآیند اجرا می شود مشخص نمود که به آن رد آن فرآیند گویند.
- مسئولیت اصلی سیستم عامل کنترل یک فرآیند است.
- یک فرآیند ممکن است در یکی از دو حالت اجرا وغیر اجرا باشد.
- وقتی یک سیستم عامل فرآیندی را دریافت می کند آن را در حالت غیر اجرا قرار می دهد.
- پس از رسیدن نوبت فرآیند فعلی را به حالت غیر اجرا برده و فرآیند را به حالت اجرا برده.
- در مورد هر فرآیندی باید اطلاعاتی را ذخیره کرد.
- فرآیندی که در حال اجرا نیست باید در صفی به انتظار نوبت قرار گیرد.
- گاهی صفی است که حاوی جداولی است که وضعیت فرآیند ها را نمایش می دهد.
- وقتی یک فرآیند در معرض وقفه قرار می گیرد به صف انتظار می رود.
- اگر یک فرآیند کارش تمام شود کنار گذاشته می شود.
نمو دار تغییر حالت:
نمودار صف بندی:
ایجاد و پایان فرآیند:
عمر یک فرآیند محدود به زمان ایجاد تا زمان خاتمه دادن به آن است.
در هنگام ایجاد سیستم عامل ساختمان داده مربوط به آن فرآیند را ساخته و فضای آدرس مربوط به آن را تخصیص می دهد.
معمولا چهار حادثه موجب به ایجاد فرآیند می گردد:
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-انتقال کنترل به فرآیند دیگر.
+ نوشته شده در پنجشنبه بیست و سوم خرداد ۱۳۸۷ ساعت 23:53 توسط میلاد
|
زمان پيگرد عبارت است از زمان لازم انتقال بازوي دستيابي ،به سيلندر مناسب.
تأخير در چرخش عبارت است از زمان لازم براي چرخش ديسک ،تا سکتور مورد نظر زير هد خواندن/نوشتن قرار گيرد.
علي رغم افزايش کارايي ديسک ها ،سرعت شبکه ها به حدي بالا رفته است که دستيابي به ديسک غالباً تنگناي مهمي در کل سيستم 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) است که براي حذف حفره هاي خالي فايلي به کار مي رود که بارها و بارها مورد حذف و بهنگام سازي قرار گرفته است.
دلايل زيادي براي کوچک کردن فايلها وجود دارد :
۱) فايل هاي کوچکتر نياز به حافظه ي کمتري دارند که باعث صرفه جويي مي شود.
۲) سريع تر انتقال داده مي شوند که زمان دسترسي را کوتاهتر مي کند يا به جاي آن مي توان با همان زمان دسترسي از پهناي باند کمتر و ارزان تر استفاده کرد.
۳) به صورت ترتيبي ،سريع تر قابل پردازش هستند.
فشرده سازي داده ها عبارت است از رمزگذاري اطلاعات در فايل ،به صورتي که جاي کمتري بگيرد.
تکنيک فشرده سازي که در آن تعداد بيت ها با استفاده از يک نمادگذاري فشرده تر کاهش مي يابد يکي از روش هاي فشرده سازي است که به عنوان کاهش زوايد شناخته مي شوند.
آرايه هاي اسپارس براي نوعي فشرده سازي به نام رمزگذاري طول رانش مناسب اند. ابتدا مقدار خاصي را براي شروع رمزگذاري طول اجرا در يک بايت ذخيره کرده سپس الگوريتم آن را اجرا مي کنيم.
الگوريتم آ رايه هاي اسپارس را به صورت زير اجرا مي کنيم :
۱) پيکسل هاي تشکيل دهنده ي شکل را خوانده آنها به ترتيب در فايل ذخيره کن.
۲) جايي که يک مقدار پيکسل بيش از يک بار پشت سر هم تکرار شود اين سه بايت را به ترتيب جايگزين کن :
الف) نشان دهنده کد طول اجرا
ب ) مقدار پيکسلي که تکرار شده
ج ) تعداد دفعاتي که اين مقدار تکرار شده است.
نوع ديگري از فشرده سازي کدهاي با طول متغير را بسته به تعداد دفعات ظاهر شدن مقادير ، به آن مقادير نسبت مي دهد. به مقاديري که بيشتر تکرار مي شوند کدهاي کوتاهتري نسبت داده مي شود بنابر اين جاي کمتري مي گيرند. کدهاي هافمن مثالي از کدهاي با طول متغير هستند.
راهي ديگر براي صرفه جويي فضا در يک فايل، بازيابيفضا در آن فايل پس از تغيير يافتن فايل است.
تغييرات فايل به سه شکل انجام مي شود :
۱) اضافه کردن رکورد
۲) بهنگام سازي رکورد
۳) حذف رکورد
متراکم کردن فايل از طريق پيدا کردن مکان هايي در فايل که حاوي هيچ داده اي نيستند و از بين بردن اين مکان هاي خالي فايل ها را کوچکتر مي کند. و مکان هاي خالي هم وقتي در فايل ايجاد مي شود که رکوردي را حذف مي کنيم.
متراکم کردن فايل آسان ترين و رايج ترين روش هاي بازيابي فضا است.
به طور کلي براي فراهم کردن مکانيسمي براي حذف رکوردها و به دنبال آن استفاده دوباره از فضاي آزاد شده بايد بتوانيم دو مسئله را تضمين کنيم :
۱) رکوردهاي حذف شده به طور خاصي علامت گذاري شوند.
۲) بتوانيم محلي را که توسط رکوردهاي حذف شده اشغال شده بود پيدا کنيم تا بتوانيم براي اضافه کردن رکوردهاي جديد از اين محل ها استفاده کنيم.
+ نوشته شده در چهارشنبه بیست و دوم خرداد ۱۳۸۷ ساعت 19:29 توسط میلاد
|
نوعی
ارائه است کهرسانه اصلی آن نوشتار است
هرچند در مقولات علمی – فنی معمولا از شکل هم برای
انتقال
ایده استفاده می شود . ارائه کننده به کمک یک زبان دارای خط و بر اساس سبک و سیاق
مشخص اطلاعات مورد نظر خود را منتقل می کند .
خصوصیات ارائه کتبی :
ارائه
کتبی به مثابه نوعی انتقال اطلاعات خصوصیاتی دارد به شرح ذیل :
غیابی است (ارائه کننده حضور ندارد )
قابل استناد است
با فرصت است
مشروح است (عرصه شرح و بسط وجود دارد البته باید
کنترل کمی و کیفی شود)
تعداد مخاطبین معمولا زیاد است
سبک و سیاق مشخص و معمولا واحد دارد (به ویژه در
مقولات علمی – فنی )
تاثیر گذاریش تدریجی (و طبعا غیابی ) است .
احتمال بروز اشتباه (حداقل نسبت به ارائه شفاهی )
کمتر است
امکان تبادل نظر و رویارویی وجود ندارد و اساسا نوعی
انتقال اطلاعات یکسویه است.
انواع ارائه کتبی :
ارائه
کتبی را می توان از چند جنبه رده بندی کرد از جمله فرم / صورت ، ماهیت محتوا ، سبک
، هدف ،مورد استفاده ، مخاطبین ، سطح محتوا و ... اما هدف اصلی این کتاب در ارائه
کتبی در دو رده کلی دانشگاهی( کم وبیش
آکادمیک ) و غیر دانشگاهی می باشد .
گونه های رایج تر ارائه کتبی دانشگاهی و غیر دانشگاهی:
دانشگاهی
: کتاب ، جزوه ، مقاله ، انواع گزارشها ، رساله ، یادداشت تحقیق ، دانشنامه ( تز )
،مجله برنامه کامپیوتری و ... که بعضی از این گونه ها در سطوح پایین تر آموزش نیز
وجود دارند .
غیر
دانشگاهی : کتاب ، مجله ، روزنامه، جنگ ، بروشور ، بولتن ، کاتالوگ ، انواع
گزارشها ،
کتابهای
راهنما ، اطلس ، آلبوم ، فصل نامه ، سالنامه ، مکاتبات اداری و ...
ساختار اکثر گونه های علمی – فنی (غیر از گونه های خاص)
1-
بخش آغازین
2-
بخش میانی
3- بخش
پایانی
آنچه که در این سه بخش آورده می شود محتوای
ارائه کتبی را تشکیل می دهد که هر یک از این سه بخش
اجزایی
دارد که مهمترین بخش همان بخش میانی یا متن اصلی است که باید طی چند مرحله آن را
تولید کرد.
مراحل آماده سازی ارائه کتبی :
تعیین موضوع
تهیه منابع
تهیه طرح اولیه متن اصلی
کسب و سازماندهی اطلاعات
تولید متن اصلی
تنظیم ساختار سه بخشی
تعیین موضوع
کارهای لازم در این مرحله عبارتند از :
الف-
مشخص کردن زمینه موضوع
ب-تحدید موضوع
ج-تعیین عنوان مناسب
تحدید موضوع و عوامل مربوط به آن:
موضوع
ارائهباید محدود و کاملا تعریف شده باشد
زیرا هر موضوعی را میتوان از چند جنبه مورد مطالعه و بررسی قرار داد . میزان
تحدید موضوع بستگی به عوامل زیر دارد:
- سطح ارائه کننده
- هدف ارائه
- وضع مخاطبین
- ملاحظات فنی
- میزان گستردگی زمینه موضوع
- خواسته های مخاطبین
- مدت ارائه
- امکانات آماده سازی محتوای ارائه
- ملاحظات مدیریتی
- سطح ارائه
ضوابط موجود برای تحدید موضوع :
مقطع تاریخی
محدوده جغرافیایی
خصوصیاتی از مخاطب
جنبه یا جنبه هایی از خود موضوع
اعمال
ضوابط تحدید می تواند بر اساس انتخاب خود ارائهکننده یا درخواست فرد دیگری یا
سازمان خواستار ارائه صورت پذیرد .
تعیین عنوان مناسب :
عنوان
موضوع را باید با جمله یا عبارتی حتي الامکان کوتاه و گویا بیان کرد . این جمله یا
عبارت می تواند بصورت زیر باشد :
جمله گزاره ای
جمله پر سشی
عبارت مصدری
خصوصیات عنوان موضوع :
- گویا وصریح
- کوتاه
- فاقد کلما ت زائد
- واقعی ، صادقانه ، و نه مبالغه آمیز
- حتی الامکان فاقد علائم کوته نویسی /فرمول و ...
- دارای حدود پانزده کلمه و از این میان حدود 4 کلمه
اصلی
تهیه منابع:
برای
تهیه منابع کارهای زیر باید انجام شود :
شناسایی منبع
جستجو و دستیابی به منبع
ضبط مشخصات منبع
ارزیابی منبع
شناسایی منبع:
برای
شناسایی منبع از امکانات زیر می توان استفاده کرد :
کتابخانه ( عمومی یا شخصی )
فهرستهای دوره ای ناشران
کتابنامه ( کتابشناسی )
فرد متخصص در موضوع
کتابدار
کتابشناس
رسانه های عمومی
مراکز اسناد ملی ،موزه ها و غیره
سیستمهای اطلاع رسانی
جستجوی منبع و دستیابی به آن :
برای
این کار می توان از شاخصهای زیر استفاده کرد :
شماره منبع در کتابخانه
مشخصات مولف یا مترجم
عنوان منبع
موضوع ( از طریق جستجوی موضوعی )
ضبط مشخصات منبع :
روش
رایج برای ضبطمشخصات منبع استفاده از
کارت یا فیش منبع است . اطلاعاتی که در این کارت درج می شود در اساس عبارتست از :
نام مولف ، عنوان منبع و مشخصات ناشر و نشر.
ارزیابی منبع :
منبع
را قبل از استفاده به منظور کسب اطلاع باید به دقت ودر عین حال با سرعت ارزیابی
کرد . برای این کار باید جنبه های زیر را در نظر گرفت :
نوع منبع از نظر صورت (فرم ) : مقاله ، کتاب ، جزوه
، سند خطی و غیره
اعتبار علمی – فنی مولف ( و مترجم)
سال اولین و آخرین ویراست
اعتبار ناشر
مکان ناشر ( کشور و شهر )
میزان ارتباط منبع با موضوع ارائه
+ نوشته شده در سه شنبه بیست و یکم خرداد ۱۳۸۷ ساعت 22:40 توسط میلاد
|
برنامه نویسی پویا، از این لحاظ که نمونه به نمونه
های کوچکتر تقسیم می شود ، مشابه روش تقسیم و حل است ولی در این روش ، نخست نمونه
های کوچک تر را حل می کنیم ، نتایج را ذخیره می کنیم و بعدا هر گاه به یکی از آن
ها نیاز پیدا شد، به جای محاسبه دوباره کافی است آن را بازیابی کنیم.
مراحل بسط یک الگوریتم برنامه نویسی پویا به شرح زیر
است:
هر دستورالعمل زبان اسمبلي در روي يک خط فايل کد منبع وارد ميشود. يک خط ميتواند حداکثر 128 کاراکتر داشته باشد.
وجود خطوط خالي مجاز است و استفاده از آنها براي جدا کردن بخش هاي مختلف کد برنامه مفيد است.
توضيحات براي مستندسازي و فهم بيشتر برنامه به کار ميروند و ميتوانند در هر جايي از برنامه وجود داشته باشند. هر توضيحي با کاراکتر ';'شروع ميشود و تا انتهاي خط ميتواند ادامه داشته باشد.
حالت های آدرس دهی
بلاواسطه
ثبات
مستقیم
دارای مبنا
دارای اندیس
دارای مبنا و اندیس
زبان اسمبلي داراي سه نوع دستور ميباشد:
دستورالعمل
دستور اسمبلر
ماکرو
دستورالعمل: به وسيله اسمبلر به کد هدف ترجمه ميگردد و اين کدها هستند که در زمان اجرا، اجرا ميگردند.
دستور اسمبلر: به اسمبلر ميگويد که عملي را انجام دهد. و اغلب هيچ اثري بر روي کد هدف ندارد.
ماکرو: نوعي دستورالعمل است که در آن تعدادي دستورالعملها، دستورات اسمبلر يا حتي ماکروهاي ديگر قرار گرفتهاند.
يک دستورالعمل ميتواند شامل عناصر زير باشد:
توضيحاتعملوند(ها)نام دستورالعملاسم
[;comment][operand(s)]mnemonic[name]
يک کاربرد فيلم اسم آن است که ميتوان آدرس دستورالعملي را به صورت نمادي بعد از اسمبل و لينک شدن برنامه با يک برچسب نشان داد. دستورالعملهاي ديگر به راحتي ميتوانند به دستورالعمل مزبور رجوع کنند.
دستورالعملهاي داراي برچسب ميتوانند مقصد يک دستورالعمل پرش در زبان اسمبلي باشند.
ساختار حلقه در زبان اسمبلي وجود ندارد، اما ميتوان حلقهها را با استفاده از jmpو يا دستورالعملهاي ديگر پيادهسازي کرد.
برچسب نميتواندبه وسيله عدد شروع شود. و اگر نقطه استفاده شود، حتماً بايد اولين کاراکتر باشد.
بغيراز اعداد و نقطه، کاراکترهاي ديگر ميتوانند در هر موقعيتي استفاده شوند.
فقط 31 کاراکتر اول اسم مورد استفاده قرار خواهد گرفت.
مقادير عددي در دستورات زبان اسمبلي، دهدهي فرض ميشوند و فقط زماني اين فرض کنار گذاشته ميشود که در برنامه منبع حالت ديگري خواسته شده باشد.
يک مقدار شانزده شانزدهي بايد با يک عدد بغيراز اعداد شانزدهشانزدهي «a»تا «f»، شروع شود تا اسمبلر بتواند آنها را از يک اسم تشخيص دهد.
شکل کلی برنامه
START
STACK _ SEGSEGMENTPARASTACK‘STACK’
اندازه پشته.
STACK _ SEGENDS
DATA _ SEGSEGMENT PARA‘DATA’
متغیر ها
DATA _ SEGENDS
EXTRA _ SEG SEGMENTPARA‘EXTRA’
متغیرهای رشته ها
EXTRA _ SEGENDS
CODE _ SEG SEGMENTPARA‘CODE’
دستورالعمل های برنامه
CODE _ SEGENDS
ENDSTART
يک برنامه از قسمتهاي مختلفي تشکيل شده است: هر کدام از اين قسمتها با دستورات اسمبلر SEGMENTو ENDSشروع شده و خاتمه يافتهاند:
Segment_nameSEGMENT
.
.
Segment_nameENDS
دستور ENDSهيچ وقت داراي عملوند نيست؛ ولي دستور SEGMENTدر بعضي کاربردها با عملوند به کار ميرود.
آخرين دستور برنامه، دستور اسمبلر زير است:
startEND
دستور ENDبه اسمبلر ميگويد که پردازش دستورات کد منبع را خاتمه دهد.
در يک برنامه منبع فقط يک دستور ENDوجود دارد و آن آخرين دستور است.
عملوند startمشخص کننده اولين دستور برنامه است که بايد اجرا شود. زماني که برنامه بار ميشود، سيستمعامل ثبات سگمنت کد را با سگمنتي که حاوي اين دستورالعمل است مقداردهي کرده و ثبات اشارهگر دستورالعملها، IPرا با آفست اين دستورالعمل از ابتداي سگمنت مزبور شروع مينمايد.
Number1 DW ?
Number2DW ?
هرکدام يک کلمه را در سگمنت داده ذخيره ميکنند.
علامت سؤال به اسمبلر ميگويد که هيچ مقدار اوليهاي به اين دو کلمه نسبت داده نشود.
هر کدام از دستورات 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 100DUP(?)
PointerDWOFFSET 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است.
نمونه كد ماشين
0000000Aa dw 10
000200b db ?
.code
00008B DFmov bx,di
00028A F9mov bh,cl
00048B 1E 0000 Rmov bx,a
00088A 26 0002 Rmov ah,b
000C8B 12mov dx,[si][bp]
000EA0 0002 Rmov al,b
00118A 26 0002 Rmov ah,b
0015BB 0003mov bx,3
0018B1 03mov cl,3
001AC7 06 0000 R 0064mov a,100
0020C6 06 0002 R FF mov b,255
+ نوشته شده در دوشنبه بیستم خرداد ۱۳۸۷ ساعت 22:58 توسط میلاد
|
همۀ برنامههايي که در دو جلسه اول بيان شد،
به شکل ترتيبي اجرا ميشوند، يعني دستورات برنامه به ترتيب از بالا به پايين و هر
کدام دقيقا يک بار اجرا ميشوند. در اين جلسه نشان داده ميشود چگونه از
دستورالعملهاي انتخاب1 جهت انعطافپذيري بيشتر برنامه استفاده کنيم. همچنين در اين جلسه انواع صحيح كه
در C++ وجود دارد بيشتر بررسي ميگردد.
دستور if
دستور ifموجب ميشود برنامه به شکل شرطي اجرا شود. نحو آن به گونۀ زير است: