نرمافزارهای ورودی خروجی (I/O) در سیستم عامل — راهنمای جامع
نرمافزارهای I/O غالباً در لایههای زیر سازماندهی میشود:
- کتابخانههای سطح کاربر – در این سطح واسط سادهای برای برنامه کاربر ارائه میشود تا عملیات ورودی و خروجی را اجرا کند. برای نمونه stdio کتابخانهای است که در زبانهای برنامهنویسی C و ++C ارائه شده است.
- ماژولهای سطح کرنل – در این سطح، درایورهای دستگاهها برای تعامل با کنترلر دستگاه و ماژولهای I/O مستقل از دستگاه که توسط درایورهای دستگاه استفاده میشود، ارائه شدهاند.
- سختافزار – در این لایه سختافزار و کنترلر سختافزار واقعی وجود دارد که با درایورهای دستگاه تعامل دارد و باعث تداوم عملکرد سختافزار میشود.
یک مفهوم کلیدی در طراحی نرمافزار I/O این است که چنین نرمافزاری باید هر کجا که امکان داشته باشد مستقل از دستگاه باشد تا بتوان برنامههایی نوشت که بتوانند بدون نیاز به تعیین دستگاه از قبل به ورودی و خروجی آن دسترسی داشته باشند. برای نمونه برنامهای که یک فایل را به صورت ورودی میخواند، میتواند یک فایل را از دیسک فلاپی یا هارددیسک یا CD-ROM بخواند و نیازی به تغییر دادن برنامه برای تعامل با هر یک از این دستگاهها وجود ندارد.
درایورهای دستگاه
درایورهای دستگاه ماژولهای نرمافزاری هستند که میتوانند به یک سیستم عامل وصل شده و دستگاه خاصی را مدیریت کنند. سیستم عامل از درایورهای دستگاه برای مدیریت همه دستگاههای ورودی/خروجی کمک میگیرد. درایورهای دستگاه کد مستقل از دستگاه را بستهبندی کرده و یک واسط استاندارد را طوری پیادهسازی میکنند که کد آن شامل رجیستر خاص دستگاه برای خواندن و نوشتن باشد. درایور دستگاه به طور کلی به وسیله سازنده دستگاه ارائه میشود و همراه با دستگاه روی یک CD عرضه میشود.
درایور دستگاه وظایف زیر را انجام میدهد:
- پذیرش درخواست از سوی نرمافزار مستقل از دستگاه.
- تعامل با کنترلر دستگاه برای دریافت و پس دادن ورودی / خروجی و اجرای مدیریت خطا.
- اطمینان یافتن از این که درخواست به درستی اجرا شده است.
شیوه مدیریت درایور دستگاه به صورت زیر است: فرض کنید یک درخواست برای خواندن یک بلوک وارد میشود. اگر درایور در زمان رسیدن درخواست بیکار باشد، بیدرنگ شروع به اجرای درخواست میکند. در غیر این صورت اگر درایور مشغول درخواست دیگری شده باشد، درخواست جدید را در صف درخواستهای در انتظار قرار میدهد.
گرداننده وقفه (Interrupt Handlers)
یک گرداننده وقفه که به نام روال سرویس وقفه یا ISR نیز نامیده میشود، نوعی نرمافزار و به طور خاص یک تابع callback محسوب میشود که در یک سیستم عامل یا به طور خاصتر در یک درایور دستگاه انجام وظیفه میکند و اجرای آن به وسیله پذیرش یک وقفه آغاز میشود.
زمانی که وقفهای رخ میدهد، رویه وقفه هر کاری که لازم است را برای مدیریت وقفه انجام میدهد، ساختارهای داده را بهروزرسانی میکند و پردازشی را که در انتظار وقوع وقفه است بیدار میکند.
مکانیسم وقفه یک آدرس میپذیرد، این آدرس شمارهای است که به طور خاص برای تابع/روال مدیریت وقفه از مجموعه کوچکی انتخاب شده است. در اغلب معماریها، این آدرس یک افست است که در جدولی به نام جدول بردار وقفه (interrupt vector) ذخیره شده است. این بردار شامل آدرسهای حافظه گردانندههای تخصصی وقفه است.
نرمافزار I/O مستقل از دستگاه
کارکرد اصلی نرمافزار I/O مستقل از دستگاه اجرای کارکردهای I/O است که میان همه دستگاهها مشترک هستند و واسط یگانهای برای نرمافزار در سطح کاربر ارائه میکند. با این که نوشتن نرمافزار کاملاً مستقل از دستگاه کار دشواری است؛ اما میتوان برخی ماژولها را طوری نوشت که میان همه دستگاهها مشترک باشند. در ادامه فهرستی از کارکردهای نرمافزار I/O مستقل از دستگاه ارائه شدهاند:
- ایجاد واسط یکنواخت برای درایورهای دستگاه
- نامگذاری دستگاه با نامهای حفظی که به شمارههای major و minor دستگاه مرتبط هستند.
- حفاظت از دستگاه
- بافر کردن دادههایی که از دستگاه میآیند و نمیتوانند در مقصد نهایی ذخیره شوند.
- تخصیص حافظه روی دستگاههای بلوک
- تخصیص و آزادسازی دستگاههای تخصیصیافته
- گزارشدهی خطا
نرمافزار I/O فضای کاربر
کتابخانههایی وجود دارند که واسط غنیتر و سادهتری برای دسترسی به کارکردهای کرنل یا تعامل نهایی با درایورهای دستگاه ارائه کردهاند. اغلب نرمافزارهای I/O سطح کاربر شامل رویههای کتابخانه هستند و تنها چند استثنا مانند سیستم spooling وجود دارند که روشی برای کار با دستگاه ورودی/خروجی خاص در سیستم چند برنامگی محسوب میشود.
کتابخانههای I/O (مانند stdio) در فضای کاربر هستند تا واسطی برای نرمافزارهای I/O مستقل از دستگاه مقیم در سیستم عامل ارائه کنند. برای نمونه ()putchar() ،getchar() ،printf و ()scanf نمونههایی از کتابخانه I/O سطح کاربر به نام stdio هستند که در زبان برنامهنویسی C ارائه شدهاند.
زیرسیستم I/O کرنل
زیرسیستم I/O کرنل مسئول ارائه بسیاری از سرویسهایی مرتبط با I/O است. در ادامه برخی از سرویسها ارائه شده است:
زمانبندی
کرنل مجموعهای از درخواستهای I/O زمانبندی میکند تا ترتیب مناسب اجرای آنها را تشخیص دهد. زمانی که یک اپلیکیشن، فراخوانی سیستم I/O مسدودکننده را تشخیص میدهد، درخواست در صف آن دستگاه قرار میگیرد. بدین ترتیب ابزار زمانبندی I/O در کرنل، ترتیب صف را بهبود میبخشد تا کارایی کلی سیستم و زمان میانگین پاسخدهی مورد انتظار افزایش یابد.
بافر کردن
زیرسیستم I/O در کرنل یک ناحیه از حافظه را نگهداری میکند که به نام buffer شناخته میشود و دادهها را هنگامی که بین دو دستگاه یا بین یک تولیدکننده و یک مصرفکنندهی جریان داده منتقل میشوند و همچنین دادهها را هنگامی که با اندازههای انتقال مختلف داده انتقال مییابند، مطابقت میدهد.
کَش کردن
کرنل حافظهای برای کش نگهداری میکند که ناحیه سریعی از حافظه است و کپیهایی از دادهها را نگهداری میکند. دسترسی به کپی کش شده بسیار کارآمدتر از دسترسی به دادههای اصلی است.
Spool کردن و رزرو کردن دستگاه
Spool نوعی بافر است که خروجی یک دستگاه مانند پرینتر را که جریانهای دادهای خروجی نمیپذیرند، نگهداری میکند. سیستم اسپول باعث میشود که فایلهای spool صفبندی شده یک به یک به پرینتر کپی شوند. در برخی سیستمهای عامل، spooling به وسیله یک پردازش daemon در سطح سیستم مدیریت میشود. در سیستمهای عامل دیگر این حالت به وسیله نخ کرنل مدیریت میشود.
مدیریت خطا
یک سیستم عامل که از حافظه حفاظت شده استفاده میکند، میتواند از بسیاری از خطاهای سختافزاری و اپلیکیشن محافظت کند.
اگر این مطلب برایتان مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای علوم کامپیوتر
- آموزش سیستمهای عامل
- مجموعه آموزشهای دروس مهندسی کامپیوتر
- آموزش سیستم عامل لینوکس (Linux) – مقدماتی
- انواع سیستم عامل — راهنمای جامع
مفاهیم سیستم عامل — راهنمای جامع
==