Hacker News

Chifukwa chiyani gawo loyamba la C++ (m) nthawi zonse limakhala 72 KB?

Ndemanga

8 min read Via joelsiks.com

Mewayz Team

Editorial Team

Hacker News

Chinsinsi Chotsatira Kugawikana Kwanu Koyamba kwa C++

Mumalemba pulogalamu yosavuta ya C++. A singleint imodzi. Mabayiti anayi. Mumayatsa strace kapena mbiri yanu yomwe mumakonda, ndipo ndi izi - ndondomeko yanu yangopempha pafupifupi 72 KB kuchokera pa opaleshoni. Osati 4 mabayiti. Osati 64 byte. 72 KB yathunthu. Ngati munayang'anapo nambala imeneyo ndikudabwa ngati chida chanu chikunama, simuli nokha. Khalidwe lowoneka ngati lodabwitsali ndi limodzi mwamafunso omwe amafunsidwa pafupipafupi pakati pa opanga ma C++ omwe amafufuza kwa nthawi yoyamba, ndipo yankho likutifikitsa paulendo wosangalatsa wodutsa zigawo zomwe zimakhala pakati pa ma code anu ndi zida zenizeni.

Zomwe Zimachitika Mukamayimba zatsopano

Kuti mumvetse chiwerengero cha 72 KB, muyenera kufufuza zonse zomwe zagawidwa. Khodi yanu ya C++ ikachita intyatsopano, wophatikiza amamasulira izi kukhala kuyitanira kwa othandizira atsopano, omwe pamakina ambiri a Linux amatumiza ku mallockuchokera ku glibc. Komamallocsafunsa mwachindunji kernel kwa 4 bytes kukumbukira. Kernel imagwira ntchito m'masamba - nthawi zambiri 4 KB pa x86_64 - ndipo mtengo wakuyimbira foni ndi wokulirapo wokhudzana ndi kukumbukira kosavuta. Kuyimbira brk() kapena mmap() pagawo lililonse la munthu aliyense kungapangitse kuti pulogalamu iliyonse yosakhala yang'ono kuyimitsidwa.

M'malo mwake, glibc's memory allocator - kukhazikitsa kotchedwa ptmalloc2, komweko kumachokera ku Doug Lea's classic dlmalloc - amachita ngati pakati. Imapempha zokumbukira zazikulu kuchokera ku kernel yakutsogolo, kenako ndikuzijambula kukhala tizidutswa tating'ono monga momwe pulogalamu yanu imafunira. Ichi ndi chifukwa chake kugawa kwanu koyamba kwa 4-byte kumayambitsa pempho lokulirapo ku makina ogwiritsira ntchito. Wopereka ndalamayo sawononga. Ndikuchita mwanzeru.

Kugawa 72 KB: Kumene Ma Byte Amapita

Kugawa koyambirira kumachokera ku zigawo zingapo zomwe nthawi yothamanga iyenera kuyambitsa isanakupatseni kukumbukira kamodzi kokha. Kumvetsetsa gawo lililonse kumafotokoza chifukwa chake nambalayo imafikira pomwe imafika.

Choyamba, glibc's malloc imayambitsa main arena — dongosolo losungira mabuku lomwe limatsata magawo onse pa ulusi waukulu. Bwaloli limaphatikizapo metadata ya mulu, zolozera pamndandanda waulere, ndi ma bin amitundu yosiyanasiyana yogawa. Woperekayo amawonjezera kutha kwa pulogalamu kudzera pa sbrk(), ndipo kuwonjezera koyambirira kumayendetsedwa ndi gawo lamkati lotchedwa M_TOP_PAD, lomwe limasinthidwa kukhala 128 KB ya padding. Komabe, pempho lenilenilo limasinthidwa kuti ligwirizane ndi tsamba ndi malo omwe alipo, zomwe nthawi zambiri zimabweretsa pempho laling'ono - nthawi zambiri zimatera pafupi ndi chiwerengero cha 72 KB pa ndondomeko yomwe yangoyamba kumene.

Chachiwiri, popeza glibc 2.26, wopereka ndalamayo ayambitsa kache ya m'deralo (tcache) pakugwiritsa ntchito koyamba. Tcache ili ndi nkhokwe 64 (imodzi pagulu laling'ono laling'ono), iliyonse imatha kusunga ma chunks 7 osungidwa. tcache_perthread_structyokha imawononga pafupifupi 1 KB, koma kuyambitsa kumayambitsa kukhazikitsidwa kwabwalo lalikulu. Chachitatu, nthawi yogwiritsira ntchito C++ yapereka kale magawo anu main() yanu isanayendenso — omanga osasunthika, kuyambitsa kwa buffer kwa iostream kwa std::cout ndi abwenzi, ndi kuyika malo onse amathandizira pamilu yoyambira.

The Arena System ndi Chifukwa Chake Pre-Allocation Ndi Yanzeru

Chigamulo chogawiratu gawo lalikulu la kukumbukira m'malo mopempha pang'onopang'ono sikungochitika mwangozi. Ndi ntchito yaukadaulo yadala yomwe idakhazikitsidwa muzaka zambiri zamadongosolo amadongosolo. Kuyitanira kulikonse ku brk() kapena mmap() kumakhudza kusinthana ndi kusintha kuchokera pa malo ogwiritsira ntchito kupita ku kernel space, kusinthidwa kwa mapu okumbukira zomwe zikuchitika, ndi zosintha za tebulo lamasamba. Pazida zamakono, kuyimba foni kamodzi kumawononga pafupifupi 100-200 nanoseconds - yaying'ono podzipatula, yowopsa kwambiri.

Ganizirani za pulogalamu yomwe imapanga magawo 10,000 ang'onoang'ono poyambitsa. Popanda kugawiratu, izi zitha kutanthauza mafoni amtundu wa 10,000, okwera mtengo pafupifupi 1-2 milliseconds yamutu weniweni. Ndi gawo lotengera mabwalo, gawo loyamba limayambitsa kuyimba kamodzi, ndipo magawo 9,999 otsatirawa amathandizidwa kwathunthu m'malo ogwiritsira ntchito pogwiritsa ntchito ma pointer masamu ndi ntchito zolumikizana - chilichonse chimatenga pafupifupi 10-50 nanoseconds. Masamu ndi osadziwika: kugawa kusanachitike kumapambana potengera kukula kwake.

72 KB yomwe mukuwona pakugawika kwanu koyamba sikungowonongeka - ndi ndalama zogwirira ntchito. Ogawa akubetcha kuti pulogalamu yanu ipereka ndalama zambiri posachedwa, ndipo pafupifupi zochitika zenizeni padziko lonse lapansi, kubetcheranako kumapindulitsa kwambiri. Mtengo wa malo a adilesi osagwiritsidwa ntchito kwenikweni ndi ziro pamakina amakono a 64-bit.

Virtual Memory vs. Physical Memory: Chifukwa Chimene Zilibe Zofunika

Nkhawa yodziwika pakati pa otukula omwe akumana ndi izi koyamba ndikuwononga zida. Ngati ndingofunika ma 4 mabayiti, chifukwa chiyani pulogalamu yanga ikudya 72 KB? Kuzindikira kofunikira ndikutikukumbukira kwenikweni sikumakumbukira zakuthupi. glibc ikakulitsa pulogalamuyo ndi 72 KB, kernel imasinthanso mamapu okumbukira momwemo, koma siyibwereranso masambawo ndi RAM. Masamba enieni amagawika pofunidwa kudzera zolakwika zamasamba — pokhapokha pulogalamu yanu ikalembera ku adilesi inayake pomwe kernel imapatsa tsamba lenileni la kukumbukira.

💡 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 →

Izi zikutanthawuza kuti ngakhale kukula kwa ndondomeko yanu kumawonjezeka ndi 72 KB, kukula kwake komwe kumakhala (RSS) - kuchuluka kwa RAM yomwe imadyedwa - kumawonjezeka ndi masamba omwe mumagwira. Kwa int imodzi yokha, ili ndi tsamba limodzi la 4 KB, kuphatikiza masamba aliwonse omwe metadata ya m'bwalo imakhala. Malo otsalawo amakhala pamenepo, okonzeka kugwiritsidwa ntchito, osatengera chilichonse koma malo adilesi - pomwe muli ndi 128 TB pa 64-bit Linux system.

Kusiyanitsa kumeneku ndikofunikira kwambiri mukamayang'anira ndikuwunika momwe ntchito zikuyendera. Ngati mukumanga mapulogalamu omwe amafunikira kuyang'anira kagwiritsidwe ntchito kazinthu zenizeni - kaya ndi SaaS backend, microservice, kapena analytics pipeline monga zomwe zimayenda pa nsanja monga Mewayzzochita zamalonda - muyenera kuyang'anira RSS nthawi zonse kusiyana ndi kukula kwake. Zida monga /proc/[pid]/smaps, valgrind --tool=massif, ndi pmap zitha kukupatsani zolondola zokumbukira m'malo mosocheretsa makumbukidwe.

Momwe Ogawa Amagwirira Ntchito Pogawa Choyamba

Chiwerengero cha 72 KB ndi cha glibc's ptmalloc2. Ogawa ena amapanga ma tradeoffs osiyanasiyana, ndipo kugawa koyamba kumasiyanasiyana molingana. Kumvetsetsa kusiyana kumeneku n'kofunika kwambiri posankha wopereka ndalama kuti agwiritse ntchito ntchito zomwe zimakhudzidwa ndi ntchito.

  • jemalloc (yogwiritsidwa ntchito ndi Facebook, FreeBSD) - Imagwiritsa ntchito mawonekedwe a mabwalo a granular ndi ma cache am'deralo. Kumutu koyambirira kumakhala kokwezeka (nthawi zambiri 200+ KB) koma kumapereka magwiridwe antchito amitundu yambiri chifukwa cha kuchepa kwa mikangano ya loko.
  • tcmalloc (Google's Thread-Caching Malloc) — Imagawira posungira pamndandanda wa pafupifupi 2 MB mwachisawawa, ndikugawiratu mwaukali. Zoyambira zoyambira ndizambiri, koma zogawika zing'onozing'ono zotsatizana nazo zimathamanga kwambiri.
  • musl libc's malloc — Amagwiritsa ntchito mapangidwe osavuta kutengera mmap pamagawidwe onse. Kukwera koyamba kumakhala kochepa (nthawi zambiri kumangokhala 4 KB pa gawo lililonse), koma mtengo wagawo lililonse ndi wokwera chifukwa cha mafoni obwera pafupipafupi.
  • mimalloc (Microsoft) — Imagwiritsa ntchito magawo otengera magawo omwe ali ndi magawo 64 MB. Kugawika koyamba kumayambitsa kusungitsa kwa 64 MB (popanda kudzipereka pang'ono), malo ogulitsira maadiresi a malo apadera komanso momwe amagwirira ntchito.

Kusankha pakati pa ogawawa kumatengera kuchuluka kwa ntchito yanu. Pamapulogalamu anthawi yayitali a seva okhala ndi ulusi wambiri, jemalloc kapena tcmalloc nthawi zambiri amapambana kusakhazikika kwa glibc. Pamakina okhazikika okumbukira kukumbukira, njira yosavuta ya musl ingakhale yabwino ngakhale kutsika kochepa. Pazinthu zambiri zapakompyuta ndi maseva, ptmalloc2's 72 KB pamwamba pake imayimira kusakhazikika koyenera komwe kumagwira ntchito bwino popanda kukonza.

Kukonza Makhalidwe Oyamba Ogawira

Ngati 72 KB yosasintha ili ndi vuto pakugwiritsa ntchito kwanu - mwina mukupanga masauzande azinthu kwakanthawi kochepa, iliyonse ikupanga magawo ochepa chabe - glibc imapereka zosinthika zingapo kudzera pa mallopt() ndi MALLOC_ banja la zosintha zachilengedwe.

Zigawo za M_TOP_PAD zimayang'anira kuchuluka kwa zokumbukira zomwe woperekayo apempha kuposa zomwe zimafunikira nthawi yomweyo. Kuyiyika ku 0 ndi mallopt(M_TOP_PAD, 0) imauza wopereka ndalama kuti apemphe zomwe zikufunika, kuchepetsa kuwonjezereka koyambirira kwambiri. Zoyimira M_MMAP_THRESHOLD zimayang'anira kukula komwe kugawika kumagwiritsira ntchito mmap m'malo mwabwalo. The M_TRIM_THRESHOLD amawongolera pamene kukumbukira komasulidwa kubwezeretsedwa ku OS. Ndipo popeza glibc 2.26, makina a glibc.malloc.tcache_count ndi glibc.malloc.tcache_max amakulolani kulamulira khalidwe la cache ya ulusi.

Komabe, chenjezo: kukonza magawowa mosayika chizindikiro nthawi zonse kumapangitsa kuti zinthu ziipireipire. Zosasintha zidasankhidwa kutengera mbiri yapadziko lonse lapansi, ndipo zimayimira malo abwino pantchito zambiri. Pokhapokha mutakhala ndi umboni wamphamvu kuchokera ku mbiri ya kupanga kuti malloc pamwamba ndi botolo - ndipo mwayesa zotsatira za kusintha kwanu - siyani zolakwika zokha. Kukhathamiritsa msanga kwa wotumizira ndi njira yobisika yometa yak yomwe yawononga maola ambiri a uinjiniya kuti apindule kwambiri.

Zomwe Izi Zikutiphunzitsa Zokhudza Systems Programming

Chinsinsi cha kugawa koyamba kwa 72 KB ndi, pachimake, phunziro lokhudza magawo ang'onoang'ono. C ++ imakupatsani chinyengo kutiint yatsopano imagawa ma byte 4. Mulingo wa chilankhulo umatero. Malingaliro anu amatero. Koma pakati pa ma code anu ndi hardware pali mulu wa machitidwe apamwamba - C++ runtime, C library allocator, kernel's virtual memory subsystem, ndi hardware's MMU ndi TLB - aliyense akuwonjezera makhalidwe ake, kukhathamiritsa, ndi pamwamba.

Ichi si cholakwika. Ndilo gawo lonse la pulogalamu yamapulogalamu. Chigawo chilichonse chilipo kuti chithetse vuto lenileni: woperekayo alipo kotero kuti simuyenera kuyimba foni pagawo lililonse. Dongosolo la kukumbukira lilipo kotero kuti simuyenera kuyang'anira kukumbukira kwenikweni. Tsamba la zolakwika lilipo kotero kukumbukira kumapangidwa mwaulesi komanso mwaluso. Chigawo chilichonse chimagulitsa kuwonekera pang'ono kuti pakhale ntchito zambiri komanso kuti zitheke.

Madivelopa omwe amamanga machitidwe odalirika, apamwamba kwambiri ndi omwe amamvetsetsa zigawozi - osati chifukwa choti amayenera kuziganizira nthawi zonse, koma chifukwa pamene chinachake chosayembekezereka chikuchitika (monga kugawa kwachinsinsi kwa 72 KB), ali ndi chitsanzo chamaganizo kuti amvetse chifukwa chake. Kaya mukumanga njira yogulitsira nthawi yeniyeni, injini yamasewera, kapena nsanja yabizinesi yomwe imathandizira ogwiritsa ntchito masauzande ambiri, kutha kuganiza za zomwe khodi yanu imachita pamlingo wamakina ndizomwe zimalekanitsa opanga odziwa ntchito ndi apadera. 72 KB si cholakwika. Ndi opereka anu akugwira ntchito yake mozindikira.

Pangani Bizinesi Yanu OS Lero

Kuchokera kwa odziyimira pawokha mpaka mabungwe, Mewayz imapatsa mphamvu mabizinesi 138,000+ okhala ndi magawo 207 ophatikizika. Yambani kwaulere, sinthani mukakula.

Pangani Akaunti Yaulere →

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