الوحدة 11: إدارة الإدخال/الإخراج وجدولة الأقراص

I/O Management and Disk Scheduling

📚 استنادًا إلى الفصل الحادي عشر من كتاب: Operating Systems: Internals and Design Principles – William Stallings – الإصدار التاسع

أهداف الوحدة

  • فهم بنية أنظمة الإدخال/الإخراج ومكوناتها.
  • التعرف على طرق تنظيم وظائف الإدخال/الإخراج داخل نظام التشغيل.
  • تحليل استراتيجيات الجدولة للأقراص لتحسين الأداء.
  • مقارنة كيفية تعامل أنظمة التشغيل المختلفة (Unix, Linux, Windows) مع الإدخال/الإخراج.
  • استيعاب دور التخزين المؤقت (Buffering) وذاكرة التخزين المؤقت للقرص (Disk Cache) في تحسين الأداء.
  • فهم تقنية RAID وأهميتها في التخزين.

1️⃣ أجهزة الإدخال/الإخراج (I/O Devices)

تُعد أجهزة الإدخال/الإخراج (Input/Output Devices) الجسر الذي يربط نظام الحاسوب بالعالم الخارجي. بدون هذه الأجهزة، لن يتمكن المستخدمون من التفاعل مع الحاسوب، ولن يتمكن الحاسوب من تخزين البيانات أو معالجتها أو إخراج النتائج. تختلف هذه الأجهزة بشكل كبير في وظائفها، سرعاتها، وطرق تفاعلها مع نظام التشغيل.

أنواع أجهزة الإدخال/الإخراج:

  • أجهزة الإدخال (Input Devices):

    تُستخدم لإدخال البيانات والأوامر إلى الحاسوب. أمثلتها:

    • لوحة المفاتيح (Keyboard): لإدخال النصوص والأوامر.
    • الفأرة (Mouse): للتفاعل الرسومي وتحديد العناصر.
    • الماسح الضوئي (Scanner): لتحويل المستندات والصور الورقية إلى صيغة رقمية.
    • الميكروفون (Microphone): لإدخال الصوت.
    • الكاميرا (Camera): لالتقاط الصور والفيديو.
  • أجهزة الإخراج (Output Devices):

    تُستخدم لعرض أو إخراج النتائج والبيانات من الحاسوب إلى المستخدم أو إلى جهاز آخر. أمثلتها:

    • الشاشة (Monitor): لعرض المعلومات الرسومية والنصية.
    • الطابعة (Printer): لإنتاج نسخ ورقية من المستندات.
    • مكبرات الصوت (Speakers): لإخراج الصوت.
    • جهاز العرض (Projector): لعرض الصور والفيديو على سطح كبير.
  • أجهزة التخزين (Storage Devices):

    تُستخدم لتخزين البيانات بشكل دائم أو شبه دائم. تُعتبر أجهزة I/O لأنها تتضمن عمليات قراءة (إدخال) وكتابة (إخراج) للبيانات. أمثلتها:

    • الأقراص الصلبة (Hard Disk Drives - HDDs): للتخزين المغناطيسي لكميات كبيرة من البيانات.
    • أقراص الحالة الصلبة (Solid State Drives - SSDs): للتخزين باستخدام الذاكرة الوميضية (Flash Memory)، وتتميز بسرعتها العالية.
    • أقراص USB (Flash Drives): للتخزين المحمول.
    • الأقراص الضوئية (CD/DVD/Blu-ray): للتخزين البصري.
  • أجهزة مزدوجة الاتجاه (Bidirectional Devices):

    يمكنها أداء وظائف الإدخال والإخراج في نفس الوقت أو بالتناوب. أمثلتها:

    • بطاقات الشبكة (Network Interface Cards - NICs): لإرسال واستقبال البيانات عبر الشبكة.
    • شاشات اللمس (Touchscreens): تعمل كجهاز إدخال (لمس) وجهاز إخراج (عرض).
    • المودم (Modem): لإرسال واستقبال البيانات عبر خطوط الهاتف أو الكابل.

📝 خصائص تختلف بها أجهزة I/O:

  • معدل النقل (Transfer Rate): السرعة التي يمكن بها للجهاز نقل البيانات. تختلف بشكل كبير من لوحة المفاتيح (معدل نقل منخفض جدًا) إلى أقراص SSD عالية السرعة أو بطاقات الشبكة (معدلات نقل عالية جدًا).
  • طريقة التفاعل (Interaction Method):
    • متزامن (Synchronous): تتطلب عمليات I/O المتزامنة انتظار المعالج حتى تكتمل العملية قبل متابعة التنفيذ. هذا شائع في الأجهزة البطيئة أو في طرق I/O المبرمجة.
    • غير متزامن (Asynchronous): تسمح عمليات I/O غير المتزامنة للمعالج بمتابعة تنفيذ المهام الأخرى بينما تتم عملية I/O في الخلفية. عندما تكتمل العملية، يتم إعلام المعالج عبر مقاطعة. هذا ضروري للأداء في الأنظمة الحديثة.
  • درجة الذكاء (Intelligence):
    • أجهزة "غبية" (Dumb Devices): تتطلب تدخلًا كبيرًا من المعالج للتحكم في كل خطوة من خطوات عملية I/O (مثل لوحة المفاتيح القديمة).
    • أجهزة "ذكية" (Smart Devices): تحتوي على معالجات صغيرة خاصة بها (Device Controllers) يمكنها أداء مهام I/O معقدة بشكل مستقل، مما يقلل من العبء على المعالج الرئيسي (مثل وحدات التحكم في الأقراص الحديثة).

2️⃣ تنظيم وظائف الإدخال/الإخراج (I/O Function Organization)

لكي يتمكن نظام التشغيل من التفاعل مع أجهزة I/O المتنوعة، يوفر عدة طرق لتنفيذ عمليات الإدخال والإخراج. تختلف هذه الطرق في مدى تدخل المعالج المركزي (CPU) في العملية، وبالتالي تؤثر على كفاءة وأداء النظام.

📍 1. Programmed I/O (الإدخال/الإخراج المبرمج)

  • الوصف: في هذه الطريقة، يقوم المعالج المركزي (CPU) بإرسال أوامر I/O إلى وحدة التحكم بالجهاز (Device Controller) بشكل مباشر. بعد إرسال الأمر، ينتظر المعالج في حلقة تكرارية (Polling Loop) حتى تكتمل عملية I/O. يظل المعالج مشغولًا بفحص حالة الجهاز بشكل مستمر.
  • كيف يعمل:
    1. المعالج يكتب أمر I/O في سجلات حالة/أمر وحدة التحكم بالجهاز.
    2. المعالج يدخل في حلقة انتظار (Polling) لفحص بت الحالة في سجلات وحدة التحكم.
    3. عندما يشير بت الحالة إلى انتهاء العملية، يقرأ المعالج البيانات من سجلات بيانات وحدة التحكم (أو يكتب إليها).
  • المزايا: بسيطة في التنفيذ، ولا تتطلب عتادًا معقدًا.
  • العيوب:
    • غير فعالة (Inefficient): تُعد هذه الطريقة غير فعالة بشكل كبير لأنها تعطل المعالج المركزي بالكامل أثناء انتظار اكتمال عملية I/O. المعالج لا يستطيع تنفيذ أي مهام أخرى خلال هذه الفترة.
    • تُستخدم عادةً فقط في الأنظمة البسيطة جدًا أو للأجهزة البطيئة جدًا حيث يكون وقت الانتظار ضئيلًا.

📍 2. Interrupt-Driven I/O (الإدخال/الإخراج القائم على المقاطعة)

  • الوصف: لتحسين كفاءة Programmed I/O، تسمح طريقة Interrupt-Driven I/O للمعالج بمتابعة تنفيذ المهام الأخرى بعد إرسال أمر I/O. عندما تكتمل عملية I/O على الجهاز، تُرسل وحدة التحكم بالجهاز إشارة مقاطعة (Interrupt Signal) إلى المعالج.
  • كيف يعمل:
    1. المعالج يرسل أمر I/O إلى وحدة التحكم بالجهاز.
    2. المعالج يعود فورًا لتنفيذ مهام أخرى (لا ينتظر).
    3. عندما تكتمل عملية I/O، تُرسل وحدة التحكم مقاطعة إلى المعالج.
    4. يقوم المعالج بإيقاف عمله الحالي، ويعالج المقاطعة (عبر روتين خدمة المقاطعة - Interrupt Service Routine - ISR) لقراءة/كتابة البيانات النهائية، ثم يستأنف عمله السابق.
  • المزايا:
    • أكثر كفاءة: المعالج لا يضيع الوقت في الانتظار، مما يزيد من استغلال المعالج ويُحسن من أداء النظام العام.
    • مناسبة لمعظم أجهزة I/O التي لا تتطلب نقل كميات كبيرة جدًا من البيانات.
  • العيوب: لا تزال تتطلب تدخل المعالج لنقل البيانات الفعلية بين الجهاز والذاكرة، مما قد يصبح عنق زجاجة عند نقل كميات كبيرة من البيانات.

📍 3. Direct Memory Access (DMA) - الوصول المباشر للذاكرة

  • الوصف: هي الطريقة الأكثر كفاءة لعمليات I/O، خاصة عند نقل كميات كبيرة من البيانات (مثل القراءة من القرص الصلب أو الكتابة إليه). تُستخدم وحدة تحكم خاصة تُسمى وحدة الوصول المباشر للذاكرة (DMA Controller). هذه الوحدة تتولى مسؤولية نقل البيانات مباشرة بين جهاز I/O والذاكرة الرئيسية (RAM) دون أي تدخل من المعالج المركزي.
  • كيف يعمل:
    1. يُخبر المعالج وحدة DMA بالعملية المطلوبة (نوع العملية، عنوان الذاكرة، عدد البايتات، عنوان الجهاز).
    2. المعالج يعود فورًا لتنفيذ مهام أخرى.
    3. وحدة DMA تتولى نقل البيانات بين الجهاز والذاكرة بشكل مستقل.
    4. عند اكتمال النقل، تُرسل وحدة DMA مقاطعة واحدة فقط إلى المعالج لإعلامه بالانتهاء.
  • المزايا:
    • أفضل كفاءة (Highest Efficiency): يُحرر المعالج تمامًا من مهمة نقل البيانات، مما يسمح له بالتركيز على تنفيذ مهام أخرى، ويُحسن بشكل كبير من أداء النظام الكلي.
    • ضروري للأجهزة عالية السرعة مثل الأقراص الصلبة وبطاقات الشبكة.
  • العيوب: يتطلب عتادًا إضافيًا (وحدة DMA Controller) وأكثر تعقيدًا في البرمجة الأولية.

📚 قراءة إثرائية: DMA in Computer Architecture – GeeksforGeeks


3️⃣ قضايا تصميم نظام التشغيل في I/O

إدارة الإدخال/الإخراج ليست مجرد مسألة نقل بيانات؛ بل تتضمن تحديات تصميمية كبيرة لضمان أن النظام يعمل بكفاءة، أمان، واستقرار مع مجموعة واسعة من الأجهزة.

📌 أهم التحديات في تصميم نظام I/O:

  • كيفية إدارة تنوع الأجهزة (Device Diversity): توجد آلاف الأنواع المختلفة من أجهزة I/O (أقراص، طابعات، شبكات، كاميرات، إلخ)، وكل منها له خصائص وواجهات تحكم فريدة. يجب أن يتمكن نظام التشغيل من التفاعل مع كل هذه الأجهزة بطريقة موحدة.
  • توفير واجهة قياسية للمطورين (Standard Interface for Developers): يجب أن يوفر نظام التشغيل واجهة برمجية (API) موحدة للمطورين، بحيث لا يحتاجون إلى معرفة التفاصيل المعقدة لكل جهاز عند كتابة البرامج.
  • حماية الذاكرة من عمليات I/O العشوائية (Memory Protection): يجب منع أجهزة I/O من الوصول إلى مناطق الذاكرة المحمية أو ذاكرة العمليات الأخرى بشكل عشوائي، لضمان أمان النظام واستقراره.
  • جدولة الأجهزة بكفاءة (Efficient Device Scheduling): عند وجود طلبات متعددة لجهاز واحد (مثل القرص الصلب)، يجب على نظام التشغيل جدولة هذه الطلبات بطريقة تزيد من الأداء وتقلل من وقت الانتظار.
  • معالجة الأخطاء (Error Handling): يجب أن يكون نظام I/O قادرًا على اكتشاف الأخطاء في الأجهزة والتعامل معها بشكل مناسب (مثل إعادة المحاولة، إبلاغ المستخدم).

📌 مكونات فرعية مهمة في بنية نظام I/O:

  • Device Driver (برنامج التشغيل / السائق):

    هو برنامج وسيط (Software Module) يُكتب خصيصًا لكل نوع من أجهزة I/O. يعمل كواجهة بين نظام التشغيل والجهاز. يحتوي على التعليمات البرمجية اللازمة للتحكم في الجهاز المحدد، وترجمة الأوامر العامة من نظام التشغيل إلى أوامر خاصة بالجهاز، والعكس. بدون برنامج التشغيل الصحيح، لا يمكن لنظام التشغيل التفاعل مع الجهاز.

  • Device Controller (وحدة التحكم بالجهاز):

    هو مكون مادي (Hardware Component) يُمثل الواجهة الإلكترونية بين الجهاز الفعلي وناقل النظام (System Bus). يحتوي على سجلات (Registers) للأوامر، الحالة، والبيانات، بالإضافة إلى منطق التحكم في الجهاز. يتواصل مع المعالج عبر الـ bus، ومع الجهاز الفعلي عبر واجهة خاصة بالجهاز.

  • I/O Buffering (التخزين المؤقت للإدخال/الإخراج):

    هو استخدام مناطق ذاكرة مؤقتة (Buffers) لتخزين البيانات أثناء نقلها بين أجهزة I/O والذاكرة الرئيسية. يساعد هذا في التغلب على اختلافات السرعة بين الأجهزة والمعالج، ويُحسن من كفاءة عمليات I/O. سنتناول هذا بالتفصيل في القسم التالي.

  • I/O Spooling (التخزين المؤقت للطباعة/المهام):

    هو استخدام قرص لتخزين البيانات التي يتم إرسالها إلى أجهزة بطيئة (مثل الطابعات). بدلاً من أن ينتظر المعالج الطابعة، يتم إرسال مهمة الطباعة إلى القرص أولاً، ثم تُطبع من القرص عندما تكون الطابعة جاهزة. هذا يحرر المعالج بسرعة ويسمح له بتنفيذ مهام أخرى.


4️⃣ التخزين المؤقت (Buffering)

التخزين المؤقت (Buffering) هو تقنية أساسية في إدارة الإدخال/الإخراج تهدف إلى تحسين كفاءة نقل البيانات بين الأجهزة والمعالج أو الذاكرة. يتم ذلك عن طريق استخدام مناطق ذاكرة مؤقتة (تُسمى "Buffers") لتخزين البيانات بشكل عابر.

📍 تعريف التخزين المؤقت:

هو عملية تخزين مؤقت للبيانات في الذاكرة (RAM) أثناء نقلها بين جهاز I/O (مثل القرص أو الطابعة) والمعالج أو الذاكرة الرئيسية. الهدف الرئيسي هو تقليل الفجوة بين سرعات الأجهزة المختلفة؛ فالأجهزة الطرفية غالبًا ما تكون أبطأ بكثير من المعالج والذاكرة الرئيسية.

📍 فوائد التخزين المؤقت:

  • التغلب على اختلافات السرعة: يسمح للأجهزة البطيئة بإرسال/استقبال البيانات بمعدلها الخاص، بينما يمكن للأجهزة الأسرع (المعالج) معالجة البيانات من/إلى المخزن المؤقت بسرعة.
  • تقليل عدد عمليات I/O: بدلاً من إجراء عملية I/O صغيرة لكل بايت، يمكن تجميع البيانات في المخزن المؤقت ثم نقلها ككتلة واحدة كبيرة، مما يقلل من الحمل الزائد (Overhead) لعمليات I/O.
  • دعم الاتصالات غير المتزامنة: يسمح للمعالج ببدء عملية I/O والعودة لمهام أخرى، بينما يتم ملء المخزن المؤقت أو تفريغه في الخلفية.

📍 أنواع التخزين المؤقت الشائعة:

  • Single Buffering (التخزين المؤقت الفردي):
    • الوصف: يتم استخدام مخزن مؤقت واحد فقط لعملية I/O. على سبيل المثال، عند قراءة ملف، يتم تحميل كتلة من البيانات إلى هذا المخزن المؤقت. بينما يقوم المعالج بمعالجة البيانات من المخزن المؤقت، لا يمكن للجهاز ملء المخزن ببيانات جديدة حتى يفرغ المعالج جزءًا منه.
    • العيوب: قد يؤدي إلى فترات انتظار (Idle Time) للمعالج أو للجهاز إذا كانت سرعاتهما مختلفة بشكل كبير.
  • Double Buffering (التخزين المؤقت المزدوج):
    • الوصف: يتم استخدام مخزنين مؤقتين (Buffer 1 و Buffer 2) لعملية I/O. بينما يقوم المعالج بمعالجة البيانات من المخزن المؤقت الأول، يمكن لجهاز I/O ملء المخزن المؤقت الثاني ببيانات جديدة. عندما ينتهي المعالج من الأول، ينتقل إلى الثاني، وهكذا.
    • المزايا: يُحسن بشكل كبير من كفاءة نقل البيانات عن طريق السماح بعمليات I/O والمعالجة بالحدوث بالتوازي (Pipeline). يقلل من فترات الانتظار لكل من المعالج والجهاز.
    • مثال: في تشغيل الفيديو، بينما تُعرض إطارات الفيديو من مخزن مؤقت، يتم تحميل الإطارات التالية في مخزن مؤقت آخر.
  • Circular Buffering (التخزين المؤقت الدائري):
    • الوصف: هو امتداد لـ Double Buffering، حيث يتم استخدام قائمة دائرية من عدة مخازن مؤقتة (أكثر من اثنين). يتم استخدام مؤشرين: مؤشر للكتابة (حيث يضع الجهاز البيانات) ومؤشر للقراءة (حيث يستهلك المعالج البيانات). عندما يصل أي مؤشر إلى نهاية القائمة، يعود إلى البداية.
    • المزايا: يوفر مرونة أكبر ويُحسن الأداء بشكل أكبر في السيناريوهات التي تتطلب تدفقًا مستمرًا للبيانات، مثل بث الفيديو أو الصوت.
    • العيوب: أكثر تعقيدًا في الإدارة.

5️⃣ جدولة الأقراص (Disk Scheduling)

تُعد الأقراص الصلبة (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 (أقصر زمن للبحث أولاً):

  1. البداية: الرأس عند 53.
  2. الطلبات المتاحة: 98, 183, 37, 122, 14, 124
  3. أقرب طلب لـ 53 هو 37 (المسافة = $|53 - 37| = 16$).
    الرأس يتحرك إلى 37. الطلبات المتبقية: 98, 183, 122, 14, 124.
  4. أقرب طلب لـ 37 هو 14 (المسافة = $|37 - 14| = 23$).
    الرأس يتحرك إلى 14. الطلبات المتبقية: 98, 183, 122, 124.
  5. أقرب طلب لـ 14 هو 98 (المسافة = $|14 - 98| = 84$).
    الرأس يتحرك إلى 98. الطلبات المتبقية: 183, 122, 124.
  6. أقرب طلب لـ 98 هو 122 (المسافة = $|98 - 122| = 24$).
    الرأس يتحرك إلى 122. الطلبات المتبقية: 183, 124.
  7. أقرب طلب لـ 122 هو 124 (المسافة = $|122 - 124| = 2$).
    الرأس يتحرك إلى 124. الطلبات المتبقية: 183.
  8. أقرب طلب لـ 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)


6️⃣ RAID – مصفوفات الأقراص المستقلة

RAID (Redundant Array of Independent Disks) هي تقنية لدمج عدة أقراص صلبة مادية (أو SSDs) في وحدة تخزين منطقية واحدة. الهدف الرئيسي من RAID هو تحقيق واحد أو أكثر من الأهداف التالية:

  • تحسين الأداء (Performance): عن طريق توزيع البيانات عبر أقراص متعددة، يمكن الوصول إليها بالتوازي، مما يزيد من سرعة القراءة والكتابة.
  • زيادة الاعتمادية (Reliability) / التسامح مع الأخطاء (Fault Tolerance): عن طريق تخزين بيانات زائدة أو نسخ متطابقة من البيانات، يمكن للنظام أن يستمر في العمل حتى لو فشل أحد الأقراص.
  • زيادة سعة التخزين (Storage Capacity): دمج سعة الأقراص الفردية في وحدة واحدة أكبر.

توجد مستويات مختلفة من 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


7️⃣ ذاكرة التخزين المؤقت للقرص (Disk Cache)

ذاكرة التخزين المؤقت للقرص (Disk Cache) هي تقنية حيوية لتحسين أداء أنظمة التخزين. إنها جزء من الذاكرة (عادةً RAM) تُستخدم للاحتفاظ بالبيانات التي تم الوصول إليها مؤخرًا من القرص الصلب، أو البيانات التي يُتوقع الوصول إليها قريبًا.

🔍 كيف تعمل ذاكرة التخزين المؤقت للقرص؟

  • مبدأ العمل: تعتمد على مبدأ "المحلية المرجعية" (Locality of Reference)، والذي ينص على أن البرامج تميل إلى الوصول إلى نفس البيانات أو البيانات القريبة منها بشكل متكرر في فترة زمنية قصيرة.
  • عملية القراءة:
    1. عندما يطلب برنامج بيانات من القرص، يتحقق نظام التشغيل أولاً مما إذا كانت هذه البيانات موجودة بالفعل في ذاكرة التخزين المؤقت للقرص.
    2. إذا وُجدت البيانات (Cache Hit)، يتم تسليمها فورًا من الذاكرة المؤقتة السريعة، مما يوفر وقتًا طويلاً كان سيُستغرق في القراءة من القرص البطيء.
    3. إذا لم تُوجد البيانات (Cache Miss)، يتم قراءتها من القرص، ثم يتم تخزين نسخة منها في ذاكرة التخزين المؤقت للاستخدام المستقبلي.
  • عملية الكتابة: يمكن أن تكون الكتابة "عبر الكتابة" (Write-Through)، حيث تُكتب البيانات إلى القرص والمخبأ في نفس الوقت، أو "الكتابة الخلفية" (Write-Back)، حيث تُكتب البيانات إلى المخبأ أولاً ثم تُكتب إلى القرص لاحقًا، مما يُحسن أداء الكتابة ولكنه يزيد من مخاطر فقدان البيانات في حالة انقطاع الطاقة قبل الكتابة إلى القرص.

فوائد ذاكرة التخزين المؤقت للقرص:

  • تحسين سرعة الوصول: تُقلل بشكل كبير من زمن الوصول إلى البيانات، خاصة للبيانات التي يتم الوصول إليها بشكل متكرر.
  • تقليل عدد عمليات I/O الفعلية: تُقلل من عدد المرات التي يحتاج فيها النظام للوصول فعليًا إلى القرص الصلب الميكانيكي البطيء.
  • زيادة الأداء العام للنظام: تُحسن من استجابة التطبيقات وتقلل من أوقات التحميل.

🔍 مثال: عند فتح ملف معين (مثل مستند Word كبير) لأول مرة، قد يستغرق الأمر بعض الوقت ليتم تحميله من القرص. ولكن إذا قمت بإغلاقه ثم إعادة فتحه بعد فترة قصيرة، فمن المحتمل أن يتم تحميله بشكل أسرع بكثير لأن أجزاء منه لا تزال موجودة في ذاكرة التخزين المؤقت للقرص.


8️⃣ أمثلة من أنظمة التشغيل

تُطبق أنظمة التشغيل الرائدة آليات متطورة لإدارة الإدخال/الإخراج، مع اختلافات في التفاصيل ولكنها جميعًا تهدف إلى الكفاءة والأمان.

النظام آلية إدارة 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. فهم هذه المفاهيم ضروري لتصميم أنظمة حاسوبية فعالة وموثوقة.