Carson a tha a’ chiad riarachadh C ++ (m) an-còmhnaidh 72 KB? | Mewayz Blog
Hacker News

Carson a tha a’ chiad riarachadh C ++ (m) an-còmhnaidh 72 KB?

Beachdan

13 min read Via joelsiks.com

Mewayz Team

Editorial Team

Hacker News

An Dìomhaireachd air cùlaibh do chiad C++ riarachadh

Sgrìobhaidh tu prògram C++ sìmplidh. Aon int ùr. Ceithir bytes. Bidh thu a’ losgadh strace no am pròifil cuimhne as fheàrr leat, agus sin e - dìreach dh’ iarr am pròiseas agad timcheall air 72 KB bhon t-siostam obrachaidh. Chan e 4 bytes. Chan e 64 bytes. 72 KB iomlan. Ma tha thu a-riamh air sùil a thoirt air an àireamh sin agus a bhith a’ faighneachd an robh an inneal agad na laighe riut, chan eil thu nad aonar. Is e an giùlan neònach seo aon de na ceistean as cumanta am measg luchd-leasachaidh C ++ a tha a’ cladhach a-steach do chuimhneachain a-staigh airson a’ chiad uair, agus tha am freagairt gar toirt air turas inntinneach tro na sreathan a tha eadar do chòd agus am bathar-cruaidh fhèin.

Dè thachras nuair a chuireas tu fios gu ùr

Gus am figear 72 KB a thuigsinn, feumaidh tu an t-sèine riarachaidh slàn a lorg. Nuair a chuireas an còd C++ agad new int an gnìomh, bidh an cruinneadair ag eadar-theangachadh sin gu gairm gu obraiche ùr, a bhios air a’ mhòr-chuid de shiostaman Linux a’ riochdachadh malloc bho glibc. Ach chan iarr malloc gu dìreach air an kernel airson 4 byte de chuimhne. Bidh an kernel ag obair ann an duilleagan - mar as trice 4 KB air x86_64 - agus tha cosgais gairm siostaim gu math mòr an coimeas ri ruigsinneachd cuimhne sìmplidh. Le bhith a’ gairm brk() no mmap() airson gach riarachadh fa leth, chuireadh stad air prògram neo-bheag sam bith.

An àite sin, tha inneal-cuimhne glibc - buileachadh ris an canar ptmalloc2, e fhèin a’ tighinn bho dlmalloc clasaigeach Doug Lea - ag obair mar mheadhan-fhear. Bidh e ag iarraidh blocaichean mòra cuimhne bhon kernel ro-làimh, an uairsin gan snaidheadh ​​​​nam pìosan nas lugha mar a tha feum aig a’ phrògram agad orra. Is e seo an adhbhar bunaiteach a tha a’ chiad riarachadh 4-byte agad a’ piobrachadh iarrtas tòrr nas motha don t-siostam obrachaidh. Chan eil an riarachadh gu bhith na sgudal. Tha e ro-innleachdail.

A’ sgaradh an 72 KB: Far an tèid na Bytes

Tha a’ chiad riarachadh os an cionn a’ tighinn bho ghrunn phàirtean sònraichte a dh’ fheumas an t-àm-ruith a thòiseachadh mus urrainn dha eadhon aon byte de chuimhne a ghabhas cleachdadh a thoirt dhut. Tha tuigse air gach co-phàirt a’ mìneachadh carson a tha an àireamh a’ tighinn gu tìr far a bheil e.

An toiseach, bidh malloc glibc a’ tòiseachadh a’ prìomh raon — am prìomh structar glèidhidh leabhraichean a bhios a’ cumail sùil air a h-uile riarachadh air a’ phrìomh snàithlean. Tha an raon seo a’ toirt a-steach meata-dàta airson a’ charn, comharran liosta an-asgaidh, agus structaran biona airson diofar mheudan riarachaidh. Bidh an cuibhreachadh a' leudachadh briseadh a' phrògraim tro sbrk(), agus tha a' chiad leudachadh air a riaghladh le paramadair a-staigh air a bheil M_TOP_PAD, a dh'fhàgas gu 128 KB de phlugadh. Ach, tha an fhìor iarrtas tùsail air atharrachadh airson co-thaobhadh duilleag agus suidheachadh briseadh a tha ann mar-thà, a bhios gu tric a’ leantainn gu ciad iarrtas nas lugha - mar as trice a ’tighinn air tìr faisg air an fhigear 72 KB sin air pròiseas a tha air ùr thòiseachadh.

San dàrna h-àite, leis gu bheil glibc 2.26, bidh an neach-cuairteachaidh a’ tòiseachadh tasgadan snàithne-ionadail (tcache) air a’ chiad chleachdadh. Anns an tcache tha 64 bionaichean (aon airson gach clas meud cuibhreann beag), gach fear comasach air suas ri 7 pìosan taisgte a chumail. Bidh an tcache_perthread_struct ann fhèin ag ithe timcheall air 1 KB, ach tha an gnìomh a bhith ga thòiseachadh a’ toirt air falbh suidheachadh an raoin nas fharsainge. San treas àite, tha an ùine ruith C++ air cuibhreannan a choileanadh mu thràth mus ruith do prìomh () eadhon - luchd-togail statach, tòiseachadh bufair iostream airson std:: cout agus caraidean, agus suidheachadh locale uile a’ cur ris a’ chiad lorg-coise sin.

Siostam Arena agus Carson a tha Ro-riarachadh Glic

Chan e tubaist buileachaidh a th’ ann an co-dhùnadh pìos mòr de chuimhne a riarachadh an àite a bhith ga iarraidh mean air mhean. Is e malairt innleadaireachd a th’ ann a dh’aona ghnothach le freumhachadh ann an deicheadan de eòlas prògramadh shiostaman. Tha a h-uile gairm gu brk() no mmap() a’ toirt a-steach atharrachadh co-theacsa bho àite luchd-cleachdaidh gu àite kernel, atharrachadh air mapaichean cuimhne brìgheil a’ phròiseis, agus ùrachadh clàr duilleag a dh’fhaodadh a bhith ann. Air bathar-cruaidh an latha an-diugh, tha aon ghairm siostam a’ cosg timcheall air 100-200 nanoseconds - rud beag leotha fhèin, tubaisteach aig sgèile.

Smaoinich air prògram a bheir seachad 10,000 cuibhreannan beaga aig àm tòiseachaidh. Às aonais ro-riarachadh, bhiodh sin a’ ciallachadh 10,000 fios siostam, a’ cosg timcheall air 1-2 milliseconds de fhìor chosgais. Le riarachadh stèidhichte air raon, bidh a’ chiad riarachadh a’ piobrachadh aon ghairm siostam, agus tha na cuibhreannan 9,999 às deidh sin air an seirbheiseachadh gu tur ann an àite luchd-cleachdaidh tro àireamhachd puing agus gnìomhachd liosta ceangailte - gach fear a’ toirt timcheall air 10-50 nanoseconds. Tha am matamataigs gun teagamh: bidh ro-riarachadh a’ buannachadh le òrdughan meudachd.

Chan e cuimhne a th’ anns an 72 KB a chì thu air a’ chiad riarachadh agad - is e tasgadh coileanaidh a th’ ann. Tha an neach-riarachaidh a’ geall gun dèan am prògram agad barrachd riarachadh a dh’ aithghearr, agus ann an cha mhòr a h-uile suidheachadh san t-saoghal fhìor, bidh an geall sin a’ pàigheadh ​​​​dheth gu dòigheil. Tha cosgais àite seòlaidh brìgheil gun chleachdadh gu ìre mhòr neoni air siostaman 64-bit an latha an-diugh.

Cuimhne Mas-fhìor vs. Cuimhne Corporra: Carson nach eil e gu diofar

Is e ana-caitheamh stòrais a tha na dhragh cumanta am measg luchd-leasachaidh a tha a’ tighinn tarsainn air a’ ghiùlan seo airson a’ chiad uair. Mura feum mi ach 4 bytes, carson a tha am prògram agam ag ithe 72 KB? Is e an sealladh èiginneach nach e cuimhne corporra a th’ ann an cuimhne fhìor. Nuair a leudaicheas glibc briseadh a ’phrògraim le 72 KB, bidh an kernel ag ùrachadh mapaichean cuimhne brìgheil a’ phròiseas, ach cha bhith e a ’toirt air ais na duilleagan sin sa bhad le RAM corporra. Tha na fìor dhuilleagan fiosaigeach air an riarachadh a rèir iarrtas tro sgàinidhean air duilleagan - dìreach nuair a sgrìobhas am prògram agad gu seòladh sònraichte a bhios an kernel a’ sònrachadh fìor dhuilleag cuimhne dha.

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

Tha seo a’ ciallachadh, ged a tha meud mas-fhìor a’ phròiseis agad a’ dol suas 72 KB, gu bheil a meud seata còmhnaidh (RSS) - an ìre de RAM corporra a thèid a chaitheamh - a’ dol am meud a-mhàin air na duilleagan air am bi thu a’ suathadh. Airson aon int ùr, is e sin aon duilleag 4 KB mar as trice, agus ge bith dè na duilleagan air a bheil meata-dàta an raoin. Tha an t-àite brìgheil a tha air fhàgail na shuidhe an sin, deiseil airson a chleachdadh, gun a bhith a’ cosg dad ach àite seòlaidh - agus tha 128 TB agad air siostam Linux 64-bit.

Tha an t-eadar-dhealachadh seo deatamach nuair a thathar a’ dèanamh ìomhaigh agus a’ cumail sùil air tagraidhean toraidh. Ma tha thu a’ togail bathar-bog a dh’ fheumas sùil a chumail air fìor chaitheamh ghoireasan - ge bith an e backend SaaS a th’ ann, microservice, no loidhne-phìoban anailis mar an fheadhainn a tha a’ ruith air àrd-ùrlaran leithid Mewayz airson gnìomhachd gnìomhachais - bu chòir dhut an-còmhnaidh sùil a chumail air RSS seach meud brìgheil. Faodaidh innealan mar /proc/[pid]/smaps, valgrind --tool=massif, agus pmap lorgan-coise cuimhne corporra ceart a thoirt dhut seach figearan cuimhne mas-fhìor a mhealladh.

Mar a làimhsicheas diofar luchd-riarachaidh a’ chiad riarachadh

Tha am figear 72 KB sònraichte do ptmalloc2 glibc. Bidh luchd-riarachaidh eile a 'dèanamh malairt eadar-dhealaichte, agus tha a' chiad riarachadh os cionn ag atharrachadh a rèir sin. Tha e luachmhor na h-eadar-dhealachaidhean sin a thuigsinn nuair a thaghas tu inneal-tomhais airson tagraidhean a tha mothachail air coileanadh.

  • jemalloc (air a chleachdadh le Facebook, FreeBSD) - A’ cleachdadh structar raon nas granular le tasgadan ionadail snàithlean. Tha a’ chiad os-cionn buailteach a bhith nas àirde (gu tric 200+ KB) ach a’ lìbhrigeadh coileanadh ioma-snàithlean nas fheàrr ri linn lùghdachadh ann an còmhstri glasaidh.
  • tcmalloc (Google's Thread-Caching Malloc) - A' riarachadh tasgadan gach snàthainn timcheall air 2 MB a ghnàth, le ro-riarachadh ionnsaigheach. Tha cosgaisean tùsail nas àirde, ach tha cuibhreannan beaga às deidh sin gu math luath.
  • malloc musl libc - A’ cleachdadh dealbhadh tòrr nas sìmplidh stèidhichte air mmap airson a h-uile riarachadh. 'S e glè bheag de chosgaisean tùsail a th' ann (gu tric dìreach 4 KB gach riarachadh), ach tha cosgais gach riarachadh nas àirde ri linn fiosan siostam nas trice.
  • mimalloc (Microsoft) - A’ cleachdadh riarachadh stèidhichte air earrann le earrannan 64 MB. Bidh a’ chiad riarachadh a’ piobrachadh glèidheadh ​​brìgheil 64 MB (le glè bheag de dhealas corporra), àite seòlaidh malairt airson sgìre air leth agus trochur.

Tha an taghadh eadar na cuibhreannan seo gu tur an urra ris an eallach obrach agad. Airson tagraidhean frithealaiche fad-ùine le riarachadh trom ioma-snàithlean, mar as trice bidh jemalloc no tcmalloc a’ coileanadh nas fheàrr na an àbhaist aig glibc. Airson siostaman freumhaichte le cuingeachadh cuimhne, dh’ fhaodadh dòigh-obrach nas sìmplidh musl a bhith nas fheàrr a dh’ aindeoin trochur nas ìsle. Airson a’ mhòr-chuid de thagraidhean deasg is frithealaiche coitcheann, tha a’ chiad os-cionn ptmalloc2 aig 72 KB a’ riochdachadh bunait reusanta a dh’ obraicheas gu math gun gleusadh.

A’ gleusadh a’ chiad ghiùlan riarachadh

Ma tha an 72 KB bunaiteach os an cionn dha-rìribh na dhuilgheadas don chùis cleachdaidh agad - is dòcha gu bheil thu a’ sìolachadh mìltean de phròiseasan geàrr-ùine, gach fear a’ dèanamh dìreach dòrlach de chuibhreannan - tha glibc a’ toirt seachad grunn thunables tro mallopt() agus an teaghlach caochladairean àrainneachd MALLOC_.

Smachdaidh am paramadair M_TOP_PAD na tha de chuimhne a bharrachd a dh’iarras an neach-riarachaidh nas fhaide na na tha a dhìth sa bhad. Le bhith ga shuidheachadh gu 0 le mallopt(M_TOP_PAD, 0) ag iarraidh air an neach-riarachaidh dìreach na tha a dhìth iarraidh, a' lùghdachadh a' chiad chosgais gu mòr. Tha am paramadair M_MMAP_THRESHOLD a' cumail smachd air a' mheud os cionn a bhios cuibhreannan a' cleachdadh mmap an àite an raon. Bidh an M_TRIM_THRESHOLD a' riaghladh nuair a thèid cuimhne shaor a thilleadh dhan OS. Agus leis gu bheil glibc 2.26, leigidh tunables glibc.malloc.tcache_count agus glibc.malloc.tcache_max smachd dhut air giùlan tasgadan nan snàithlean.

Ach, facal rabhadh: bidh gleusadh nam paramadairean sin gun a bhith a’ comharrachadh slatan-tomhais faiceallach cha mhòr an-còmhnaidh a’ dèanamh cùisean nas miosa. Chaidh na h-uireasbhaidhean a thaghadh stèidhichte air pròifil farsaing san t-saoghal fhìor, agus tha iad a’ riochdachadh àite milis airson a’ mhòr-chuid de eallach obrach. Mura h-eil fianais làidir agad bho phròifil cinneasachaidh gur e cnap-starra a th’ ann am malloc os an cionn - agus gu bheil thu air buaidh nan atharrachaidhean agad a thomhas - fàg na roghainnean bunaiteach. Tha optimization ro-luath den riarachadh na sheòrsa gu math brùideil de bhearradh yak a tha air grunn uairean innleadaireachd a chaitheamh airson glè bheag de bhuannachd.

Na tha seo a’ teagasg dhuinn mu phrògramadh shiostaman

Tha dìomhaireachd ciad-riarachaidh 72 KB, aig a chridhe, na leasan mu sreathan às-tharraing. Bheir C++ an mealladh dhut gu bheil int ùr a’ riarachadh 4 byte. Tha an inbhe cànain ag ràdh sin. Tha do mhodail inntinn ag ràdh sin. Ach eadar do chòd agus am bathar-cruaidh tha stac de shiostaman sòlaimte - an ùine ruith C ++, riarachadh leabharlann C, fo-shiostam cuimhne brìgheil an kernel, agus MMU agus TLB a’ bhathar-cruaidh - gach fear a’ cur ris a ghiùlan fhèin, optimizations agus os an cionn.

Chan e locht a tha seo. Is e seo puing iomlan bathar-bog siostaman. Tha gach còmhdach ann gus fuasgladh fhaighinn air fìor dhuilgheadas: tha an riarachadh ann gus nach fheum thu fiosan siostam a dhèanamh airson gach riarachadh. Tha an siostam cuimhne brìgheil ann gus nach fheum thu cuimhne corporra a riaghladh gu dìreach. Tha inneal-làimhseachaidh locht na duilleige ann gus am bi cuimhne air a dhèanamh gu leisg agus gu h-èifeachdach. Bidh a h-uile còmhdach a’ malairt beagan follaiseachd airson tòrr coileanaidh agus goireasachd.

Is e an luchd-leasachaidh a thogas na siostaman as earbsaiche, as àirde coileanadh, an fheadhainn a thuigeas na sreathan sin - chan ann air sgàth gu feum iad smaoineachadh orra an-còmhnaidh, ach air sgàth nuair a thachras rudeigin ris nach robh dùil (mar riarachadh dìomhair 72 KB), tha am modal inntinn aca gus tuigsinn carson. Co-dhiù a tha thu a’ togail siostam malairt fìor-ùine, einnsean geama, no àrd-ùrlar gnìomhachais a’ frithealadh mìltean de luchd-cleachdaidh, is e an comas reusanachadh a dhèanamh mu na tha do chòd a’ dèanamh aig ìre an t-siostaim a tha a’ sgaradh luchd-leasachaidh comasach bho fheadhainn air leth. Chan e biast a th’ anns an 72 KB. Is e an neach-riarachaidh agad a bhith a’ dèanamh an obair aige gu sgoinneil.

Tog do ghnìomhachas OS an-diugh

Bho luchd-obrach neo-cheangailte gu buidhnean-gnìomha, tha Mewayz a’ toirt cumhachd do 138,000+ gnìomhachas le 207 modal amalaichte. Tòisich an-asgaidh, àrdaich nuair a dh'fhàsas tu.

Cruthaich cunntas an-asgaidh →

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