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

اصول سخت افزاري I/O

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

۱- دستگاههاي بلوكي BLOCK DEVICE

۲- دستگاههاي كاركتري CHARACTER DEVICE

يك دستگاه بلوكي وسيله اي است كه اطلاعات را در يك بلوك با اندازه معين ذخيره مي كند كه هر كدام با آدرس خودشان مشخص شده اند. حدود اندازه بلوك‌هاي معمولي از ۵۱۲ بايت تا ۳۲۷۶۸ بايت مي باشند خاصيت اساسي يك دستگاه بلوكي اين است كه خواندن و نوشتن هر بلوك را بطور مستقل از بقيه ممكن مي سازد ديسكها از متداولترين دستگاههاي بلوكي هستند.

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

۱- قابل خواندن توسط انسان:

مناسب براي ارتباط با كاربر، مانند پايانه هاي نمايش دهنده تصوير، صفحه كليد و…

۲- خواندن توسط ماشين:

مناسب براي ارتباط با وسائل الكترونيكي، مانند گردانندهاي ديسك و نوار، حس كننده‌ها، كنترل كننده ها و محركها.

۳- ارتباطات:

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

نرخ انتقال، كاربرد، پيچيدگي كنترل، واحد انتقال، نمايش داده ها، شرايط خطا.

سازمان عمل ورودي/ خروجي

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

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

پ) دسترسي مستقيم به حافظه DMA: مولفه DMA تبادل داده ها بين حافظه اصلي و مولفه ورودي/ خروجي را كنترل مي كند. پردازنده تقاضايي براي انتقال يك بلوك از داده ها را به مولفه DMA مي فرستد و فقط پس از انتقال كل بلوك مورد وقفه قرار مي گيرد.

تكامل عمل ورودي/ خروجي

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

۱- كنترل دستگاه جانبي بطور مستقيم.

۲- يك كنترل كننده يا مولفه ورودي/ خروجي افزوده شده است. پردازنده از ورودي/ خروجي برنامه ريزي شده بدون وقفه استفاده مي كند. با اين گام پردازنده از جزئيات اختصاصي واسط هاي دستگاه خارجي جدا مي گردد.

۳- همان پيكربندي گام دوم، ولي اين بار از وقفه استفاده شده است. ديگر وقت پردازنده تلف نمي شود.

۴- از طريق DMA كنترل مستقيم حافظه به مولفه ورودي/ خروجي داده شده است. حال مي توان بلوكي از داده را بدون دخالت پردازنده به/ از حافظه انتقال داد.

۵- مولفه ورودي/ خروجي تا حد پردازنده اي مجزا، با مجموعه اي دستورالعملهاي خاصي براي ورودي/ خروجي ارتقاء يافته است. پردازنده مركزي (CPU)، پردازنده ورودي/ خروجي را براي اجراي برنامه ورودي/ خروجي از حافظه هدايت مي كند، پردازنده ورودي/ خروجي اين دستورالعملها را بدون دخالت پردازنده مركزي واكنشي و اجرا مي كند.

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

دسترسي مستقيم به حافظه

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

– اينكه درخواست خواندن يا نوشتن.

– آدرس دستگاه ورودي/ خروجي درگير.

– آدرس مكان شروع خواندن يا نوشتن در حافظه.

– تعداد كلماتي كه بايد خوانده يا نوشته شود.

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

اصول نرم افزاري I/O

هدف اصلي نرم افزار I/O، سازماندهي نرم افزار بصورت يك سري از لايه ها است كه كار لايه هاي پاييني پنهان ساختن ويژگي هاي پيچيده سخت افزار از لايه هاي بالاتر و كار لايه هاي بالايي نشان دادن يك واسطه منظم، ساده و شفاف براي استفاده كننده است. از اين اهداف مي توان به موارد زير اشاره نمود.

– برنامه ها تا حد ممكن بايد از دستگاه مستقل باشند. يعني بايد بتوانيم برنامه هايي بنويسيم كه قادر باشد فايلهاي روي يك ديسك نرم، ديسك سخت و يا CD-ROM را بخواند.

– يكي ديگر از اهداف نرم افزار I/O كه ارتباط نزديكي با مفهوم نرم افزار مستقل دستگاه دارد، نامگذاري يكسان مي باشد. نام يك فايل يا يك دستگاه بطور ساده بايد يك رشته يا يك عدد صحيح باشد و به هيچ وجه به دستگاه بستگي نداشته باشد.

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

– هدف ديگر، كه يك موضوع كليدي است، انتقال همگام (بلوكه كردن)در مقابل انتقال هاي ناهمگام (مبتني بر وقفه) مي باشد.

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

اهدافي كه در بالا بيان شد. با روشي قابل درك و موثر با ساختن نرم افزار I/O در چهار لايه بدست مي آيد:

الف) اداره كننده هاي وقفه

ب) گرداننده هاي دستگاه

پ) نرم افزار سيستم عامل مستقيم از دستگاه

ج) نرم افزار سطح كاربر

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

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

بن بست

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

بن بست زماني اتفاق مي افتد كه فرايندها مي توانند بطور انحصاري به دستگاهها، فايلها و ديگر اشياء دست يابند. بطور كلي به هر يك از اين اشياء منبع گفته مي‌شود. منابع مي توانند سخت افزاري و يا يك ركورد از يك بانك اطلاعاتي باشد. منابع به دو گروه تقسيم مي شوند.

الف) قابل پس گرفتن PREEMPTABLE

به منبعي قابل پس گرفتن مي گويند كه بتوان آن را بدون اينكه تاثير منفي بر جاي گذارد از فرايند صاحب آن باز پس گرفت (بعد از پايان كار).

ب) غير قابل پس گرفتن NON PREEMPTABLE

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

يك مجموعه از فرايندها در صورتي منجر به بن بست مي شوند كه هر يك از فرايندهاي درون مجموعه منتظر رويدادي است كه فقط فرآيند ديگر از همين مجموعه مي تواند باعث ايجاد آن شود. اين رويداد رهاسازي منابع توسط فرآيند قبلي است.

شرايط بن بست

از ديد كافمن، براي پديد آمدن بن بست ۴ شرط بايد بوجود آيد.

۱- انحصار متقابل: در هر زمان تنها يك فرآيند مي تواند از يك منبع استفاده كند.

۲- نگهداري و انتظار: در حاليكه فرايند منبع تخصيص داده شده را نگه مي‌دارد، منتظر تخصيص منبع ديگر است.

۳- قبضه نكردن: منبعي كه قبلاً به فرآيند واگذار شده را نتوان به زور از آن باز پس گرفت.

۴- انتظار مدور: زنجير بسته اي از فرآيندها وجود دارد، به گونه اي كه هر يك، حداقل يك منبع مورد نياز فرايند بعد در زنجير را نگه دارد.

براي برخورد با بن بست الگوريتم هاي مختلفي وجود دارد. اما بطور كلي سه راه براي اداره بن بست وجود دارد.

۱- كشف بن بست و ترميم

۲- اجتناب از بن بست

۳- پيشگيري از بن بست

نكته: عده اي يك مورد به موارد بالا مي افزايند و آن اينكه بن بست را ناديده بگيريم و در بعضي سيستم عاملها حتي براي كشف آن اقدامي بعمل نمي آيد مانند UNIX.

كشف بن بست

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

ترميم

پس از كشف بن بست، براي ترميم راهبردهايي وجود دارد. در زير رويكردهاي ممكن به ترتيب پيچيدگي فهرست شده اند.

الف) قطع تمام فرايندهاي بن بست

ب) برگشت هر يك از فرايندهاي بن بست به آغاز و شروع مجدد هر يك

پ) قطع پي‌درپي فرايندهاي بن بست تاجايي كه ديگر بن بست وجود نداشته باشد

ت) قبضه كردن پي در پي منابع تا جايي كه ديگر بن بست وجود نداشته باشد

اجتناب از بن بست

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

الف) عدم شروع فرايندي كه ممكن است درخواستهايش منجر به بن بست شود.

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

پيشگيري از بن بست

راهبرد پيشگيري از بن بست اين است كه طرح سيستم به گونه اي باشد كه از قبل امكان بن بست از بين برده شود روش پيشگيري دو گروهند. روش غير مستقيم كه پيشگيري از بروز يكي از شرايط ۱ تا ۳ است و روش مستقيم كه پيشگيري از بروز انتظار مدور است.

انحصار متقابل

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