Zergatik da lehen C++ (m)esleipena beti 72 KB?
Iruzkinak
Mewayz Team
Editorial Team
Zure lehen C++ esleipenaren atzean dagoen misterioa
C++ programa sinple bat idazten duzu. Int berri bakarra. Lau byte. strace edo zure gogoko memoria profilera abiarazten duzu, eta hor dago: zure prozesuak gutxi gorabehera 72 KB eskatu zizkion sistema eragileari. Ez 4 byte. Ez 64 byte. 72 KB osoa. Inoiz zenbaki horri begira egon bazara eta zure tresneria gezurretan ari ote zen galdetu bazenuen, ez zaude bakarrik. Itxuraz bitxia den portaera hau C++-ko garatzaileen artean lehen aldiz memoria barnean sakontzen duten galderetako bat da, eta erantzunak bidaia liluragarri batera eramaten gaitu zure kodearen eta benetako hardwarearen artean dauden geruzetan zehar.
Zer gertatzen da berria
deitzen duzunean72 KB-ko zifra ulertzeko, esleipen-kate osoa trazatu behar duzu. Zure C++ kodea new int exekutatzen denean, konpilatzaileak hori operator new dei batean itzultzen du, Linux sistema gehienetan glibc-etik malloc delegatzen duena. Baina mallocek ez dio zuzenean kernelari 4 byteko memoria eskatzen. Nukleoak orrialdetan funtzionatzen du - normalean 4 KB x86_64-n - eta sistema-dei baten kostua izugarria da memoria sarbide soil baten aldean. Banakako esleipen bakoitzeko brk() edo mmap() deituz gero, edozein programa ez-trivial geldituko litzateke.
Hainbat, glibc-ren memoria-esleitzaileak — ptmalloc2 izeneko inplementazioa, Doug Learen dlmalloc klasikotik datorrena — bitartekari gisa jokatzen du. Memoria bloke handiak eskatzen ditu nukleotik aldez aurretik, eta gero zati txikiagoetan zatitzen ditu zure programak behar dituen heinean. Hau da zure lehen 4 byteko esleipenak sistema eragileari eskaera askoz handiagoa abiarazten dion oinarrizko arrazoia. Esleitzailea ez da alferrik galtzen ari. Estrategikoa izaten ari da.
72 KB-en disekzioa: nora doazen byteak
Hasierako esleipen-gastuak exekuzio-denborak hasieratu behar dituen hainbat osagaietatik dator, memoria erabilgarriaren byte bakar bat ere eman aurretik. Osagai bakoitza ulertzeak azaltzen du zergatik heltzen den zenbakia dagoen lekuan.
Lehenik eta behin, glibc-en malloc-ek esparru nagusia hasieratzen du — hari nagusiko esleipen guztien jarraipena egiten duen kontabilitatearen egitura nagusia. Alor honek metadatuak biltzen ditu, esleipen-tamaina ezberdinetarako zerrenda libreko erakusleak eta bin-egiturak. Esleitzaileak programaren etenaldia sbrk() bidez hedatzen du, eta hasierako luzapena M_TOP_PAD izeneko barne-parametro batek zuzentzen du, 128 KB-ko betegarritasuna lehenesten duena. Hala ere, benetako hasierako eskaera orrien lerrokadurarako eta lehendik dagoen eten-posiziorako doitzen da, eta horrek sarritan lehen eskaera txikiagoa izaten du, normalean 72 KB-ko zifra horretatik gertu abiatzen da hasi berri den prozesu batean.
Bigarrenik, glibc 2.26tik aurrera, esleitzaileak thread-local cache (tcache) hasieratzen du lehen erabileran. Tcache-ak 64 edukiontzi ditu (esleipen txikiko tamainako klase bakoitzeko bat), eta bakoitzak cacheko 7 zati eduki ditzake. tcache_perthread_structek berak 1 KB inguru kontsumitzen du, baina hasierako ekintzak arena konfigurazio zabalagoa abiarazten du. Hirugarrenik, C++ exekuzio-denborak dagoeneko egin ditu esleipenak zure main() exekutatu baino lehen — konstruktore estatikoek, std::coutentzako iostream buffer-en hasierak eta lokalizazio-konfigurazioak hasierako heap-aztarna horretan laguntzen dute.
Arena sistema eta zergatik den adimenduna aurre-esleipena
Memoriaren zati handi bat zatika eskatzea baino aldez aurretik esleitzea erabakia ez da ezarpenaren ustekabea. Sistemak programatzeko hainbat hamarkadatako esperientzian errotutako ingeniaritza-konpromiso bat da. brk() edo mmap()-ra dei bakoitzak erabiltzaile-espaziotik nukleo-espaziora testuinguru-aldaketa bat dakar, prozesuaren memoria birtualaren mapak aldatzea eta orrialde-taularen eguneratzeak. Hardware modernoan, sistema-dei bakarrak 100-200 nanosegundo kostatzen du gutxi gorabehera - hutsala modu isolatuan, hondamendia eskalan.
Kontuan hartu hasieratzerakoan 10.000 esleipen txiki egiten dituen programa bat. Aurre-esleipenik gabe, horrek 10.000 sistema-dei ekarriko lituzke, gutxi gorabehera 1-2 milisegundoko kostu hutsaren kostua. Arenan oinarritutako esleitzaile batekin, lehenengo esleipenak sistema-dei bakarra abiarazten du, eta ondorengo 9.999 esleipenak erabiltzaile-espazioan zerbitzatzen dira guztiz erakusle aritmetika eta estekatutako zerrenda-eragiketen bidez, bakoitzak 10-50 nanosegundo gutxi gorabehera. Matematika ez da anbiguoa: aurre-esleipena irabazten du magnitude-ordenaren arabera.
Zure lehen esleipenean ikusten dituzun 72 KB ez dira alferrik galduko memoria; errendimendu-inbertsioa da. Esleitzaileak zure programak laster esleipen gehiago egingo dituela apustu egiten du, eta ia mundu errealeko eszenatoki guztietan, apustu horrek ederki ordaintzen du. Erabiltzen ez den helbide birtualen espazioaren kostua, funtsean, zero da 64 biteko sistema modernoetan.
Memoria birtuala eta memoria fisikoa: zergatik ez du axola
Jokaera hau lehen aldiz aurkitzen duten garatzaileen artean ohiko kezka bat baliabideen xahutzea da. 4 byte bakarrik behar baditut, zergatik kontsumitzen du nire programak 72 KB? Ikuspegi kritikoa da memoria birtuala ez dela memoria fisikoa. Glibc-ek programaren etenaldia 72 KB luzatzen duenean, nukleoak prozesuaren memoria birtualaren mapak eguneratzen ditu, baina ez ditu berehala atzera egiten orrialde horiek RAM fisikoarekin. Benetako orrialde fisikoak eskaeraren arabera esleitzen dira orrien akatsen bidez — zure programak helbide zehatz batean idazten duenean soilik esleitzen dio nukleoak memoria orri erreal bat.
💡 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 →Horrek esan nahi du zure prozesuaren tamaina birtuala 72 KB handitzen den arren, bere egoiliarren multzoaren tamaina (RSS) — benetan kontsumitzen den RAM fisikoaren kopurua — benetan ukitzen dituzun orrialdeetan soilik handitzen dela. New int bakarrerako, normalean 4 KB-ko orri bat da, gehi arena metadatuak hartzen dituen orrialdeak. Gainerako espazio birtuala bertan dago, erabiltzeko prest, helbide-espazioa baino ez du balio; horietatik 128 TB dituzu 64 biteko Linux sistema batean.
Bereizkuntza hau funtsezkoa da produkzio-aplikazioak profilak egitean eta monitorizatzean. Baliabideen kontsumo errealaren jarraipena egin behar duen softwarea eraikitzen ari bazara - SaaS backend bat, mikrozerbitzu bat edo negozio-eragiketetarako Mewayz bezalako plataformetan exekutatzen diren bezalako analitika kanala izan - beti kontrolatu beharko zenuke RSS tamaina birtuala baino. /proc/[pid]/smaps, valgrind --tool=massif eta pmap bezalako tresnek memoria fisikoaren aztarna zehatzak eman diezazukete, memoria birtualeko zifrak engainatu beharrean.
Esleitzaile ezberdinek nola kudeatzen duten lehen esleipena
72 KB-ko zifra glibc-en ptmalloc2-ren espezifikoa da. Beste esleitzaile batzuek truke desberdinak egiten dituzte, eta hasierako esleipen-gastuak horren arabera aldatzen dira. Desberdintasun hauek ulertzea baliotsua da errendimenduarekiko sentikorrak diren aplikazioetarako esleitzaile bat aukeratzerakoan.
- jemalloc (Facebook-ek, FreeBSD-ek erabilia) — Egitura zehatzagoa erabiltzen du hari lokaleko cacheekin. Hasierako gainkostua handiagoa izan ohi da (askotan 200 KB-tik gorakoa), baina hari anitzeko errendimendu hobea eskaintzen du blokeoen gatazka murrizteagatik.
- tcmalloc (Google-ren Thread-Caching Malloc) — 2 MB inguruko hari bakoitzeko cache bat esleitzen du lehenespenez, aurre-esleipen oldarkorrarekin. Hasierako gastuak handiagoak dira, baina ondorengo esleipen txikiak oso azkarrak dira.
- musl libc-en malloc — mmapen oinarritutako diseinu askoz errazagoa erabiltzen du esleipen guztietarako. Hasierako kostua gutxienekoa da (askotan 4 KB esleipen bakoitzeko), baina esleipen bakoitzeko kostua handiagoa da sistema-deiak maizago direlako.
- mimalloc (Microsoft) — Segmentuetan oinarritutako esleipena erabiltzen du 64 MBko segmentuekin. Lehenengo esleipenak 64 MB-ko erreserba birtuala abiarazten du (konpromiso fisiko minimoarekin), helbide-espazioa salbuespeneko tokiko eta abiadurarekin saltzeko.
Esleitzaile hauen arteko aukera zure lan-kargaren araberakoa da erabat. Iraupen luzeko hari anitzeko esleipen handia duten zerbitzari-aplikazioetarako, jemalloc edo tcmalloc normalean glibc-en lehenetsia gainditzen dute. Memoriak mugatutako sistema txertatuetarako, musl-en hurbilketa sinpleagoa hobe daiteke errendimendu txikiagoa izan arren. Erabilera orokorreko mahaigaineko eta zerbitzariko aplikazio gehienetarako, ptmalloc2-ren 72 KB-ren hasierako gain-gainak arrazoizko lehenetsia adierazten du, sintonizatu gabe ondo funtzionatzen duena.
Hasierako esleipenaren portaera doitzea
Hasierako 72 KB lehenetsitako gainkostua zure erabilera kasurako benetan arazotsua bada — agian iraupen laburreko milaka prozesu sortzen ari zara, bakoitzak esleipen gutxi batzuk besterik ez ditu egiten — glibc-k hainbat doigarri eskaintzen ditu mallopt() eta MALLOC_ ingurune-aldagaien familia
bidez.M_TOP_PAD parametroak esleitzaileak berehala behar denaz gain zenbat memoria gehigarri eskatzen duen kontrolatzen du. mallopt(M_TOP_PAD, 0)-rekin 0 ezarriz gero, esleitzaileari behar dena soilik eskatzeko esaten dio, hasierako gainkostua nabarmen murriztuz. M_MMAP_THRESHOLD parametroak esleipenek arena izan beharrean mmap erabiltzen duten tamaina kontrolatzen du. M_TRIM_THRESHOLD kontrolatzen du noiz itzultzen den askatutako memoria OSra. Eta glibc 2.26tik aurrera, glibc.malloc.tcache_count eta glibc.malloc.tcache_max doigarriek hari-cachearen portaera kontrolatzeko aukera ematen dizute.
Hala ere, kontu handi bat: parametro hauek sintonizatzeak benchmarking kontu handirik gabe ia beti okerrera egiten du. Lehenetsiak mundu errealeko profil zabalean oinarrituta aukeratu ziren, eta lan-karga gehienentzako leku gozoa adierazten dute. Malloc overhead botila-lepoa dela dioen ekoizpen-profiletik froga sendorik ez baduzu, eta zure aldaketen eragina neurtu baduzu, utzi lehenetsiak bakarrik. Esleitzailearen optimizazioa goiztiarra da yak bizarra egiteko forma bereziki maltzurra, eta ingeniaritza ordu ugari kontsumitu ditu onura hutsaletarako.
Honek zer irakasten digu Sistemen programazioari buruz
72 KB-ko lehen esleipenaren misterioa abstrakzio-geruzeiri buruzko ikasgaia da bere oinarrian. C++-k new int 4 byte esleitzen dituelako ilusioa ematen dizu. Hizkuntza estandarrak hala dio. Zure eredu mentalak hala dio. Baina zure kodearen eta hardwarearen artean sistema sofistikatuen pila bat dago: C++ exekuzioa, C liburutegien esleitzailea, nukleoaren memoria birtualaren azpisistema eta hardwarearen MMU eta TLB, bakoitzak bere jokabideak, optimizazioak eta gainkostuak gehituz.
Hau ez da akats bat. Sistemaren softwarearen puntu osoa da. Geruza bakoitza benetako arazo bat konpontzeko existitzen da: esleitzailea existitzen da, beraz, ez duzu sistema deirik egin behar esleipen bakoitzeko. Memoria birtualaren sistema existitzen da, beraz, ez duzu memoria fisikoa zuzenean kudeatu beharrik. Orriaren akatsen kudeatzailea existitzen da, beraz, memoria alfer eta eraginkortasunez konprometitzen da. Geruza bakoitzak gardentasun kopuru txiki bat trukatzen du errendimendu eta erosotasun kopuru handiarekin.
Sistema fidagarrienak eta errendimendu handienak eraikitzen dituzten garatzaileak geruza hauek ulertzen dituztenak dira, ez etengabe haietan pentsatu behar dutelako, baizik eta ustekabeko zerbait gertatzen denean (72 KB-ko esleipen misteriotsu bat adibidez), zergatik ulertzeko eredu mentala dutelako. Denbora errealeko merkataritza-sistema bat, joko-motor bat edo milaka erabiltzaileri zerbitzatzeko negozio-plataforma bat eraikitzen ari zaren ala ez, zure kodeak sistema mailan benetan zer egiten duen arrazoitzeko gaitasuna da garatzaile eskudunak apartekoetatik bereizten dituena. 72 KB ez da akats bat. Zure esleitzailea da bere lana bikain egiten ari dena.
Eraiki zure negozioa gaur egun
Independienteetatik hasi eta agentzietaraino, Mewayz-ek 138.000 enpresa baino gehiago sustatzen ditu 207 modulu integraturekin. Hasi doan, handitzen zarenean eguneratu.
Sortu doako kontua →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
Show HN: Spice simulation → oscilloscope → verification with Claude Code
Apr 17, 2026
Hacker News
Hospital at centre of child HIV outbreak caught reusing syringes in Pakistan
Apr 16, 2026
Hacker News
George Orwell Predicted the Rise of "AI Slop" in Nineteen Eighty-Four (1949)
Apr 16, 2026
Hacker News
Everything we like is a psyop
Apr 16, 2026
Hacker News
U.S. to Create High-Tech Manufacturing Zone in Philippines
Apr 16, 2026
Hacker News
New unsealed records reveal Amazon's price-fixing tactics, California AG claims
Apr 16, 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