Niyə ilk C++ (m) bölgüsü həmişə 72 KB olur?
Şərhlər
Mewayz Team
Editorial Team
İlk C++ ayırmağınızın arxasındakı sirr
Siz sadə C++ proqramı yazırsınız. Tək yeni int. Dörd bayt. Siz strace və ya sevimli yaddaş profilinizi işə salırsınız və iş budur — prosesiniz əməliyyat sistemindən təxminən 72 KB tələb etdi. 4 bayt deyil. 64 bayt deyil. Tam 72 KB. Əgər siz nə vaxtsa bu nömrəyə baxmısınızsa və alətinizin sizə yalan danışıb-yaxmadığını düşünmüsünüzsə, tək deyilsiniz. Qəribə görünən bu davranış yaddaşın daxili hissələrini ilk dəfə araşdıran C++ tərtibatçıları arasında ən çox verilən suallardan biridir və cavab bizi kodunuzla faktiki aparat arasında yerləşən təbəqələr arasında maraqlı səyahətə aparır.
yeni
zəng edərkən nə baş verir72 KB rəqəmini başa düşmək üçün siz tam ayırma zəncirini izləməlisiniz. C++ kodunuz new int-i yerinə yetirdikdə, kompilyator bunu operator new-a zəngə çevirir, bu da əksər Linux sistemlərində glibc-dən malloc-a nümayəndə verir. Lakin malloc birbaşa nüvədən 4 bayt yaddaş tələb etmir. Nüvə səhifələrdə işləyir - adətən x86_64-də 4 KB - və sistem çağırışının dəyəri sadə yaddaş girişinə nisbətən çox böyükdür. Hər bir fərdi ayırma üçün brk() və ya mmap() çağırmaq hər hansı qeyri-trivial proqramı dayandıracaq.
Əvəzində, glibc-in yaddaş ayırıcısı — ptmalloc2 adlı tətbiq, özü Doug Lea-nın klassik dlmalloc-dan irəli gəlir - vasitəçi kimi çıxış edir. O, nüvədən qabaqcadan böyük yaddaş bloklarını tələb edir, sonra proqramınızın onlara ehtiyacı olduğu üçün onları daha kiçik parçalara ayırır. Bu, ilk 4 baytlıq ayırmanızın əməliyyat sisteminə daha böyük sorğu göndərməsinin əsas səbəbidir. Ayırıcı israfçılıq etmir. Bu, strateji xarakter daşıyır.
72 KB-nin parçalanması: Baytların getdiyi yer
İlkin bölüşdürmə yükü bir neçə fərqli komponentdən gəlir ki, işləmə vaxtı sizə hətta bir bayt istifadə edilə bilən yaddaş təqdim etməzdən əvvəl işə salınmalıdır. Hər bir komponentin başa düşülməsi nömrənin nəyə görə gəldiyini izah edir.
Birincisi, glibc-in malloc-u əsas arenanı işə salır — əsas mövzu üzrə bütün ayırmaları izləyən əsas mühasibat strukturu. Bu arenaya yığın üçün metadata, sərbəst siyahı göstəriciləri və müxtəlif ayırma ölçüləri üçün qutu strukturları daxildir. Ayırıcı proqram fasiləsini sbrk() vasitəsilə genişləndirir və ilkin genişləndirmə M_TOP_PAD adlı daxili parametrlə idarə olunur, bu, defolt olaraq 128 KB doldurma üçün nəzərdə tutulub. Bununla belə, faktiki ilkin sorğu səhifə düzülməsinə və mövcud fasilə mövqeyinə uyğunlaşdırılır ki, bu da tez-tez daha kiçik ilk sorğu ilə nəticələnir - adətən təzə başlamış prosesdə həmin 72 KB rəqəmin yaxınlığında enir.
İkincisi, glibc 2.26-dan bəri ayırıcı ilk istifadədə mevzunun yerli keşini (tcache) işə salır. Tcache-də 64 qutu (kiçik ayırma ölçüsü sinfi üçün bir) var, hər biri 7-ə qədər keşlənmiş hissəni saxlaya bilir. tcache_perthread_structun özü təxminən 1 KB sərf edir, lakin onun işə salınması daha geniş arena quraşdırmasını işə salır. Üçüncüsü, C++ işləmə vaxtı main()-iniz hətta işə düşməmişdən əvvəl artıq ayırmaları həyata keçirmişdir — statik konstruktorlar, std::cout və dostlar üçün iostream buferinin işə salınması və yerli ayarların hamısı həmin ilkin yığın izinə töhfə verir.
Arena Sistemi və Əvvəlcədən Təxsisatın Ağıllı Olması Niyə
Yaddaşın hissə-hissə tələb edilmək əvəzinə, əhəmiyyətli bir hissəsinin əvvəlcədən ayrılması qərarı həyata keçirilməsi təsadüfi deyil. Bu, onilliklər ərzində sistem proqramlaşdırma təcrübəsinə əsaslanan məqsədyönlü mühəndislik ticarətidir. brk() və ya mmap()-a edilən hər bir zəng istifadəçi sahəsindən kernel məkanına kontekst keçidini, prosesin virtual yaddaş xəritələrinin modifikasiyasını və potensial səhifə cədvəli yeniləmələrini əhatə edir. Müasir aparatda tək sistem çağırışı təxminən 100-200 nanosaniyəyə başa gəlir – təcrid olunmuş halda əhəmiyyətsiz, miqyasda fəlakətlidir.
İndiallaşdırma zamanı 10.000 kiçik ayırma edən proqramı nəzərdən keçirək. Əvvəlcədən ayırma olmadan bu, təxminən 1-2 millisaniyə təmiz əlavə xərcə başa gələn 10.000 sistem çağırışı deməkdir. Arena əsaslı ayırıcı ilə ilk ayırma bir sistem çağırışını işə salır və sonrakı 9,999 ayırma göstərici arifmetik və əlaqəli siyahı əməliyyatları vasitəsilə tamamilə istifadəçi məkanında xidmət göstərir - hər biri təxminən 10-50 nanosaniyə alır. Riyaziyyat birmənalı deyil: əvvəlcədən ayırma böyüklük sırasına görə qazanır.
İlk ayırdığınız zaman gördüyünüz 72 KB yaddaş boşa getmir - bu, performans sərmayəsidir. Ayırıcı proqramınızın tezliklə daha çox ayırmalar edəcəyinə mərc edir və faktiki olaraq hər real dünya ssenarisində bu mərc yaxşı nəticə verir. İstifadə edilməmiş virtual ünvan sahəsinin qiyməti müasir 64-bit sistemlərdə mahiyyətcə sıfırdır.
Virtual Yaddaş və Fiziki Yaddaş: Niyə Önəmli Deyil
Bu davranışla ilk dəfə rastlaşan tərtibatçılar arasında ümumi narahatlıq resurs israfıdır. Əgər mənə yalnız 4 bayt lazımdırsa, niyə proqramım 72 KB istehlak edir? Tənqidi fikir ondan ibarətdir ki, virtual yaddaş fiziki yaddaş deyil. glibc proqram fasiləsini 72 KB genişləndirdikdə, nüvə prosesin virtual yaddaş xəritələrini yeniləyir, lakin o, həmin səhifələri fiziki RAM ilə dərhal dəstəkləmir. Faktiki fiziki səhifələr tələb əsasında səhifə xətaları vasitəsilə bölüşdürülür — yalnız proqramınız konkret ünvana yazdıqda kernel ona real yaddaş səhifəsini təyin edir.
💡 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 →Bu o deməkdir ki, prosesinizin virtual ölçüsü 72 KB artsa da, onun rezident set ölçüsü (RSS) - faktiki olaraq istehlak edilən fiziki RAM miqdarı - yalnız faktiki toxunduğunuz səhifələr qədər artır. Tək yeni int üçün bu adətən bir 4 KB səhifədir, üstəgəl arena metadatasının hansı səhifələri tutmasından asılı olmayaraq. Qalan virtual məkan orada oturur, istifadəyə hazırdır və ünvan sahəsindən başqa heç nəyə başa gəlmir – 64 bitlik Linux sistemində 128 TB-a sahibsiniz.
İstehsal proqramlarının profilləşdirilməsi və monitorinqi zamanı bu fərq çox vacibdir. Əgər real resurs istehlakını izləmək üçün lazım olan proqram təminatı qurursunuzsa - istər SaaS backend, istər mikroservis, istərsə də biznes əməliyyatları üçün Mewayz kimi platformalarda işləyən analitik boru kəməri olsun - virtual ölçüdən çox RSS-ə həmişə nəzarət etməlisiniz. /proc/[pid]/smaps, valgrind --tool=massif və pmap kimi alətlər virtual yaddaş rəqəmlərini yanıltmaq əvəzinə sizə dəqiq fiziki yaddaş izləri verə bilər.
Müxtəlif Ayırıcılar İlk Ayrışmanı Necə İdarə edir
72 KB rəqəmi glibc-in ptmalloc2-yə xasdır. Digər ayırıcılar müxtəlif kompromislər edir və ilkin bölüşdürmə xərcləri müvafiq olaraq dəyişir. Performans baxımından həssas tətbiqlər üçün ayırıcı seçərkən bu fərqləri başa düşmək vacibdir.
- jemalloc (Facebook, FreeBSD tərəfindən istifadə olunur) — Yerli iplik keşləri ilə daha dənəvər arena strukturundan istifadə edir. İlkin əlavə məsrəf daha yüksək olmağa meyllidir (çox vaxt 200+ KB), lakin azaldılmış kilid çəkişmələri səbəbindən daha yaxşı çox yivli performans təmin edir.
- tcmalloc (Google'un Thread-Caching Malloc) — Defolt olaraq, aqressiv qabaqcadan bölüşdürmə ilə hər bir mövzu üçün təxminən 2 MB-lıq keş ayırır. İlkin əlavə xərclər daha yüksəkdir, lakin sonrakı kiçik ayırmalar olduqca sürətlidir.
- musl libc's malloc — Bütün ayırmalar üçün mmap-a əsaslanan daha sadə dizayndan istifadə edir. İlkin əlavə məsrəf minimaldır (çox vaxt hər ayırma üçün cəmi 4 KB), lakin daha tez-tez edilən sistem zəngləri səbəbindən hər bir ayırma dəyəri daha yüksəkdir.
- mimalloc (Microsoft) — 64 MB seqmentlərlə seqment əsaslı bölgüdən istifadə edir. İlk ayırma 64 MB virtual rezervasiyanı (minimum fiziki öhdəliklə), müstəsna yerlik və ötürmə qabiliyyəti üçün ticarət ünvan sahəsini işə salır.
Bu ayırıcılar arasında seçim tamamilə iş yükünüzdən asılıdır. Ağır çox yivli yerləşdirmə ilə uzun müddət işləyən server proqramları üçün jemalloc və ya tcmalloc adətən glibc-in defoltundan üstündür. Yaddaşı məhdud olan daxili sistemlər üçün, aşağı ötürmə qabiliyyətinə baxmayaraq, musl-un daha sadə yanaşmasına üstünlük verilə bilər. Əksər ümumi təyinatlı masa üstü və server proqramları üçün ptmalloc2-nin 72 KB ilkin yükü tənzimləmə olmadan yaxşı işləyən ağlabatan defoltdur.
İlkin Ayrılma Davranışının Tənzimlənməsi
Defolt 72 KB ilkin əlavə məsrəf sizin istifadə vəziyyətiniz üçün həqiqətən problemlidirsə - ola bilsin ki, siz minlərlə qısa müddətli proses yaradırsınız, hər biri yalnız bir ovuc ayırma edir - glibc mallopt() və MALLOC_ ətraf mühit dəyişənləri ailəsi vasitəsilə bir neçə tənzimlənmə təmin edir.
M_TOP_PAD parametri ayırıcının dərhal tələb olunandan artıq nə qədər əlavə yaddaş tələb etdiyinə nəzarət edir. Onu mallopt(M_TOP_PAD, 0) ilə 0-a təyin etmək, ayırıcıya yalnız lazım olanı tələb etməyi bildirir və ilkin əlavə xərcləri əhəmiyyətli dərəcədə azaldır. M_MMAP_THRESHOLD parametri yuxarıdakı ayırmaların arena əvəzinə mmap istifadə etdiyi ölçüyə nəzarət edir. M_TRIM_THRESHOLD boş yaddaşın ƏS-ə qaytarıldığını idarə edir. Və glibc 2.26-dan bəri, glibc.malloc.tcache_count və glibc.malloc.tcache_max tənzimləmələri sizə iplik keşinin davranışını idarə etməyə imkan verir.
Lakin bir xəbərdarlıq: bu parametrləri diqqətlə müqayisə etmədən tənzimləmək demək olar ki, həmişə vəziyyəti daha da pisləşdirir. Defoltlar geniş real dünya profilinə əsaslanaraq seçilmişdir və onlar iş yüklərinin böyük əksəriyyəti üçün şirin nöqtəni təmsil edir. İstehsal profilindən malloc yükünün darboğaz olduğuna dair güclü sübutunuz yoxdursa - və dəyişikliklərinizin təsirini ölçməmisinizsə - defoltları tək buraxın. Ayırıcının vaxtından əvvəl optimallaşdırılması cüzi fayda üçün saysız-hesabsız mühəndislik saatlarını sərf edən yak qırxmağın xüsusilə məkrli bir formasıdır.
Bu Sistem Proqramlaşdırması Haqqında Bizə Nəyi Öyrənir
72 KB-lıq ilk ayırma sirri, əsas etibarilə, abstraksiya təbəqələri haqqında dərsdir. C++ sizə yeni intin 4 bayt ayırdığı illüziyasını verir. Dil standartı belə deyir. Zehni modeliniz belə deyir. Lakin kodunuz və aparat arasında mürəkkəb sistemlər yığını yerləşir – C++ işləmə vaxtı, C kitabxanası ayırıcısı, nüvənin virtual yaddaş alt sistemi və aparatın MMU və TLB – hər biri öz davranışlarını, optimallaşdırmalarını və əlavə xərclərini əlavə edir.
Bu, qüsur deyil. Sistem proqram təminatının bütün nöqtəsidir. Hər bir təbəqə real problemi həll etmək üçün mövcuddur: ayırıcı mövcuddur ki, siz hər ayırma üçün sistem çağırışları etmək məcburiyyətində deyilsiniz. Virtual yaddaş sistemi mövcuddur ki, siz fiziki yaddaşı birbaşa idarə etməli olmayacaqsınız. Səhifə xətalarının idarəedicisi mövcuddur, ona görə də yaddaş tənbəl və səmərəli işlənir. Hər bir təbəqə böyük həcmdə performans və rahatlıq üçün az miqdarda şəffaflıq alır.
Ən etibarlı, ən yüksək performanslı sistemləri quran tərtibatçılar bu təbəqələri başa düşənlərdir – onlar haqqında daim düşünmək lazım olduğuna görə deyil, gözlənilməz bir şey baş verəndə (sirli 72 KB ayırma kimi) bunun səbəbini başa düşmək üçün zehni modelə malikdirlər. İstər real vaxt rejimində ticarət sistemi, istər oyun mühərriki, istərsə də minlərlə istifadəçiyə xidmət göstərən biznes platforması qurursunuz, kodunuzun sistem səviyyəsində əslində nə etdiyi barədə fikir yürütmək bacarığı savadlı tərtibatçıları müstəsnalardan ayırır. 72 KB səhv deyil. Bu sizin paylayıcınızdır, öz işini mükəmməl şəkildə yerinə yetirir.
Bu gün Biznes ƏS-inizi Yaradın
Frilanserlərdən tutmuş agentliklərə qədər Mewayz 207 inteqrasiya modulu ilə 138.000+ biznesə səlahiyyət verir. Pulsuz başlayın, böyüdükcə təkmilləşdirin.
Pulsuz Hesab Yaradın→Try Mewayz Free
All-in-one platform for CRM, invoicing, projects, HR & more. No credit card required.
Get more articles like this
Weekly business tips and product updates. Free forever.
You're subscribed!
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 →Related articles
Hacker News
Bluesky has been dealing with a DDoS attack for nearly a full day
Apr 17, 2026
Hacker News
Human Accelerated Region 1
Apr 17, 2026
Hacker News
Discourse Is Not Going Closed Source
Apr 17, 2026
Hacker News
Substrate AI Is Hiring Harness Engineers
Apr 17, 2026
Hacker News
US Bill Mandates On-Device Age Verification
Apr 17, 2026
Hacker News
Show HN: SPICE simulation → oscilloscope → verification with Claude Code
Apr 17, 2026
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