mallinfo(3)

الاسم
mallinfo، mallinfo2 - الحصول على معلومات تخصيص الذاكرة

المكتبة
مكتبة سي المعيارية (libc، -lc)

موجز
#include <malloc.h>

struct mallinfo mallinfo(void);
struct mallinfo2 mallinfo2(void);

الوصف
ترجع هذه الدوال نسخة من بنية تحتوي على معلومات حول تخصيصات الذاكرة التي تُنفذ بواسطة malloc(3) والدوال ذات الصلة. تحتوي البنية التي ترجعها كل دالة على نفس الحقول. ومع ذلك، فإن الدالة الأقدم، mallinfo()، مُهملة لأن النوع المستخدم للحقول صغير جدًا (انظر BUGS).

لاحظ أنه ليست كل التخصيصات مرئية لهذه الدوال؛ انظر BUGS وفكر في استخدام malloc_info(3) بدلاً من ذلك.

تُعرف بنية mallinfo2 التي ترجعها mallinfo2() كما يلي:

    struct mallinfo2 {
        size_t arena;     /* المساحة المخصصة غير المُعيَّنة بـ mmap (بايت) */
        size_t ordblks;   /* عدد القطع الحرة */
        size_t smblks;    /* عدد كتل fastbin الحرة */
        size_t hblks;     /* عدد المناطق المُعيَّنة بـ mmap */
        size_t hblkhd;    /* المساحة المخصصة في المناطق المُعيَّنة بـ mmap
                             (بايت) */
        size_t usmblks;   /* انظر أدناه */
        size_t fsmblks;   /* المساحة في كتل fastbin المحررة (بايت) */
        size_t uordblks;  /* إجمالي المساحة المخصصة (بايت) */
        size_t fordblks;  /* إجمالي المساحة الحرة (بايت) */
        size_t keepcost;  /* المساحة القابلة للتحرير في الأعلى (بايت) */
    };

بنية mallinfo التي ترجعها الدالة المُهملة mallinfo() هي نفسها تمامًا، باستثناء أن الحقول مكتوبة كنوع int.

تحتوي حقول البنية على المعلومات التالية:

arena
    إجمالي كمية الذاكرة المخصصة بوسائل غير mmap(2) (أي الذاكرة المخصصة على الكومة). يشمل هذا الرقم الكتل قيد الاستخدام والكتل الموجودة في القائمة الحرة.

ordblks
    عدد الكتل الحرة العادية (أي غير fastbin).

smblks
    عدد كتل fastbin الحرة (انظر mallopt(3)).

hblks
    عدد الكتل المخصصة حاليًا باستخدام mmap(2). (انظر مناقشة M_MMAP_THRESHOLD في mallopt(3).)

hblkhd
    عدد البايتات في الكتل المخصصة حاليًا باستخدام mmap(2).

usmblks
    هذا الحقل غير مستخدم، وقيمته دائمًا 0. تاريخيًا، كان "علامة المياه العالية" للمساحة المخصصة—أي، أقصى كمية من المساحة تم تخصيصها على الإطلاق (بالبايت)؛ كان هذا الحقل يُحافظ عليه فقط في بيئات غير متعددة الخيوط.

fsmblks
    إجمالي عدد البايتات في الكتل الحرة في السلة السريعة.

uordblks
    إجمالي عدد البايتات المستخدمة بواسطة التخصيصات قيد الاستخدام.

fordblks
    إجمالي عدد البايتات في الكتل الحرة.

keepcost
    المبلغ الإجمالي للمساحة الحرة القابلة للتحرير في أعلى الكومة. هذا هو أقصى عدد من البايتات التي يمكن تحريرها نظريًا (أي بتجاهل قيود محاذاة الصفحة، وما إلى ذلك) بواسطة malloc_trim(3).

السمات
للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر attributes(7).
الواجهة | السمة | القيمة
mallinfo(), mallinfo2() | سلامة الخيوط | MT-Unsafe init const:mallopt

mallinfo()/ mallinfo2() تصل إلى بعض الكائنات الداخلية العامة. إذا تم تعديلها بغير ذرية، فقد تُحصل نتائج غير متناسقة. المعرف mallopt في const:mallopt يعني أن mallopt() تعدل الكائنات الداخلية العامة بذرية، مما يضمن أن mallinfo()/ mallinfo2() آمنة بما يكفي، بينما التعديلات الأخرى بغير ذرية قد لا تكون كذلك.

المعايير
لا شيء.

التاريخ

mallinfo()
    glibc 2.0. SVID.

mallinfo2()
    glibc 2.33.

العلل
تُعاد المعلومات لمنطقة تخصيص الذاكرة الرئيسية فقط. تُستبعد التخصيصات في الساحات الأخرى. انظر malloc_stats(3) و malloc_info(3) لبدائل تتضمن معلومات عن الساحات الأخرى.

حقول بنية mallinfo التي تُعاد بواسطة الدالة الأقدم mallinfo() مكتوبة كنوع int. ومع ذلك، لأن بعض قيم المحاسبة الداخلية قد تكون من نوع long، فقد تلتف القيم المبلغ عنها حول الصفر وبالتالي تكون غير دقيقة.

أمثلة
يستخدم البرنامج أدناه mallinfo2() لاسترداد إحصائيات تخصيص الذاكرة قبل وبعد تخصيص وتحرير بعض كتل الذاكرة. تُعرض الإحصائيات على المخرج القياسي.

تحدد الوسيطتان الأوليان لسطر الأوامر عدد وحجم الكتل التي سيتم تخصيصها باستخدام malloc(3).

الوسائط الثلاثة المتبقية تُحدد أي من الكتل المخصصة يجب تحريرها باستخدام free(3). هذه الوسائط الثلاثة اختيارية، وتُحدد (بالترتيب): حجم الخطوة المستخدم في الحلقة التي تحرر الكتل (المبدئي هو 1، أي تحرير جميع الكتل في النطاق)؛ الموضع الترتيبي لأول كتلة يُراد تحريرها (المبدئي 0، أي أول كتلة مخصصة)؛ ورقم أكبر بواحد من الموضع الترتيبي لآخر كتلة يُراد تحريرها (المبدئي هو أكبر بواحد من رقم الكتلة الأقصى). إذا حُذفت هذه الوسائط الثلاثة، فإن المبدئيات تؤدي إلى تحرير جميع الكتل المخصصة.

في تشغيل المثال التالي للبرنامج، أُجريت 1000 تخصيص بحجم 100 بايت، ثم حُررت كل كتلة مخصصة ثانية:

    $ ./a.out 1000 100 2;
    ============== Before allocating blocks ==============
    Total non-mmapped bytes (arena):       0
    # of free chunks (ordblks):            1
    # of free fastbin blocks (smblks):     0
    # of mapped regions (hblks):           0
    Bytes in mapped regions (hblkhd):      0
    Max. total allocated space (usmblks):  0
    Free bytes held in fastbins (fsmblks): 0
    Total allocated space (uordblks):      0
    Total free space (fordblks):           0
    Topmost releasable block (keepcost):   0

    ============== After allocating blocks ==============
    Total non-mmapped bytes (arena):       135168
    # of free chunks (ordblks):            1
    # of free fastbin blocks (smblks):     0
    # of mapped regions (hblks):           0
    Bytes in mapped regions (hblkhd):      0
    Max. total allocated space (usmblks):  0
    Free bytes held in fastbins (fsmblks): 0
    Total allocated space (uordblks):      104000
    Total free space (fordblks):           31168
    Topmost releasable block (keepcost):   31168

    ============== After freeing blocks ==============
    Total non-mmapped bytes (arena):       135168
    # of free chunks (ordblks):            501
    # of free fastbin blocks (smblks):     0
    # of mapped regions (hblks):           0
    Bytes in mapped regions (hblkhd):      0
    Max. total allocated space (usmblks):  0
    Free bytes held in fastbins (fsmblks): 0
    Total allocated space (uordblks):      52000
    Total free space (fordblks):           83168
    Topmost releasable block (keepcost):   31168

  مصدر البرنامج
    #include <malloc.h>
    #include <stdlib.h>
    #include <string.h>

    #define streq(...)  (strcmp(__VA_ARGS__) == 0)

    static void
    display_mallinfo2(void)
    {
        struct mallinfo2 mi;

        mi = mallinfo2();

        printf("Total non-mmapped bytes (arena):       %zu\n", mi.arena);
        printf("# of free chunks (ordblks):            %zu\n", mi.ordblks);
        printf("# of free fastbin blocks (smblks):     %zu\n", mi.smblks);
        printf("# of mapped regions (hblks):           %zu\n", mi.hblks);
        printf("Bytes in mapped regions (hblkhd):      %zu\n", mi.hblkhd);
        printf("Max. total allocated space (usmblks):  %zu\n", mi.usmblks);
        printf("Free bytes held in fastbins (fsmblks): %zu\n", mi.fsmblks);
        printf("Total allocated space (uordblks):      %zu\n", mi.uordblks);
        printf("Total free space (fordblks):           %zu\n", mi.fordblks);
        printf("Topmost releasable block (keepcost):   %zu\n", mi.keepcost);
    }

    int
    main(int argc, char *argv[])
    {
    #define MAX_ALLOCS 500000
        char *alloc[MAX_ALLOCS];
        size_t blockSize, numBlocks, freeBegin, freeEnd, freeStep;

        if (argc < 3 || streq(argv[1], "--help")) {
            fprintf(stderr, "%s num-blocks block-size [free-step "
                    "[start-free [end-free]]]\n", argv[0]);
            exit(EXIT_FAILURE);
        }

        numBlocks = atoi(argv[1]);
        blockSize = atoi(argv[2]);
        freeStep = (argc > 3) ? atoi(argv[3]) : 1;
        freeBegin = (argc > 4) ? atoi(argv[4]) : 0;
        freeEnd = (argc > 5) ? atoi(argv[5]) : numBlocks;

        printf("============== Before allocating blocks ==============\n");
        display_mallinfo2();

        for (size_t j = 0; j < numBlocks; j++) {
            if (numBlocks >= MAX_ALLOCS) {
                fprintf(stderr, "Too many allocations\n");
                exit(EXIT_FAILURE);
            }

            alloc[j] = malloc(blockSize);
            if (alloc[j] == NULL) {
                perror("malloc");
                exit(EXIT_FAILURE);
            }
        }

        printf("\n============== After allocating blocks ==============\n");
        display_mallinfo2();

        for (size_t j = freeBegin; j < freeEnd; j += freeStep)
            free(alloc[j]);

        printf("\n============== After freeing blocks ==============\n");
        display_mallinfo2();

        exit(EXIT_SUCCESS);
    }

انظر أيضًا
mmap(2), malloc(3), malloc_info(3), malloc_stats(3), malloc_trim(3), mallopt(3)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.