Ни өчен беренче C ++ (м) бүлеп бирү һәрвакыт 72 КБ? | Mewayz Blog
Hacker News

Ни өчен беренче C ++ (м) бүлеп бирү һәрвакыт 72 КБ?

Аңлатмалар

1 min read Via joelsiks.com

Mewayz Team

Editorial Team

Hacker News

Беренче C ++ бүлү артындагы сер

Сез гади C ++ программасы язасыз. Бер яңа int . Дүрт байт. Сез страс яки яраткан хәтер профилегезне яндырасыз, һәм ул - сезнең процесс операцион системадан якынча 72 КБ сорады. 4 байт түгел. 64 байт түгел. Тулы 72 КБ. Әгәр дә сез бу санга караган булсагыз һәм сезнең кораллау сезгә ялганмы дип уйлаган булсагыз, сез ялгыз түгел. Бу сәер кебек тоелган тәртип - C ++ уйлап табучылар арасында иң еш бирелә торган сорауларның берсе, һәм хәтер беренче тапкыр хәтер эчендә казыла, һәм җавап безне сезнең код белән фактик аппарат арасында урнашкан катламнар аша кызыклы сәяхәткә алып бара.

яңа

шалтыратканда нәрсә була

72 КБ фигурасын аңлар өчен, тулы бүлү чылбырын эзләргә кирәк. Сезнең C ++ кодыгыз яңа int башкарганда, компиляр аны оператор яңа чакыруына тәрҗемә итә, күпчелек Linux системаларында глибктан маллок га тапшырыла. Ләкин маллок ядрәдән 4 байт хәтер сорамый. Ядрә битләрдә эшли - гадәттә 4 КБ x86_64 - һәм система чакыру бәясе гади хәтергә керү белән чагыштырганда бик зур. Individualәрбер бүлеп бирү өчен brk () яки mmap () шалтырату теләсә нинди вак-төяк булмаган программаны туктатырга мөмкин.

Киресенчә, glibc хәтер бүлеп бирүче - ptmalloc2 дип аталган гамәл, үзе Даг Ли классикасыннан чыккан dlmalloc - арадашчы ролен башкара. Ядрәнең алгы өлешеннән зур хәтер блокларын сорый, аннары аларны сезнең программа кирәк булганча кечкенә кисәкләргә бүлеп куя. Бу сезнең беренче 4 байт бүлеп бирү операцион системага зуррак сорау тудыруның төп сәбәбе. Бүләк бирүче исраф итми. Бу стратегик.

72 КБны бүлү: Байт кая бара

Башлангыч бүлеп бирү берничә төрле компонентлардан килә, эш вакыты сезгә хәтта бер байт кулланыла торган хәтер бирер алдыннан башларга тиеш. Eachәрбер компонентны аңлау санның ни өчен җиргә төшүен аңлата.

Беренчедән, glibc's malloc төп аренаны башлый - төп җептәге барлык бүленешләрне күзәтүче төп бухгалтерлык структурасы. Бу аренада өем өчен мета-мәгълүматлар, ирекле исемлек күрсәткечләре, төрле бүлү зурлыклары өчен бин структуралары бар. Бүләк бирүче программа тәнәфесен sbrk () аша киңәйтә, һәм башлангыч киңәйтү M_TOP_PAD дип аталган эчке параметр белән идарә ителә, ул 128 КБ паддингка туры килми. Ләкин, башлангыч сорау битне тигезләү һәм булган тәнәфес позициясе өчен көйләнә, бу еш кына кечерәк беренче сорауга китерә - гадәттә яңа башланган процесста шул 72 КБ фигурасы янына төшү.

Икенчедән, glibc 2.26 дан, бүлеп бирүче беренче тапкыр җеп-локаль кэш (tcache) башлый. Tcache 64 савытны үз эченә ала (кечкенә бүлеп бирелгән зурлык классына), һәрберсе 7 кэшка кадәр тотарга сәләтле. tcache_perthread_struct үзе 1 КБ тирәсе куллана, ләкин аны башлау акты киң аренаны урнаштыра. Өченчедән, C ++ эш вакыты сезнең төп () хәтта эшләгәнче бүлеп бирелгән - статик конструкторлар, std :: cout һәм дуслар өчен iostream буфер инициализациясе, һәм җирле көйләүләр барысы да беренче өем эзенә ярдәм итә.

Арена системасы һәм ни өчен алдан бүлеп бирү акыллы

Хәтернең төп өлешен алдан бүлеп бирү карары аны тормышка ашыру очраклы түгел. Бу дистәләгән система программалаштыру тәҗрибәсенә нигезләнгән белә торып инженерлык сәүдәсе. brk () яки mmap () га булган һәр шалтырату кулланучылар киңлегеннән ядро ​​киңлегенә контекстны күчерүне, процессның виртуаль хәтер карталарын үзгәртүне һәм потенциаль таблицаны яңартуны үз эченә ала. Заманча җиһазларда бер система шалтыраты якынча 100-200 наносекундка төшә - изоляциядә вак, масштаблы катастрофик.

инициализация вакытында 10,000 кечкенә бүлеп бирүче программаны карагыз. Алдан бүлеп бирмичә, бу 10,000 система шалтыратуларын аңлата, якынча 1-2 миллисекунд чиста өскә. Аренага нигезләнгән бүлүче белән, беренче бүлеп бирү бер система шалтыратуына китерә, һәм аннан соң 9999 бүлеп бирү арифметик һәм бәйләнгән исемлек операцияләре ярдәмендә кулланучылар мәйданында тулысынча хезмәт күрсәтә - һәрберсе якынча 10-50 наносекунд ала. Математика бертөрле: алдан бүлеп бирү зурлык заказлары белән җиңә.

Беренче бүлеп биргәндә күргән 72 КБ хәтерне әрәм итми - бу башкару инвестициясе. Бүләк бирүче сезнең программа тиздән күбрәк акча бүлеп бирәчәк, һәм бөтен реаль дөнья сценарийларында диярлек яхшы акча түли. Кулланылмаган виртуаль адрес мәйданының бәясе хәзерге 64 битлы системаларда нуль.

Виртуаль хәтер vs. Физик хәтер: Нигә мөһим түгел

Бу тәртипне беренче тапкыр очратучылар арасында гомуми борчылу - ресурс калдыклары. Миңа 4 байт кына кирәк булса, нигә минем программа 72 КБ куллана? Критик аңлау - виртуаль хәтер физик хәтер түгел . Glibc программа тәнәфесен 72 КБга озайтканда, ядрә процессның виртуаль хәтер карталарын яңарта, ләкин ул битләрне физик RAM белән тиз арада кире кайтармый. Факттагы физик битләр сорау буенча бит җитешсезлекләре аша бүлеп бирелә - сезнең программа билгеле бер адреска язганда гына, ядрә аңа чын хәтер битен билгели.

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

Димәк, сезнең процессның виртуаль күләме 72 КБга артса да, аның резидент размеры (RSS) - физик RAM күләме - сез кагылган битләр генә арта. Бер яңа int өчен, бу гадәттә бер 4 КБ бит, һәм арена мета-метата нинди битләрне били. Калган виртуаль киңлек анда утыра, кулланырга әзер, адрес мәйданыннан башка бернәрсә дә тормый - сезнең 64 битлы Linux системасында 128 ТБ бар.

Производство кушымталарын профильләштергәндә һәм мониторинглаганда бу аерма бик мөһим. Әгәр сез реаль ресурс куллануны күзәтергә тиеш программа төзисез икән - SaaS аркасымы, микросервисмы, яки бизнес-операцияләр өчен Mewayz кебек платформаларда эшләгән кебек аналитик торба - сез виртуаль зурлыкка түгел, ә RSSны һәрвакыт күзәтергә тиеш. / proc / [pid] / smaps , valgrind --tool = massif , һәм pmap кебек кораллар сезгә виртуаль хәтер фигураларын адаштыру урынына төгәл физик хәтер эзләрен бирә ала.

Төрле бүлеп бирүчеләр беренче бүлүне ничек эшлиләр

72 КБ фигурасы glibc ptmalloc2 өчен хас. Башка бүлеп бирүчеләр төрле сәүдә нәтиҗәләре ясыйлар, һәм башлангыч бүлеп бирү шулай ук ​​үзгәрә. Эшчәнлеккә сизгер кушымталар өчен бүлеп бирүче сайлаганда бу аермаларны аңлау бик кыйммәт.

  • jemalloc (Facebook, FreeBSD куллана) - җеп-җирле кэшлар белән гранулалы арена структурасын куллана. Башлангыч өстәмә югарырак булырга мөмкин (еш 200+ КБ), ләкин йозак бәхәсенең кимүе аркасында яхшырак күп җепле эш күрсәтә.
  • tcmalloc (Google'ның Thread-Caching Malloc) - агрессив алдан бүлеп, якынча 2 Мб җепнең кэшын бүлеп бирә. Башлангыч өстәмә югарырак, ләкин аннан соң кечкенә бүленешләр бик тиз.
  • musl libc's malloc - барлык бүлеп бирү өчен ммап нигезендә гадирәк дизайн куллана. Башлангыч өстәмә минималь (бүлеп бирү өчен еш кына 4 КБ), ләкин система шалтыратулары аркасында бүлеп бирү бәясе югарырак.
  • mimalloc (Microsoft) - 64 Мб сегментлы сегмент нигезендә бүленеш куллана. Беренче бүлеп бирү 64 Мб виртуаль резервациягә китерә (минималь физик бурыч белән), сәүдә өлкәсенең махсус мәйданы һәм үткәрү урыны.

Бу бүлеп бирүчеләр арасындагы сайлау тулысынча сезнең эш авырлыгына бәйле. Озын эшләгән сервер кушымталары өчен, күп җепле бүленешләр өчен, jemalloc яки tcmalloc гадәттә glibc'ның килешүеннән өстен чыга. Хәтер белән чикләнгән урнаштырылган системалар өчен, түбән үткәрүгә карамастан, муслның гадирәк карашы өстен булырга мөмкин. Күпчелек гомуми максатлы эш өстәле һәм сервер кушымталары өчен ptmalloc2-ның 72 КБ башлангыч өстенлеге көйләнмичә яхшы эшли торган акыллы килешүне күрсәтә.

Башлангыч бүленеш тәртибен көйләү

Әгәр дә куллану өчен 72 КБ башлангыч проблема чыннан да проблемалы булса - бәлки сез меңләгән кыска гомерле процесслар ясыйсыз, аларның һәрберсе берничә өлеш бүлеп бирә - glibc маллопт () һәм MALLOC_ әйләнә-тирә үзгәрүләр гаиләсе аша берничә көйләү тәэмин итә.

M_TOP_PAD параметры бүлеп бирүченең тиз арада кирәк булганнан күбрәк сораганын контрольдә тота. Аны маллопт (M_TOP_PAD, 0) белән 0 итеп кую бүлеп бирүчегә кирәк булганны гына сорарга куша, баштагы башны сизелерлек киметә. M_MMAP_THRESHOLD параметры арена урынына ммап кулланган зурлыкны контрольдә тота. Ирекле хәтер ОСка кайтарылганда M_TRIM_THRESHOLD идарә итә. Glibc 2.26 булганга, glibc.malloc.tcache_count һәм glibc.malloc.tcache_max көйләнмәләре җеп кэш тәртибен контрольдә тотарга мөмкинлек бирә.

Шулай да, сак булырга кирәк: бу параметрларны җентекләп бәяләмичә көйләү һәрвакыт диярлек эшне начаррак итә. Килешүләр реаль дөнья профиленә нигезләнеп сайланган, һәм алар күпчелек эш йөкләре өчен татлы урынны күрсәтәләр. Productionитештерү профиленнән көчле дәлилләр булмаса, маллок өстендәге кыенлык - һәм сез үзгәртүләрегезнең йогынтысын үлчәдегез - дефолтларны калдырыгыз. Бүләк бирүченең вакытыннан алда оптимизациясе - аеруча мәкерле форма, ул бик күп файда өчен сансыз инженер сәгатьләрен сарыф итте.

Бу системалар программалаштыру турында безгә нәрсә өйрәтә

72 КБ беренче бүлеп бирү сере, аның нигезендә, абстракция катламнары турында дәрес. C ++ сезгә яңа int 4 байт бүлеп бирүче иллюзия бирә. Тел стандарты шулай дип әйтә. Сезнең психик модель шулай дип әйтә. Ләкин сезнең кодыгыз һәм җиһазлар арасында катлаулы системалар тупланган - C ++ эш вакыты, C китапханә бүлеп бирүче, ядрәнең виртуаль хәтер системасы, һәм җиһазның MMU һәм TLB - һәрберсе үз-үзен тотышы, оптимизациясе һәм өстенлеге өсти.

Бу кимчелек түгел. Бу система программаларының бөтен ноктасы. Eachәр катлам реаль проблеманы чишү өчен бар: бүлеп бирүче бар, шуңа күрә сез бүлеп бирү өчен система чакыруларын ясарга тиеш түгел. Виртуаль хәтер системасы бар, шуңа күрә физик хәтерне турыдан-туры идарә итәргә кирәк түгел. Битнең ялгыш эшкәртүчесе бар, шуңа күрә хәтер ялкау һәм эффектив эшләнә. Everyәр катлам бик күп эш башкару һәм уңайлык өчен аз күләмдә ачыклык сәүдә итә.

Иң ышанычлы, иң югары күрсәткечле системалар төзүчеләр - бу катламнарны аңлаган кешеләр - алар турында гел уйларга кирәк булганга түгел, ә көтелмәгән нәрсә булганда (серле 72 КБ бүленеше кебек), ни өчен икәнен аңлар өчен акыл моделе бар. Сез реаль вакыттагы сәүдә системасын, уен двигателе яки меңләгән кулланучыларга хезмәт күрсәтүче бизнес-платформа төзисезме, сезнең кодның система дәрәҗәсендә нәрсә эшләгәне турында уйлау сәләте компетентлы уйлап табучыларны аерылып торган нәрсәләрдән аера. 72 КБ хата түгел. Бу сезнең бүлүчегез үз эшен искиткеч башкара.

Бүген сезнең бизнес ОСны төзегез

Фрилансерлардан алып агентлыкларга кадәр, Mewayz 207 интеграль модульле 138,000+ бизнеска вәкаләт бирә. Ирекле эшләгез, үскәч яңартыгыз.

{"@ контекст": "https: \ / \ / schema.org", "@ тип": "Сораулар", "mainEntity": 207 интеграль модульләр, бушлай башлагыз, үскәч яңартыгыз. "}}]}

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