هل سيستخدم mmap الذاكرة المستمرة؟(على سولاريس)

StackOverflow https://stackoverflow.com/questions/837863

  •  10-07-2019
  •  | 
  •  

سؤال

لقد استخدمت mmap (فقط حاول فهم كيفية عمل mmap) لتخصيص 96 كيلو بايت من الذاكرة المجهولة، ولكن يبدو أنها قسمت 96 كيلو بايت إلى 64 كيلو بايت و32 كيلو بايت.ولكن عند تخصيص 960 ألفًا، فإنه يخصص قطعة واحدة فقط حجمها 960 ألفًا.متى سيقوم سولاريس بتقسيم الذاكرة المخصصة إلى عدة أجزاء؟شفرة:

#define PROT PROT_READ | PROT_WRITE
#define MAP  MAP_ANON  | MAP_PRIVATE
if ((src = mmap(0, 88304, PROT, MAP, -1, 0)) == MAP_FAILED)
    printf("mmap error for input");

if ((src = mmap(0, 983040, PROT, MAP, -1, 0)) == MAP_FAILED)
    printf("mmap error for input");

if ((src = mmap(0, 98304, PROT, MAP, -1, 0)) == MAP_FAILED)
    printf("mmap error for input");

الجمالون:

mmap(0x00000000, 88304, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0)
    = 0xFFFFFFFF7E900000
mmap(0x00000000, 983040, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0)
    = 0xFFFFFFFF7E800000
mmap(0x00000000, 98304, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0)
    = 0xFFFFFFFF7E700000

خريطة بي ماب:

FFFFFFFF7E700000         64     -          -          - rw---    [anon]
    ==> strange is that for 96k, it was broken into 2 part.
FFFFFFFF7E710000         32     -          -          - rw---    [anon]
FFFFFFFF7E800000        960     -          -          - rw---    [anon]
FFFFFFFF7E900000         64     -          -          - rw---    [anon]
FFFFFFFF7E910000         24     -          -          - rw---    [anon]
FFFFFFFF7EA00000         64     -          -          - rw---    [anon]
FFFFFFFF7EA10000         32     -          -          - rw---    [anon]
هل كانت مفيدة؟

المحلول

الذي - التي يكون ذاكرة متجاورة، يمكنك معرفة العناوين (F...700000 + 64K = F...710000) لذلك لا أعتقد أن عليك أن تقلق بشأن ذلك.أنا متأكد تمامًا من أن mmap مطلوب لتزويدك بذاكرة متجاورة في مساحة العنوان الخاصة بك.سيكون الأمر عديم الفائدة إلى حد كبير بخلاف ذلك لأنه يمنحك عنوانًا أساسيًا واحدًا فقط.مع كتلتين غير متجاورتين، لن تكون هناك طريقة للعثور على تلك الكتلة الثانية.

لذلك أعتقد أن سؤالك هو:لماذا يظهر هذا ككتلتين في pmap؟

وسيكون جوابي عليه: "محشو إذا كنت أعرف".لكن يمكنني أن أخمن ما هو أفضل ما يمكن أن يتمناه أي شخص مني في هذا الوقت من الصباح (قبل تناول القهوة).

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

  • إنه يفعل ذلك بمجرد تحرير الذاكرة (ليس هذا هو الحال كما يظهر مخرجاتك لا يحدث).
  • يقوم بذلك بشكل دوري ولم يكن قد وصل إليه قبل أن تطلب كتلة 96 كيلو بايت الخاصة بك؛أو
  • إنه لا يزعجك على الإطلاق لأنه ذكي بما يكفي للقيام بذلك أثناء تخصيص الكتلة لك.

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

ضع في اعتبارك أن هذه مجرد تكهنات (مستنيرة، ولكنها لا تزال تكهنات).لقد رأيت قدرًا كبيرًا من الأجزاء الداخلية لنظام UNIX (أنظمة UNIX الحقيقية، وليس هذا الطفل الجديد في المجموعة :-) ولكن لم تكن لدي حاجة أبدًا للتعمق في mmap.

نصائح أخرى

وأنا لا يمكن أن تذكر المصطلح، لأنه (المشارب؟ شرائح؟ أسافين؟ أرغ) ولكن سولاريس تخصص أحجام الصفحات مختلفة من برك من مختلف الأحجام. وهذا ما يتبين إلى حد ما أكثر كفاءة من أحجام الصفحات موحدة، لأنه يستخدم تعيين ذاكرة أفضل. واحدة من تلك الأحجام هو 32K، 64K آخر، وآخر هو 1024K على ما أعتقد. للحصول على 96K، كنت حصلت على 64 و 32، للحصول على 960 حصلت أكثر من 1024K.

والمورد الأساسي لهذا السحر هو سولاريس الداخلية لل الكتاب. الألغام، للأسف، في مربع في مرآب في momrnt.

والجواب يعتمد على ما تعنيه متجاورة. وسولاريس وجميع أنظمة يونكس ويونكس تشبه الحديثة (وربما جميع أنظمة التشغيل الحديثة) تقسيم الذاكرة الفعلية إلى صفحات، وسوف الذاكرة ضمن "الصفحة" تكون متجاورة في المستوى المادي. معظم النظم الحديثة لديها MMU الأجهزة (وحدة إدارة الذاكرة) التي سوف تترجم عنوان ظاهري إلى عنوان فعلي. وبالتالي فإن استدعاء نظام mmap سيعود مساحة العنوان الظاهرية المتجاورة لكن ستدار أن العنوان الظاهرية من قبل MMU التي قد تستخدم صفحات متعددة اعتمادا على حجم الصفحة (ق) وحجم تعيين ذاكرة.

وعلى الرغم من كل عنوان الظاهري سوف تكون متجاورة (ضمن رسم الخرائط) سوف عناوين داخل "الصفحات" أيضا أن تكون متجاورة جسديا ولكن الصفحات والانتقال بين صفحات قد لا تكون قريبة من بعضها البعض جسديا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top