Hacker News

بۆچی یەکەم C++ (m) allocation هەمیشە 72 KB یە؟

کۆمێنتەکان

1 min read Via joelsiks.com

Mewayz Team

Editorial Team

Hacker News

نهێنی پشت یەکەم تەرخانکردنی سی++ ی تۆ

تۆ بەرنامەیەکی سادەی C++ دەنووسیت. یەک نوێ ئینت. چوار بایت. تۆ strace یان پرۆفایلی بیرگەی دڵخوازت ئاگر دەکەیتەوە، و لەوێیە — پرۆسەکەت تەنها داوای نزیکەی 72 کیلۆبایت لە سیستەمی کارپێکردن کردووە. نەک ٤ بایت. نەک ٦٤ بایت. تەواو 72 کیلۆبایت. ئەگەر هەرگیز چاوت لەو ژمارەیە بووبێت و پرسیارت کردووە کە ئایا ئامرازەکانت درۆیان لەگەڵ دەکات، ئەوا تۆ تەنیا نیت. ئەم ڕەفتارە بەڕواڵەت سەیرە یەکێکە لەو پرسیارانەی کە زۆرترین جار لە نێو گەشەپێدەرانی سی++دا دەکرێت کە بۆ یەکەمجار لە ناوەوەی بیرگەدا هەڵکەندن و وەڵامەکەش دەمانباتە گەشتێکی سەرنجڕاکێش بەناو ئەو چینانەی کە لە نێوان کۆدەکەت و ڕەقەکاڵا ڕاستەقینەکەدا دادەنیشن.

چی ڕوودەدات کاتێک پەیوەندی نوێ

دەکەیت

بۆ تێگەیشتن لە ژمارەی 72 کیلۆبایت، پێویستە زنجیرەی تەواوی تەرخانکردنەکە بەدواداچوون بکەیت. کاتێک کۆدی ++C ی تۆ new int جێبەجێ دەکات، کۆمپایەر ئەوە دەگۆڕێت بۆ بانگەوازێک بۆ operator new، کە لە زۆربەی سیستەمەکانی لینوکسدا لە glibc ەوە malloc دەنێرێت. بەڵام malloc ڕاستەوخۆ داوای ٤ بایت بیرگە لە ناوک ناکات. ناوکەکە لە لاپەڕەکاندا کاردەکات — بە شێوەیەکی گشتی 4 کیلۆبایت لەسەر x86_64 — و تێچووی بانگەوازی سیستەم زۆر گەورەیە بە بەراورد بە دەستگەیشتنێکی سادەی بیرگە. بانگهێشتکردنی brk() یان mmap() بۆ هەر تەرخانکردنێکی تاکەکەسی، هەر بەرنامەیەکی نائاسایی دەکاتە وەستان.

لەبری ئەوە، تەرخانکەری بیرگەی glibc — جێبەجێکردنێک بە ناوی ptmalloc2، کە خۆی لە کلاسیکی dlmallocی دۆگ لیاوە هاتووە — وەک ناوەندکارێک کاردەکات. پێشوەختە داوای بلۆکی گەورەی بیرگە لە ناوکەوە دەکات، پاشان بەپێی پێویستی بەرنامەکەت دەیکاتە پارچەی بچووکتر. ئەمە هۆکاری بنەڕەتییە کە یەکەم تەرخانکردنی ٤ بایتەکەت داواکارییەکی زۆر گەورەتر بۆ سیستەمی کارپێکردن دەستپێدەکات. تەرخانکەر بەفیڕۆدان نییە. ستراتیژی بوونە.

پارچەکردنی 72 کیلۆبایت: بایتەکان بۆ کوێ دەڕۆن

سەرپێچی تەرخانکردنی سەرەتایی لە چەند پێکهاتەیەکی جیاوازەوە دێت کە دەبێت کاتی جێبەجێکردن دەستپێبکات پێش ئەوەی بتوانێت تەنانەت یەک بایت بیرگەی بەکارهێنەرت پێ بدات. تێگەیشتن لە هەر پێکهاتەیەک ڕوونی دەکاتەوە کە بۆچی ژمارەکە لەو شوێنەدا دەنیشێتەوە.

سەرەتا، malloc ی glibc گۆڕەپانی سەرەکی دەستپێدەکات — پێکهاتەی کتێبخانەی سەرەتایی کە هەموو تەرخانکردنەکان لەسەر تەوەرەی سەرەکی بەدواداچوون دەکات. ئەم گۆڕەپانە مێتاداتا بۆ کەڵەکە، ئاماژەدەری لیستی ئازاد و پێکهاتەی بن بۆ قەبارەی جیاوازی تەرخانکردن لەخۆدەگرێت. تەرخانکەر پچڕانی بەرنامەکە لە ڕێگەی sbrk() درێژ دەکاتەوە، و درێژکراوەی سەرەتایی لەلایەن پارامێتەرێکی ناوخۆییەوە بەڕێوەدەبرێت کە پێی دەوترێت M_TOP_PAD، کە بە پێشوەختە 128 کیلۆبایت پادکردنە. بەڵام داواکاری سەرەتایی ڕاستەقینە بۆ ڕێکخستنی لاپەڕە و شوێنی پچڕانی هەبوو ڕێکدەخرێت، کە زۆرجار دەبێتە هۆی داواکارییەکی یەکەمی بچووکتر — بە شێوەیەکی باو لە نزیک ئەو ژمارەیەی 72 کیلۆبایت لەسەر پرۆسەی تازە دەستپێکراوی نیشتنەوەی.

دووەم، لەبەر ئەوەی glibc 2.26، تەرخانکەر کاشێکی ناوخۆیی تەوەر (tcache) لە یەکەم بەکارهێناندا دەستپێدەکات. tcache 64 بن لەخۆدەگرێت (یەکێک بۆ هەر پۆلێکی قەبارەی تەرخانکردنی بچووک)، هەریەکەیان توانای هەڵگرتنی تا 7 پارچەی کاشکراویان هەیە. tcache_perthread_struct خۆی نزیکەی 1 کیلۆبایت بەکاردەهێنێت، بەڵام کردەی دەستپێکردنی ڕێکخستنی گۆڕەپانی فراوانتر دەستپێدەکات. سێیەم، کاتی جێبەجێکردنی ++C پێشتر تەرخانکردنی ئەنجامداوە پێش ئەوەی main()ەکەت تەنانەت کاربکات — بنیاتنەرە ئیستاتیکییەکان، دەستپێکردنی بافەری iostream بۆ std::cout و هاوڕێکان، و ڕێکخستنی ناوچەیی هەموویان بەشدارن لەو شوێنپێیەی کەڵەکەبووی سەرەتایی.

سیستەمی ئارێنا و بۆچی پێش تەرخانکردن زیرەکییە

بڕیاری پێشوەختە تەرخانکردنی بەشێکی بەرچاو لە بیرگە نەک پارچە پارچە داوای بکرێت، ڕووداوێکی جێبەجێکردن نییە. مامەڵەیەکی ئەندازیارییە بە ئەنقەست کە ڕەگ و ڕیشەی لە ئەزموونی دەیان ساڵەی بەرنامەسازی سیستەمەکاندا هەیە. هەر بانگەوازێک بۆ brk() یان mmap() گۆڕینی کۆنتێکست لە شوێنی بەکارهێنەرەوە بۆ شوێنی ناوک، گۆڕینی نەخشەسازی بیرگەی مەجازی پرۆسەکە و نوێکردنەوەی خشتەی لاپەڕەی ئەگەری لەخۆدەگرێت. لەسەر ڕەقەکاڵای مۆدێرن، یەک پەیوەندی سیستەم بە نزیکەیی 100-200 نانۆ چرکەی تێدەچێت — لە گۆشەگیریدا شتێکی بێ بایەخ، لە قەبارەدا کارەساتبار.

بەرنامەیەک لەبەرچاو بگرن کە 10,000 تەرخانکردنی بچووک لە کاتی دەستپێکردندا دەکات. بەبێ پێشوەختە تەرخانکردن، ئەوە بە مانای 10,000 پەیوەندی سیستەم دەبێت، کە نزیکەی 1-2 میلی چرکە لە سەرپێچییەکی پاکی تێدەچێت. لەگەڵ تەرخانکەرێکی بنەمادار بە گۆڕەپان، یەکەم تەرخانکردن یەک بانگەوازی سیستەم دەستپێدەکات، و 9,999 تەرخانکردنی دواتر بە تەواوی لە شوێنی بەکارهێنەردا لە ڕێگەی ژمێریاری ئاماژەدەر و کارەکانی لیستی بەستراوەوە خزمەتگوزاری دەکرێن — هەریەکەیان نزیکەی 10-50 نانۆ چرکە دەخایەنێت. بیرکارییەکە بێ دوو دڵییە: پێش تەرخانکردن بە ڕێژەی گەورەیی سەردەکەوێت.

<بلۆککۆت>

ئەو 72 کیلۆبایتەی کە لە یەکەم تەرخانکردنتدا دەیبینیت بیرگەی بەفیڕۆچوو نییە — ئەوە وەبەرهێنانێکی کاراییە. تەرخانکەر گرەو دەکات کە بەرنامەکەت بەم زووانە تەرخانکردنی زیاتر دەکات و بە شێوەیەکی بنەڕەتی لە هەموو سیناریۆیەکی جیهانی ڕاستەقینەدا، ئەو گرەوکردنە بە شێوەیەکی جوان سوودی دەبێت. تێچووی شوێنی ناونیشانی مەجازی بەکارنەهێنراو لە بنەڕەتدا سفرە لەسەر سیستەمی ٦٤ بیتی مۆدێرن.

بیرەوەری مەجازی بەرامبەر بیرەوەری فیزیکی: بۆچی گرنگ نییە

نیگەرانییەکی باو لە نێوان گەشەپێدەران کە بۆ یەکەمجار ڕووبەڕووی ئەم ڕەفتارە دەبنەوە، بەفیڕۆدانی سەرچاوەکانە. ئەگەر تەنها پێویستم بە ٤ بایت بێت بۆچی بەرنامەکەم ٧٢ کیلۆبایت بەکاردەهێنێت؟ تێڕوانینی ڕەخنەگرانە ئەوەیە کە بیرەوەری مەجازی بیرەوەری فیزیکی نییە. کاتێک glibc پچڕانی بەرنامەکە بە ڕێژەی 72 کیلۆبایت درێژ دەکاتەوە، ناوکەکە نەخشەسازییەکانی بیرگەی مەجازی پرۆسەکە نوێ دەکاتەوە، بەڵام یەکسەر بە ڕامی فیزیکی ئەو لاپەڕانە پشتگیری ناکات. لاپەڕە فیزیکییە ڕاستەقینەکان لەسەر داواکاری لە ڕێگەی هەڵەکانی لاپەڕەەوە تەرخان دەکرێن — تەنها کاتێک بەرنامەکەت بۆ ناونیشانێکی دیاریکراو دەنووسێت، ناوک لاپەڕەیەکی ڕاستەقینەی بیرگەی بۆ دیاری دەکات.

💡 DID YOU KNOW?

Mewayz replaces 8+ business tools in one platform

CRM · Invoicing · HR · Projects · Booking · eCommerce · POS · Analytics. Free forever plan available.

Start Free →

ئەمە بەو مانایەیە کە هەرچەندە قەبارەی مەجازی پرۆسەکەت بە ڕێژەی 72 کیلۆبایت زیاد دەکات، بەڵام قەبارەی کۆمەڵەی نیشتەجێبووەکەی (RSS) — بڕی ڕامی فیزیکی کە لە ڕاستیدا بەکاردەهێنرێت — تەنها بەو لاپەڕانە زیاد دەکات کە لە ڕاستیدا دەستیان لێدەدەیت. بۆ یەک new int، کە بە شێوەیەکی گشتی یەک لاپەڕەی 4 کیلۆبایت، لەگەڵ هەر لاپەڕەیەک کە میتاداتای گۆڕەپانەکە داگیری بکات. ئەو شوێنە مەجازییەی کە دەمێنێتەوە لەوێ دادەنیشێت، ئامادەیە بۆ بەکارهێنان، جگە لە شوێنی ناونیشان هیچی تێناچێت — کە 128 تێرابایتت لەسەر سیستەمی لینوکسی 64 بیتی هەیە.

ئەم جیاکارییە لە کاتی پرۆفایلکردن و چاودێریکردنی بەرنامەکانی بەرهەمهێناندا زۆر گرنگە. ئەگەر تۆ نەرمەکاڵایەک دروست دەکەیت کە پێویستی بە بەدواداچوونی بەکارهێنانی سەرچاوەی ڕاستەقینە هەیە — جا پاشکۆی SaaS بێت، مایکرۆسێرڤیس، یان بۆری شیکاری وەک ئەوانەی کە لەسەر پلاتفۆرمەکانی وەک Mewayz بۆ کارەکانی بازرگانی کاردەکەن — پێویستە هەمیشە چاودێری RSS بکەیت نەک قەبارەی مەجازی. ئامرازەکانی وەک /proc/[pid]/smaps، valgrind --tool=massif، و pmap دەتوانن شوێنپێی بیرگەی فیزیکی وردت پێ بدەن نەک ژمارەکانی بیرگەی مەجازی چەواشەکارانە.

چۆن تەرخانکەرە جیاوازەکان مامەڵە لەگەڵ تەرخانکردنی یەکەم دەکەن

ژمارەی 72 کیلۆبایت تایبەتە بە ptmaloc2 ی glibc. تەرخانکەرانی تر مامەڵەی جیاواز دەکەن و سەرپێچی سەرەتایی تەرخانکردن بەپێی ئەوە دەگۆڕێت. تێگەیشتن لەم جیاوازیانە بەنرخە لە کاتی هەڵبژاردنی تەرخانکەرێک بۆ بەرنامە هەستیارەکانی کارایی.

  • jemalloc (لەلایەن فەیسبووک، FreeBSD بەکاردێت) — پێکهاتەیەکی گۆڕەپانێکی دانەوێڵەییتر بەکاردەهێنێت لەگەڵ کاشەکانی ناوخۆیی تەوەر. سەرپێچی سەرەتایی زیاتر زیاترە (زۆرجار 200+ کیلۆبایت) بەڵام کارایی فرە ڕەگێکی باشتر دەدات بەهۆی کەمبوونەوەی ململانێی قوفڵ.
  • tcmalloc (Malloc ی هەڵگرتنی تەوەرەکانی گووگڵ) — کاشێکی هەر تەوەرێک کە نزیکەی 2 مێگابایت بە شێوازی پێشوەختە تەرخان دەکات، لەگەڵ پێش تەرخانکردنی شەڕانگێزانە. سەرپێچی سەرەتایی زیاترە، بەڵام تەرخانکردنی بچووکی دواتر زۆر خێران.
  • musl libc's malloc — دیزاینێکی زۆر سادەتر بەکاردەهێنێت لەسەر بنەمای mmap بۆ هەموو تەرخانکردنەکان. سەرپێچی سەرەتایی کەمترینە (زۆرجار تەنها 4 کیلۆبایت بۆ هەر تەرخانکردنێک)، بەڵام تێچووی هەر تەرخانکردنێک زیاترە بەهۆی پەیوەندییە زۆرەکانی سیستەمەوە.
  • mimalloc (مایکرۆسۆفت) — تەرخانکردنی بنەمادار بە سێگمێنت بەکاردەهێنێت لەگەڵ سێگمێنتەکانی 64 مێگابایت. یەکەم تەرخانکردن 64 مێگابایت حجزکردنی مەجازی (بە کەمترین پابەندبوونی فیزیکی) دەستپێدەکات، شوێنی ناونیشانی بازرگانی بۆ ناوچەیی و توانای ناوازە.

هەڵبژاردنی نێوان ئەم تەرخانکەرانە بە تەواوی بەندە بە باری کارەکەتەوە. بۆ بەرنامەکانی سێرڤەری درێژخایەن کە تەرخانکردنی قورس و فرە ڕەگیان هەیە، jemalloc یان tcmalloc بە شێوەیەکی گشتی لە پێشوەختەی glibc باشترە. بۆ سیستەمی جێگیرکراوی سنووردار بە بیرگە، ڕەنگە ڕێگەی سادەتری musl باشتر بێت سەرەڕای توانای کەمتر. بۆ زۆربەی بەرنامەکانی دەسکتۆپ و سێرڤەری مەبەستی گشتی، سەرپێچی سەرەتایی 72 کیلۆبایت ptmaloc2 نوێنەرایەتی پێشوەختەیەکی گونجاو دەکات کە بەبێ کۆکردنەوە بە باشی کاردەکات.

کۆکردنەوەی هەڵسوکەوتی تەرخانکردنی سەرەتایی

ئەگەر سەرپێچی سەرەتایی 72 کیلۆبایتی پێشوەختە بەڕاستی کێشەدار بێت بۆ کەیسی بەکارهێنانەکەت — ڕەنگە تۆ هەزاران پرۆسەی کورتخایەن درووست بکەیت، هەریەکەیان تەنها مشتێک تەرخانکردن دەکەن — glibc چەندین کۆنتڕۆڵکەر لە ڕێگەی mallopt() و خێزانی MALLOC_ گۆڕاوە ژینگەییەکان دابین دەکات.

پارامێتەرەکەی M_TOP_PAD کۆنتڕۆڵی ئەوە دەکات کە تەرخانکەر چەند بیرگەی زیادە داوای دەکات لە دەرەوەی ئەوەی کە دەستبەجێ پێویستە. ڕێکخستنی بۆ 0 لەگەڵ mallopt(M_TOP_PAD, 0) بە تەرخانکەر دەڵێت تەنها ئەوەی پێویستە داوای بکات، ئەمەش سەرپێچی سەرەتایی بە شێوەیەکی بەرچاو کەمدەکاتەوە. پارامێتری M_MMAP_THRESHOLD قەبارەی کۆنتڕۆڵ دەکات کە لە سەرەوەی تەرخانکردنەکان mmap بەکاردەهێنن لەبری گۆڕەپانەکە. M_TRIM_THRESHOLD کۆنتڕۆڵی دەکات کاتێک بیرگەی ئازادکراو دەگەڕێتەوە بۆ سیستەمی کارپێکردن. وە لەبەر ئەوەی glibc 2.26، glibc.malloc.tcache_count و glibc.malloc.tcache_max tunables ڕێگەت پێدەدەن هەڵسوکەوتی کاشی تەوەرەکە کۆنتڕۆڵ بکەیت.

بەڵام وشەیەکی وریا: کۆکردنەوەی ئەم پارامێتەرانە بەبێ پێوەرکردنی ورد نزیکەی هەمیشە شتەکان خراپتر دەکات. دیفۆڵتەکان لەسەر بنەمای پرۆفایلی جیهانی ڕاستەقینەی بەرفراوان هەڵبژێردران، و ئەوان نوێنەرایەتی خاڵێکی شیرین دەکەن بۆ زۆربەی زۆری باری کار. مەگەر بەڵگەی بەهێزت هەبێت لە پرۆفایلی بەرهەمهێنانەوە کە سەرپێچی مالۆک گەردنی تەنگە - و کاریگەری گۆڕانکارییەکانتان پێوانە کردووە - پێشوەختەکان بە تەنیا جێبهێڵن. باشترکردنی پێشوەختەی تەرخانکەر فۆرمێکی تایبەتی فێڵبازانەی ڕیش تاشی یاکە کە کاتژمێرە ئەندازیارییە بێشومارەکانی بەکارهێناوە بۆ سوودێکی کەم.

ئەمە چیمان فێر دەکات دەربارەی بەرنامەسازی سیستەم

نهێنی تەرخانکردنی یەکەمی 72 کیلۆبایت، لە ناوەڕۆکەکەیدا، وانەیەک دەربارەی چینەکانی ئەبستراکشن. C++ ئەو وەهمەت پێدەبەخشێت کە new int 4 بایت تەرخان دەکات. ستانداردی زمان وا دەڵێت. مۆدێلی دەروونی تۆ وا دەڵێت. بەڵام لە نێوان کۆدەکەت و ڕەقەکاڵاکەدا کۆمەڵێک سیستەمی ئاڵۆز دانیشتوون — کاتی جێبەجێکردنی ++C، تەرخانکەری کتێبخانەی C، ژێر سیستەمی بیرگەی مەجازی ناوک، و MMU و TLB ی ڕەقەکاڵاکە — هەریەکەیان هەڵسوکەوتی خۆیان، باشترکردن و سەرپێچی زیاد دەکەن.

ئەمە کەموکوڕی نییە. تەواوی خاڵی نەرمەکاڵای سیستەمەکانە. هەر چینێک بۆ چارەسەرکردنی کێشەیەکی ڕاستەقینە بوونی هەیە: تەرخانکەرەکە بوونی هەیە بۆیە پێویست ناکات بانگەوازی سیستەم بکەیت بۆ هەر تەرخانکردنێک. سیستەمی بیرگەی مەجازی بوونی هەیە بۆیە پێویست ناکات ڕاستەوخۆ بیرگەی فیزیکی بەڕێوەببەیت. مامەڵەکەری هەڵەی لاپەڕە بوونی هەیە بۆیە بیرگە بە تەمبەڵی و کارا پابەند دەکرێت. هەموو چینێک بڕێکی کەم لە شەفافیەت دەگۆڕێتەوە بۆ بڕێکی زۆر لە کارایی و ئاسانکاری.

ئەو گەشەپێدەرانەی کە متمانەپێکراوترین و بەرزترین سیستەم دروست دەکەن ئەوانەن کە لەم چینانە تێدەگەن — نەک لەبەر ئەوەی پێویستە بەردەوام بیریان لێبکەنەوە، بەڵکو لەبەر ئەوەی کاتێک شتێکی چاوەڕواننەکراو ڕوودەدات (وەک تەرخانکردنی نهێنی 72 کیلۆبایت)، ئەوان مۆدێلی دەروونییان هەیە بۆ ئەوەی تێبگەن بۆچی. جا تۆ سیستەمێکی بازرگانی کاتی ڕاستەقینە دروست بکەیت، بزوێنەری یاری، یان پلاتفۆرمی بازرگانی کە خزمەت بە هەزاران بەکارهێنەر دەکات، توانای عەقڵکردن سەبارەت بەوەی کە کۆدەکەت لە ڕاستیدا چی دەکات لە ئاستی سیستەمدا ئەوەیە کە گەشەپێدەرانی لێهاتوو لە ناوازە جیا دەکاتەوە. 72 کیلۆبایتەکە هەڵە نییە. ئەوە تەرخانکەری تۆیە کە کاری خۆی بە شێوەیەکی درەوشاوە ئەنجام دەدات.

ئەمڕۆ سیستەمی کارپێکردنی کارەکەت دروست بکە

لە فریلانسەرەکانەوە تا ئاژانسەکان، مێوایز بە 207 مۆدیۆلی یەکگرتوو 138,000+ بزنس بەهێز دەکات. بەخۆڕایی دەست پێ بکە، کاتێک گەشە دەکەیت بەرزی بکەرەوە.

دروستکردنی ئەکاونتی بێبەرامبەر →

Try Mewayz Free

All-in-one platform for CRM, invoicing, projects, HR & more. No credit card required.

Start managing your business smarter today

Join 30,000+ businesses. Free forever plan · No credit card required.

Ready to put this into practice?

Join 30,000+ businesses using Mewayz. Free forever plan — no credit card required.

Start Free Trial →

Ready to take action?

Start your free Mewayz trial today

All-in-one business platform. No credit card required.

Start Free →

14-day free trial · No credit card · Cancel anytime