كل برنامج فاكر الذاكرة بتاعته
برنامجين بيكتبوا في نفس العنوان في الذاكرة، وكل واحد بيقرا قيمته هو مش قيمة التاني. الدرس ده بيوريك ليه: كل 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).
*(0x5000) = 42اكتب في 0x50001MMU: A's page table → 0x5000 = RAM 0x3A000ترجمة- 3
*(0x5000) = 99اكتب في 0x5000 MMU: B's page table → 0x5000 = RAM 0x91000ترجمةread *(0x5000)425- 6
read *(0x9F000) -- عنوان مش بتاعهاSegmentation fault
دوس ▶ شغّل، أو امشي خطوة خطوة بالأسهم.
ده بيدّي 3 حاجات في نفس الوقت:
| الميزة | معناها |
|---|---|
| Isolation | Process مش بتقدر تقرا ولا تكتب ذاكرة غيرها، ولا ذاكرة الـ Kernel |
| سهولة | كل برنامج بيتكتب كأن الذاكرة كلها بتاعته، من غير ما يعرف مين تاني شغال |
| مرونة | نظام التشغيل يقدر يحط صفحات البرنامج في أي مكان فاضي في الـ RAM، أو حتى على الديسك لو الـ RAM خلصت (Swap) |
الذاكرة متقسمة بالمساحة، وكل Process عندها خريطة خاصة بيها بتترجم عناوينها لأماكن حقيقية. وده أساس الأمان في الجهاز كله.
3. تشوف ذاكرة الـ Process إزاي؟
$ 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، مع ملاحظة إنه بيعدّ المكتبات المشتركة.