مدیریت پردازنده :
مفهوم مدیریت پردازنده در دو مورد مرتبط خلاصه می شود :
- اطمینان از دریافت زمان کافی از پردازنده برای هر پروسه و برنامه برای کارکرد صحیح.
- استفاده حد اکثری از چرخه های پردازنده برای پروسه ها.
واحد پایه ی نرم افزاری که سیستم عامل برای زمان بندی با آن سر و کار دارد و بوسیله ی پردازنده انجام میشود ، یا پروسه است یا رشته (thread) ؛ که به نوع سیستم عامل بستگی دارد. ( با "پروسه" و "رشته" در مقالات بعدی به طور کامل آشنا می شویم)
این وسوسه انگیز است که به پروسه به دید یک برنامه نگاه کنیم؛ ولی این به ما یک تصویر کلی از ارتباط بین پروسه با سیستم عامل و سخت افزار می دهد. برنامه های کاربردی که شما می بینید (مانند واژه پرداز ها ، صفحه گسترده ها یا بازی ها) در واقع پروسه هستند ، اما برنامه ممکن است که باعث شروع چندین پروسه برای وظایفی مانند ارتباط با وسایل یا کامپیوتر های دیگر شود. پروسه های زیادی وجود دارند که بدون اینکه ما متوجه شویم اجرا می شوند، برای مثال ویندوزxp و یونیکس می توانند ده ها پردازش پس زمینه ای برای سر و کار داشتن با شبکه ، مدیریت حافظه ، مدیریت دیسک ، اسکن برای ویروس و .. داشته باشند.
پس پروسه ، نرم افزاری است چند عمل قابل کنترل به وسیله ی کاربر، برنامه های کاربردی یا سیستم عامل را انجام می دهد. این پروسه ها (نه برنامه ها) هستند که سیستم عامل برای انجام آنها در CPU برنامه ریزی می کند. در یک سیستم تک کاربرده ، جدول زمان بندی ساده و خطی است. سیستم عامل به برنامه های کاربردی اجازه ی شروع فعالیت را میدهد و فقط به اندازه کافی برای رسیدگی به اینتراپت ها (interrupt) و ورودی های کاربر، اجرا را تعلیق می دهد.
اینتراپت ها سیگنال های ویژه ای هستند که به وسیله ی سخت افزار یا نرم افزار به CPU فرستاده میشوند. درست مانند این که قسمتی از کامپیوتر برای درخواستی از CPU در یک جلسه دست خود را بلند می کند. بعضی مواقع سیستم عامل اولویت یک برنامه را طوری برنامه ریزی می کند که سیگنال نادیده گرفته شوند؛ یعنی سیستم عامل سیگنال ها از بعضی منابع را نادیده می گیرد که یک وظیفه ی خاص بتواند در کمترین زمان ممکن انجام شود. اینتراپت هایی وجود دارند که (مانند آن هایی که از خطا ها و مشکلات حافظه می آیند) به اندازه ای مهم هستند که نمی توانند نادیده گرفته شوند. به این اینتراپ های غیر قابل نادیده گرفته شدن که NMI (non-maskable interrups) نامیده می شوند باید سریعا رسیدگی شود بدون توجه به این که چه وظیفه ای در حال انجام است.
با این که اینتراپت ها پیچیدگی هایی را به پردازش ها در سیستم های تک کاربرده اضافه می کنند، اما کار سیستم عامل های چند کاربرده بسیار پیچیده تر خواهد بود. در این حالت، سیستم عامل بایستی اجرای برنامه ها را طوری برنامه ریزی کند که شما باور کنید چندین کار در آن واحد انجام می شود. به این خاطر این کار پیچیده است که cpu فقط یک کار را می تواند در آن واحد انجام دهد. پردازنده های چند هسته ای امروزی می توانند حجم کار بیشتری را انجام دهند ولی هر هسته هنوز توانایی انجام یک کار در آن واحد را دارد. برای نشان دادن در ظاهر که چندین کار همزمان انجام می شود، سیستم عامل باید بین پروسه های مختلف هزاران بار در ثانیه سوئیچ کند (پردازش های مختلفی را در یک ثانیه انجام دهد). انجام این کار به صورت زیر است :
- یک پروسه مقدار مشخصی از حافظه (RAM) را اشغال می کند. همچنین از ریجیستر ها ، بسته ها و خط های درون CPU و فضای حافظه ی سیستم عامل استفاده می کند.
- هنگامی که دو پروسه، چند وظیفه ای (multitasking) هستند، سیستم عامل بخش معینی از چرخه های اجرای CPU را به یک برنامه اختصاص می دهد.
- بعد از آن تعداد چرخه ها ، سیستم عامل از ریجیستر ها ، بسته ها و خط ها که به وسیله ی برنامه استفاده می شد، نسخه های ی کپی تهیه می کند؛ و نقطه ی توقف هر پروسه در زمان اجرایش را یادداشت می کند.
- سپس سیستم عامل تمام آن ها را به وسیله پروسه بعدی لود می کند و تعداد چرخه های خاصی از CPU را به آن اختصاص می دهد.
- هنگامی که آنها کامل شدند، سیستم عامل از تمام ریجیستر ها ، بسته ها و خط های استفاده شده به وسیله برنامه دوم، نسخه کپی تهیه می کند و برنامه اول را لود می کند.
بلوک کنترل پردازش :
تمام اطلاعاتی که برای پیدا کردن و ادمه دادن یک پروسه نیاز است در بسته ی دیتا به نام "بلوک کنترل پردازش" نگهداری می شود. این بلوک عموما شامل موارد زیر می شود :
- یک عدد مشخصه (ID number) برای شناسایی پروسه.
- اشاره گرها به موقعیت در برنامه و اطلاعاتش جایی که آخرین بار انجام شده اند.
- مندرجات ریجیستر.
- وضعیت های نشانه ها و سوئیچ های مختلف.
- اشاره گر ها به محدوده های پایینی و بالایی حافظه ی مورد نیاز برای پروسه.
- یک لیست از فایل ها که به وسیله ی پروسه باز شده اند.
- اولویت های پروسه.
- وضعیت های تمام وسایل ورودی - خروجی مورد نیاز به وسیله ی پروسه.
هر پروسه وضعیتی مرتبط با آن دارد. بسیاری از پردازش ها تا زمانی که ورودی های خود را دریافت نکرده اند، زمانی از cpu نمی گیرند. برای مثال ، یک پروسه ممکن است که منتظر فشار دادن یک کلید از طرف کاربر باشند. در زمانی که آن منتظر این عمل است، زمان و پردازشی ای از cpu طلب نمی کند و در حالت تعلیق است. هنگامی که کلید زده شد، سیستم عامل وضعیت آن را تغییر می دهد و آن را به حالت فعال در می آورد. برای مثال از حالت تعلیق به حالت در حال اجرا، باید از اطلاعات موجود در بلوک کنترل پردازش مانند اطلاعات هر برنامه ی دیگری برای هدایت کردن اجرای بخش "تغییر وظیفه" سیستم عامل استفاده شود.
تعویض پروسه بدون دخالت کاربر انجام می شود، و به هر پروسه به میزان کافی از چرخه های cpu برای انجام وظایفش در یک زمان معین و معقول داده می شود. مشکل می تواند زمانی ایجاد شود که کاربر بخواهد پردازشات زیادی را در یک زمان انجام دهد. خود سیستم عامل نیازمند چرخه هایی از cpu برای ذخیره کردن و تعویض ریجیستر ها و ردیف ها و بسته های پروسه های برنامه های کاربردی است. اگر مقدار زیادی پروسه شروع شود و سیستم عامل به طور صحیح طراحی نشده باشد، سیستم می تواند از بخش زیادی از چرخه های cpu به جای شروع پروسه ها، برای تعویض بین آنها استفده کند. به این حالت thrashing می گویند (کامپیوتر به جای اجرای برنامه ها وقت بیشتری را صرف تعویض اطلاعات حافظه می کند.) در این مواقع معمولا لازم است که خود کاربر با مداخله پروسه ها را متوقف کند و نظم را به سیستم برگرداند.
یک راه برای طراحان سیستم عامل برای کاهش thrashing ، کاهش نیاز پروسه های جدید به اجرای وظایف متعدد است. بعضی از سیستم عامل ها به یک رشته (thread) (دستورعمل های اجرا که بخشی از یک برنامه هستند) اجازه می دهند که با کار فشرده cpu در یک پروسه ی عادی، سر و کار داشته باشد؛ اما به طور عمده با ورودی و خروجی های مختلف سر و کار ندارند و ساختار مورد نیاز برای بلوک کنترل پروسه ی فشرده یک پروسه عادی را ایجاد نمی کنند. یک پروسه ممکن است که رشته ها (ترد) یا پروسه های دیگری را شروع کند ، ولی یک ترد نمی تواند یک پروسه را شروع کند.
تا این جا تمام این زمان بندی ها در مورد یک cpu بود. در یک سیستم با دو یا چند cpu ، سیستم عامل باید حجم کار را بین cpu ها تقسیم کند و سعی کند که تعادل درخواست های پروسه های مورد نیاز با چرخه های موجود cpu ها را برقرار کند. سیستم عامل های نامتقارن از یک cpu برای نیاز خودشان استفاده می کنند و بقیه cpu ها را صرف پروسه های برنامه های مختلف می کنند. سیستم عامل های متقارن خود را بین cpu های مختلف تقسیم می کنند ، و تعادل درخواست ها با دسترسی cpu حتی در شرایطی که تنها سیستم عامل در حال اجرا است، را برقرار می کنند. اگر هم سیستم عامل تنها نرم افزاری باشد که نیاز به پردازش داشته باشد، زمان بندی cpu تنها کار موردنیاز نیست، مدیریت حافظه قدم بسیار مهم دیگری است که در صحیح اجرا شدن پروسه ها نقش دارد..
ذخیره سازی و مدیریت حافظه :
هنگامی که سیستم عامل حافظه کامپیوتر را مدیریت می کند، دو وظیفه بایستی انجام شود :
- هر پروسه باید به اندازه ی کافی از حافظه بهره مند شود. آن نه می تواند که به فضای یک پروسه دیگر وارد شود و نه یک پروسه ی دیگر می تواند به بخش آن وارد شود.
- انواع مختلف حافظه در سیستم باید به طور صحیح استفده شوند که هر پروسه بتواند به طور موثر تری اجرا شود.
برای مثال بیایید به یک سیستم فرضی با 1 مگابایت حافظه (رم) نگاه کنیم . در طول مراحل بوت (راه اندازی کامپیوتر) سیستم عامل کامپیوتر ما طراحی شده است که به بالاترین مقدار حافظه قابل دسترسی برود و سپس به حد نیاز های خود سیستم عامل به عقب برگردد. فکر کنید که سیستم عامل به سیصد کیلوبایت برای اجرا نیاز دارد. سیستم عامل به اعماق حوضچه ی رم میرود و شروع به ساخت نرم افزار راه انداز (درایور) مورد نیاز برای کنترل اجزای سخت افزاری کامپیوتر می کند. در کامپیوتر ما درایور ها 200 کیلوبایت فضا می گیرند. پس بعد از اینکه سیستم کاملا لود شد ، 500 کیلوبایت دیگر از رم برای پردازش برنامه ها، باقی مانده است. هنگامی که برنامه ها شروع به بارگذاری در حافظه می کنند، آنها در بلوک هایی با اندازه ی مشخص از طرف سیستم عامل بارگذاری می شوند. اگر اندازه ی این بلوک 2 کیلوبایت است ، پس هر پروسه ای که لود می شود ، مقدار حافظه ای را می گیرد که مضربی از 2 کیلوبایت است. برنامه ها در این بلوک های ثابت لود می شوند، که هر کدام محدوده ی خاصی دارند و با استفاده از کلمات 4 یا 8 بایتی از هم جدا میشوند. این بلوک ها و مرز ها باعث می شوند که برنامه ها در فضای یکدیگر لود نشوند. حال با حل این مشکل سوال این است وقتی این 500 کیلوبایت فضای برنامه پر شد چه کنیم !
در اکثر کامپیوتر ها ، این امکان پذیر است که بیش از ظرفیت اولیه، حافظه اظافه کنیم . برای مثال می توانید رم را از یک گیگابایت به دو گیگابایت افزایش دهید. این کار خوب ولی متناسبا هزینه بر هست. همچنین اصل عمل محاسبات را نادیده می گیرد. بسیاری که اطلاعاتی که یک برنامه ذخیره می کند، استفاده نمی شوند. یک پردازنده فقط می تواند به یک موقعیت حافظه در آن واحد دسترسی داشته باشد؛ پس بسیاری از فضای اشغال شده رم در یک لحظه استفاده نمیشود. از آن جایی که حافظه ی جانبی در مقایسه با رم ارزان تر است، انتقال اطلاعات به هارد دیسک می تواند حجم حافظه ی رم را به مقدار زیادی افزایش دهد. به این تکنیک "مدیریت حافظه ی مجازی " گفته میشود. ذخیره سازی دیسکی کم سرعت ترین نوع حافظه و تنها نوع است که کاملا باید به وسیله ی سیستم عامل مدیریت شود. از نظر سرعت به ترتیب انواع حافظه عبارتد از :
- کش (حافظه نهان) پر سرعت. این نوع پرسرعت، عموما در حجم های پایین توسط cpu در ارتباطات پر سرعت استفاده می شود. کنترل کننده های کش قسمت بعدی از اطلاعات که به وسیله ی پردازنده استفاده خواهد شد را پیشبینی می کنند و آن را از حافظه اصلی به کش منتقل می کنند تا سیستم عملکرد بهتری داشته باشد.
- حافظه اصلی. که به نام "رم" (حافظه با دسترسی تصادفی) شناخته می شود.
- حافظه ی ثانویه . این حافظه عموما از وسایل مغناطیسی مکانیکی هستند که برای ذخیره ی اطلاعات و برنامه ها و گاهی به عنوان حافظه ی مجازی تحت کنترل سیستم عامل، استفاده می شوند.
سیستم عامل باید نیاز پروسه های مختلف و حافظه های قابل دسترسی موجود (شامل انتقال اطلاعات از بلوک های مختلف حافظه ها در هنگام نیاز پردازنده..) را کنترل و متعادل کند.
ادامه در قسمت سوم ...