No ke aha he 72 KB mau ka mahele mua C++ (m)? | Mewayz Blog Skip to main content
Hacker News

No ke aha he 72 KB mau ka mahele mua C++ (m)?

Nā Manaʻo

16 min read Via joelsiks.com

Mewayz Team

Editorial Team

Hacker News

Ka Pohihihi Ma hope o kāu Hoʻokaʻawale mua C++

Kākau ʻoe i kahi papahana C++ maʻalahi. Hoʻokahi int hou. ʻEhā paita. Hoʻopau ʻoe i ka stracea i ʻole kāu mea hoʻomanaʻo hoʻomanaʻo punahele, aia i laila - ua noi ʻia kāu kaʻina hana ma kahi o 72 KB mai ka ʻōnaehana hana. ʻAʻole 4 bytes. ʻAʻole 64 bytes. He 72 KB piha. Inā ua nānā ʻoe i kēlā helu a noʻonoʻo inā he wahaheʻe kāu mea hana iā ʻoe, ʻaʻole ʻoe wale nō. ʻO kēia ʻano ʻano ʻano ʻano ʻē kekahi o nā nīnau i nīnau pinepine ʻia ma waena o nā mea hoʻomohala C++ e ʻeli ana i loko o ka hoʻomanaʻo internals no ka manawa mua, a ʻo ka pane e lawe iā mākou i kahi huakaʻi hoihoi ma nā papa e noho ana ma waena o kāu code a me ka hāmeʻa maoli.

He aha kāu e kāhea aku ai i mea hou

No ka hoʻomaopopo ʻana i ka helu 72 KB, pono ʻoe e ʻimi i ke kaulahao hoʻokaʻawale piha. Ke hoʻokō nei kāu code C++new int, unuhi ka mea hōʻuluʻulu i ke kelepona i operator new, ka mea ma ka hapa nui o nā ʻōnaehana Linux e hāʻawi i ka mallocmai glibc. Akā mallocʻaʻole e nīnau pololei i ka kernel no 4 bytes o ka hoʻomanaʻo. Hoʻohana ka kernel i nā ʻaoʻao - maʻamau 4 KB ma x86_64 - a ʻo ke kumukūʻai o ke kelepona ʻōnaehana he nui loa e pili ana i kahi komo hoʻomanaʻo maʻalahi. ʻO ke kāhea ʻana i brk() a i ʻole mmap() no kēlā me kēia hoʻokaʻawale ʻana i kēlā me kēia kanaka, e hoʻopau ʻia kekahi papahana mea ʻole.

Akā, ka mea hoʻokaʻawale hoʻomanaʻo o glibc - kahi hoʻokō i kapa ʻia ʻo ptmalloc2, ʻo ia iho i iho mai i kā Doug Lea's classic dlmalloc - hana ma ke ʻano he middleman. Noi ʻo ia i nā poloka hoʻomanaʻo nui mai ka kernel i mua, a laila kālai iā lākou i mau ʻāpana liʻiliʻi e like me ka pono o kāu polokalamu. ʻO kēia ke kumu nui o kāu hoʻokaʻawale 4-byte mua e hoʻoulu i kahi noi nui aku i ka ʻōnaehana hana. ʻAʻole hoʻopau ka mea hoʻokaʻawale. He hoʻolālā.

Ke wehe ʻana i ka 72 KB: Kahi e hele ai nā Bytes

ʻO ka hoʻokaʻawale mua ʻana mai nā ʻāpana ʻokoʻa e pono e hoʻomaka ka wā holo ma mua o ka hāʻawi ʻana iā ʻoe i hoʻokahi byte o ka hoʻomanaʻo hoʻohana. ʻO ka hoʻomaopopo ʻana i kēlā me kēia ʻāpana e wehewehe i ke kumu e pae ai ka helu ma laila.

ʻO ka mea mua, hoʻomaka ka malloc o glibc i ka arena nui — ka ʻōnaehana mālama puke mua e hahai ana i nā ʻāpana āpau ma ka pae nui. Loaʻa i kēia pāʻani ka metadata no ka puʻu, nā kuhikuhi papa inoa manuahi, a me nā hale bin no nā ʻāpana like ʻole. Hoʻonui ka mea hoʻokaʻawale i ka hoʻomaha o ka papahana ma sbrk(), a mālama ʻia ka hoʻonui mua ʻia e kekahi ʻāpana kūloko i kapa ʻia M_TOP_PAD, ʻo ia ka 128 KB o ka padding. Eia nō naʻe, hoʻoponopono ʻia ka noi mua maoli no ka hoʻopololei ʻana i ka ʻaoʻao a me ke kūlana hoʻomaha e kū nei, a ʻo ia ka mea e loaʻa pinepine ai i kahi noi mua liʻiliʻi - maʻamau e pae kokoke ana i kēlā helu 72 KB ma kahi kaʻina hana hou.

Ka lua, mai ka glibc 2.26, hoʻomaka ka mea hoʻokaʻawale i thread-local cache (tcache) ma ka hoʻohana mua ʻana. Aia i loko o ka tcache he 64 bins (hoʻokahi no ka papa liʻiliʻi hoʻokaʻawale), hiki i kēlā me kēia mea ke paʻa i 7 mau puʻupuʻu huna. ʻO ka tcache_perthread_struct ponoʻī e hoʻopau ma kahi o 1 KB, akā ʻo ka hana o ka hoʻomaka ʻana e hoʻomaka i ka hoʻonohonoho ʻana o ke kahua ākea. ʻO ke kolu, ua hana mua ka C++ runtime i nā hoʻokaʻawale ma mua o kāu main() a hiki i ka holo ʻana - nā mea hana static, iostream buffer initialization no std::couta me nā hoaaloha, a me ka hoʻonohonoho ʻāina āpau e kōkua i kēlā me kēia kapuaʻi puʻu mua.

ʻO ka Pūnaehana Arena a me ke kumu i akamai ai ka hoʻokaʻawale mua ʻana

ʻO ka hoʻoholo ʻana e hoʻokaʻawale mua i kahi puʻupuʻu nui o ka hoʻomanaʻo ma mua o ka noi ʻana iā ia ʻāpana ʻaʻole ia he ulia pōpilikia o ka hoʻokō. ʻO ia kahi kālepa ʻenehana noʻonoʻo i hoʻokumu ʻia i nā makahiki he mau makahiki o ka ʻike hoʻonohonoho ʻōnaehana. ʻO kēlā me kēia kelepona ʻana iā brk() a i ʻole mmap() e pili ana i ka hoʻololi pōʻaiapili mai kahi mea hoʻohana a i ke kikowaena kernel, ka hoʻololi ʻana i nā palapala palapala hoʻomanaʻo virtual o ke kaʻina hana, a me nā hōʻano hou o ka papa ʻaoʻao. Ma nā lakohana hou, ʻo ke kelepona ʻōnaehana hoʻokahi ke kumukūʻai ma kahi o 100-200 nanokekona - he mea liʻiliʻi ma ke kaʻawale, pōʻino ma ka nui.

E noʻonoʻo i kahi papahana e hoʻokaʻawale liʻiliʻi i 10,000 i ka wā hoʻomaka. Me ka ʻole o ka hoʻokaʻawale ʻana, ʻo ia ke ʻano he 10,000 kelepona ʻōnaehana, ke kumu kūʻai ma kahi o 1-2 milliseconds o ke poʻo maʻemaʻe. Me ka hoʻokaʻawale ʻana i ka arena, hoʻomaka ka hoʻokaʻawale mua i kahi kelepona ʻōnaehana hoʻokahi, a lawelawe ʻia nā ʻāpana 9,999 ma hope o nā wahi mea hoʻohana ma o ka pointer arithmetic a me ka papa inoa pili - e lawe ana kēlā me kēia ma kahi o 10-50 nanoseconds. ʻAʻole maopopo ka makemakika: lanakila ka hoʻokaʻawale mua ʻana ma ke kauoha o ka nui.

ʻO ka 72 KB āu e ʻike ai ma kāu hoʻokaʻawale mua ʻaʻole i pau ka hoʻomanaʻo - he hoʻopukapuka hana. Ke koho nei ka mea hoʻokaʻawale e hoʻonui koke aku kāu polokalamu, a ma kahi kokoke i kēlā me kēia hiʻohiʻona maoli, e uku maikaʻi ʻia kēlā pili. ʻO ke kumu kūʻai o nā wahi kikoʻī kikoʻī i hoʻohana ʻole ʻia, ʻaʻole ia ma nā ʻōnaehana 64-bit hou.

Hoʻomanaʻo Virtual vs. Hoʻomanaʻo Kino: No ke aha he mea ʻole ia

ʻO kahi hopohopo maʻamau i waena o nā mea hoʻomohala e ʻike i kēia ʻano no ka manawa mua ʻo ia ka ʻōpala waiwai. Inā makemake au i 4 bytes, no ke aha e ʻai ai kaʻu polokalamu i ka 72 KB? ʻO ka ʻike koʻikoʻi ʻo iaʻaʻole hoʻomanaʻo kino ka hoʻomanaʻo virtual. Ke hoʻolōʻihi ʻo glibc i ka hoʻomaha o ka papahana ma 72 KB, hoʻonui ka kernel i nā palapala palapala hoʻomanaʻo virtual o ke kaʻina, akā ʻaʻole ia e hoʻihoʻi koke i kēlā mau ʻaoʻao me ka RAM kino. Hoʻokaʻawale ʻia nā ʻaoʻao kino maoli ma ke koi ʻana ma o hewa ʻaoʻao — aia wale nō ke kākau kāu polokalamu i kahi helu kikoʻī e hāʻawi ka kernel i kahi ʻaoʻao hoʻomanaʻo iā ia.

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

'O ia ho'i, 'oiai e pi'i ana ka nui virtual o kāu ka'ina hana i ka 72 KB, 'o kona ka nui ho'onohonoho noho'ana (RSS) — ka nui o ka RAM kino i ho'opau maoli 'ia — ho'onui 'ia e nā 'ao'ao āu i pā maoli ai. No ka new int hoʻokahi, ʻo ia ka mea maʻamau hoʻokahi ʻaoʻao 4 KB, a me nā ʻaoʻao ʻē aʻe e noho ai ka metadata arena. Aia ke koena virtual space ma laila, mākaukau no ka hoʻohana ʻana, ʻaʻohe kumu kūʻai akā he wahi helu wahi — nona ka 128 TB ma kahi ʻōnaehana Linux 64-bit.

He mea koʻikoʻi kēia ʻokoʻa i ka wā e hoʻopaʻa inoa a nānā ana i nā noi hana. Inā ʻoe e kūkulu nei i nā polokalamu e pono ai ke hahai i ka hoʻohana waiwai maoli - inā he SaaS backend, microservice, a i ʻole kahi pipeline analytics e like me nā mea e holo ana ma nā paepae e like me Mewayzno nā hana ʻoihana - pono ʻoe e nānā mau i ka RSS ma mua o ka nui virtual. Hiki i nā mea hana e like me /proc/[pid]/smaps, valgrind --tool=massif, a me pmap ke hāʻawi iā ʻoe i nā kapuaʻi hoʻomanaʻo kino kūpono ma mua o ka hoʻopunipuni ʻana i nā helu hoʻomanaʻo virtual.

Pehea ka lawelawe ʻana o nā mea hoʻokaʻawale ʻokoʻa i ka ʻāpana mua

He kiko'ī ka helu 72 KB i ka ptmalloc2 o glibc. Hana nā mea hoʻokaʻawale ʻē aʻe i nā kālepa like ʻole, a ʻokoʻa ka hoʻokaʻawale mua ʻana ma luna. He mea nui ka hoʻomaopopo ʻana i kēia mau ʻokoʻa i ke koho ʻana i kahi mea hoʻokaʻawale no nā noi pili i ka hana.

  • jemalloc (hoʻohana ʻia e Facebook, FreeBSD) — Ke hoʻohana nei i kahi hoʻolālā pānaʻi ʻoi aku ka nui me nā huna huna kūloko. ʻOi aku ka kiʻekiʻe o ke poʻo mua (maʻa mau 200+ KB) akā hāʻawi i ka hana ʻoi aku ka maikaʻi o nā loina lehulehu ma muli o ka hoʻemi ʻana i ka paio laka.
  • tcmalloc (Google's Thread-Caching Malloc) — Hoʻokaʻawale i kahi huna huna no kēlā me kēia thread ma kahi o 2 MB ma ke ʻano paʻamau, me ka hoʻokaʻawale mua ʻana. ʻOi aku ka kiʻekiʻe o ke poʻo mua, akā wikiwiki loa nā ʻāpana liʻiliʻi ma hope.
  • musl libc's malloc — Hoʻohana i kahi hoʻolālā maʻalahi ma muli o mmap no nā hoʻokaʻawale ʻana. ʻOi aku ka liʻiliʻi o ke poʻo mua (pinepine ʻo 4 KB wale nō no ka hoʻokaʻawale ʻana), akā ʻoi aku ka kiʻekiʻe o ke kumukūʻai no ka hoʻokaʻawale ʻana ma muli o ke kelepona ʻana o ka ʻōnaehana.
  • mimalloc (Microsoft) — Hoʻohana i ka hoʻokaʻawale ʻana i ka māhele me nā ʻāpana 64 MB. Hoʻomaka ka hoʻokaʻawale mua ʻana i kahi hoʻopaʻa inoa virtual 64 MB (me ka liʻiliʻi o ke koʻikoʻi kino), wahi kūʻai wahi kūʻai no ka wahi kūʻokoʻa a me ka hana.

E pili ana ka koho ma waena o kēia mau mea hoʻokaʻawale i kāu haʻahaʻa hana. No nā polokalamu kikowaena lōʻihi me ka hoʻokaʻawale ʻana i nā kaula he nui, ʻoi aku ka maʻamau o jemalloc a i ʻole tcmalloc i ka hana paʻamau o glibc. No nā ʻōnaehana hoʻokomo i hoʻopaʻa ʻia i ka hoʻomanaʻo, ʻoi aku ka maikaʻi o ke ala maʻalahi o musl me ka haʻahaʻa. No ka hapa nui o nā papa kuhikuhi a me nā polokalamu kikowaena, ʻo ka ptmalloc2 o 72 KB ka poʻo mua e hōʻike ana i kahi paʻamau kūpono e hana maikaʻi me ka hoʻolohe ʻole.

Ka hoʻopololei ʻana i ke ʻano hoʻokaʻawale mua

Inā pilikia maoli ka 72 KB ma luna o ke poʻo mua no kāu hihia hoʻohana — malia paha ke hoʻopuka nei ʻoe i mau kaukani o nā kaʻina hana pōkole, e hāʻawi ana kēlā me kēia i ka liʻiliʻi o ka hoʻokaʻawale ʻana - hāʻawi ʻo glibc i kekahi mau mele ma o mallopt() a me ka ʻohana MALLOC_ o nā ʻano hoʻololi kaiapuni.

Na ka palena M_TOP_PAD e hoʻomalu i ka nui o ka hoʻomanaʻo hou a ka mea hoʻokaʻawale e noi ai ma mua o ka mea e pono koke ai. ʻO ka hoʻonohonoho ʻana iā 0 me mallopt(M_TOP_PAD, 0) e ʻōlelo i ka mea hoʻokaʻawale e noi wale i nā mea e pono ai, e hōʻemi nui ana i ka overhead mua. Mālama ka ʻāpana M_MMAP_THRESHOLD i ka nui ma luna aʻe e hoʻohana ai nā ʻāpana mmap ma kahi o ke kahua. Mālama ka M_TRIM_THRESHOLD ke hoʻihoʻi ʻia ka hoʻomanaʻo i ka OS. A mai ka glibc 2.26, hiki i ka glibc.malloc.tcache_counta me glibc.malloc.tcache_max nā mele kani iā ʻoe ke hoʻomalu i ka hana cache thread.

Akā naʻe, he ʻōlelo akahele: ʻo ka hoʻopaʻa ʻana i kēia mau ʻāpana me ka ʻole o ka hoʻopaʻa ʻana me ka makaʻala ʻaneʻane e ʻoi aku ka hewa. Ua koho ʻia nā kuhi ma muli o ka hoʻolaha ʻana o ka honua maoli, a ke hōʻike nei lākou i kahi wahi momona no ka hapa nui o nā hana. Inā ʻaʻole i loaʻa iā ʻoe nā hōʻike ikaika mai ka hoʻolaha ʻana i ka hana ʻana he bottleneck ka malloc overhead - a ua ana ʻoe i ka hopena o kāu hoʻololi - waiho wale i nā mea paʻa. ʻO ka hoʻomaʻamaʻa mua ʻana o ka mea hoʻokaʻawale he ʻano hoʻopunipuni maoli nō ia o ka kahihi yak i hoʻopau i nā hola ʻenehana he nui no ka pōmaikaʻi ʻole.

He aha kēia e aʻo mai ai iā mākou e pili ana i ka papahana papahana

ʻO ka 72 KB mea pohihihi i hoʻokaʻawale mua ʻia, ma kona kumu, he haʻawina e pili ana i nā papa hoʻokaʻawale. Hāʻawi ʻo C++ iā ʻoe i ka hoʻopunipuni int houe hoʻokaʻawale i 4 bytes. Ke ʻōlelo nei ke kūlana ʻōlelo. Ke ʻōlelo nei kāu kumu hoʻohālike. Akā, ma waena o kāu code a me ka lako lako e noho ana he pūʻulu o nā ʻōnaehana maʻalahi - ka C++ runtime, ka C library allocator, ka kernel's virtual memory subsystem, a me ka MMU a me TLB o ka hardware - hoʻohui kēlā me kēia i kāna mau ʻano ponoʻī, nā koho, a me ke poʻo.

ʻAʻole kēia he hemahema. ʻO ia ke kiko holoʻokoʻa o nā polokalamu ʻōnaehana. Aia kēlā me kēia papa e hoʻoponopono i kahi pilikia maoli: aia ka mea hoʻokaʻawale no laila ʻaʻole pono ʻoe e hana i nā kelepona ʻōnaehana no kēlā me kēia hoʻokaʻawale. Aia ka ʻōnaehana hoʻomanaʻo virtual no laila ʻaʻole pono ʻoe e hoʻokele pololei i ka hoʻomanaʻo kino. Aia ka ʻaoʻao hoʻohana hewa no laila ua hana ʻia ka hoʻomanaʻo me ka palaualelo a me ka maikaʻi. Kūʻai kēlā me kēia papa i kahi kikoʻī liʻiliʻi no ka nui o ka hana a me ka maʻalahi.

ʻO nā mea hoʻomohala i kūkulu i nā ʻōnaehana hilinaʻi a me ka hana kiʻekiʻe loa, ʻo ia ka poʻe i hoʻomaopopo i kēia mau papa - ʻaʻole no ka mea pono lākou e noʻonoʻo mau iā lākou, akā no ka mea inā hiki mai kekahi mea i manaʻo ʻole ʻia (e like me kahi hoʻokaʻawale 72 KB pohihihi), loaʻa iā lākou ke kumu noʻonoʻo e maopopo ai ke kumu. Inā ʻoe e kūkulu nei i kahi ʻōnaehana kālepa manawa maoli, kahi mīkini pāʻani, a i ʻole kahi kahua pāʻoihana e lawelawe ana i nā tausani o nā mea hoʻohana, ʻo ka hiki ke noʻonoʻo e pili ana i ka hana maoli o kāu code ma ka pae ʻōnaehana ka mea e hoʻokaʻawale i nā mea hoʻomohala mākaukau mai nā mea ʻokoʻa. ʻAʻole ʻo ka 72 KB he bug. ʻO kāu mea hoʻokaʻawale e hana maikaʻi ana i kāna hana.

Kūkulu i kāu OS ʻoihana i kēia lā

Mai ka poʻe manuahi a hiki i nā keʻena, hoʻohana ʻo Mewayz i nā ʻoihana 138,000+ me 207 mau modula i hoʻohui ʻia. Hoʻomaka manuahi, hoʻomaikaʻi i kou wā e ulu ai.

Hana moʻokāki manuahi →

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