بنناجح
المرحلة 1: مقدمة: نظام التشغيل بيعمل إيه؟ · الدرس 3 من 6 · 20 دقيقة

كل برنامج فاكر الذاكرة بتاعته

برنامجين بيكتبوا في نفس العنوان في الذاكرة، وكل واحد بيقرا قيمته هو مش قيمة التاني. الدرس ده بيوريك ليه: كل Process ليها Address Space خاص بيها، ونظام التشغيل مع الـ Hardware بيترجموا كل عنوان لمكان حقيقي مختلف. وده اللي بيخلّي برنامج واقع مايوقّعش الجهاز كله.

في الدرس ده هتتعلم
  • تعرّف الـ Address Space و Virtual Address
  • تفهم إزاي نفس العنوان في برنامجين بيوصل لمكانين مختلفين
  • تفهم ليه ده بيدّي Isolation وأمان
  • تقرا الذاكرة الحقيقية للـ Process في ps و top

1. الذاكرة من غير نظام تشغيل

الذاكرة الحقيقية (Physical Memory) مجرد Array ضخم من الـ Bytes، كل Byte ليه عنوان من 0 لحد آخر الـ RAM. ولو كل البرامج بتكتب فيها مباشرة:

  • برنامج فيه Bug كتب في عنوان غلط ← بوّظ داتا برنامج تاني، أو نظام التشغيل نفسه.
  • برنامج خبيث يقرا باسوردات من ذاكرة المتصفح.
  • كل برنامج لازم يعرف الأماكن الفاضية فين، ويتفق مع الباقيين مين ياخد إيه.

2. كل Process ليها عالم لوحدها

الفكرة الأساسية: العنوان اللي البرنامج شايفه مش هو العنوان الحقيقي في الـ RAM. كل مرة البرنامج يقرا أو يكتب، الـ Hardware (وحدة اسمها MMU) بيترجم العنوان الافتراضي لعنوان حقيقي، باستخدام جدول نظام التشغيل عامله لكل Process (Page Table).

نفس العنوان، مكانين مختلفينجرّب بنفسك
في الداتابيزRAM[0x3A000]—RAM[0x91000]—
Process A⏱Process B
  1. *(0x5000) = 42اكتب في 0x50001
  2. MMU: A's page table → 0x5000 = RAM 0x3A000ترجمة
  3. 3*(0x5000) = 99اكتب في 0x5000
  4. MMU: B's page table → 0x5000 = RAM 0x91000ترجمة
  5. read *(0x5000)425
  6. 6read *(0x9F000) -- عنوان مش بتاعهاSegmentation fault
▶

دوس ▶ شغّل، أو امشي خطوة خطوة بالأسهم.

ده بيدّي 3 حاجات في نفس الوقت:

الميزة معناها
Isolation Process مش بتقدر تقرا ولا تكتب ذاكرة غيرها، ولا ذاكرة الـ Kernel
سهولة كل برنامج بيتكتب كأن الذاكرة كلها بتاعته، من غير ما يعرف مين تاني شغال
مرونة نظام التشغيل يقدر يحط صفحات البرنامج في أي مكان فاضي في الـ RAM، أو حتى على الديسك لو الـ RAM خلصت (Swap)

الذاكرة متقسمة بالمساحة، وكل Process عندها خريطة خاصة بيها بتترجم عناوينها لأماكن حقيقية. وده أساس الأمان في الجهاز كله.

3. تشوف ذاكرة الـ Process إزاي؟

Terminal
$ ps -o pid,vsz,rss,comm -C php-fpm
  PID    VSZ   RSS COMMAND
 1021 412844 28160 php-fpm
 1188 415320 61432 php-fpm
 1189 415108 59904 php-fpm
العمود معناه
VSZ (Virtual Size) حجم الـ Address Space كله اللي الـ Process حجزته: كود، ومكتبات، ومساحات محجوزة لسه ما اتستخدمتش. غالباً رقم كبير ومش مقلق
RSS (Resident Set Size) اللي موجود فعلاً في الـ RAM دلوقتي. ده الرقم اللي يهمك

ولاحظ إن الـ RSS بيعدّ المكتبات المشتركة اللي كل الـ Workers بيستخدموها، فجمع RSS بتاع 30 Worker بيطلع أكبر من الذاكرة اللي بياخدوها فعلاً. وللتفاصيل: cat /proc/<pid>/status (سطور VmRSS و VmSwap)، أو pmap -x <pid> عشان تشوف خريطة الـ Address Space نفسها.

4. أسئلة

فكّر في إجابتك الأول، وبعدين افتح السؤال.

01يعني إيه Virtual Address؟

العنوان اللي البرنامج شايفه ومستخدمه. مش هو المكان الحقيقي في الـ RAM: الـ MMU بيترجمه لعنوان فيزيائي باستخدام جدول (Page Table) نظام التشغيل عامله لكل Process.

02ليه برنامجين ممكن يكتبوا في نفس العنوان من غير ما يبوّظوا بعض؟

لأن كل Process ليها Address Space وجدول ترجمة خاص بيها، فنفس العنوان الافتراضي في كل واحدة متربوط بمكان حقيقي مختلف في الـ RAM.

03إيه هو Segmentation Fault؟

البرنامج حاول يوصل لعنوان مش متربوط بحاجة في الـ Address Space بتاعه، أو بطريقة مش مسموحة (زي إنه يكتب في الكود). الـ Hardware بيرفض، ونظام التشغيل بيوقف البرنامج ده بس.

04الفرق بين VSZ و RSS؟

VSZ هو حجم الـ Address Space كله اللي اتحجز، حتى اللي لسه ما اتستخدمش. RSS هو اللي موجود فعلاً في الـ RAM دلوقتي. لما تقيس استهلاك الذاكرة بص على RSS، مع ملاحظة إنه بيعدّ المكتبات المشتركة.

علّم عليه لما تقدر تجاوب أسئلة الإنترفيو من غير ما تبص.