📚 استنادًا إلى الفصل الحادي عشر من كتاب: Operating Systems: Internals and Design Principles – William Stallings – الإصدار التاسع
تُعد أجهزة الإدخال/الإخراج (Input/Output Devices) الجسر الذي يربط نظام الحاسوب بالعالم الخارجي. بدون هذه الأجهزة، لن يتمكن المستخدمون من التفاعل مع الحاسوب، ولن يتمكن الحاسوب من تخزين البيانات أو معالجتها أو إخراج النتائج. تختلف هذه الأجهزة بشكل كبير في وظائفها، سرعاتها، وطرق تفاعلها مع نظام التشغيل.
تُستخدم لإدخال البيانات والأوامر إلى الحاسوب. أمثلتها:
تُستخدم لعرض أو إخراج النتائج والبيانات من الحاسوب إلى المستخدم أو إلى جهاز آخر. أمثلتها:
تُستخدم لتخزين البيانات بشكل دائم أو شبه دائم. تُعتبر أجهزة I/O لأنها تتضمن عمليات قراءة (إدخال) وكتابة (إخراج) للبيانات. أمثلتها:
يمكنها أداء وظائف الإدخال والإخراج في نفس الوقت أو بالتناوب. أمثلتها:
لكي يتمكن نظام التشغيل من التفاعل مع أجهزة I/O المتنوعة، يوفر عدة طرق لتنفيذ عمليات الإدخال والإخراج. تختلف هذه الطرق في مدى تدخل المعالج المركزي (CPU) في العملية، وبالتالي تؤثر على كفاءة وأداء النظام.
📚 قراءة إثرائية: DMA in Computer Architecture – GeeksforGeeks
إدارة الإدخال/الإخراج ليست مجرد مسألة نقل بيانات؛ بل تتضمن تحديات تصميمية كبيرة لضمان أن النظام يعمل بكفاءة، أمان، واستقرار مع مجموعة واسعة من الأجهزة.
هو برنامج وسيط (Software Module) يُكتب خصيصًا لكل نوع من أجهزة I/O. يعمل كواجهة بين نظام التشغيل والجهاز. يحتوي على التعليمات البرمجية اللازمة للتحكم في الجهاز المحدد، وترجمة الأوامر العامة من نظام التشغيل إلى أوامر خاصة بالجهاز، والعكس. بدون برنامج التشغيل الصحيح، لا يمكن لنظام التشغيل التفاعل مع الجهاز.
هو مكون مادي (Hardware Component) يُمثل الواجهة الإلكترونية بين الجهاز الفعلي وناقل النظام (System Bus). يحتوي على سجلات (Registers) للأوامر، الحالة، والبيانات، بالإضافة إلى منطق التحكم في الجهاز. يتواصل مع المعالج عبر الـ bus، ومع الجهاز الفعلي عبر واجهة خاصة بالجهاز.
هو استخدام مناطق ذاكرة مؤقتة (Buffers) لتخزين البيانات أثناء نقلها بين أجهزة I/O والذاكرة الرئيسية. يساعد هذا في التغلب على اختلافات السرعة بين الأجهزة والمعالج، ويُحسن من كفاءة عمليات I/O. سنتناول هذا بالتفصيل في القسم التالي.
هو استخدام قرص لتخزين البيانات التي يتم إرسالها إلى أجهزة بطيئة (مثل الطابعات). بدلاً من أن ينتظر المعالج الطابعة، يتم إرسال مهمة الطباعة إلى القرص أولاً، ثم تُطبع من القرص عندما تكون الطابعة جاهزة. هذا يحرر المعالج بسرعة ويسمح له بتنفيذ مهام أخرى.
التخزين المؤقت (Buffering) هو تقنية أساسية في إدارة الإدخال/الإخراج تهدف إلى تحسين كفاءة نقل البيانات بين الأجهزة والمعالج أو الذاكرة. يتم ذلك عن طريق استخدام مناطق ذاكرة مؤقتة (تُسمى "Buffers") لتخزين البيانات بشكل عابر.
هو عملية تخزين مؤقت للبيانات في الذاكرة (RAM) أثناء نقلها بين جهاز I/O (مثل القرص أو الطابعة) والمعالج أو الذاكرة الرئيسية. الهدف الرئيسي هو تقليل الفجوة بين سرعات الأجهزة المختلفة؛ فالأجهزة الطرفية غالبًا ما تكون أبطأ بكثير من المعالج والذاكرة الرئيسية.
تُعد الأقراص الصلبة (HDDs) من أبطأ مكونات النظام مقارنة بالمعالج والذاكرة. عندما تكون هناك العديد من طلبات القراءة والكتابة على القرص في نفس الوقت، يجب على نظام التشغيل جدولة هذه الطلبات بذكاء لتقليل زمن الوصول إلى البيانات (Seek Time) وتحسين الأداء العام للقرص.
الهدف الرئيسي لجدولة الأقراص هو تقليل إجمالي المسافة التي يتحركها رأس القراءة/الكتابة للقرص.
| الخوارزمية | الوصف | المزايا والعيوب |
|---|---|---|
| FCFS (First-Come, First-Served) - أولاً يأتي، أولاً يُخدم |
تخدم الطلبات بالترتيب الذي تصل به إلى قائمة الانتظار. لا تأخذ في الاعتبار الموقع الحالي لرأس القرص. |
المزايا: بسيطة جدًا في التنفيذ، لا تسبب المجاعة. العيوب: قد تؤدي إلى حركة رأس كبيرة وغير فعالة، مما يؤدي إلى بطء الأداء العام للقرص، خاصة مع الطلبات المتناثرة على مساحات بعيدة. |
| SSTF (Shortest Seek Time First) - أقصر زمن للبحث أولاً |
تخدم الطلب الأقرب لرأس القراءة/الكتابة الحالي. الهدف هو تقليل زمن البحث (Seek Time) قدر الإمكان. |
المزايا: تُحسن من الأداء بشكل كبير عن طريق تقليل حركة الرأس. العيوب: قد تُسبب مجاعة (Starvation) للطلبات البعيدة إذا استمر وصول طلبات قريبة من الموقع الحالي للرأس. |
| SCAN (Elevator Algorithm) - خوارزمية المصعد |
يتحرك رأس القرص في اتجاه واحد (مثلاً، من الداخل إلى الخارج) ويخدم جميع الطلبات في طريقه. عندما يصل إلى نهاية القرص في ذلك الاتجاه، يعكس اتجاهه ويخدم الطلبات في الاتجاه الآخر. |
المزايا: تمنع المجاعة، وتوفر أداءً جيدًا. مناسبة للأنظمة ذات الأحمال الثقيلة. العيوب: الطلبات التي تصل للتو بعد مرور الرأس في اتجاهها قد تضطر للانتظار دورة كاملة. |
| C-SCAN (Circular SCAN) - المسح الدائري |
مثل SCAN، ولكنها تتحرك في اتجاه واحد فقط (مثلاً، من الداخل إلى الخارج) وتخدم الطلبات في طريقها. عندما تصل إلى نهاية القرص، تعود مباشرة إلى البداية دون خدمة أي طلبات في طريق العودة، ثم تبدأ دورة جديدة في الاتجاه الأصلي. |
المزايا: أكثر عدالة من SCAN لأنها تضمن أن كل طلب سيُخدم في دورة واحدة، وتمنع المجاعة. العيوب: قد تكون حركة الرأس أكبر قليلاً من SCAN في بعض الحالات. |
| LOOK / C-LOOK |
مثل SCAN و C-SCAN على التوالي، ولكن الرأس لا يذهب لأقصى حدود القرص. يتوقف ويعكس اتجاهه بمجرد خدمة آخر طلب في الاتجاه الحالي. |
المزايا: تقلل من المسافة الإجمالية لحركة الرأس مقارنة بـ SCAN/C-SCAN لأنها تتجنب الذهاب إلى المسارات الفارغة في الأطراف. العيوب: لا تزال تحمل بعض عيوب SCAN/C-SCAN اعتمادًا على نوعها. |
🧪 مثال عملي لجدولة الأقراص (SSTF):
لنفترض أن لدينا طلبات I/O التالية على مسارات القرص (Cylinders):
98, 183, 37, 122, 14, 124وأن رأس القراءة/الكتابة يبدأ عند المسار:
53تطبيق خوارزمية SSTF (أقصر زمن للبحث أولاً):
- البداية: الرأس عند
53.- الطلبات المتاحة:
98, 183, 37, 122, 14, 124- أقرب طلب لـ 53 هو 37 (المسافة = $|53 - 37| = 16$).
الرأس يتحرك إلى37. الطلبات المتبقية:98, 183, 122, 14, 124.- أقرب طلب لـ 37 هو 14 (المسافة = $|37 - 14| = 23$).
الرأس يتحرك إلى14. الطلبات المتبقية:98, 183, 122, 124.- أقرب طلب لـ 14 هو 98 (المسافة = $|14 - 98| = 84$).
الرأس يتحرك إلى98. الطلبات المتبقية:183, 122, 124.- أقرب طلب لـ 98 هو 122 (المسافة = $|98 - 122| = 24$).
الرأس يتحرك إلى122. الطلبات المتبقية:183, 124.- أقرب طلب لـ 122 هو 124 (المسافة = $|122 - 124| = 2$).
الرأس يتحرك إلى124. الطلبات المتبقية:183.- أقرب طلب لـ 124 هو 183 (المسافة = $|124 - 183| = 59$).
الرأس يتحرك إلى183. الطلبات المتبقية: لا شيء.الترتيب الذي ستُخدم به الطلبات:
37 → 14 → 98 → 122 → 124 → 183إجمالي حركة الرأس: $16 + 23 + 84 + 24 + 2 + 59 = 208$ مسار.
🎥 فيديو توضيحي ممتاز: Disk Scheduling Algorithms – YouTube (Neso Academy)
RAID (Redundant Array of Independent Disks) هي تقنية لدمج عدة أقراص صلبة مادية (أو SSDs) في وحدة تخزين منطقية واحدة. الهدف الرئيسي من RAID هو تحقيق واحد أو أكثر من الأهداف التالية:
توجد مستويات مختلفة من RAID (تُسمى "مستويات RAID")، كل منها يوفر توازنًا مختلفًا بين الأداء، الاعتمادية، والتكلفة.
| المستوى | الوصف | المزايا | العيوب |
|---|---|---|---|
| RAID 0 (Striping) |
يُعرف بـ "التقسيم" أو "Striping". يتم تقسيم البيانات إلى كتل صغيرة وتوزيعها بالتساوي عبر جميع الأقراص في المصفوفة. لا يوجد تكرار للبيانات. |
أسرع أداء: يُقدم أفضل أداء للقراءة والكتابة لأنه يمكن الوصول إلى البيانات بالتوازي. استغلال كامل للسعة: جميع سعة الأقراص متاحة للتخزين. |
لا يوجد تكرار: إذا فشل أي قرص واحد في المصفوفة، يتم فقدان جميع البيانات. غير مناسب للبيانات الحرجة. |
| RAID 1 (Mirroring) |
يُعرف بـ "النسخ المتطابق" أو "Mirroring". يتم إنشاء نسخة طبق الأصل من البيانات على قرصين مختلفين (أو أكثر). كل شيء يُكتب على قرص يُكتب أيضًا على القرص الآخر. |
أكثر أمانًا (Reliable): يوفر حماية ممتازة للبيانات؛ إذا فشل قرص واحد، يمكن استرداد البيانات بالكامل من القرص الآخر. سرعة قراءة جيدة: يمكن القراءة من أي من القرصين. |
استغلال سعة 50% فقط: نصف سعة الأقراص تُستخدم للتكرار، مما يجعله مكلفًا من حيث السعة. |
| RAID 5 (Striping with Parity) |
يجمع بين تقسيم البيانات (Striping) مع تخزين معلومات التكرار (Parity) عبر جميع الأقراص في المصفوفة. تتطلب 3 أقراص على الأقل. |
توازن بين الأداء والحماية: يوفر أداءً جيدًا وحماية ضد فشل قرص واحد. استغلال سعة أفضل: تُفقد سعة قرص واحد فقط لتخزين Parity. |
أداء كتابة أبطأ: تتطلب عمليات الكتابة حساب وتحديث Parity. استعادة البيانات معقدة وبطيئة إذا فشل قرص. |
📘 رابط توضيحي: RAID Explained – HowToGeek
ذاكرة التخزين المؤقت للقرص (Disk Cache) هي تقنية حيوية لتحسين أداء أنظمة التخزين. إنها جزء من الذاكرة (عادةً RAM) تُستخدم للاحتفاظ بالبيانات التي تم الوصول إليها مؤخرًا من القرص الصلب، أو البيانات التي يُتوقع الوصول إليها قريبًا.
🔍 مثال: عند فتح ملف معين (مثل مستند Word كبير) لأول مرة، قد يستغرق الأمر بعض الوقت ليتم تحميله من القرص. ولكن إذا قمت بإغلاقه ثم إعادة فتحه بعد فترة قصيرة، فمن المحتمل أن يتم تحميله بشكل أسرع بكثير لأن أجزاء منه لا تزال موجودة في ذاكرة التخزين المؤقت للقرص.
تُطبق أنظمة التشغيل الرائدة آليات متطورة لإدارة الإدخال/الإخراج، مع اختلافات في التفاصيل ولكنها جميعًا تهدف إلى الكفاءة والأمان.
| النظام | آلية إدارة I/O |
|---|---|
| Unix SVR4 |
يستخدم نظام ملفات مرنًا (Flexible File System) ويدعم تعدد المخازن المؤقتة (Multiple Buffers) لتحسين أداء I/O. يعتمد على بنية طبقات (Layered Architecture) حيث يتم فصل وظائف I/O إلى طبقات مختلفة (مثل طبقة الجهاز، طبقة برنامج التشغيل، طبقة نظام الملفات). يُعرف بنهجه الموحد للتعامل مع الأجهزة كملفات (Everything is a file). |
| Linux |
يعتمد على Virtual File System (VFS)، وهي طبقة تجريدية تسمح لنواة Linux بالتفاعل مع أنواع مختلفة من أنظمة الملفات وأجهزة التخزين بطريقة موحدة. يدعم Plug and Play (التوصيل والتشغيل) للأجهزة، مما يسمح باكتشاف الأجهزة الجديدة وتكوينها تلقائيًا. يستخدم نظامًا قويًا لبرامج التشغيل المعيارية (Modular Device Drivers) التي يمكن تحميلها وتفريغها ديناميكيًا. يستخدم أيضًا جدولة أقراص متقدمة (مثل CFQ - Completely Fair Queuing) لتحسين الأداء. |
| Windows |
يعتمد على مفهوم I/O Request Packets (IRP). عندما يطلب تطبيق عملية I/O، يتم إنشاء IRP يمر عبر طبقات مختلفة من برامج التشغيل (نموذج Drivers متعدد الطبقات). يستخدم نموذجًا موجهًا للكائنات (Object-Oriented Model) لإدارة الأجهزة، حيث يتم تمثيل كل جهاز ككائن يمكن التفاعل معه. يوفر دعمًا واسعًا لـ DMA والتخزين المؤقت لتحسين الأداء. |
في هذه الوحدة، استكشفنا عالم **إدارة الإدخال/الإخراج (I/O Management)**، وهو جانب حيوي لعمل أي نظام تشغيل. بدأنا بالتعرف على **أنواع أجهزة I/O** المختلفة وخصائصها. ثم تعمقنا في **طرق تنظيم وظائف I/O**، من Programmed I/O البسيط إلى Interrupt-Driven I/O الأكثر كفاءة، وصولاً إلى DMA الذي يُحرر المعالج تمامًا. ناقشنا **قضايا تصميم نظام التشغيل** المتعلقة بـ I/O، مثل إدارة تنوع الأجهزة وتوفير برامج التشغيل. كما فهمنا دور **التخزين المؤقت (Buffering)** في تحسين الأداء، وأنواعه المختلفة. جزء كبير من الوحدة كان مخصصًا لـ**جدولة الأقراص (Disk Scheduling)**، حيث قمنا بتحليل خوارزميات مثل FCFS, SSTF, SCAN, و C-SCAN وكيف تُقلل من زمن البحث. أخيرًا، استعرضنا تقنيات متقدمة مثل **RAID** لزيادة الأداء والاعتمادية في التخزين، و**ذاكرة التخزين المؤقت للقرص (Disk Cache)** لتسريع الوصول للبيانات، وألقينا نظرة على كيفية تعامل أنظمة التشغيل الرائدة (Unix, Linux, Windows) مع I/O. فهم هذه المفاهيم ضروري لتصميم أنظمة حاسوبية فعالة وموثوقة.