Hacker News

Ke hobane'ng ha kabo ea pele ea C++ (m) e lula e le 72 KB?

Maikutlo

12 min read Via joelsiks.com

Mewayz Team

Editorial Team

Hacker News

Sephiri se ka Mora Kabo ea Hao ea Pele ea C++

O ngola lenaneo le bonolo la C++. Ntho e le 'ngoe ee ncha. Li-byte tse 'nè. U chesa strace kapa profaele ea hau ea memori eo u e ratang, 'me e teng - ts'ebetso ea hau e sa tsoa kopa 72 KB ho tsoa ho sistimi e sebetsang. Ha se li-byte tse 4. Ha se li-byte tse 64. E feletseng 72 KB. Haeba u kile ua sheba palo eo 'me ua ipotsa hore na sesebelisoa sa hau se bua leshano ho uena, ha u mong. Boitšoaro bona bo bonahalang bo sa tloaeleha ke e 'ngoe ea lipotso tse botsoang khafetsa har'a bahlahisi ba C++ ba ntseng ba cheka ka hare ho memori khetlo la pele, 'me karabo e re nka leetong le tsotehang ho pholletsa le likarolo tse lutseng pakeng tsa khoutu ea hau le hardware ea sebele.

Ho Etsahala'ng Ha U Bitsa e ncha

Ho utloisisa palo ea 72 KB, o hloka ho ts'oara ketane e felletseng ea kabo. Ha khoutu ea hau ea C++ e kenya int e ncha, moqapi o fetolela hoo ho etsa pitso ho mosebetsi e mocha, eo ho litsamaiso tse ngata tsa Linux e e romelang ho malloc ho tloha glibc. Empamallocha e botse kernel ka ho toba bakeng sa 4 bytes ea memori. Kernel e sebetsa maqepheng - hangata 4 KB ho x86_64 - mme litšenyehelo tsa mohala oa sistimi li kholo haholo ha li bapisoa le phihlello e bonolo ea memori. Ho letsetsa brk() kapa mmap() bakeng sa kabo e 'ngoe le e 'ngoe ho ka etsa hore lenaneo lefe kapa lefe le sa reng letho le eme.

Ho e-na le hoo, glibc's memory allocator - ts'ebetsong e bitsoang ptmalloc2, ka boeona e theohile ho Doug Lea's classic dlmalloc - e sebetsa e le motho ea bohareng. E kopa li-blocks tse kholo ho tloha kernel e ka pele, ebe e li betla likotoana tse nyane ha lenaneo la hau le li hloka. Lena ke lona lebaka la bohlokoa kabo ea hau ea pele ea 4-byte e bakang kopo e kholoanyane ho sistimi e sebetsang. Moabi ha a senyehe. E ntse e etsoa leano.

Ho arola 72 KB: Moo Li-byte li eang teng

Tlhaloso ea pele ea kabo e tsoa ho likarolo tse 'maloa tse ikhethileng tseo nako ea ho sebetsa e tlamehang ho e qala pele e ka u fa memori e le 'ngoe e ka sebelisoang. Ho utloisisa karolo ka 'ngoe ho hlalosa hore na ke hobane'ng ha palo e fihla moo e fihlang teng.

Ntlha ea pele, glibc's malloc e qala main arena — sebopeho sa mantlha sa pokello ea libuka se latellang likabo tsohle khoeleng e kholo. Lebala lena le kenyelletsa metadata bakeng sa qubu, lintlha tsa lethathamo la mahala, le meaho ea meqomo bakeng sa boholo bo fapaneng ba kabo. Mofani o eketsa khefu ea lenaneo ka sbrk(), 'me katoloso ea pele e laoloa ke parameter e ka hare e bitsoang M_TOP_PAD, e sa fetoheng ho 128 KB ea padding. Leha ho le joalo, kopo ea mantlha e lokisoa bakeng sa ho tsamaisana le maqephe le boemo bo teng ba ho robeha, hoo hangata ho fellang ka kopo e nyane ea pele - hangata e oela haufi le palo ea 72 KB mabapi le ts'ebetso e sa tsoa qala.

Ya bobedi, ho tloha ka glibc 2.26, mofani wa thepa o qala cache ea sebaka sa khoele (tcache) ts'ebelisong ea pele. Tcache e na le meqomo e 64 (e le 'ngoe ka sehlopha sa boholo ba kabo e nyane), e' ngoe le e 'ngoe e khona ho boloka likotoana tse 7 tse bolokiloeng. The tcache_perthread_structka boeona e sebelisa hoo e ka bang 1 KB, empa ketso ea ho e qala e etsa hore ho be le ho hlophisoa ha lebala ka bophara. Taba ea boraro, nako ea ts'ebetso ea C++ e se e fane ka likabelo pele main() ea hau e sebetsa - lihahi tse tsitsitseng, iostream buffer initialization bakeng sa std::cout le metsoalle, le ho seta libaka kaofela li kenya letsoho molemong oa qubu eo ea pele.

Sistimi ea Arena le Hobaneng ha Kabo ea Pele e Le Bohlale

Qeto ea ho fana ka karolo e kholo ea mohopolo ho fapana le ho e kopa hanyane ha se kotsi ea ho kengoa tšebetsong. Ke khoebo ea ka boomo ea boenjiniere e thehiloeng mashomeng a lilemo a boiphihlelo ba mananeo a sistimi. Pitso e 'ngoe le e 'ngoe e eang ho brk() kapa mmap() e kenyelletsa phetoho ea maemo ho tloha sebakeng sa mosebelisi ho ea sebakeng sa kernel, phetoho ea 'mapa oa mohopolo oa ts'ebetso, le lintlafatso tsa litafole tsa maqephe. Ho hardware ea sejoale-joale, mohala o le mong oa sistimi e bitsa li-nanoseconds tse ka bang 100-200 - ha ho letho le le leng, le kotsi haholo.

Nahana ka lenaneo le etsang likhabo tse nyane tse 10,000 nakong ea ho qala. Ntle le kabo ea pele, hoo ho ka bolela mehala ea sistimi e 10,000, e bitsang li-milliseconds tse ka bang 1-2 tsa holimo. Ka allocator e thehiloeng lebaleng, kabo ea pele e baka mohala o le mong oa sistimi, 'me likabelo tse latelang tsa 9,999 li sebetsoa ka botlalo sebakeng sa basebelisi ka ts'ebetso ea lipalo le lenane le hokahantsoeng - e' ngoe le e 'ngoe e nka li-nanoseconds tse ka bang 10-50. Lipalo ha li hlake: Kabo ea pele e hapa ka liodara tsa boholo.

72 KB eo u e bonang kabong ea hau ea pele ha e senyehe mohopolo - ke letsete la ts'ebetso. Mofani o becha hore lenaneo la hau le tla fana ka likabelo tse ngata haufinyane, 'me maemong ohle a lefatše la 'nete, bethe eo e lefa haholo. Litsenyehelo tsa sebaka sa aterese se sa sebelisoeng ha e le hantle ke zero lits'ebetsong tsa sejoale-joale tsa 64-bit.

Virtual Memory vs. Physical Memory: Hobaneng ho sa Tsotellehe

Matšoenyeho a atileng har'a bahlahisi ba tobanang le boits'oaro bona lekhetlo la pele ke tšenyo ea lisebelisoa. Haeba ke hloka li-byte tse 4 feela, ke hobane'ng ha lenaneo la ka le ja 72 KB? Kutloisiso e mahlonoko ke horememori ea sebele hase mohopolo oa 'mele. Ha glibc e atolosa khefu ea lenaneo ka 72 KB, kernel e ntlafatsa 'mapa oa mohopolo oa ts'ebetso, empa ha e khutlisetse maqephe ao hang-hang ka RAM ea 'mele. Maqephe a 'nete a abeloa ho latela tlhoko ka phoso ea leqephe - ha feela lenaneo la hau le ngolla atereseng e itseng moo kernel e fanang ka leqephe la memori la nnete ho lona.

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

Sena se bolela hore leha boholo ba ts'ebetso ea hau bo eketseha ka 72 KB, saese ea eona ea moahi (RSS) - palo ea RAM e sebelisitsoeng - e eketseha ka maqephe ao u a amang feela. Bakeng sa e ncha int, eo hangata ke leqephe le le leng la 4 KB, hammoho le maqephe afe kapa afe ao metadata ea arena e leng teng. Sebaka se setseng sa sebele se lutse moo, se loketse ho sebelisoa, ha se bitse letho haese sebaka sa aterese feela - seo u nang le 128 TB ho sistimi ea 64-bit Linux.

Phapano ena e bohlokoa ha ho etsoa profil le ho beha leihlo lits'ebetso tsa tlhahiso. Haeba u ntse u haha ​​​​software e hlokang ho latela tšebeliso ea lisebelisoa tsa 'nete - ebang ke SaaS backend, microservice, kapa analytics pipeline tse kang tse tsamaeang ka li-platform tse kang Mewayzbakeng sa ts'ebetso ea khoebo - u lokela ho lula u lekola RSS ho e-na le boholo ba sebele. Lisebelisoa tse kang /proc/[pid]/smaps, valgrind --tool=massif, le pmap li ka u fa mehato e nepahetseng ea mohopolo ho e-na le ho khelosa lipalo tsa mohopolo.

Kamoo Baabi ba Fapaneng ba Sebelisang Kabo ea Pele

Palo ea 72 KB e tobane le ptmalloc2 ea glibc. Likabelo tse ling li etsa tradeoffs tse fapaneng, 'me kabo ea pele ea kabo e fapana ho latela. Ho utloisisa liphapang tsena ho bohlokoa ha u khetha moabi bakeng sa lits'ebetso tse amehang haholo.

  • jemalloc (e sebelisoang ke Facebook, FreeBSD) - E sebelisa sebopeho sa arena e nang le granular e nang le likhoele tsa sebaka sa khoele. Sehlooho sa pele se atisa ho ba holimo (hangata 200+ KB) empa se fana ka ts'ebetso e ntlafetseng ea mefuta e mengata ka lebaka la ho fokotseha ha likhang tsa senotlolo.
  • tcmalloc (Google's Thread-Caching Malloc) — E fana ka cache ka khoele e ka bang 2 MB ka mokhoa oa kamehla, ka kabo ea pele e mabifi. Lithako tsa pele li phahame, empa likabelo tse nyane tse latelang li potlakile haholo.
  • musl libc's malloc — E sebelisa moralo o bonolo haholoanyane o thehiloeng hommap bakeng sa likabo tsohle. Litšenyehelo tsa ho qala li fokola haholo (hangata ke 4 KB kabo e ngoe le e ngoe), empa litšenyehelo tsa kabo ka 'ngoe li phahame ka lebaka la mehala ea khafetsa ea sistimi.
  • mimalloc (Microsoft) — E sebelisa kabo e thehiloeng ho karolo e nang le likarolo tsa 64 MB. Kabo ea pele e etsa hore ho be le 64 MB ea ho boloka (ka boitlamo bo fokolang ba 'mele), sebaka sa aterese ea khoebo bakeng sa sebaka se ikhethang le sephetho.

Khetho lipakeng tsa baabi bana e ipapisitse le boima ba mosebetsi oa hau. Bakeng sa lits'ebetso tsa seva tsa nako e telele tse nang le kabo e boima ea likhoele tse ngata, jemalloc kapa tcmalloc hangata e feta maemo a kamehla a glibc. Bakeng sa litsamaiso tse kenyellelitsoeng mohopolong, mokhoa o bonolo oa musl o ka ba molemo ho sa tsotelehe tlhahiso e tlase. Bakeng sa lits'ebetso tse ngata tsa komporo le li-server tse sebelisoang ka kakaretso, ptmalloc2's 72 KB e kaholimo e emela khetho e utloahalang e sebetsang hantle ntle le ho lokisa.

Ho Lokisa Boitšoaro ba Pele ba Kabo

Haeba sehlooho sa mantlha sa 72 KB se na le bothata bakeng sa tshebediso ya hao — mohlomong o hlahisa dikete tsa ditshebetso tsa nako e kgutshwane, e nngwe le e nngwe e etsa kabo e seng kae feela — glibc e fana ka diphetoho tse mmalwa ka mallopt() le MALLOC_ lelapa la mefuta e fapaneng ya tikoloho.

The M_TOP_PAD paramethara e laola hore na mofani o kopa memori e kae ho feta e hlokahalang hanghang. Ho e beha ho 0 kamallopt(M_TOP_PAD, 0)e bolella mofani oa thepa hore a kope feela se hlokahalang, ho fokotsa ho feta ha pele haholo. The M_MMAP_THRESHOLD paramethara e laola boholo ba likabo bo sebelisang mmap ho fapana le lebala. M_TRIM_THRESHOLDe laola ha memori e lokolotsoeng e khutlisetsoa ho OS. Mme kaha glibc 2.26, glibc.malloc.tcache_count le glibc.malloc.tcache_max tse o ka kgonang ho laola boitshwaro ba cache ya thread.

Leha ho le joalo, tlhokomeliso: ho lokisa liparamente tsena ntle le ho beha matšoao ka hloko hoo e ka bang kamehla ho mpefatsa lintho le ho feta. Li-default li khethiloe ho ipapisitsoe le profil ea lefats'e ea 'nete,' me li emela sebaka se monate bakeng sa mesebetsi e mengata. Ntle le haeba o na le bopaki bo matla bo tsoang ho profiling ea tlhahiso ea hore malloc overhead ke botlolo - mme o lekanyelitse phello ea liphetoho tsa hau - tlohela li-default feela. Ntlafatso ea pele ho nako ea mofani ke mokhoa o poteletseng haholo oa ho kuta eak o sebelisitseng lihora tse ngata tsa boenjiniere molemong o sa reng letho.

Seo Sena se re Rutang Sona ka Systems Programming

Sephiri sa kabo ea pele ea 72 KB, mantlha, ke thuto e mabapi le mekhahlelo ea ho nka karolo. C ++ e u fa maikutlo a horeint e nchae fana ka li-byte tse 4. Tekanyetso ea puo e bolela joalo. Mohlala oa hau oa kelello o bolela joalo. Empa pakeng tsa khoutu ea hau le hardware ho lutse litsamaiso tse ngata tse tsoetseng pele - nako ea ho sebetsa ea C++, mofani oa libuka oa C, tsamaiso e nyenyane ea kernel, le MMU le TLB ea hardware - e 'ngoe le e' ngoe e eketsa boitšoaro ba eona, optimizations, le holimo.

Sena ha se phoso. Ke ntlha eohle ea software ea sistimi. Karolo e 'ngoe le e' ngoe e teng ho rarolla bothata ba 'nete: mofani o teng, kahoo ha ua tlameha ho etsa mehala ea sistimi bakeng sa kabo e ngoe le e ngoe. Sistimi ea memori e teng, kahoo ha ho hlokahale hore o laole memori ea 'mele ka kotloloho. Sebapali sa liphoso se teng kahoo memori e etsoa ka botsoa le ka katleho. Karolo e 'ngoe le e 'ngoe e rekisa ponaletso e nyane bakeng sa ts'ebetso e ngata le boiketlo.

Bahlahisi ba hahang mekhoa e tšepahalang ka ho fetisisa, e sebetsang ka ho fetisisa ke ba utloisisang lihlopha tsena - eseng hobane ba hloka ho nahana ka tsona kamehla, empa hobane ha ho etsahala ntho e sa lebelloang (joaloka kabo e makatsang ea 72 KB), ba na le mohlala oa kelello ho utloisisa lebaka. Hore na o theha sistimi ea nako ea nnete ea khoebo, enjine ea papali, kapa sethala sa khoebo se sebeletsang basebelisi ba likete, bokhoni ba ho beha mabaka mabapi le seo khoutu ea hau e hlileng e se etsang boemong ba sistimi ke sona se arohanyang baetsi ba hloahloa ho tsoa ho ba ikhethang. 72 KB ha se bothata. Ke mofani oa hau ea etsang mosebetsi oa eona ka bokhabane.

Haha Khoebo ea Hao ea Tsamaiso Kajeno

Ho tloha ho batho ba ikemetseng ho isa mekhatlong, Mewayz e matlafatsa likhoebo tse 138,000+ ka likarolo tse 207 tse kopaneng. Qala mahala, ntlafatsa ha o hola.

Theha Account Free →

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