كيفية استخدام أمر pmap على نظام Linux

نشرت: 2022-06-25
كمبيوتر محمول Linux يعرض موجه bash
fatmawati achmad zaenuri / Shutterstock.com

إن اكتشاف مقدار ذاكرة الوصول العشوائي (RAM) التي تستخدمها عملية Linux ليس بالأمر السهل - خاصةً عند الحاجة إلى مراعاة الذاكرة المشتركة. لحسن الحظ ، يساعدك الأمر pmap على فهم كل شيء.

تخطيط الذاكرة

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

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

فوائد التجريد

هناك فوائد لهذا المخطط. يتم تغليف استخدام الذاكرة إلى حد ما ووضع الحماية لكل عملية في أرض المستخدم. عملية "ترى" فقط الذاكرة من حيث عناوين الذاكرة الظاهرية. هذا يعني أنه لا يمكنه العمل إلا مع الذاكرة التي أعطاها نظام التشغيل. ما لم يكن لديه وصول إلى بعض الذاكرة المشتركة ، فإنه لا يعرف ولا يمكنه الوصول إلى الذاكرة المخصصة للعمليات الأخرى.

ما هو Swappiness على لينكس؟ (وكيفية تغييره)
ذات صلة ما هو Swappiness على لينكس؟ (وكيفية تغييره)

يتيح تجريد الذاكرة الفعلية القائمة على الأجهزة في عناوين الذاكرة الظاهرية للنواة تغيير العنوان الفعلي الذي تم تعيين بعض الذاكرة الظاهرية إليه. يمكنه تبديل الذاكرة بالقرص عن طريق تغيير العنوان الفعلي الذي تشير إليه منطقة الذاكرة الظاهرية. ويمكنه أيضًا تأجيل توفير الذاكرة الفعلية حتى يتم طلبها بالفعل.

طالما يتم تقديم طلبات قراءة أو كتابة الذاكرة كما هو مطلوب ، فإن النواة حرة في التوفيق بين جدول الخرائط كما تراه مناسبًا.

ذاكرة الوصول العشوائي عند الطلب

يفتح جدول الخرائط ومفهوم "ذاكرة الوصول العشوائي عند الطلب" إمكانية الذاكرة المشتركة . ستحاول النواة تجنب تحميل نفس الشيء في الذاكرة أكثر من مرة. على سبيل المثال ، سيتم تحميل مكتبة مشتركة في الذاكرة مرة واحدة وتعيينها إلى العمليات المختلفة التي تحتاج إلى استخدامها. سيكون لكل عملية عنوان فريد خاص بها للمكتبة المشتركة ، لكنها ستشير جميعها إلى نفس الموقع الفعلي.

إذا كانت منطقة الذاكرة المشتركة قابلة للكتابة ، فإن النواة تستخدم مخططًا يسمى النسخ عند الكتابة. إذا كتبت إحدى العمليات إلى الذاكرة المشتركة ولم يكن من المفترض أن ترى العمليات الأخرى التي تشارك تلك الذاكرة التغييرات ، يتم إنشاء نسخة من الذاكرة المشتركة عند طلب الكتابة.

المبتدئين المبتدئين: كيفية إنشاء واستخدام الأجهزة الافتراضية
مبتدئ ذو صلة بالموضوع: كيفية إنشاء واستخدام الأجهزة الافتراضية

Linux kernel 2.6.32 ، الذي تم إصداره في ديسمبر 2009 ، أعطى Linux ميزة تسمى "Kernel SamePage Merging". هذا يعني أن Linux يمكنه اكتشاف مناطق متطابقة من البيانات في مساحات عناوين مختلفة. تخيل سلسلة من الأجهزة الافتراضية تعمل على جهاز كمبيوتر واحد ، وجميع الأجهزة الافتراضية تعمل بنظام التشغيل نفسه. باستخدام نموذج الذاكرة المشتركة والنسخ عند الكتابة ، يمكن تقليل الحمل على الكمبيوتر المضيف بشكل كبير.

كل هذا يجعل التعامل مع الذاكرة في Linux معقدًا ومثاليًا قدر الإمكان. لكن هذا التطور يجعل من الصعب النظر إلى عملية ما ومعرفة ما هو استخدام الذاكرة بالفعل.

الأداة المساعدة pmap

تكشف النواة الكثير مما تفعله مع ذاكرة الوصول العشوائي (RAM) من خلال ملفين زائفين في نظام ملفات معلومات النظام "/ proc". يوجد ملفان لكل عملية ، مسميان بمعرف العملية أو PID لكل عملية: "/ proc / maps" و "/ proc // smaps."

تقوم أداة pmap بقراءة المعلومات من هذه الملفات وتعرض النتائج في نافذة المحطة الطرفية. سيكون من الواضح أننا بحاجة إلى توفير PID للعملية التي نهتم بها عندما نستخدم pmap .

العثور على معرف العملية

هناك عدة طرق للعثور على PID لعملية. هذا هو الكود المصدري لبرنامج تافه سنستخدمه في أمثلةنا. هو مكتوب في C. كل ما يفعله هو طباعة رسالة إلى نافذة المحطة والانتظار حتى يضغط المستخدم على مفتاح "Enter".

 # تضمين <stdio.h>

int main (int argc، char * argv [])
{
  printf ("برنامج اختبار How-To Geek.") ؛
  getc (stdin) ؛
} // نهاية main

تم تجميع البرنامج في ملف تنفيذي يسمى pm باستخدام مترجم gcc :

 دول مجلس التعاون الخليجي-مساءا مساءا 

تجميع مثال البرنامج

نظرًا لأن البرنامج سينتظر حتى يقوم المستخدم بالضغط على "Enter" ، فسيظل قيد التشغيل للمدة التي نشاء.

 ./مساءً 

تشغيل برنامج المثال

يبدأ البرنامج ويطبع الرسالة وينتظر ضغطة المفتاح. يمكننا الآن البحث عن PID الخاص به. يسرد الأمر ps العمليات الجارية. يجعل الخيار -e (عرض جميع العمليات) ps قائمة بكل عملية. سنقوم بتوجيه الإخراج عبر grep وتصفية الإدخالات التي تحتوي على "pm" في أسمائها.

 ps -e | grep pm 

العثور على معرّف العملية باستخدام grep

هذا يسرد جميع الإدخالات مع "مساء" في أي مكان في أسمائهم.

يمكننا أن نكون أكثر تحديدًا باستخدام الأمر pidof . نعطي pidof اسم العملية التي نهتم بها في سطر الأوامر ، ويحاول العثور على تطابق. إذا تم العثور على تطابق ، يطبع pidof معرف المنتج لعملية المطابقة.

 pidof مساء 

استخدام pidof للعثور على معرف العملية

تكون طريقة pidof أكثر إتقانًا عندما تعرف اسم العملية ، لكن طريقة ps ستعمل حتى لو كانت تعرف جزءًا فقط من اسم العملية.

باستخدام pmap

مع تشغيل برنامج الاختبار الخاص بنا ، وبمجرد تحديد PID الخاص به ، يمكننا استخدام pmap مثل هذا:

 pmap 40919 

تشغيل pmap على برنامج المثال

يتم سرد تعيينات الذاكرة للعملية بالنسبة لنا.

إخراج pmap القياسي

هذا هو الإخراج الكامل للأمر:

 40919:. / مساء
000056059f06c000 4K r ---- pm
000056059f06d000 4K rx-- pm
000056059f06e000 4K r ---- pm
000056059f06f000 4K r ---- pm
000056059f070000 4K rw - مساءً
000056059fc39000 132K rw --- [مجهول]
00007f97a3edb000 8K rw --- [مجهول]
00007f97a3edd000 160K r ---- libc.so.6
00007f97a3f05000 1616K rx-- libc.so.6
00007f97a4099000 352K r ---- libc.so.6
00007f97a40f1000 4K ----- libc.so.6
00007f97a40f2000 16K r ---- libc.so.6
00007f97a40f6000 8K rw --- libc.so.6
00007f97a40f8000 60K rw --- [مجهول]
00007f97a4116000 4K r ---- ld-linux-x86-64.so.2
00007f97a4117000 160K rx-- ld-linux-x86-64.so.2
00007f97a413f000 40K r ---- ld-linux-x86-64.so.2
00007f97a4149000 8K r ---- ld-linux-x86-64.so.2
00007f97a414b000 8K rw - ld-linux-x86-64.so.2
00007ffca0e7e000 132K rw --- [مكدس]
00007ffca0fe1000 16K r ---- [مجهول]
00007ffca0fe5000 8K rx-- [مجهول]
ffffffffff600000 4K --x-- [مجهول]
إجمالي 2756 ألف

السطر الأول هو اسم العملية و PID الخاص بها. يعرض كل سطر من الأسطر الأخرى عنوان ذاكرة معيّن ، ومقدار الذاكرة في هذا العنوان ، معبرًا عنه بالكيلو بايت. تسمى الأحرف الخمسة التالية من كل سطر أذونات الذاكرة الظاهرية . الأذونات الصالحة هي:

  • r : يمكن قراءة الذاكرة المعينة من خلال العملية.
  • w : يمكن كتابة الذاكرة المعينة من خلال العملية.
  • x : يمكن للعملية تنفيذ أي تعليمات موجودة في الذاكرة المعينة.
  • s : يتم مشاركة الذاكرة المعينة ، وتكون التغييرات التي تم إجراؤها على الذاكرة المشتركة مرئية لجميع العمليات التي تشارك الذاكرة.
  • R : لا يوجد حجز لمساحة المبادلة لهذه الذاكرة المعينة.

المعلومات النهائية في كل سطر هي اسم مصدر التعيين. يمكن أن يكون هذا اسم عملية أو اسم مكتبة أو اسم نظام مثل المكدس أو الكومة.

العرض الموسع

يوفر الخيار -x (الموسع) عمودين إضافيين.

 pmap -x 40919 

استخدام الخيار الموسع -X مع pmap

يتم إعطاء الأعمدة عناوين. لقد رأينا بالفعل أعمدة "العنوان" و "Kbytes" و "Mode" و "Mapping". يُطلق على الأعمدة الجديدة اسم "RSS" و "Dirty".

تمديد pmap الإخراج

هنا هو الإخراج الكامل:

 40919:. / مساء
عنوان Kbytes RSS مخطط وضع القذرة
000056059f06c000 4 4 0 r ---- pm
000056059f06d000 4 4 0 rx-- pm
000056059f06e000 4 4 0 r ---- pm
000056059f06f000 4 4 4 r ---- pm
000056059f070000 4 4 4 rw - pm
000056059fc39000 132 4 4 rw --- [مجهول]
00007f97a3edb000 8 4 4 rw --- [مجهول]
00007f97a3edd000 160160 0 r ---- libc.so.6
00007f97a3f05000 1616788 0 rx-- libc.so.6
00007f97a4099000352 64 0 r ---- libc.so.6
00007f97a40f1000 4 0 0 ----- libc.so.6
00007f97a40f2000 16 16 16 r ---- libc.so.6
00007f97a40f6000 8 8 8 rw - libc.so.6
00007f97a40f8000 60 28 28 rw --- [مجهول]
00007f97a4116000 4 4 0 r ---- ld-linux-x86-64.so.2
00007f97a4117000160160 0 rx-- ld-linux-x86-64.so.2
00007f97a413f000 40 40 0 ​​r ---- ld-linux-x86-64.so.2
00007f97a4149000 8 8 8 r ---- ld-linux-x86-64.so.2
00007f97a414b000 8 8 8 rw - ld-linux-x86-64.so.2
00007ffca0e7e000 132 12 12 rw --- [مكدس]
00007ffca0fe1000 16 0 0 r ---- [مجهول]
00007ffca0fe5000 8 4 0 rx-- [مجهول]
ffffffffff600000 4 0 0 --x-- [مجهول]
---------------- ------- ------- ------- 
مجموع kB 2756 1328 96
  • RSS : هذا هو حجم مجموعة المقيمين . أي مقدار الذاكرة الموجودة حاليًا في ذاكرة الوصول العشوائي ، وغير قابلة للتبديل.
  • متسخ : تم تغيير الذاكرة "المتسخة" منذ بدء العملية - والتعيين -.

تبين لي كل شيء

تضيف -X (أكثر من الموسعة) أعمدة إضافية إلى الإخراج. لاحظ الحرف الكبير "X". يُظهر لك خيار آخر يسمى -XX (حتى أكثر من -X ) كل شيء يمكن أن تحصل عليه pmap من النواة. نظرًا لأن -X هي مجموعة فرعية من -XX ، فسنصف الإخراج من -XX .

 pmap -XX 40919 

باستخدام -XX أظهر لي خيار كل شيء باستخدام pmap

يلتف الإخراج بشكل فظيع في نافذة طرفية ولا يمكن فك تشفيره عمليًا. هنا هو الإخراج الكامل:

 40919:. / مساء
         عنوان بيرم إزاحة جهاز Inode حجم KernelPageSize MMUPageSize Rss Pss Shared_Clean Shared_Dirty Private_Clean Private_Dirty Referenced Anonymous LazyFree AnonHugePages ShmemPmdMapped FilePmdMapped Shared_Hugetlb Private_Hugetlb Swap SwapPss مغلق TH مؤهل VmFlags Mapping
    56059f06c000 r - p 00000000 08:03 393304 4 4 4 4 4 0 0 4 0 4 0 0 0 0 0 0 0 0 0 0 rd mr mw me dw sd pm
    56059f06d000 r-xp 00001000 08:03 393304 4 4 4 4 4 0 0 4 0 4 0 0 0 0 0 0 0 0 0 0 rd ex mr mw me dw sd pm
    56059f06e000 r - p 00002000 08:03 393304 4 4 4 4 4 0 0 4 0 4 0 0 0 0 0 0 0 0 0 0 rd mr mw me dw sd pm
    56059f06f000 r - p 00002000 08:03 393304 4 4 4 4 4 0 0 0 4 4 4 0 0 0 0 0 0 0 0 0 rd mr mw me dw ac sd pm
    56059f070000 rw-p 00003000 08:03 393304 4 4 4 4 4 0 0 0 4 4 4 0 0 0 0 0 0 0 0 0 rd wr mr mw me dw ac sd pm
    56059fc39000 rw-p 00000000 00:00 0132 4 4 4 0 0 0 4 4 4 0 0 0 0 0 0 0 0 0 0 rd wr mr mw me ac sd [كومة]
    7f97a3edb000 rw-p 00000000 00:00 0 8 4 4 4 0 0 0 4 4 4 0 0 0 0 0 0 0 0 0 rd wr mr mw me ac sd 
    7f97a3edd000 r - p 00000000 08:03 264328 160 4 4160 4160 0 0 0160 0 0 0 0 0 0 0 0 0 0 rd mr mw me sd libc.so.6
    7f97a3f05000 r-xp 00028000 08:03 264328 1616 4 4888 32788 0 0 0788 0 0 0 0 0 0 0 0 0 0 0 rd ex mr mw me sd libc.so.6
    7f97a4099000 r - p 001bc000 08:03 264328352 4 4 64 1 64 0 0 0 0 64 0 0 0 0 0 0 0 0 0 0 rd mr mw me sd libc.so.6
    7f97a40f1000 - p 00214000 08:03 264328 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 mr mw me sd libc.so.6
    7f97a40f2000 r - p 00214000 08:03 264328 16 4 4 16 16 0 0 0 16 16 16 0 0 0 0 0 0 0 0 0 rd mr mw me ac sd libc.so.6
    7f97a40f6000 rw-p 00218000 08:03 264328 8 4 4 8 8 0 0 0 8 8 8 0 0 0 0 0 0 0 0 0 rd wr mr mw me ac sd libc.so.6
    7f97a40f8000 rw-p 00000000 00:00 0 60 4 4 28 28 0 0 0 28 28 28 0 0 0 0 0 0 0 0 0 rd wr mr mw me ac sd 
    7f97a4116000 r - p 00000000 08:03 264305 4 4 4 4 0 4 0 0 0 4 0 0 0 0 0 0 0 0 0 0 rd mr mw me dw sd ld-linux-x86-64.so.2
    7f97a4117000 r-xp 00001000 08:03 264305 160 4160 1160 0 0 0160 0 0 0 0 0 0 0 0 0 rd ex mr mw me dw sd ld-linux-x86-64.so.2
    7f97a413f000 r - p 00029000 08:03 264305 40 4 4 40 1 40 0 ​​0 0 40 0 ​​0 0 0 0 0 0 0 0 0 rd mr mw me dw sd ld-linux-x86-64.so.2
    7f97a4149000 r - p 00032000 08:03 264305 8 4 4 8 8 0 0 0 8 8 8 0 0 0 0 0 0 0 0 0 rd mr mw me dw ac sd ld-linux-x86-64.so.2
    7f97a414b000 rw-p 00034000 08:03 264305 8 4 4 8 8 0 0 0 0 8 8 8 0 0 0 0 0 0 0 0 0 rd wr mr mw me dw ac sd ld-linux-x86-64.so.2
    7ffca0e7e000 rw-p 00000000 00:00 0132 4 4 12 0 0 0 12 12 12 0 0 0 0 0 0 0 0 0 0 rd wr mr mw me gd ac [stack]
    7ffca0fe1000 r - p 00000000 00:00 0 16 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 rd mr pf io de dd sd [vvar]
    7ffca0fe5000 r-xp 00000000 00:00 0 8 4 4 4 0 4 0 0 0 4 0 0 0 0 0 0 0 0 0 0 rd ex mr mw me de sd [vdso]
ffffffffff600000 --xp 00000000 00:00 0 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ex [vsyscall]
                                             ==== ============== =========== ==== === ============ == ========== ============= ======================== ==== ===== ======== ============== =============== ========== === ============== ================ ==== ======= ====== = ========== 
                                             2756 92 92 1328157 1220 0 12 96 1328 96 0 0 0 0 0 0 0 0 0 0 كيلوبايت 

هناك الكثير من المعلومات هنا. هذا ما تحمله الأعمدة:

  • العنوان : عنوان بداية هذا التعيين. يستخدم هذا عنونة الذاكرة الظاهرية.
  • بيرم : أذونات الذاكرة.
  • الإزاحة : إذا كانت الذاكرة قائمة على الملف ، فسيتم إزاحة هذا التعيين داخل الملف.
  • الجهاز : رقم جهاز Linux ، معطى بأرقام رئيسية وثانوية. يمكنك رؤية أرقام الجهاز على جهاز الكمبيوتر الخاص بك عن طريق تشغيل الأمر lsblk .
  • Inode : inode الملف المرتبط به التعيين. على سبيل المثال ، في مثالنا ، قد يكون هذا هو inode الذي يحتوي على معلومات حول برنامج pm.
  • الحجم : حجم المنطقة المعينة للذاكرة.
  • KernelPageSize : حجم الصفحة المستخدم بواسطة kernel.
  • MMUPageSize : حجم الصفحة الذي تستخدمه وحدة إدارة الذاكرة.
  • Rss : هذا هو حجم مجموعة المقيمين . أي مقدار الذاكرة الموجودة حاليًا في ذاكرة الوصول العشوائي ، وغير قابلة للتبديل.
  • ملاحظة : هذا هو حجم الحصة النسبي . هذا هو الحجم المشترك الخاص المضاف إلى (الحجم المشترك مقسومًا على عدد المشاركات.)
  • Shared_Clean : مقدار الذاكرة المشتركة مع العمليات الأخرى التي لم يتم تغييرها منذ إنشاء التعيين. لاحظ أنه حتى إذا كانت الذاكرة قابلة للمشاركة ، إذا لم تتم مشاركتها بالفعل ، فإنها لا تزال تعتبر ذاكرة خاصة.
  • Shared_Dirty : مقدار الذاكرة المشتركة مع العمليات الأخرى التي تم تغييرها منذ إنشاء التعيين.
  • Private_Clean : مقدار الذاكرة الخاصة - التي لم تتم مشاركتها مع العمليات الأخرى - والتي لم يتم تغييرها منذ إنشاء التعيين.
  • Private_Dirty : مقدار الذاكرة الخاصة التي تم تغييرها منذ إنشاء التعيين.
  • تمت الإشارة إليه: مقدار الذاكرة الذي تم وضع علامة عليه حاليًا كمرجع أو تم الوصول إليه.
  • مجهول : ذاكرة لا تحتوي على جهاز للتبديل إليه. وهذا يعني أنه ليس ملفًا مدعومًا.
  • LazyFree : الصفحات التي تم وضع علامة عليها على أنها MADV_FREE . تم تمييز هذه الصفحات على أنها متاحة ليتم تحريرها واستعادتها ، على الرغم من أنه قد يكون بها تغييرات غير مكتوبة فيها. ومع ذلك ، في حالة حدوث تغييرات لاحقة بعد تعيين MADV_FREE على تعيين الذاكرة ، تتم إزالة علامة MADV_FREE ولن يتم استرداد الصفحات حتى تتم كتابة التغييرات.
  • AnonHugePages : هذه صفحات ذاكرة "ضخمة" غير مدعومة بالملفات (أكبر من 4 كيلوبايت).
  • ShmemPmdMapped : ذاكرة مشتركة مرتبطة بصفحات ضخمة. يمكن أيضًا استخدامها بواسطة أنظمة الملفات الموجودة بالكامل في الذاكرة.
  • FilePmdMapped : يعد دليل الصفحات الأوسط أحد أنظمة الترحيل المتاحة للنواة. هذا هو عدد الصفحات المدعومة بالملفات المشار إليها بإدخالات PMD.
  • Shared_Hugetlb : تُعد جداول Lookaside للترجمة ، أو TLBs ، ذاكرات تخزين مؤقت تُستخدم لتحسين الوقت المستغرق للوصول إلى مواقع ذاكرة مساحة المستخدمين. هذا الرقم هو مقدار ذاكرة الوصول العشوائي المستخدمة في TLBs المرتبطة بصفحات الذاكرة الضخمة المشتركة.
  • Private_Hugetlb : هذا الرقم هو مقدار ذاكرة الوصول العشوائي المستخدمة في TLBs المرتبطة بصفحات الذاكرة الضخمة الخاصة.
  • المبادلة : مقدار المبادلة المستخدمة.
  • SwapPss : حجم السهم النسبي للمبادلة . هذا هو مقدار التبادل المكون من صفحات الذاكرة الخاصة المُتبادلة المضافة إلى (الحجم المشترك مقسومًا على عدد المشاركات.)
  • مؤمن : يمكن تأمين تعيينات الذاكرة لمنع نظام التشغيل من ترحيل ذاكرة الكومة أو خارج الكومة.
  • TH مؤهل : هذه علامة تشير إلى ما إذا كان التعيين مؤهلاً لتخصيص صفحات ضخمة شفافة . 1 يعني صواب ، 0 يعني خطأ. الصفحات الضخمة الشفافة عبارة عن نظام لإدارة الذاكرة يقلل من عبء عمليات البحث عن صفحات TLB على أجهزة الكمبيوتر التي تحتوي على كمية كبيرة من ذاكرة الوصول العشوائي.
  • VmFlags : انظر قائمة الأعلام أدناه.
  • التعيين : اسم مصدر التعيين. يمكن أن يكون هذا اسم عملية أو اسم مكتبة أو أسماء نظام مثل المكدس أو الكومة.

ستكون VmFlags - أعلام الذاكرة الظاهرية - مجموعة فرعية من القائمة التالية.

  • rd : مقروء.
  • wr : قابل للكتابة.
  • مثال : قابل للتنفيذ.
  • sh : مشترك.
  • السيد : قد يقرأ.
  • ميغاواط : قد يكتب.
  • لي : قد ينفذ.
  • مللي : قد تشارك.
  • gd : ينمو جزء المكدس.
  • pf : نطاق رقم إطار الصفحة النقي. أرقام إطارات الصفحة هي قائمة بصفحات الذاكرة الفعلية.
  • dw : تم تعطيل الكتابة إلى الملف المعين.
  • lo : الصفحات مقفلة في الذاكرة.
  • io : منطقة الإدخال / الإخراج المعينة للذاكرة.
  • sr : نصيحة القراءة المتسلسلة المقدمة (بواسطة الدالة madvise() .)
  • rr : تقديم المشورة لقراءة عشوائية.
  • dc : لا تقم بنسخ منطقة الذاكرة هذه إذا كانت العملية متشعبة.
  • de : لا تقم بتوسيع منطقة الذاكرة هذه عند إعادة التعيين.
  • ac : المنطقة خاضعة للمساءلة.
  • nr : مساحة التبديل ليست محجوزة للمنطقة.
  • ht : تستخدم المنطقة صفحات TLB ضخمة.
  • sf : خطأ متزامن في الصفحة.
  • ع : علم خاص بالعمارة.
  • wf : امسح منطقة الذاكرة هذه إذا كانت العملية متشعبة.
  • dd : لا تقم بتضمين منطقة الذاكرة هذه في عمليات تفريغ النواة.
  • sd : علم متسخ ناعم.
  • ملم : منطقة خريطة مختلطة.
  • hg : علم نصيحة صفحة ضخمة.
  • nh : لا توجد صفحة كبيرة تشير إلى العلم.
  • mg : علم نصيحة Mergeable.
  • bt : ARM64 صفحة محمية من عدم استقرار درجة حرارة التحيز.
  • mt : تم تمكين علامات تمديد علامات الذاكرة ARM64.
  • um : Userfaultfd مفقود التتبع.
  • uw : Userfaultfd wr-protection تتبع.

إدارة الذاكرة معقدة

والعمل بشكل عكسي من جداول البيانات لفهم ما يحدث بالفعل هو أمر صعب. ولكن على الأقل يمنحك pmap الصورة الكاملة بحيث يكون لديك أفضل فرصة لمعرفة ما تحتاج إلى معرفته.

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

إحدى الحيل الرائعة الأخيرة هي أنه يمكنك استخدام pmap و pidof معًا ، والجمع بين إجراءات العثور على PID للعملية وتمريرها إلى pmap في أمر واحد:

 pmap $ (pidof pm)