فصل اول
مفاهيم و تعاريف سيستم عامل
اجزاي مختلف كامپيوتر
همانطور كه مي دانيد كامپيوتر از دو بخش كلي سخت افزار و نرم افزار تشكيل شده است. به طور دقيق تر مي توان يك سيستم كامپيوتري را به صورت زير ترسيم كرد:

برنامه هاي كاربردي(حسابداري، مرورگر وب و…)
مفسر فرمان، مترجم ها، اديتورها
سيستم عامل

زبان ماشين
ريز برنامه نويسي
دستگاه هاي فيزيكي

در بسياري از سيستم ها هنگام اجرا دستورات ماشين، ابتدا اين دستورات توسط يك ROM به يك سري دستورالعمل هاي ايتدايي تر به نام ريز دستور يا ميكرو كد تبديل شده و سپس توسط سخت افزار اجرا مي گردند كه به اين ماشين ها CISC(Complex Instruction Set Computer) گفته مي شود. در بعشي از كامپيوترها به نام RISC(Reduced Instruction Set Computer) اين سطح ريز برنامه نويسي وجود نداشته و دستورات زبان ماشين مستقيما توسط سخت افزار اجرا مي گردند. تعداد دستورات ماشين هاي RISC كمتر از كامپيوترهاي CISC مي باشد.
سيستم عامل چيست؟
به طور كلي نرم افزارهاي كامپيوتر به دو گروه تقسيم مي شوند: يكي برنامه هاي سيستمي كه عمليات كامپيوتر را مديريت مي كنند و ديگري برنامه هاي كاربردي. سيستم عامل(Operation System= OS) اصلي ترين برنامه سيستمي است كه به عنوان رابط بين كاربر و سخت افزار كامپيوتر عمل مي كند.
سيستم عامل دو دظيفه(يا هدف) اصلي دارد:

الف) سيستم عامل استفاده از كامپيوتر را ساده مي سازد. اين بدان معناست كه مثلا كاربر يا برنامه نويس بدون درگير شدن با مسائل سخت افزاري ديسكها به راحتي فايلي را بر روي ديسك ذخيره و حذف كند. اين كار در واقع با به كار بردن دستورات ساده اي كه فراخوان هاي سيستمي(System Calls) را صدا مي زنند انجام مي پذيرد. در صورت عدم وجود سيستم عامل كاربر و يا برنامه نويس مي بايست آشنايي كاملي با سخت افزارهاي مختلف كامپيوتر(مثل مونيتور، فلاپي، كي بورد و غيره) داشته باشد و روتين هائي براي خواندن و يا نوشتن آنها به زبانهاي سطح پائين بنويسد. از اين جنبه به سيستم عامل با عنوان

ماشين توسعه يافته(Extended machine) يا ماشين مجازي(Virtual machine) ياد مي شود كه واقعيت سخت افزار را از ديد برنامه نويسان مخفي مي سازد.
ب) واقعيت وظيفه دوم سيستم عامل مديريت منابع(Resource Management) مي باشد، يعني سيستم عامل باعث استفاده بهينه و سودمند(اقتصادي) از

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

سيستم عامل اطلاعات خروجي آنها را در بافري ريخته و سپس به ترتيب و براساس اولويتي از پيش تعيين شده اطلاعات را به چاپگر مي فرستد. بنابراين كار سيستم عامل اين است كه بداند چه كساني از كدام منابع استفاده مي كنند، به درخواستهاي جهت دريافت منابع رسيدگي كند، حسابداري استفاده مي كنند، به درخواستهاي جهت دريافت منابع رسيدگي كند، حسابداري استفاده از منابع را نگهداري كند و در برابر تداخل درخواستهاي مختلف ميانجي گري كند. پس با نگرش از بالا به پائين سيستم عامل فراهم كننده واسطه اي راحت براي كاربران است و با نگرش از پائين به بالا سيستم عامل مدير كليه اجزاء و منابع سيستم مي باشد.

به بياني مي توان گفت هدف سيستم عامل استفاده بهينه و حداكثر از ماشين و وظيفه سيستم عامل كنترل تمامي منابع و به تعادل رساندن درخواستها و منابع موجود است.

با توجه به توضيحات فوق مي توان گفت سيستم عامل مشابه دولت است يعني مانند دولت سيستم عامل محيطي را كه درون آن ساير برنامه هاي بتوانند كار مفيد انجام دهند، ايجاد مي كند و هسته سيستم عامل به خودي خود كاري مفيد و نهائي را براي كاربر انجام نمي دهد. به عبارتي ديگر سيستم عامل برنامه كنترلي است كه اجراي برنامه هاي كاربر و استفاده از سخت افزار سيستم را كنترل مي كند.

سيستم عامل معمولا اولين برنامه اي است كه پس از بوت شدن در حافظه بار مي شود. پس از بار شدن، قسمتي از سيستم عامل بطور دائم در حافظه باقي(Resident) مي ماند. قسمتهاي ديگر با توجه به كاربرد كامپيوتر توسط كاربر از ديسك به حافظه آورده مي شود.

به قسمت اصلي سيستم عامل كه وظايف مهم آن را انجام مي دهد هسته يا kernel گفته مي شود. هسته سيستم عامل و معماري كامپيوتر اثر زيادي يكديگر داشته اند. يعني جهت سهولت كار با سخت افزارهاي جديد، سيستم عامل ها توسعه يافتند در اثناي طراحي سيستم عامل ها، مشخص شد كه تغييراتي در طراحي سخت افزار مي تواند سيستم عاملها را ساده تر و كارآمدتر سازد. هذ چند كه تطبيق نسلهاي كامپيوتر با نسلهاي سيستم عامل كار درستي نيست ولي اين تطبيق كه در ادامه انجام مي دهيم علت ايجاد سيستم عاملهاي جديد را مشخص مي سازد.

در نسل اول كامپيوترها(۵۵-۱۹۴۵) كه از لامپ خلا براي ساخت آنها استفاده مي شد، زبانهاي برنامه نويسي(حتي اسمبلي) ابداع نشده بودند و سيستم عامل نيز اصلا وجود نداشت. روند كار به اين صورت بود كه برنامه نويسان در يك فاصله زماني مشخص حق استفاده از كامپيوتر بزرگ و گران قيمت را داشتند. آنها برنامه هاي خود را توسط تخته مدار سوراخدار( و بعدها توسط كارتهاي پانچ) و به زبان ماشين به كامپيوتر مي دادند. اكثر برنامه هاي محاسبات عددي معمولي مانند جداول سينوس و كسينوس بود.

سيستم هاي دسته اي Batch Systems
در نسل دوم، كامپيوترها(۶۵-۱۹۵۵) از ترانزيستور ساخته شدند.
طريقه كار با اين كامپيوترهاي نسل دوم از طريق يك كنسول(Console) بود كه تنها اپراتور مخصوص كامپيوتر با آن كار مي كرد و كاربران به طور مستقيم با اين كامپيوترها محاوره(interaction) نداشتند. كاربر ابتدا برنامه خود را به زبان فرترن يا اسمبلي بر روي كاغذ مي نوشت سپس توسط دستگاه Card punch، برنامه را روي كارت هاي سورخدار منتقل مي ساخت. بعد اين دسته كارت تهيه شده كه شامل برنامه، داده ها و كارتهاي كنترل بود به صورت يك كار(Job) تحويل اپراتور

داده مي شد. اپراتور بعد از اتمام كار قبلي، دسته كارت جديد را به كامپيوتر مي داد تا برنامه را اجراء كند در انتهل خروجي برنامه(كه غالبا چاپي بود) را به كاربر تحويل مي داد. سيستم عامل در اين كامپيوترهاي اوليه ساده بود و وظيفه اصلي آن انتقال كنترل اتوماتيك از يك كار به كار ديگري بود. سيستم عامل همواره مقيم در حافظه بود و در هر لحظه فقط يك برنامه اجراء مي شد. هنگامي كه اپراتور مشغول گذاشتن نوارها يا برداشتن كاغذهاي چاپ شده بود وقت زيادي از اين كامپيوترهاي گران قيمت به هدر مي رفت.

براي رفع مشكل فوق سيستم هاي دسته اي(Batch System) ابداع شد. يعني ابتدا يك سبد پر از دسته كارتها در اتاق ورودي جمع آوري مي شد، سپس كليه آنها به وسيله دستگاه كارتخوان يك كامپيوتر كوچك و نسبتا ارزان(مثل IBM 1401) خوانده شده و بر روي يك نوار ذخيره مي گرديد. سپس اپراتور نوار را برداشته بر روي كامپيوتر اصلي و گران قيمت كه محاسبات را انجام مي داد(مثل IBM 7094) نصب مي كرد. بعد از آن برنامه اي را اجراء مي كرد(يعني سيستم عامل) تا

اولين كار را از روي نوار برداشته و اجرا كند، خروجي بر روي نوار ديگري نوشته مي شد. پس از اتمام هر كار سيستم عامل به صورت خودكار كار بعدي را از نوار مي خواند. پس از اجراء همه برنامه ها، اپراتور نوار خروجي را برداشته و دوباره روي كامپيوتر IBM 1401 منتقل مي ساخت تا عمليات چاپ خروجي ها به صورت off line انجام شود. به اين روش كار offline spooling نيز گفته مي شود. بيشتر برنامه هاي نسل دوم به زبان فرترن و اسمبلي براي محاسبات مهندسي و علمي مثل مشتقات جزئي به كار مي رفت.

يكي از معايب روش offline- spooling زياد بودن زمان برگشت(گردش) (turnaround time) است، يعني تاخير مابين تحويل كار و تكميل كار. همچنين در اين سيستم اولويت بندي به معناي واقعي وجود ندارد. تنها روش بدست آوردن اولويت اين بود كه نوار كارهاي مهم را ابتدا مهم را ابتدا در ماشين اصلي قرار دهند. حتي در اينصورت هم بايد چندين ساعت صبر مي كردند تا خروجي ها ظاهر شوند. همچنين نياز به سخت افزار اضافي(مثل كامپيوترهاي ۱۴۰۱) از ديگر معايب اين روش بود.

پس از معايب اين روش عبارت است از: ۱- گردش طولاني تر كار ۲- عدم وجود اولويت ۳- نياز به سخت افزار اضافي.
از مزاياي سيستم offline spooling نسبت به سيستم هاي قبل از آن مي توان موارد زير را ذكر كرد:
۱- راندمان بهتر ۲- عمليات ساده تر ۳- سهولت براي استفاده از راه دور
تذكر: در سيستم هاي اوليه CPU گرانترين جزء كامپيوتر بود و بدين جهت نياز به بالا بردن درصد استفاده از CPU فاكتور اصلي در طراحي سيستم عاملها بود.
سيستم هاي چند برنامگي Multiprogramming

در نسل سوم كامپيوترها(۸۰-۱۹۶۵) از مدارات مجتمع(Integrated Circuit= IC) براي ساخت كامپيوترها استفاده شد. به طور كلي برنامه ها را مي توان به دو دسته تقسيم كرد: يكي برنامه ها با تنگناي محاسباتي(CPU bound يا CPU Limited) مانند محاسبات علمي سنگين كه بيشتر زمان كامپيوتر صرف محاسبات CPU مي شود و ديگري برنامه ها با تنگناي I/O(I/O Limited) مانند برنامه هاي تجاري كه بيشتر زمان كامپيوتر صرف ورود داده ها و خروج اطلاعات مي شود.
يك اشكال مهم سيستم هاي دسته اي اين است كه وقتي كار جاري براي تكميل يك عمليات I/O مثلا بر روي نوار گردان منتظر مي شود، در اين حال CPU بيكار مي ماند و مجبور است صبر كند تا عمليات I/O به اتمام برسد. در برنامه هاي CPU Limited اين اتلاف وقت اندك است ولي در برنامه هاي I/O Limited ممكن است حدود ۸۰ تا ۹۰ درصد وقت CPU به هدر برود.

براي رفع اين مشكل از تكنيك multiprogramming استفاده مي شود. بدين ترتيب كه حافظه به چند قسمت تقسيم شده و در هر قسمت يك برنامه مجزا قرار داده مي شود. وقتي كه يك كار براي تكميل عمليات I/O منتظر مي ماند، پردازنده به كار ديگري داده مي شود. اگر تعداد كارهاي موجود در حافظه كافي باشد مي توان CPU را تقريبا صد در صد مشغول نگه داشت. البته نگهداري همزمان چند برنامه در حافظه نياز به مديريت خاص حافظه دارد تا برنامه ها بر همديگر اثر سوء نداشته باشند. لذا مديريت حافظه بحث مهمي در سيستم عامل مي باشد( شكل زير).

 

پس سيستم هاي چند برنامگي فقط يك پردازنده دارند و به كمك مكانيزم وقفه بين كارهاي CPU- limited و I/O Limited سوئيچ مي شود و به ظاهر اجراي اين برنامه ها به صورت موازي و همزمان صورت مي گيرد و بدين ترتيب بهره وري از سيستم افزايش مي يابد.
يك شيوه براي بالا بردن راندمان CPU آن است كه تعدادي كار CPU- Limited را با I/O- Limited مخلوط كنيم. ولي در عمل امكان تقسيم بندي كارها قبل از اجراء شدنشان وجود ندارد. از طرف ديگر برنامه هاي ممكن است در ابتدا CPU-Limited باشد ولي در حين اجراء تبديل به I/O-Limited گردد.
سيستم هاي Spooling

يكي ديگر از ويژگيهاي سيستم عاملهاي نسل سوم Spooling(On Line Spooling) است كه معمولا همراه چند برنامگي استفاده مي شود. اين كلمه مخفف عبارات(Simultaneous Peripheral Operation) مي باشد. در اين سيستم به جاي آنكه كارتها از دستگاه كارت خوان مستقيما وارد حافظه گردند و توسط CPU پردازش شوند ابتدا كاراكتر به كاراكتر در بافري در حافظه قرار گرفته و سپس به صورت بلوكي بر روي ديسك نوشته مي شوند. وقتيكه برنامه كاربر اجراء مي شود

و از سيستم عامل تقاضاي ورودي مي كند، اطلاعات ورودي به صورت بلوكي و با سرعت زياد از ديسك خوانده مي شوند. به طور مشابه هنگامي كه برنامه براي خروجي چاپگر را احضار مي كند، خط خروجي در يك بافر كپي شده و سپس در ديسك نوشته مي شود. پس اطلاعات خروجي از ديسك براساس ترتيب و اولويت در چاپگر چاپ مي شوند. در واقع اسپولينگ عمل I/O يك كار را با عمل محاسباتي كار ديگر روي هم مي اندازد(overlap). در سيستم اسپولينگ در حاليكه

ورودي يك كار از دستگاه ورودي خوانده مي شود، كار ديگري در حال چاپ شدن است، در همين بين حتي كار ديگري مي تواند در حال پردازش و اجراء باشد. در اسپولينگ برنامه عمليات ورودي و خروجي اش را متناسب با سرعت ديسك(كه سريع است) انجام مي دهد و نه متناسب با سرعت كارتخوان يا چاپگر( كه خيلي كند هستند).

بنابراين سيستم مذكور باعث استفاده بهينه از CPU و وسايل I/O مي شود و سرعت عمل را بالا مي برد. در اين سيستم ديگر نيازي به كامپيوترهاي ۱۴۰۱، نوارگردانهاي اضافي و حمل نوارها( مانند سيستم هاي دسته اي) نداريم.

با توجه به توضيحات فوق مزاياي سيستم اسپولينگ(نسبت به سيستم دسته اي) عبارتند از:
۱- بالا بودن راندمان CPU و وسايل I/O 2- گردش سريعتر كار(turnaround time) در اينجا برعكس سيستم دسته اي لازم نيست براي كامل شدن نوارهاي ورودي يا خروجي صبر كرد. ۳- دسترسي با اولويت. هنگامي كه اطلاعات مستقيما از طريق كارت خوان يا نوار وارد مي شوند چون دسترسي به صورت سريال است امكان ندارد كه اجراي آنها با ترتيب متفاوتي انجام گيرد، يعني كارها الزاما به ترتيب ذخيره شدن روي نوار اجراء مي شوند. اما با استفاده از ديسك، كه رسانه اي با دسترسي تصادفي و مستقيم(direct access) است مي توان بين كارها زمانبندي كرده و كار با اولويت را ابتدا اجراء كرد هر چند كه قبل از همه وارد نشده باشد. ۴- مي توان همزمان چند مدرك ورودي يا خروجي داشت چون وروديها و خروجيها در ديسك ذخيره مي شوند.

بلوك دياگرام يك سيستم اسپولينگ را مي توان به صورت زير ترسيم كرد:

۱- سيستم ورودي: كاركترهايي كه توسط كارتخوان وارد مي شود را در بلوكهائي جمع آوري كرده و راجع به آن مدارك ورودي اطلاعاتي راجع به آن مدارك(مانند محل آن بر روي ديسك، اولويت، اسم استفاده كننده) به قسمت زمانبند كار فرستاده مي شود.

۲- زمانبند كار(JS= Job Scheduler): اين زمانبند يك ليست از كارهاي موجود در ماشين و اطلاعات لازم در مورد مدارك ورودي مورد نياز هر يك را نگه مي دارد. به اين ليست انبار كار يا Jobpool يا Joblist نيز گفته مي شود. زمانبند كار به پردازنده كار مي گويد كه كدام كار بعدي را اجرا كند. براي اين منظور اطلاعاتي در مورد محل كار و مدارك ورودي آن بر روي ديسك را به پردازنده كار مي دهد. همچنين اگر كارهاي متعددي منتظر ورود به حافظه باشند و فضاي كافي براي همگي در دسترس نباشد، زمانبند كار تعدادي از آنها را انتخاب كرده و به حافظه مي آورد.

۳- پردازنده كار(Job processor) كار داده شده را اجرا مي كند. اين پردازنده محل كامپايلرها و ساير نرم افزارهاي سيستم را بر روي ديسك مي داند. هنگام اجراء پردازنده كار خروجي هاي خود را به صورت بلوكي بر روي ديسك مي نويسد و مدارك خروجي را تشكيل مي دهد. پردازنده كار اطلاعاتي راجع به محل و اولويت مدارك و اولويت خروجي به زمانبند خروجي مي دهد.

۴- زمانبند خروجي(output scheduler) ليستي از مداركي كه بايد چاپ شوند را نگه مي دارد. وقتي كه چاپگر آزاد شد، اين زمانبند مدرك بعدي را براي چاپ انتخاب كرده و محل مدرك بر روي ديسك را به سيستم خروجي مي گويد.

۵- سيستم خروجي: بلاكهاي خروجي را از روي ديسك خوانده و كاراكتر به كاراكتر( يا خط به خط) آنها را به چاپگر مي فرستد.
۶- مدير ديسك(Disk Manager) كه وظايف خواندن و نوشتن يك بلاك بر ديسك، تخصيص بلاك خالي روي ديسك و برگرداندن يك بلاك به مجموعه فضاي آزاد ديسك را بر عهده دارد. درخواستهاي مربوطه در يك صف به نام DTQ(Disk Transfer Queue) ذخيره مي گردد.

۷- هماهنگ كننده: البته هر سيستم اسپولينگ يك هماهنگ كننده(Coordinator) دارد كه مسئول زمانبندي پردازش هاي سيستم و فراهم كردن عملياتي كه جهت همگام كردن بكار مي آيند مي باشد. (هماهنگ كننده در شكل نشان داده نشده است). اين عمليات توسط دو روال انجام مي پذيرد:
Wait: پردازش جاري را متوقف كرده و دوباره وارد زمانبند مي گردد.

Free: يك پردازش ويژه را جهت زمانبندي، آماده مي كند.
نكته: بافر كردن امكان مي دهد كه عمل I/O يك كار با عمل پردازش همان كار همزمان گردد در حاليكه spooling امكان مي دهد عمليات I/O و پردازش چندين كار با هم همزمان گردند.

در چند برنامگي اجراي يك برنامه تا هنگام عمليات I/O ادامه پيدا مي كند، سپس عمل I/O آن شروع شده و همزمان CPU اجراي برنامه ديگري را آغاز مي كند. ولي در Spooling مي توان چند كار را همزمان اجرا كرد.
تذكر: در سيستم هاي On line پردازنده مستقيما به دستگاه هاي I/O در ارتباط است ولي در سيستم هاي Off line يا ارتباط غيرمستقيم، پردازنده با دستگاه هاي I/O به طور مستقيم در ارتباط نيست.

سيستم هاي اشتراك زماني Time- Sharing
اين سيستم ها از اوايل سالهاي ۱۹۷۰ در نسل سوم كامپيوترها معمول شدند. سيستم اشتراك زماني در واقع تعميم سيستم چند برنامگي است.
در سيستم هاي چند برنامگي كاربر ارتباطي با كامپيوتر نداشت و خطايابي برنامه ها مشكل بود چرا كه زمان برگشت نسبتا طولاني اجازه آزمايش كردنهاي متعدد را نمي داد. در سيستم اشتراك زماني كاربر به كمك ترمينال(Terminal) كه شامل كي بورد(براي ورودي) و مونيتور(براي خروجي) است با كامپيوتر به

صورت محاوره اي(interactive) رابطه برقرار مي سازد. كاربر مستقيما دستوراتي را وارد كرده و پاسخ سريع آن را روي مونيتور دريافت مي كند. در اين سيستم ها چندين كاربر به كمك ترمينالهائي كه به كامپيوتر وصل است همزمان مي توانند از آن استفاده كنند. در سيستم اشتراك زماني فقط يك پردازنده وجود دارد كه توسط مكانيزمهاي زمانبندي بين برنامه هاي مختلف كاربرها با سرعت زياد(مثلا در حد ميلي ثانيه) سوئيچ مي شود و بنابراين هر كاربر تصور مي كند كل

كامپيوتر در اختيار اوست. در اينجا تاكيد بر روي ميزان عملكرد كاربر است يعني هدف فراهم كردن وسايل مناسب براي توليد ساده نرم افزار و راحتي كاربر مي باشد و نه بالا بردن ميزان كاربرد منابع ماشين. كاربر مي تواند در هر زمان دلخواه برنامه خود را آغاز يا متوقف سازد و يا برنامه را به صورت قدم به قدم اجراء و اشكال زدائي(debug) كند. سيستم هاي دسته اي براي اجراي برنامه هاي بزرگ كه نياز محاوره اي كمي دارند مناسب است ولي سيستم هاي اشتراك زماني براي مواردي كه زمان پاسخ كوتاه لازم است، استفاده مي شوند. در زماني كه كاربردي در حال تايپ برنامه اش يا فكر كردن روي خطاهاي برنامه اش مي باشد CPU به برنامه كاربر ديگري اختصاص يافته تا آن را اجراء كند.

در سيستم هاي محاوره اي دستورات به دو صورت پيش زمينه(foreground) و پس زمينه(Background) اجرا مي شوند. در نوع پيش زمينه با وارد كردن دستور، تا هنگامي كه دستور اجرا و تمام نشود اعلان سيستم ظاهر نمي گردد ولي در نوع پس زمينه، پس از ورود دستور، بلافاصله اعلان سيستم ظاهر مي شود تا دستور بعدي وارد گردد ولي در همين حين دستور قبلي در پشت زمينه در حال اجرا مي باشد.

در اين سيستم اشتراك زماني هنگامي كه چند كاربر همگي يك برنامه(مثل كامپايلر C) را احضار مي كنند هر يك داراي كپي هايي از ثباتها، فضاي داده اي، فضاي پشته(stack) مخصوص به خود هستند ولي قسمت كد همگي يكسان و مشترك مي باشد. در سيستم اشتراك زماني وجود يك سيستم فايل ضروري است زيرا نمي توان در هر بار اجراي كار مدارك بزرگي را توسط ترمينالها وارد كامپيوتر كرد. لذا داده ها و برنامه هاي كاربر مي بايست در ديسك ذخيره گردند. لذا بخش مديريت فايلها يكي از بخش هاي اصلي سيستم عامل مي باشد. هر چند كه مي توان وظايف مدير فايل(File Manager) و مدير ديسك(Disk Manager) را در هم آميخت ولي منطقا اين دو كاملا متفاوت هستند. مدير ديسك مسئول توزيع فضاي خالي روي ديسك و نقل و انتقالات است، حال آنكه كارهاي مدير فايل بيشتر مربوط به مديريت فهرستها، فايلها، امنيت فايلها و كارهاي مربوط به حسابداري(Accounting) است.

يكي ديگر از بخشهاي مهم در سيستم اشتراك زماني، مدير ترمينال است كه وظيفه تعيين هويت كاربران و پذيرش آنها را بر عهده دارد.
چند برنامگي و اشتراك زماني مباحث اصلي سيستم عاملهاي امروزي و در نتيجه مباحث اصلي اين كتاب مي باشند. اشتراك زماني حالت ويژه اي از چند برنامگي است كه در آن تعويض يك برنامه نه بر مبناي لحظه نياز برنامه به عمل I/O بلكه بر مبناي يك برش زماني انجام مي پذيرد. از جمله سيستم عاملهاي سنتي و مشهور كه شامل اين ويژگيها مي باشد سيستم عامل UNIX است. موسسه IEEE يك استاندارد به نام POSIX براي UNIX بنا نهاد. POSIX حداقل واسط فراخوان سيستمي را تعريف مي كند كه سيستم هاي UNIX سازگار بايد آن را پشتيباني نمايند.

سيستم عاملهاي كامپيوترهاي شخصي و شبكه
سال ۱۹۸۰ تاكنون ه مدارات مجتمع با مقياس بزرگ LSI(Large Scale Integrated Circuit) ابداع شدند، به عنوان نسل چهارم كامپيوترها شناخته مي شود. در اين سالها كامپيوترهاي شخصي با قيمتي ارزان و كارآئي بالا و محيط گرافيكي و محاوره اي بسيار خوب به سرعت گسترش يافتند. سيستم عاملهاي اوليه بر روي PC(مانند DOS) فقط تك كاربره و تك برنامه اي بودند. ولي سيستم عاملهاي امروزي آن مانند Windows NT خاصيتهاي چند برنامگي، چند كاربره(multiuser) و شبكه اي را دارا هستند. با توجه به هزينه اندك سخت افزار اهداف سيستم عامل در طول زمان تغيير كرده است و براي PCها به جاي ماكزيمم كردن درصد استفاده CPU و وسايل جانبي، سيستم به سمت راحتي كاربر پيش مي رود. به تدريج ويژگي هاي مهم سيستم عاملهاي قديمي در كامپيوترهاي بزرگ(مانند حفاظت حافظه، محافظت فايلها، همزماني پردازشها و…) بر روي سيستم هاي PC نيز پياده سازي شده است.

هنگامي كه كامپيوترها از طريق شبكه به هم وصل شوند به آنها ايستگاههاي كاري(Workstations) مي گويند. در يك سيستم عامل شبكه، كاربران از وجود ماشين هاي مختلف در شبكه باخبرند. آنها مي توانند از دور وارد يك ماشين شوند و همچنين فايلهاي يك ماشين را روي ماشين ديگر كپي كنند.
هر كامپيوتر سيستم عامل محلي خودش را اجراء مي كند و كاربر يا كاربران محلي مخصوص به خود را دارد.
سيستم هاي توزيع شده Distributed Systems

سيستم عامل توزيع شده در يك محيط شبكه اي اجراء مي شود. در اين سيستم قسمتهاي مختلف برنامه كاربر بدون آنكه خود او متوجه شود مي توانند همزمان در چند كامپيوتر مجزا اجراء شده و سپس نتايج نهائي به كامپيوتر اصلي كاربر برگردند. كاربران نبايد از اين موضوع باخبر شوند كه برنامه آنها در كجا به اجراء درمي آيد و يا فايلهاي آنها در كجاي شبكه قرار دارد و همه اين كارها بايد توسط سيستم عامل به صورت خودكار انجام گيرد. به عبارتي ديگر سيستم بايد از ديد كاربر شفاف باشد و هر چيز را با نام آن فراخواني كند و كاري به آدرس آن نداشته باشد.

با توجه به توضيحات فوق سيستم عامل هاي توزع شده به مراتب پيچيده تر از سيستم عاملهاي شبكه هستند. يكي از مزاياي مهم سيستم هاي توزيع شده سرعت بالاي اجراي برنامه هاست چرا كه يك برنامه همزمان مي تواند از چندين كامپيوتر براي اجراء شدنش استفاده كند. همچنين به علت توزيع شدن اطلاعات، بانكهاي اطلاعاتي حجيم مي تواند روي يكسري كامپيوترهاي شبكه شده قرار بگيرند و لازم نيست كه همه اطلاعات به يك كامپيوتر مركزي فرستاده شود(كه در نتيجه اين نقل و انتقالات حجيم زمان زيادي به هدر مي رود).

در شبكه هر كامپيوتر مي تواند سيستم عامل ويژه خود را داشته باشد و تنها يك نرم افزار مديريت شبكه به سيستم عامل اضافه شده است ولي در سيستم عامل توزيع شده تنها يك سيستم عامل مجموعه اي از سيستم هاي متصل به هم را مديريت مي كند.

در شبكه هر كامپيوتر مي تواند سيستم عامل ويژه خود را داشته باشد و تنها يك نرم افزار مديريت شبكه به سيستم عامل اضافه شده است ولي در سيستم عامل توزيع شده تنها يك سيستم عامل مجموعه اي از سيستم هاي متصل به هم را مديريت مي كند.

در شبكه هر كامپيوتر مي تواند سيستم عامل ويژه خود را داشته باشد و تنها يك نرم افزار مديريت شبكه به سيستم عامل اضافه شده است ولي در سيستم عامل توزيع شده تنها تنها يك سيستم عامل مجموعه اي از سيستم هاي متصل به هم را مديريت مي كند.

به علت تاخيرهاي انتقال در شبكه و نويزهاي احتمالي در خطوط انتقالي قابليت اعتماد اجراي يك برنامه در سيستم تنها، بيشتر از قابليت اعتماد اجراي آن در يك سيستم توزيع شده است. همچنين در سيستم توزيع شده اگر يكي از كامپيوترهائي كه وظيفه اصلي برنامه جاري را بر عهده دارد خراب شود كل عمل سيستم مختل خواهد شد. از طرف ديگر اگر اطلاعاتي همزمان در چند كامپيوتر به صورت يكسان ذخيره گردد و يكي از كامپيوترها خراب شود، داده ها را مي توان از كامپيوترهاي ديگر بازيابي كرد و از اين نظر امنيت افزايش مي يابد.

تذكر: به سيستم هاي توزيع شده گاهي اوقات سيستم هاي Loosely Coupled يا ارتباط ضعيف نيز مي گويند، چرا كه هر پردازنده كلاك و حافظه مستقلي دارد. پردازنده ها از طريق خطوط مخابراتي مختلفي مثل گذرگاه هاي سريع يا خطوط تلفن با همديگر ارتباط دارند.
چند دليل براي استفاده از سيستم هاي گسترده عبارتند از:
۱- اشتراك منابع

۲- تسريع محاسبات
۳- قابليت اعتماد: اگر در سيستم توزيع شده، كامپيوتري خراب شود، كامپيوترهاي ديگر(در صورت طراحي سيستم براي اين منظور) مي توانند كار را ادامه دهند. ولي همانطور كه قبلا گفتيم اگر سيستم نتواند خطا را تشخيص داده و آن كار را به كامپيوتر ديگري بسپارد برعكس امنيت كاهش مي يابد.
۴- ارتباطات(مثل پست الكترونيكي و انتقال فايلها)
نخ(thread) و سيستم هاي multitasking

در تكنيك چند نخي(Multithreading) يك فرايند(process) كه برنامه اي در حال اجراست، مي تواند به بخشها يا نخهائي(بندهائي) تقسيم شود كه مي توانند به صورت همزمان اجراء شوند.

گاهي اوقات به سيستم هاي multithreading سيستم هاي چند تكليفي يا چند وظيفه اي(multitasking) هم گفته مي شود.
فرآيند(process) يا پردازش اساسا يك برنامه در حال اجراست كه منابعي از سيستم به آن تخصيص داده شده است( شامل رجيسترها، حافظه، فايلها و دستگاهها). فرآيند مي تواند مجموعه اي از يك يا چند نخ باشد. به نخ، رشته يا بند هم گفته مي شود. كليه اطلاعات مربوط به هر پروسس، در يكي از جداول سيستم عامل به نام جدول Process Control Block=PCB ذخيره مي شود. اين جدول يك آرايه يا ليست پيوندي از ساختارهاست كه هر عضو آن مربوط به يكي از پروسس هاست كه در حال حاضر موجوديت دارد.

اطلاعات موجود در PCB عبارتند از: حالت جاري پردازش، شماره شناسايي پردازش، شماره شناسايي پردازش، اولويت پردازش، نشاني حافظه پردازش، نشاني محل برنامه پردازش بر روي ديسك، نشاني ساير منابع پردازش، محلي براي حفظ ثباتها. در فصل سوم PCB را كامل تر شرح مي دهيم.
سيستم هاي چند پردازنده اي(multiprocessor)

كامپيوترها مي توانند به جاي يك CPU چندين CPU داشته باشند كه در اينصورت به آنها سيستم هاي multiprocessor مي گويند. جهت استفاده از اسن سيستم ها نياز به يك سيستم عامل خاص مي باشد كه بتواند چندين برنامه(يا نخهاي يك فرآيند) را به صورت موازي واقعي روي آنها اجراء كند. سيستم عامل multitasking براي اجراء چند نخ بر روي يك CPU به كار مي روند. گاهي اوقات به سيستم multiprocessor، سيستم multiprocessing هم مي گويند.
در سيستم چند پردازنده اي، CPU ها بايد بتوانند از حافظه، امكانات ورودي و خروجي و گذرگاه Bus سيستم به صورت اشتراكي استفاده كنند. مزاياي اين سيستم ها عبارتند از:

الف) زياد شدن توان عملياتي(throughput). منظور از throughput تعداد كارهائي است كه در يك واحد زماني تمام مي شوند. بديهي است هر چقدر تعداد پردازنده ها بيشتر باشد تعداد كارهاي تمام شده در يك پريود زماني نيز بيشتر خواهد بود. البته اين نسبت خطي نيست، مثلا اگر تعداد پردازنده ها n باشد سرعت اجراء برنامه ها n برابر نمي شود چرا كه بخشي از وقت پردازنده ها جهت مسائلي كنترلي و امنيتي و سوئيچ كردن ها به هدر مي رود.
ب) صرفه جوئي در هزينه ها. از آنجا كه پردازنده ها منابع تغذيه، ديسكها، حافظه ها و ادوات جانبي را به صورت مشترك استفاده مي كنند در هزينه هاي سخت افزاري صرفه جوئي مي شود.

ج) تحمل پذيري در برابر خطا(fault- tolerant). سيستم هاي مالتي پروسسور قابليت اعتماد را افزايش مي دهند چرا كه خرابي يك CPU سبب توقف سيستم نمي شود بلكه تنها سبب كند شدن آن خواهد شد. استمرار عمل با وجود خرابي نيازمند مكانيزمي است كه اجازه دهد خرابي جست و جو شده، تشخيص داده شده و در صورت امكان اصلاح شود( يا كنار گذاشته شود). اين توانايي به ادامه سرويس، متناسب با سطح بقاي سخت افزار، تنزل مطبوع يا graceful degradation ناميده مي شود.

سيستم عاملهاي چند پردازنده اي نامتقارن(Asymmetric Multi Processing ) يك پردازنده جهت اجراء سيستم عامل و پردازنده هاي ديگر جهت اجراي برنامه هاي كاربران استفاده مي شود. از آنجا كه كد سيستم عامل تنها روي يك پروسسور اجراء مي شود، ساخت اين نوع سيستم عامل نسبتا ساده است و از تعميم سيستم عامل تك پردازنده اي به دست مي آيد. اين نوع سيستم عامل ها براي اجراء روي سخت افزارهاي نامتقارن مناسب هستند، مانند كمك پردازنده و پردازنده اي كه به هم متصل هستند يا دو پردازنده اي كه از تمام حافظه موجود مشتركا استفاده نمي كنند. يكي از معايب سيستم عامل نامتقارن غيرقابل حمل بودن(non- portable) آن است. يعني براي سخت افزارهاي مختلف بايد سيستم عاملهاي مختلفي نوشته شود چرا كه نامتقارني مي تواند حالات مختلف داشته باشد.

در سيستم چند پردازنده اي متقارن(Symmetric Multi Processing= SMP) سيستم عامل مي تواند روي هر يك از پروسسورهاي آزاد يا روي تمام پردازنده ها همزمان اجراء شود. در اين حالت حافظه بين تمام آنها مشترك مي باشد. تمام پردازنده ها اعمال يكساني را مي توانند انجام دهند. سيستم متقارن از چند جنبه نسبت به نوع متقارن برتري دارد:

۱- از آنجا كه سيستم عامل خود يك پردازش سنگين است اگر فقط روي يك CPU اجراء شود باعث مي گردد كه آن پردازنده همواره بار سنگيني داشته باشد، در حاليكه احتمالا پردازنده هاي ديگر بي كار هستند لذا اجراء سيستم عامل روي چند پردازنده باعث متعادل شدن(balancing) بار سيستم مي شود.
۲- در سيستم نامتقارن اگر پردازنده اجراء كننده سيستم عامل خراب شود كل سيستم خراب مي شود ولي در سيستم متقارن از اين نظر امنيت بيشتر است چرا كه اگر يك پردازنده از كار بيفتد سيستم عامل مي تواند روي پردازنده هاي ديگر اجراء شود.

۳- برعكس سيستم عامل نامتقارن، سيستم عامل متقارن قابل حمل(portable) بر روي سيستم هاي سخت افزاري مختلف است.
سيستم عامل SUNOS ورژن ۴ از نوع نامتقارن و سيستم عامل Solaris2 ورژن ۵ و همچنين Windows NT از نوع متقارن مي باشند.
توجه كنيد وجود پردازنده هاي متعدد از ديد كاربر مخفي است و زمانبندي نخها(Thread) يا فرآيندها(process) روي هر يك از پردازنده ها به عهده سيستم عامل است.

گرچه multithreading و multiprocessing امكانات مستقلي هستند ولي معمولا با هم پياده سازي مي شوند. حتي در يك ماشين تك پردازنده اي، چند نخي كارايي را افزايش مي دهد. همچنين ماشين چند پردازنده اي حتي براي فرايندهاي غيرنخي هم كارآمد است.
شكل زير تفاوت سيستم نامتقارن و متقارن را نشان مي دهد:

 

تذكر ۱: گاهي اوقات به سيستم هاي چند پرازنده اي، سيستم هاي Tightly Coupled يا ارتباط محكم نيز گفته مي شود. چرا كه پردازنده ها كلاك(Clock)، گذرگاه و همچنين حافظه مشتركي دارند.
تذكر ۲: بعضي از كتابها سيستم هاي توزيع شده را به صورت زير به دو دسته تقسيم كرده اند:
۱- سيستم هاي با ارتباط سست يا ضعيف(Loosely Coupled) كه تعدادي پردازنده با خطوط ارتباطي بين آنها دارند و هر پردازنده كلاك و حافظه مستقل دارد.
۲- سيستم هاي با ارتباط محكم(Tightly Coupled) كه پردازنده هايي با كلاك يكسان و حافظه مشترك دارند. با آنكه اين سيستم پيچيده تر است ولي سرعت اجراي آن از نوع قبلي بيشتر مي باشد.

سيستم هاي توزيع شده جهت افزايش سرعت اجرا، افزايش قابليت اطمينان، اشتراك منابع و برقراري ارتباط بين سيستم هاي مختلف استفاده مي گردند.
سيستم هاي بي درنگ(Real Time)

سيستم هاي بي درنگ معمولا به عنوان يك كنترل كننده در يك كاربرد خاص استفاده مي شوند. سيستم در اين حالت مي بايست در زماني مشخص و معين حتما جواب مورد نظر را بدهد. سيستم كنترل صنعتي، كنترل موشك و غيره از اين دسته اند.

در سيستم هاي بي درنگ زمان پاسخ بايد سريع و تضمين شده باشد ولي در سيستم اشتراك زماني مطلوبست كه زمان پاسخ سريع باشد(ولي اجباري نيست). در سيستم دسته اي هيچ محدوديت زماني در نظر گرفته نمي شود.

در سيستم هاي بي درنگ معمولا وسايل ذخيره سازي ثانويه وجود ندارد و به جاي آن از حافظه هاي ROM استفاده مي شود. سيستم عامل هاي پيشرفته نيز در اين سيستم ها وجود ندارند چرا كه سيستم عامل را از سخت افزار جدا مي كند و اين جداسازي باعث عدم قطعيت در زمان پاسخگوئي مي شود.

سيستم هاي بي درنگ با سيستم هاي اشتراك زماني تناقض دارند لذا نمي توانند هر دو تواما وجود داشته باشند. به دليل نياز به پاسخ دهي سريع و تضمين شده، سيستم هاي بلادرنگ از حافظه مجازي و اشتراك زماني استفاده نمي كنند. به اين سيستم ها«بي درنگ سخت» نيز گفته مي شود. اين موضوع در كتاب حاضر مورد بررسي قرار نمي گيرد. در سيستم هاي« بي درنگ نرم» يك وظيفه بي درنگ بحراني، نسبت به ساير وظايف اولويت دارد و تا پايان تكميل

شدنش اين ارجحيت را دارا خواهد بود. از آنجا كه اين سيستم ها مهلت زماني(deadline) را پشتيباني نمي كنند استفاده آنها در كنترل صنعتي ريسك آور است. هر چند كه اين سيستم هاي بي درنگ نرم نيز مي بايست پاسخي سريع داشته باشند ولي مساله پاسخ دهي به حادي سيستم هاي بي درنگ سخت نمي باشد. از كاربردهاي بي درنگ نرم مي توان رزواسيون شركتهاي هواپيمائي، چند رسانه اي(multimedia)، واقعيت مجازي(Virtual reality) را نام برد. اين سيستم ها به ويژگي هاي سيستم عاملهاي پيشرفته(كه توسط بي درنگ سخت حمايت نمي شوند) نيازمندند. بعضي از نسخه هاي UNIX مانند solaris 2 خاصيت بي درنگ نرم را دارا مي باشند.