.\" Copyright (c) 2013, Peter Schiffer .\" and Copyright (C) 2014, Michael Kerrisk .\" .\" SPDX-License-Identifier: GPL-2.0-or-later .TH memusage 1 2024-06-15 "Linux man-pages 6.9.1" "دستورات عمومی کاربر" .SH "نام (NAME)" memusage \- پروفایل‌سازی و بررسی مصرف حافظه یک برنامه .SH "خلاصه دستور (SYNOPSIS)" .nf .BR memusage " [\fIگزینه‌ها\fR]... \fIبرنامه\fR [\fIگزینه‌های‌برنامه\fR]..." .fi .SH "توضیحات (DESCRIPTION)" دستور .B memusage یک اسکریپت بش (bash) است که مصرف حافظه یک برنامه مشخص‌شده توسط .I program را پروفایل‌سازی و بررسی می‌کند. این اسکریپت کتابخانه .B libmemusage.so را در محیط فراخواننده از طریق متغیر محیطی .B LD_PRELOAD (به .BR ld.so (8) مراجعه کنید) از پیش بارگذاری می‌کند. کتابخانه .B libmemusage.so تخصیص حافظه را با رهگیری فراخوانی‌های توابع .BR malloc (3)، .BR calloc (3)، .BR free (3) و .BR realloc (3) ردیابی می‌کند؛ همچنین به‌صورت اختیاری، فراخوانی‌های توابع .BR mmap (2)، .BR mremap (2) و .BR munmap (2) نیز می‌توانند رهگیری شوند. .P دستور .B memusage می‌تواند داده‌های جمع‌آوری‌شده را به شکل متنی چاپ کند، یا می‌تواند با استفاده از .BR memusagestat (1) (گزینه .B \-p در ادامه را ببینید) یک فایل گرافیکی PNG شامل نمایش نموداری از داده‌های جمع‌آوری‌شده ایجاد نماید. .SS "خلاصه مصرف حافظه (Memory usage summary)" خط «خلاصه مصرف حافظه» (Memory usage summary) که در خروجی .B memusage نمایش داده می‌شود، شامل سه فیلد است: .RS 4 .TP \fBمجموع حافظه هیپ (heap total)\fR مجموع آرگومان‌های \fIsize\fR در تمام فراخوانی‌های .BR malloc (3)، حاصل‌ضرب آرگومان‌ها (\fInmemb\fR*\fIsize\fR) در تمام فراخوانی‌های .BR calloc (3) و مجموع آرگومان‌های \fIlength\fR در تمام فراخوانی‌های .BR mmap (2). در مورد .BR realloc (3) و .BR mremap (2)، اگر اندازه جدید یک تخصیص از اندازه قبلی بزرگ‌تر باشد، مجموع تمام این اختلاف‌ها (اندازه جدید منهای اندازه قبلی) اضافه می‌شود. .TP .B "اوج مصرف هیپ (heap peak)" بیشینه تمام آرگومان‌های \fIsize\fR در .BR malloc (3)، تمام حاصل‌ضرب‌های \fInmemb\fR*\fIsize\fR در .BR calloc (3)، تمام آرگومان‌های \fIsize\fR در .BR realloc (3)، آرگومان‌های .I length در .BR mmap (2) و آرگومان‌های \fInew_size\fR در .BR mremap (2). .TP .B "اوج مصرف پشته (stack peak)" پیش از نخستین فراخوانی به هر تابع تحت نظارت، نشانی اشاره‌گر پشته (اشاره‌گر پشته پایه) ذخیره می‌شود. پس از هر فراخوانی تابع، نشانی واقعی اشاره‌گر پشته خوانده شده و اختلاف آن با اشاره‌گر پشته پایه محاسبه می‌گردد. بیشینه این اختلاف‌ها، اوج مصرف پشته (stack peak) خواهد بود. .RE .P بلافاصله پس از این خط خلاصه، یک جدول تعداد فراخوانی‌ها، مجموع حافظه تخصیص‌یافته یا آزادشده، و تعداد فراخوانی‌های ناموفق را برای هر یک از توابع رهگیری‌شده نشان می‌دهد. برای .BR realloc (3) و .BR mremap (2)، فیلد اضافی «nomove» بازتخصیص‌هایی را نشان می‌دهد که نشانی یک بلوک را تغییر داده‌اند، و فیلد اضافی «dec» بازتخصیص‌هایی را نشان می‌دهد که اندازه بلوک را کاهش داده‌اند. برای .BR realloc (3)، فیلد اضافی «free» بازتخصیص‌هایی را نشان می‌دهد که باعث آزادسازی یک بلوک شده‌اند (یعنی اندازه بازتخصیص‌یافته 0 بوده است). .P ردیف «realloc/total memory» در جدول خروجیِ .B memusage مواردی را که در آن‌ها از .BR realloc (3) برای بازتخصیص یک بلوک حافظه به اندازه‌ای کوچک‌تر از اندازه قبلی استفاده شده است بازتاب نمی‌دهد. این موضوع می‌تواند باعث شود مجموع تمام خانه‌های «total memory» (به‌جز «free») بزرگ‌تر از خانه «free/total memory» باشد. .SS "هیستوگرام برای اندازه‌های بلوک (Histogram for block sizes)" بخش «هیستوگرام برای اندازه‌های بلوک» تفکیکی از تخصیص‌های حافظه را در دسته‌بندی‌های مختلف اندازه (buckets) ارائه می‌دهد. .SH "گزینه‌ها (OPTIONS)" .TP .BI \-n\ name \fR,\ \fB\-\-progname= name نام فایل برنامه‌ای که باید پروفایل‌سازی شود. .TP .BI \-p\ file \fR,\ \fB\-\-png= file تولید تصویر گرافیکی PNG و ذخیره آن در .IR file . .TP .BI \-d\ file \fR,\ \fB\-\-data= file تولید فایل داده‌های باینری و ذخیره آن در .IR file . .TP .B \-u\fR,\ \fB\-\-unbuffered عدم بافر کردن خروجی. .TP .BI \-b\ size \fR,\ \fB\-\-buffer= size جمع‌آوری تعداد .I size ورودی پیش از نوشتن آن‌ها در خروجی. .TP .B \-\-no\-timer غیرفعال کردن نمونه‌برداری مبتنی بر تایمر .RB ( SIGPROF ) از مقدار اشاره‌گر پشته. .TP .B \-m\fR,\ \fB\-\-mmap ردیابی فراخوانی‌های .BR mmap (2)، .BR mremap (2) و .BR munmap (2) علاوه بر توابع پیش‌فرض. .TP .B \-?\fR,\ \fB\-\-help نمایش راهنما و خروج. .TP .B \-\-usage نمایش پیام کوتاه نحوه استفاده و خروج. .TP .B \-V\fR,\ \fB\-\-version نمایش اطلاعات نسخه و خروج. .TP گزینه‌های زیر تنها هنگام تولید خروجی گرافیکی اعمال می‌شوند: .TP .B \-t\fR,\ \fB\-\-time\-based استفاده از زمان (به‌جای تعداد فراخوانی‌های توابع) به عنوان مقیاس محور X. .TP .B \-T\fR,\ \fB\-\-total رسم نمودار مصرف کل حافظه نیز علاوه بر سایر موارد. .TP .BI \fB\-\-title= name استفاده از .I name به عنوان عنوان نمودار. .TP .BI \-x\ size \fR,\ \fB\-\-x\-size= size تنظیم عرض نمودار به میزان .I size پیکسل. .TP .BI \-y\ size \fR,\ \fB\-\-y\-size= size تنظیم ارتفاع نمودار به میزان .I size پیکسل. .SH "وضعیت خروج (EXIT STATUS)" وضعیت خروج .B memusage برابر با وضعیت خروج برنامه پروفایل‌شده است. .SH "اشکالات (BUGS)" برای گزارش اشکالات، ببینید: .UR http://www.gnu.org/software/libc/bugs.html .UE .SH "مثال‌ها (EXAMPLES)" در ادامه یک برنامه ساده آمده است که یک بلوک حافظه را در چرخه‌هایی که ابتدا به یک نقطه اوج می‌رسند بازتخصیص می‌دهد و سپس به‌صورت چرخه‌ای با اندازه‌های کوچک‌تر بازتخصیص داده و در نهایت به صفر بازمی‌گرداند. پس از کامپایل برنامه و اجرای دستورات زیر، نمودار مصرف حافظه برنامه را می‌توان در فایل .IR memusage.png مشاهده کرد: .P .in +4n .EX $ \fBmemusage \-\-data=memusage.dat ./a.out\fP \&... Memory usage summary: heap total: 45200, heap peak: 6440, stack peak: 224 total calls total memory failed calls malloc| 1 400 0 realloc| 40 44800 0 (nomove:40, dec:19, free:0) calloc| 0 0 0 free| 1 440 Histogram for block sizes: 192\-207 1 2% ================ \&... 2192\-2207 1 2% ================ 2240\-2255 2 4% ================================= 2832\-2847 2 4% ================================= 3440\-3455 2 4% ================================= 4032\-4047 2 4% ================================= 4640\-4655 2 4% ================================= 5232\-5247 2 4% ================================= 5840\-5855 2 4% ================================= 6432\-6447 1 2% ================ $ \fBmemusagestat memusage.dat memusage.png\fP .EE .in .SS "کد منبع برنامه (Program source)" .EX #include #include \& #define CYCLES 20 \& int main(int argc, char *argv[]) { int i, j; size_t size; int *p; \& size = sizeof(*p) * 100; printf("malloc: %zu\[rs]n", size); p = malloc(size); \& for (i = 0; i < CYCLES; i++) { if (i < CYCLES / 2) j = i; else j\-\-; \& size = sizeof(*p) * (j * 50 + 110); printf("realloc: %zu\[rs]n", size); p = realloc(p, size); \& size = sizeof(*p) * ((j + 1) * 150 + 110); printf("realloc: %zu\[rs]n", size); p = realloc(p, size); } \& free(p); exit(EXIT_SUCCESS); } .EE .SH "همچنین ببینید (SEE ALSO)" .BR memusagestat (1), .BR mtrace (1), .BR ld.so (8)