Nima uchun birinchi C++ (m) taqsimoti har doim 72 KB?
Fikrlar
Mewayz Team
Editorial Team
Birinchi C++ taqsimotingiz ortidagi sir
Siz oddiy C++ dasturini yozasiz. Yagona yangi int. To'rt bayt. Siz straceni yoki sevimli xotira profilingizni ishga tushirasiz va mana shu — jarayoningiz hozirgina operatsion tizimdan taxminan 72 KB talab qildi. 4 bayt emas. 64 bayt emas. To'liq 72 KB. Agar siz hech qachon bu raqamga qaragan bo'lsangiz va asboblaringiz sizga yolg'on gapiryaptimi yoki yo'qmi deb o'ylagan bo'lsangiz, siz yolg'iz emassiz. Bu g‘alati tuyulgan xatti-harakatlar C++ dasturchilari orasida birinchi marta xotiraning ichki qismlarini o‘rganayotganlar orasida eng ko‘p beriladigan savollardan biridir va bu javob bizni kodingiz va haqiqiy uskuna o‘rtasida joylashgan qatlamlar bo‘ylab qiziqarli sayohatga olib boradi.
yangi
ga qo'ng'iroq qilganingizda nima bo'ladi72 KB hajmini tushunish uchun siz to'liq taqsimlash zanjirini kuzatishingiz kerak. Sizning C++ kodingiz new intni ishga tushirganda, kompilyator buni operator newga qo'ng'iroqqa aylantiradi, bu ko'pchilik Linux tizimlarida glibc-dan mallocga topshiriladi. Lekin malloc yadrodan 4 bayt xotirani bevosita so'ramaydi. Yadro sahifalarda ishlaydi - odatda x86_64 da 4 KB - va tizim chaqiruvining narxi oddiy xotiraga kirishga nisbatan juda katta. Har bir alohida ajratish uchun brk() yoki mmap() chaqiruvi har qanday ahamiyatsiz dasturni toʻxtatib qoʻyadi.
O'rniga, glibc xotira taqsimlovchisi — ptmalloc2 deb nomlangan dastur, o'zi Dug Lining klassik dlmallocdan kelib chiqqan — vositachi vazifasini bajaradi. Oldindan yadrodan katta xotira bloklarini so'raydi, so'ngra dasturingizga kerak bo'lgani uchun ularni kichikroq qismlarga ajratadi. Bu sizning birinchi 4 baytni ajratishingiz operatsion tizimga kattaroq so'rovni ishga tushirishining asosiy sababidir. Ajratuvchi isrofgarchilik qilmayapti. Bu strategik ahamiyatga ega.
72 KB ni ajratish: baytlar qaerga ketadi
Dastlabki taqsimlash xarajatlari bir necha alohida komponentlardan kelib chiqadi, ular sizga bir bayt foydalanish mumkin bo'lgan xotirani topshirishdan oldin ish vaqti ishga tushirilishi kerak. Har bir komponentni tushunish raqam nima uchun qayerga tushishini tushuntiradi.
Birinchidan, glibc's malloc asosiy arenani ishga tushiradi — bu asosiy buxgalteriya hisobi tuzilmasi asosiy tarmoqdagi barcha taqsimotlarni kuzatadi. Ushbu arenada to'p uchun metama'lumotlar, bepul ro'yxat ko'rsatkichlari va turli ajratish o'lchamlari uchun quti tuzilmalari kiradi. Ajratuvchi dastur uzilishini sbrk() orqali uzaytiradi va dastlabki kengaytma M_TOP_PAD deb nomlangan ichki parametr bilan boshqariladi, bu sukut boʻyicha 128 KB toʻldirishga teng. Biroq, haqiqiy boshlang‘ich so‘rov sahifalarni tekislash va mavjud tanaffus holatiga moslashtiriladi, bu ko‘pincha kichikroq birinchi so‘rovga olib keladi – odatda yangi boshlangan jarayonda 72 KB ga yaqin tushadi.
Ikkinchidan, glibc 2.26 dan boshlab ajratuvchi birinchi foydalanishda mavzu-mahalliy keshni (tcache) ishga tushiradi. Tkeshda 64 ta quti (kichik ajratilgan o'lchamli sinf uchun bitta), har biri 7 tagacha keshlangan bo'laklarni saqlashga qodir. tcache_perthread_structning o'zi taxminan 1 KB sarflaydi, lekin uni ishga tushirish harakati kengroq arenani sozlashni boshlaydi. Uchinchidan, C++ ish vaqti main() ishga tushgunga qadar allaqachon taqsimlashlarni amalga oshirgan — statik konstruktorlar, std::cout va do‘stlar uchun iostream buferini ishga tushirish va mahalliy sozlamalar o‘sha boshlang‘ich to‘p iziga hissa qo‘shadi.
Arena tizimi va nima uchun oldindan ajratish aqlli
Xotiraning katta qismini qismlarga bo'lib so'rash o'rniga oldindan ajratish to'g'risidagi qaror amalga oshirish tasodifiy emas. Bu o'nlab yillar davomida tizimlarni dasturlash tajribasiga asoslangan qasddan muhandislik kelishuvidir. brk() yoki mmap() ga har bir qo‘ng‘iroq kontekst foydalanuvchi maydonidan yadro maydoniga o‘tishni, jarayonning virtual xotira xaritalarini o‘zgartirishni va potentsial sahifa jadvalini yangilashni o‘z ichiga oladi. Zamonaviy uskunada bitta tizim qo‘ng‘irog‘i taxminan 100-200 nanosekundga tushadi – alohida holatda ahamiyatsiz, miqyosda halokatli.
Initsializatsiya paytida 10 000 ta kichik taqsimotni amalga oshiradigan dasturni ko'rib chiqing. Oldindan taqsimlanmagan holda, bu taxminan 1-2 millisekundlik sof qo'shimcha xarajatlarni talab qiladigan 10 000 ta tizim qo'ng'iroqlarini anglatadi. Arenaga asoslangan ajratuvchi bilan birinchi ajratish bitta tizim chaqiruvini ishga tushiradi va keyingi 9999 ta taqsimot toʻliq foydalanuvchi maydonida koʻrsatkich arifmetikasi va bogʻlangan roʻyxat operatsiyalari orqali xizmat koʻrsatiladi - har biri taxminan 10-50 nanosekundni oladi. Matematika bir ma'noli: oldindan taqsimlash kattalik bo'yicha g'alaba qozonadi.
Birinchi ajratilganingizda ko'rgan 72 KB xotira behuda sarflanmaydi - bu unumdorlikka investitsiya. Taqdim etuvchi dasturingiz tez orada ko'proq mablag' ajratishiga va deyarli har bir real stsenariyda bu garov yaxshi natija berishiga umid qilmoqda. Foydalanilmayotgan virtual manzil maydoni narxi zamonaviy 64-bitli tizimlarda nolga teng.
Virtual xotira va jismoniy xotira: nima uchun bu muhim emas
Bu kabi xatti-harakatlarga birinchi marta duch kelgan dasturchilarni tashvishga soladigan narsa bu resurslarni isrof qilishdir. Agar menga atigi 4 bayt kerak bo'lsa, nega mening dasturim 72 KB sarflaydi? Muhim tushuncha shundaki, virtual xotira jismoniy xotira emas. Glibc dastur uzilishini 72 KB ga kengaytirganda, yadro jarayonning virtual xotira xaritalarini yangilaydi, lekin u darhol ushbu sahifalarni jismoniy RAM bilan saqlamaydi. Haqiqiy jismoniy sahifalar so'rov bo'yicha sahifa xatoliklari orqali taqsimlanadi — faqat dasturingiz ma'lum bir manzilga yozganda yadro unga xotiraning haqiqiy sahifasini tayinlaydi.
💡 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 →Bu shuni anglatadiki, jarayoningiz virtual hajmi 72 KB ga oshgan bo'lsa-da, uning rezident o'lchami (RSS) - haqiqatda iste'mol qilingan jismoniy RAM miqdori - faqat siz tegib turgan sahifalarga ortadi. Bittayangi int uchun, odatda, bitta 4 KB sahifa, shuningdek, arena metamaʼlumotlari qaysi sahifalarni egallashidan qatʼi nazar. Qolgan virtual boʻsh joy oʻsha yerda, foydalanishga tayyor, faqat manzil maydonidan boshqa hech narsa talab qilmaydi – 64-bitli Linux tizimida sizda 128 TB bor.
Bu farq ishlab chiqarish ilovalarini profillash va monitoring qilishda muhim ahamiyatga ega. Agar siz real resurslar sarfini kuzatish uchun dasturiy ta'minot yaratayotgan bo'lsangiz - xoh u SaaS backend, mikroservis yoki biznes operatsiyalari uchun Mewayz kabi platformalarda ishlaydigan analitik quvur bo'ladimi - virtual o'lchamdan ko'ra har doim RSS-ni kuzatib borishingiz kerak. /proc/[pid]/smaps, valgrind --tool=massif va pmap kabi asboblar virtual xotira raqamlarini chalg‘itmasdan, aniq jismoniy xotira izlarini berishi mumkin.
Turli taqsimlovchilar birinchi ajratishni qanday boshqaradi
72 KB hajmi glibc ning ptmalloc2 ga xosdir. Boshqa taqsimlovchilar turli xil kelishuvlarni amalga oshiradilar va dastlabki taqsimlash qo'shimcha xarajatlari mos ravishda o'zgaradi. Bu farqlarni tushunish unumdorlikka sezgir ilovalar uchun ajratuvchi tanlashda muhim ahamiyatga ega.
- jemalloc (Facebook, FreeBSD tomonidan qo'llaniladi) — Tarmoq-mahalliy keshlar bilan yanada granüler arena strukturasidan foydalanadi. Dastlabki qo‘shimcha xarajatlar odatda yuqoriroq (ko‘pincha 200+ KB) bo‘ladi, lekin blokirovkalashning kamayishi tufayli ko‘p tarmoqli ish faoliyatini yaxshilaydi.
- tcmalloc (Google Thread-Caching Malloc) — Agressiv oldindan ajratish bilan sukut bo'yicha har bir mavzu uchun taxminan 2 MB keshni ajratadi. Dastlabki qo‘shimcha xarajatlar yuqoriroq, lekin keyingi kichik taqsimotlar juda tezdir.
- musl libc's malloc — Barcha ajratmalar uchun mmapga asoslangan ancha sodda dizayndan foydalanadi. Dastlabki qo‘shimcha xarajatlar minimal (ko‘pincha har bir ajratish uchun 4 KB), lekin tizim qo‘ng‘iroqlari tez-tez bo‘lgani uchun har bir taqsimlash narxi yuqoriroq bo‘ladi.
- mimalloc (Microsoft) — 64 MB segmentlar bilan segmentga asoslangan ajratishdan foydalanadi. Birinchi ajratish 64 MB virtual zahirani (minimal jismoniy majburiyat bilan), alohida joylashuv va o‘tkazish qobiliyati uchun savdo manzil maydonini ishga tushiradi.
Ushbu taqsimlagichlar orasidagi tanlov butunlay sizning ish yukingizga bog'liq. Og'ir ko'p tarmoqli ajratishga ega bo'lgan uzoq muddatli server ilovalari uchun jemalloc yoki tcmalloc odatda glibc standartidan yuqori ishlaydi. Xotirasi cheklangan o'rnatilgan tizimlar uchun, past o'tkazish qobiliyatiga qaramay, muslning soddaroq yondashuvi afzalroq bo'lishi mumkin. Aksariyat umumiy maqsadli ish stoli va server ilovalari uchun ptmalloc2-ning 72 KB boshlang‘ich yuki sozlashsiz ham yaxshi ishlaydi.
Boshlang'ich ajratish xatti-harakatini sozlash
Agar sukut boʻyicha 72 KB boshlangʻich qoʻshimcha xarajatlar sizning foydalanishingiz uchun haqiqatan ham muammoli boʻlsa – ehtimol siz minglab qisqa muddatli jarayonlarni yaratayotgan boʻlsangiz, ularning har biri faqat bir nechta taqsimotlarni amalga oshiradi – glibc mallopt() va MALLOC_ muhit oʻzgaruvchilari oilasi
orqali bir nechta sozlanishi mumkin.M_TOP_PAD parametri ajratuvchi zarur boʻlganidan tashqari qancha qoʻshimcha xotira soʻrashini boshqaradi. Uni mallopt(M_TOP_PAD, 0) yordamida 0 ga o‘rnatish, ajratuvchiga faqat kerakli narsani so‘rashni bildiradi, bu esa dastlabki qo‘shimcha xarajatlarni sezilarli darajada kamaytiradi. M_MMAP_THRESHOLD parametri yuqoridagi taqsimotlarda arena oʻrniga mmap dan foydalanish hajmini boshqaradi. M_TRIM_THRESHOLD bo'shatilgan xotira qachon OTga qaytarilishini boshqaradi. Glibc 2.26 dan boshlab, glibc.malloc.tcache_count va glibc.malloc.tcache_max sozlanishi sizga ip keshini boshqarish imkonini beradi.
Ammo, diqqat: bu parametrlarni sinchkovlik bilan taqqoslamasdan sozlash deyarli har doim vaziyatni yomonlashtiradi. Standartlar keng qamrovli real dunyo profiliga asoslangan holda tanlangan va ular ish yuklarining katta qismi uchun yoqimli joyni ifodalaydi. Agar ishlab chiqarish profilini yaratishda sizda malloc yuki to'siq ekanligi haqida kuchli dalillar bo'lmasa va siz o'zgartirishlaringiz ta'sirini o'lchagan bo'lsangiz, standart sozlamalarni yolg'iz qoldiring. Ajratgichni muddatidan oldin optimallashtirish - bu arzimas foyda uchun son-sanoqsiz muhandislik soatlarini sarflagan yasoqni tarashning ayniqsa makkor shaklidir.
Bu bizga tizimlarni dasturlash haqida nimani o'rgatadi
72 KB hajmdagi birinchi taqsimlash sirining mohiyati abstraksiya qatlamlari haqida saboqdir. C++ sizga yangi int 4 bayt ajratadi degan tasavvurni beradi. Til standarti shunday deydi. Sizning aqliy modelingiz shunday deydi. Lekin sizning kodingiz va apparat o‘rtasida murakkab tizimlar to‘plami joylashgan – C++ ish vaqti, C kutubxonasi ajratuvchisi, yadro virtual xotira quyi tizimi va apparatning MMU va TLB – har biri o‘ziga xos xatti-harakatlar, optimallashtirish va qo‘shimcha xarajatlarni qo‘shadi.
Bu kamchilik emas. Bu tizim dasturiy ta'minotining butun nuqtasidir. Har bir qatlam haqiqiy muammoni hal qilish uchun mavjud: ajratuvchi mavjud, shuning uchun har bir ajratish uchun tizim qo'ng'iroqlarini qilishingiz shart emas. Virtual xotira tizimi mavjud, shuning uchun siz bevosita jismoniy xotirani boshqarishingiz shart emas. Sahifa xatosini qayta ishlovchi mavjud, shuning uchun xotira dangasa va samarali ishlaydi. Har bir qatlam katta hajmdagi unumdorlik va qulaylik uchun kichik hajmdagi shaffoflikni sotadi.
Eng ishonchli va yuqori samarali tizimlarni yaratadigan ishlab chiquvchilar bu qatlamlarni tushunadiganlardir - ular doimo ular haqida o'ylashlari kerakligi uchun emas, balki kutilmagan bir narsa sodir bo'lganda (masalan, sirli 72 KB ajratish) sababini tushunish uchun aqliy modelga ega. Haqiqiy vaqtda savdo tizimini, o'yin mexanizmini yoki minglab foydalanuvchilarga xizmat ko'rsatadigan biznes platformasini quryapsizmi, sizning kodingiz tizim darajasida aslida nima qilishi haqida fikr yuritish qobiliyati malakali ishlab chiquvchilarni istisnolardan ajratib turadigan narsadir. 72 KB xato emas. Bu sizning taqsimlovchingiz o'z ishini a'lo darajada bajarmoqda.
O'z biznes operatsion tizimini bugun yarating
Frilanserlardan tortib agentliklargacha, Mewayz 207 integratsiyalashgan modulga ega 138 000 dan ortiq biznesga vakolat beradi. Bepul boshlang, oʻsganingizda yangilang.
Bepul hisob yaratish →We use cookies to improve your experience and analyze site traffic. Cookie Policy