بسم الله الرحمن الرحيم.
بعد أن أنهينا إدارة الذاكرة في الدرس السابق، نختم بهذا الدرس السلسلة: واجهة نظام الملفات (File-System Interface).
تنفيذ أنظمة الملفات جانب رئيسي من معمارية أنظمة التشغيل؛ فعلى المصممين أن يقرروا كيف يرسمون معلومات نظام الملفات على أجهزة التخزين الفيزيائية، وأي طرائق يوفرون للوصول إليها والتلاعب بها. وأنظمة الملفات كثيراً ما تكون عنق زجاجة في الأداء، فتحدي كفاءتها ليس هيناً.
ويتكون نظام الملفات من جزأين: مجموعة من الملفات، وبنية أدلة (Directory Structure) هدفها توفير المعلومات عن الملفات وتنظيمها.
مفهوم الملف (File Concept)
الملف هو وحدة تخزين منطقية — أصغر حصة من التخزين الثانوي المنطقي — مجموعة مسماة من المعلومات المرتبطة المسجلة على التخزين الثانوي.
خصائص الملف (File Attributes)
شكل (1): نافذة معلومات ملف
من الخصائص النموذجية للملف:
- Name: اسم مقروء للإنسان.
- Identifier: رقم معرف فريد.
- Type: معلومات يحتاجها النظام لدعم نوع الملف.
- Location: مؤشر إلى موقع الملف على الجهاز.
- Size: الحجم (بالبايتات أو الكلمات أو البلوكات).
- Protection: من يملك صلاحية القراءة أو الكتابة أو التنفيذ وهكذا.
- Timestamps & User ID: أوقات الإنشاء وآخر تعديل وآخر استخدام وصاحبها.
وهناك خصائص أخرى ممكنة مثل ترميز المحارف لملف نصي أو بصمة تحقق Checksum. ويخزن نظام التشغيل هذه الخصائص في بنية الأدلة لنظام الملفات.
عمليات الملف (File Operations)
الملفات بنيات بيانات مجردة، ولها عمليات مرتبطة تُنفذ عبر نداءات النظام:
- Create: إنشاء ملف (حجز مساحة وإضافة مدخل في الدليل).
- Open: فتح ملف (تخزين معلوماته مؤقتاً في الذاكرة الرئيسية وإرجاع مؤشر إليها).
- Write / Read: كتابة وقراءة (مع تحديث مؤشر الموقع الحالي داخل الملف).
- Reposition: تغيير قيمة مؤشر الموقع داخل الملف.
- Delete: حذف ملف (إزالة مدخله من الدليل وتحرير مساحته).
- Truncate: تجزئة ملف (تحرير المساحة وتصفير حجمه).
هذه مجموعة حدانية دنيا؛ ويمكن للمصممين تنفيذ عمليات أخرى بتركيبها — فنسخ ملف مثلاً = إنشاء ملف جديد ثم القراءة من القديم والكتابة في الجديد.
وكثير من الأنظمة تشترط فتح الملف قبل استخدامه: تضع عملية Open معلومات الدليل عن الملف في بنية اسمها جدول الملفات المفتوحة (Open File Table) في الذاكرة الرئيسية، وبذلك تستطيع العمليات إجراء وصولات كثيرة للملف دون جلب معلومات الدليل من القرص كل مرة. وفي الأنظمة التي تتيح لعدة عمليات فتح الملف نفسه معاً، يتعارف مستويان من الجداول: جدول واحد على مستوى النظام كله، وجداول لكل عملية — يحمل كل منها ما يخص استخدام تلك العملية مثل مواضع القراءة والكتابة الحالية، ومدخل الملف فيه يشير إلى مدخله في الجدول العام الذي يحتفظ بالمعلومات المستقلة عن العمليات: موقع الملف على القرص، تواريخ الوصول، حجم الملف، وعدد مرات فتحه.
ومعلومات الملف المفتوح إذن:
- File Pointer: آخر موقع قراءة/كتابة للعملية.
- File-Open Count: عدد العمليات التي فتحت الملف.
- Location: موقع الملف لمعرفة من أين تقرأ وتكتب.
- Access Rights: نمط الاستخدام الممنوح للعملية.
وتتوفر أيضاً عمليات قفل الملفات (File Locking): أقفال مشتركة و/أو حصرية، إلزامية و/أو استشارية.
أنواع الملفات وبنيتها الداخلية
توجد أنواع متعددة من الملفات: نصية وثنائية وقابلة للتنفيذ، وكثيراً ما تستخدم الامتدادات للدلالة على النوع. ومع ذلك فإن معظم الأنواع لا يدعمها نظام التشغيل دعماً كاملاً — فمن الشائع أن يعامل النظام الملفات مجرد تسلسل غير مهيكل من البايتات:
شكل (2): امتدادات شائعة وأنظمتها
لكن كل نظام يجب أن يدعم نوعاً واحداً قابلاً للتنفيذ على الأقل حتى يستطيع تحميل البرامج وتشغيلها.
أما داخلياً: جميع دوال الإدخال/الإخراج الأساسية تعمل بلوكاً بلوكاً — بلوكات فيزيائية هي عادة أجزاء البيانات ذات 512 بايتاً من قطاعات القرص. والملفات تسلسلات من السجلات المنطقية التي يجب ربطها ببلوكات الملف — وقد يجري التطبيق هذا الربط أو النظام. وبما أن كل ملفات تخصص بعدد صحيح من البلوكات الفيزيائية، فإن كل أنظمة الملفات تعاني من تشظٍ داخلي (Internal Fragmentation).
طرق الوصول (Access Methods)
يمكن الوصول إلى معلومات الملفات بطرائق مختلفة:
الوصول التسلسلي (Sequential Access)
أبسط الطرائق وأكثرها شيوعاً: يُقرأ الملف تسلسلاً من البداية إلى النهاية كما يقرأ شريط الكاسيت، والكتابة بالمثل — كل عملية كتابة تضيف عنصراً جديداً في النهاية. العمليات النموذجية «اقرأ التالي» و«اكتب التالي»، ويحافظ النظام على مؤشر للموقع الحالي، وقد يدعم عملية إعادة تموضعه (Seek):
شكل (3): قراءة الملف كسلسلة
الوصول المباشر (Direct Access)
يسمح بالوصول إلى البلوكات بأي ترتيب — معاملة الملف كمصفوفة من البلوكات. العمليات النموذجية «اقرأ البلوك رقم n» و«اكتب البلوك رقم m»، وأرقام البلوكات عناوين منطقية تبدأ من الصفر وتتصاعد:
شكل (4): محاكاة الوصول التسلسلي على ملف مباشر
ولنفترض أن أول بايت في الملف مرقم 0، والملف سلسلة سجلات حجم كل منها L بايتاً مرقمة من الصفر، ونريد السجل رقم N: نحسب رقم البايت الابتدائي N×L ثم نجلب L بايتات بدءاً من هناك.
طرائق أخرى
يمكن البناء فوق الوصول المباشر بطرائق غالباً ما تستخدم فهرساً (Index) للبحث عن أرقام بلوكات الملف ثم الوصول إليها مباشرة:
شكل (5): ملف الفهرس والملفات النسبية
بنية الأدلة (Directory Structure)
الدليل في جوهره جدول للبحث عن معلومات الملفات مستخدماً اسم الملف مفتاح بحث. ويجب أن تدعم بنية الأدلة العمليات التالية: البحث عن ملف باسمه، إنشاء ملف (إضافة إلى الدليل)، حذف ملف، عرض محتويات دليل، إعادة تسمية ملف، واجتياز نظام الملفات (الوصول لكل الأدلة والملفات — عند عمل نسخة احتياطية مثلاً).
الدليل أحادي المستوى (Single-Level)
في هذا المخطط يعمل الدليل كقائمة واحدة من المداخل؛ وحتى مع تعدد المستخدمين لا يُسمح لملفين بحمل الاسم نفسه:
شكل (6): قائمة واحدة للجميع
الدليل ثنائي المستوى (Two-Level)
دليل رئيسي للملفات (Master File Directory) له عدة أدلة فرعية؛ يمكن إسناد لكل مستخدم دليله الرئيسي Home الخاص، فيسمي ملفاته ما شاء دون خوف من التصادم مع أسماء مستخدمين آخرين. وإذا ذُكر اسم مستخدم واسم ملف ضمن دليله فإن هذا «المسار» يحدد الملف بشكل فريد. ويفترض النظام أن اسم ملف بلا اسم مستخدم يشير إلى دليل المستخدم نفسه أو إلى دليل خاص بملفات النظام. وتسمى سلسلة الأدلة التي تبحث فيها عند تسمية ملف بمسار البحث (Search Path):
شكل (7): دليل رئيسي وأدلة للمستخدمين
الأدلة الشجرية (Tree-Structured)
تعميم للبنية ثنائية المستوى يتيح للمستخدمين إنشاء شجرة خاصة بهم من الأدلة الفرعية لتجميع ملفاتهم وتنظيمها. للشجرة جذر، ولكل ملف أو دليل مسار فريد يبدأ من الجذر. وتستطيع العمليات «التنقل» في الشجرة باستخدام نداء نظام يحدد دليل العمل الحالي (Current Working Directory)، وملف حساب المستخدم — مثل passwd — يحدد أي دليل يكون دليل العمل الابتدائي عند دخوله. والمسارات إما مطلقة Absolute أو نسبية Relative:
شكل (8): شجرة الأدلة والملفات
أدلة الرسم غير الدوري (Acyclic-Graph Directories)
هذه البنية تتيح للأدلة مشاركة ملف أو دليل فرعي — وهذا ممكن بحسب التعريف في الشجرة. وتنفذ المشاركة باستخدام الروابط:
الرابط الرمزي (Symbolic Link) أو Soft Link: يمكن اعتباره ملفاً يحتوي على اسم مسار. مدخل الدليل الخاص به يحمل قيمة بت خاصة تميزه كرابط لا كملف عادي. مثلاً إذا كان /x/y ملفاً نريد مشاركته، يمكننا وضع رابط رمزي في /z يحوي المسار /x/y وتسمية الرابط r؛ وعندها كل إشارة إلى /z/r ستصل إلى الملف نفسه الذي يصل إليه /x/y.
الرابط الصلب (Hard Link): مدخل الدليل الأصلي لـ /x/y يشار إليه أحياناً بهذا الاسم — وهو مجرد مدخل دليل عادي يتكون من اسم الملف وعنوانه على القرص. وطريقة أخرى لمشاركة الملف نفسه: وضع hard link آخر — مدخل في /z يحوي الاسم الآخر r والعنوان نفسه على القرص لمعلومات الملف الأصلي. فيكون لدينا مدخلَا دليل منفصلان يشيران إلى الملف ذاته على القرص.
وعند تعدد الروابط الصلبة و/أو الرمزية، يجب على مصممي النظام توخي الحذر في عمليات حذف الملفات والأدلة: فقد تبقى مؤشرات معلقة Dangling، و/أو قد تحرر مساحة ملف ما وهو ما زال قيد الاستخدام:
شكل (9): مشاركة الملفات بين الأدلة
دليل الرسم العام (General Graph Directory)
في هذه البنية يُسمح بوجود دورات (Cycles) في الأدلة. وعندما تصبح الدورات ممكنة يصبح تصميم خوارزميات البحث والاجتياز الصحيحة أصعب، ويصبح اكتشاف الأدلة التي لم تعد متصلة بالجزء الرئيسي من نظام الملفات وتحريرها أصعب أيضاً:
شكل (10): دورة في بنية الأدلة
الحماية (Protection)
عندما تُخزن معلومات ثمينة على نظام حاسوب نريدها آمنة من التلف المادي ومن الوصول غير المشروع.
أنواع الوصول
يجب أن نوفر الوصول إلى الملفات لكن وصولاً متحكماً به. أمثلة على العمليات الواجب ضبطها: القراءة Read، الكتابة Write، التنفيذ Execute، الإلحاق Append، الحذف Delete، العرض List، وتغيير الخصائص Attribute Change.
التحكم بالوصول (Access Control)
نهج واحد: الاحتفاظ بقائمة تحكم بالوصول (ACL) مع كل ملف أو دليل — بنية جدولية مفهرسة بمعرف المستخدم، تعطيك صلاحيات أي مستخدم على ذلك الكائن. لكن تنفيذ قوائم ACL الكاملة صعب.
ولهذا تصمم كثير من الأنظمة بصورة مكثفة منها تخزن الصلاحيات لثلاث جهات فقط:
- Owner: مالك الملف — المستخدم الذي أنشأه.
- Group: مجموعة عمل معينة.
- Other: كل من يستعمل النظام سواهما.
وتترافق عادة بتات القراءة والكتابة والتنفيذ مع كل صنف من الثلاثة. فبالنسبة لملف عادي: بت القراءة يعني سماح عضو الصنف بقراءته، وبت الكتابة بالكتابة فيه، وبت التنفيذ بتنفيذه (إن كان برنامجاً أو سكربتاً). أما بالنسبة للأدلة: بت القراءة يمنح حق عرض محتويات الدليل، وبت الكتابة يسمح بإنشاء ملفات جديدة داخله وحذفه إن كان فارغاً، وبت التنفيذ يمنح حق الانتقال إليه cd والوصول إلى كائناته وفقاً لصلاحيات تلك الكائنات ذاتها. ومن يفتقد إما صلاحية الكتابة أو التنفيذ على دليل لا يستطيع حذف كائن منه:
شكل (11): إدارة ACL في ويندوز
وبعض الأنظمة مثل Solaris تستخدم نهج (Owner, Group, Others) افتراضياً مع السماح بإضافة تحكم أدق لكائنات بعينها — والمقصود بكائن الملف هنا الملفات والأدلة وغيرها من العناصر الخاصة.
أساليب حماية أخرى
نهج آخر إسناد كلمة سر لملف أو دليل — لكن إدارة كلمات سر متعددة على كائنات متعددة قد يعقدها الأمر.
الملفات المعينة في الذاكرة (Memory-Mapped Files)
إدخال/إخراج الملفات يتطلب أحياناً عدداً من نداءات النظام المستهلكة للوقت ووصولات متكررة للقرص. ويمكن للمصممين زيادة الكفاءة بتقنيات الذاكرة الافتراضية:
يعالج النظام الوصولات الأولى إلى بلوكات الملف تماماً كمعالجة خطأ صفحة (Page Fault)، وبعد أن يحمّل النظام بلوكات الملف إلى إطارات الذاكرة الفيزيائية تستطيع العملية الوصول إليها بعمليات الوصول العادية للذاكرة. وينسخ النظام بلوكات الملف المعدلة إلى القرص بعد أن تغلق العملية الملف، أو ربما كجزء من روتين مقاطعة دوري.
وعند توفر تعيين الملفات في الذاكرة يمكن استخدامه لتنفيذ مشاركة ملف من قبل مجموعة عمليات، والذاكرة المشتركة، ووظيفة النسخ عند الكتابة Copy-on-Write:
شكل (12): تعيين الملف في فضاء عمليتين معاً
بهذا نصل إلى ختام سلسلة مفاهيم أنظمة التشغيل: بدأنا ببنية الحاسب والنواة وفضاء المستخدم، ومررنا بالمقاطعة والعمليات والخيوط والجدولة وإدارة الذاكرة، وانتهينا بواجهة نظام الملفات التي يلمسها كل مستخدم يومياً. نسأل الله أن يكون هذا العمل نافعاً.
لا تنسونا من صالح دعائكم.