Hacker News

पैह् ला C++ (m) आबंटन हमेशा 72 केबी कीऽ होंदा ऐ ?

कमेंट करो

1 min read Via joelsiks.com

Mewayz Team

Editorial Team

Hacker News

तुंदे पैह् ले C++ आबंटन दे पिच्छे दा रहस्य

तुस इक साधारण सी ++ प्रोग्राम लिखदे ओ। इक गै नमां इंट। चार बाइट्स। तुस strace जां अपने पसंदीदा मेमोरी प्रोफाइलर गी फायर करदे ओ, ते उत्थें गै ऐ — तुंदी प्रक्रिया ने सिर्फ ऑपरेटिंग सिस्टम थमां मोटे तौर पर 72 केबी दी मंग कीती ऐ. 4 बाइट्स नहीं। 64 बाइटें दा नेईं। इक पूरा 72 केबी। जेकर तुसें कदें उस नंबर गी टकटकी लांदे होई सोचेआ ऐ जे तुंदी टूलिंग तुंदे कन्नै झूठ बोलदी ऐ जां नेईं तां तुस अकेले नेईं ओ। एह् विचित्र प्रतीत होने आह् ला बर्ताव पैह् ली बारी मेमोरी इंटरनल च खोदने आह् ले C++ डेवलपर्स च सारें शा मते पुच्छे जाने आह् ले सवालें च शामल ऐ, ते इसदा जवाब असेंगी उनें परतें दे माध्यम कन्नै इक आकर्षक यात्रा पर लेई जंदा ऐ जेह् ड़ियां तुंदे कोड ते असल हार्डवेयर दे बश्कार बैठदियां न.

जदूं तुस नमें

गी फोन करदे ओ तां केह् होंदा ऐ

72 केबी आंकड़े गी समझने लेई, तुसेंगी पूरी आबंटन श्रृंखला दा पता लाने दी लोड़ ऐ. जदूं तुंदा C++ कोड new int गी निष्पादत करदा ऐ तां कंपाइलर उसगी ऑपरेटर नमें गी इक काल च अनुवाद करदा ऐ, जेह् ड़ा मते सारे Linux सिस्टमें पर glibc थमां malloc गी प्रत्यायोजित करदा ऐ. पर malloc सीधे कर्नेल थमां 4 बाइटें दी मेमोरी नेईं मंगदा. कर्नेल पन्नें च कम्म करदा ऐ — आमतौर पर x86_64 पर 4 केबी — ते इक सिस्टम काल दी लागत इक साधारण मेमोरी एक्सेस दे सापेक्ष बड़ी मती ऐ. हर इक व्यक्तिगत आबंटन आस्तै brk() जां mmap() गी बुलाने कन्नै कुसै बी गैर-तुच्छ प्रोग्राम गी रोकने आस्तै पीसग.

इसदे बजाय, glibc दा मेमोरी आवंटक — ptmalloc2 नांऽ दा इक कार्यान्वयन, जेह् ड़ा अपने आपै च डौग लीआ दे क्लासिक dlmalloc थमां उतरदा ऐ — इक बिचौलियें दे रूप च कम्म करदा ऐ. एह् कर्नेल थमां पैह् ले थमां गै मेमोरी दे बड्डे ब्लॉक दी रिक्वेस्ट करदा ऐ, फ्ही उ'नेंगी छोटे-छोटे टुकड़े च उकेरदा ऐ जि'यां तुंदे प्रोग्राम गी उंदी लोड़ होंदी ऐ. एह् बुनियादी कारण ऐ जे तुंदा पैह् ला 4-बाइट आबंटन ऑपरेटिंग सिस्टम गी मता बड्डा रिक्वेस्ट ट्रिगर करदा ऐ। आवंटनकर्ता बेकार नेईं होआ करदा। एह् रणनीतिक होआ करदा ऐ।

72 केबी दा विच्छेदन: बाइट कित्थे जांदे न

शुरुआती आबंटन ओवरहेड केईं बक्ख-बक्ख घटकें थमां औंदा ऐ जेह् ड़े रनटाइम गी इस थमां पैह् ले शुरू करना होग जे ओह् तुसेंगी बरतूनी मेमोरी दा इक बाइट बी सौंप सकदा ऐ. हर घटक गी समझने कन्नै एह् दस्सेआ जंदा ऐ जे नंबर जित्थें उतरदी ऐ उत्थें कीऽ उतरदी ऐ।

पैह् ले, glibc दा malloc मुख्य क्षेत्र गी शुरू करदा ऐ — प्राथमिक बहीखाता संरचना जेह् ड़ी मुक्ख थ्रेड पर सारे आबंटन गी ट्रैक करदी ऐ. इस अखाड़े च ढेर, मुक्त-सूची संकेतक, ते बक्ख-बक्ख आबंटन आकारें आस्तै बिन संरचनाएं आस्तै मेटाडाटा शामल न. आबंटनकर्ता प्रोग्राम ब्रेक गी sbrk() दे राहें विस्तार करदा ऐ , ते शुरूआती विस्तार गी M_TOP_PAD नांऽ आह् ले इक आंतरिक पैरामीटर कन्नै नियंत्रित कीता जंदा ऐ , जेह् ड़ा डिफाल्ट रूप कन्नै 128 केबी पैडिंग ऐ . हालांकि, असल शुरूआती रिक्वेस्ट गी पृष्ठ संरेखण ते मौजूदा ब्रेक स्थिति आस्तै समायोजित कीता जंदा ऐ, जेह् ड़ा अक्सर इक निक्के पैह् ले अनुरोध दा नतीजा होंदा ऐ — आमतौर पर ताजा शुरू कीती गेदी प्रक्रिया पर उस 72 केबी आंकड़े दे कोल लैंडिंग.

दूआ, glibc 2.26 दे बाद, आबंटन करने आह् ला पैह् ले इस्तेमाल पर इक थ्रेड-स्थानीय कैशे (tcache) गी शुरू करदा ऐ. tcache च 64 बिन (इक प्रति छोटे-आवंटन आकार वर्ग) होंदे न, हर इक 7 कैश कीते गेदे चंक्स गी रखने च समर्थ ऐ. tcache_perthread_struct अपने आपै च 1 केबी दे आसपास खपत करदा ऐ, पर इसगी शुरू करने दी क्रिया व्यापक अखाड़े सेटअप गी ट्रिगर करदी ऐ. तीसरी गल्ल, C++ रनटाइम ने तुंदे main() गी बी चलाने थमां पैह् ले आबंटन कीते न — स्थिर कंस्ट्रक्टर, std::cout ते दोस्तें आस्तै iostream बफर आरंभीकरण, ते लोकेल सेटअप सारे उस शुरूआती ढेर फुटप्रिंट च योगदान दिंदे न.

एरेना सिस्टम ते प्री-आवंटन स्मार्ट कीं ऐ

स्मृति दे इक पर्याप्त हिस्से गी टुकड़े-टुकड़े च अनुरोध करने दे बजाय पूर्व-आवंटित करने दा फैसला लागू करने दा कोई दुर्घटना नेईं ऐ. एह् इक जानबूझकर इंजीनियरिंग ट्रेडऑफ ऐ जेह् ड़ा दशकें दे सिस्टम प्रोग्रामिंग दे अनुभव च जड़ें दा ऐ। brk() जां mmap() गी हर इक काल च बरतूनी स्पेस थमां कर्नेल स्पेस च संदर्भ स्विच, प्रक्रिया दी आभासी स्मृति मैपिंग च संशोधन, ते संभावित पृष्ठ तालिका अपडेट शामल न. आधुनिक हार्डवेयर पर, इक सिस्टम काल दी कीमत मोटे तौर पर 100-200 नैनोसेकंड होंदी ऐ — अलगाव च मामूली, पैमाने पर तबाही आह् ला।

इक प्रोग्राम पर विचार करो जेह् ड़ा शुरूआत दे दौरान 10,000 छोटे आबंटन करदा ऐ. पूर्व-आवंटन दे बगैर, इसदा मतलब ऐ 10,000 सिस्टम काल, जिस च लगभग 1-2 मिलीसेकंड शुद्ध ओवरहेड दी लागत होग। एरेना-आधारत आबंटन कन्नै, पैह् ला आबंटन इक सिस्टम काल गी ट्रिगर करदा ऐ, ते इसदे बाद 9,999 आबंटन गी पॉइंटर अंकगणित ते लिंक-लिस्ट ऑपरेशनें दे माध्यम कन्नै पूरी चाल्ली कन्नै यूजर स्पेस च सेवा दित्ती जंदी ऐ — हर इक च मोटे तौर पर 10-50 नैनोसेकंड लगदा ऐ। गणित निर्विवाद ऐ: पूर्व-आवंटन परिमाण दे आर्डर कन्नै जीतदा ऐ।

<ब्लॉककोट> दा

जेह् ड़ा 72 केबी तुस अपने पैह् ले आबंटन पर दिक्खदे ओ ओह् मेमोरी बर्बाद नेईं ऐ — एह् इक प्रदर्शन निवेश ऐ. आवंटक दांव लगा करदा ऐ जे तुंदा प्रोग्राम जल्द गै होर आबंटन करग, ते लगभग हर असली दुनिया दे परिदृश्य च, ओह दांव सुंदर तरीके कन्नै फलदा ऐ। अप्रयुक्त आभासी पता स्पेस दी लागत आधुनिक 64-बिट सिस्टम पर जरूरी रूप कन्नै शून्य ऐ.

दा

आभासी स्मृति बनाम भौतिक स्मृति: इसदा कोई फर्क नेईं पौंदा

इस बर्ताव दा पैह् ली बारी सामना करने आह् ले डेवलपर्स च इक आम चिंता संसाधनें दी बरबादी ऐ. जेकर मिगी सिर्फ 4 बाइटें दी लोड़ ऐ तां मेरा प्रोग्राम 72 केबी दा खपत कीऽ करा करदा ऐ? आलोचनात्मक अंतर्दृष्टि एह् ऐ जे आभासी स्मृति भौतिक स्मृति नेईं ऐ । जदूं glibc प्रोग्राम ब्रेक गी 72 केबी बधांदा ऐ तां कर्नेल प्रक्रिया दी वर्चुअल मेमोरी मैपिंग गी अपडेट करदा ऐ, पर एह् भौतिक रैम कन्नै उनें पन्नें दा तुरत बैक नेईं करदा ऐ. असल भौतिक पन्नें गी मंग पर पृष्ठ त्रुट्टी दे राहें आबंटित कीता जंदा ऐ — तदूं गै जदूं तुंदा प्रोग्राम कुसै खास पते पर लिखदा ऐ तां कर्नेल इसगी मेमोरी दा इक असली पृष्ठ असाइन करदा ऐ.

💡 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 केबी बधदा ऐ, पर इसदा निवासी सेट आकार (आरएसएस) — असल च खपत कीते गेदे भौतिक रैम दी मात्रा — सिर्फ उनें पन्नें कन्नै बधदा ऐ जिनेंगी तुस असल च छूंदे ओ. इक गै नमें int आस्तै, जेह् ड़ा आमतौर पर इक 4 केबी पृष्ठ ऐ, प्लस जेह् ड़े बी पन्नें पर एरिना मेटाडाटा कब्जा करदा ऐ. बाकी आभासी स्पेस उत्थें गै बैठे दा ऐ, इस्तेमाल आस्तै तैयार ऐ, जिसदी कीमत पता स्पेस दे अलावा होर किश नेईं ऐ — जिंदे चा तुंदे कोल 64-बिट लिनक्स सिस्टम पर 128 टीबी ऐ.

उत्पादन एप्लीकेशनें गी प्रोफाइल ते निगरानी करदे बेल्लै एह् भेद मता जरूरी ऐ. जेकर तुस सॉफ्टवेयर बना करदे ओ जेह् ड़ा असली संसाधन खपत गी ट्रैक करने दी लोड़ ऐ — चाहे ओह् SaaS बैकएंड होऐ , माइक्रोसर्विस होऐ , जां एनालिटिक्स पाइपलाइन होऐ जि’यां जेह् ड़े कारोबारी संचालन आस्तै Mewayz जनेह् प्लेटफार्में पर चलदे न — तां तुसेंगी हमेशा आभासी आकार दी बजाय आरएसएस दी निगरानी करनी चाहिदी /proc/[pid]/smaps, valgrind --tool=massif, ते pmap जनेह् उपकरण तुसेंगी आभासी स्मृति आंकड़ें गी गुमराह करने दे बजाय सटीक भौतिक स्मृति पैरें दे निशान देई सकदे न.

अलग-अलग आबंटनकर्ता पैह् ले आबंटन गी किस चाल्ली संभालदे न

72 केबी दा आंकड़ा glibc दे ptmalloc2 आस्तै विशिष्ट ऐ. होर आबंटनकर्ता बक्ख-बक्ख ट्रेडऑफ करदे न, ते शुरूआती आबंटन ओवरहेड इसदे मुताबिक बक्ख-बक्ख होंदा ऐ। प्रदर्शन-संवेदनशील अनुप्रयोगें आस्तै इक आबंटनकर्ता चुनदे बेल्लै इनें अंतरें गी समझना कीमती ऐ.

<उल>
  • jemalloc (फेसबुक, FreeBSD आसेआ बरतेआ जंदा ऐ) — थ्रेड-स्थानीय कैशे कन्नै इक होर दानेदार अखाड़े संरचना दा उपयोग करदा ऐ. शुरूआती ओवरहेड उच्च (अक्सर 200+ केबी) होने दी प्रवृत्ति रखदा ऐ पर लॉक विवाद च कमी दे कारण बेहतर मल्टी-थ्रेडेड प्रदर्शन प्रदान करदा ऐ.
  • tcmalloc (गूगल दा थ्रेड-कैशिंग मैलोक) — आक्रामक पूर्व-आवंटन कन्नै, डिफाल्ट रूप कन्नै लगभग 2 एमबी दा प्रति-थ्रेड कैश आवंटित करदा ऐ. शुरूआती ओवरहेड मता ऐ, पर बाद च छोटे आबंटन बेह्तर तेज़ होंदे न।
  • musl libc दा malloc — सारे आबंटन आस्तै mmap पर आधारित इक मता सरल डिजाइन दा उपयोग करदा ऐ. शुरूआती ओवरहेड घट्ट शा घट्ट ऐ (अक्सर सिर्फ 4 केबी प्रति आबंटन), पर प्रति आबंटन लागत मती बार-बार होने आह् ली सिस्टम काल दे कारण मती ऐ.
  • mimalloc (माइक्रोसॉफ्ट) — 64 एमबी सेगमेंटें कन्नै सेगमेंट-आधारत आबंटन दा उपयोग करदा ऐ. पैह् ला आबंटन 64 एमबी आभासी आरक्षण (घट्ट शा घट्ट भौतिक प्रतिबद्धता कन्नै), असाधारण लोकलटी ते थ्रूपुट आस्तै ट्रेडिंग पता स्पेस गी ट्रिगर करदा ऐ.
  • दा ऐ

    इन्हें आबंटनकर्ताएं दे बश्कार चयन पूरी चाल्ली तुंदे कम्मै दे बोझ उप्पर निर्भर करदा ऐ. भारी बहु-थ्रेडेड आबंटन कन्नै लंबे समें तगर चलने आह् ले सर्वर एप्लीकेशनें आस्तै, jemalloc जां tcmalloc आमतौर पर glibc दे डिफाल्ट थमां बेहतर प्रदर्शन करदा ऐ. मेमोरी-संकुचित एम्बेडेड सिस्टम आस्तै, घट्ट थ्रूपुट दे बावजूद musl दा सरल तरीका बेहतर होई सकदा ऐ। ज्यादातर सामान्य-उद्देश्य डेस्कटॉप ते सर्वर एप्लीकेशनें आस्तै, ptmaloc2 दा 72 केबी शुरूआती ओवरहेड इक उचित डिफाल्ट दा प्रतिनिधित्व करदा ऐ जेह् ड़ा ट्यूनिंग दे बगैर ठीक कम्म करदा ऐ.

    शुरुआती आवंटन व्यवहार गी ट्यून करना

    जेकर डिफाल्ट 72 केबी शुरूआती ओवरहेड तुंदे इस्तेमाल मामले आस्तै सच्ची समस्याग्रस्त ऐ — शायद तुस हज़ारें अल्पकालिक प्रक्रियाएं गी स्पॉन करा करदे ओ, हर इक सिर्फ मुट्ठी भर आबंटन करदा ऐ — glibc mallopt() ते वातावरण चर दे MALLOC_ परिवार दे राहें केईं ट्यूनेबल उपलब्ध करोआंदा ऐ.

    M_TOP_PAD पैरामीटर नियंत्रत करदा ऐ जे आबंटन करने आह् ला किन्नी अतिरिक्त मेमोरी दी रिक्वेस्ट करदा ऐ जेह् ड़ी फौरन लोड़चदी ऐ. mallopt(M_TOP_PAD, 0) कन्नै इसगी 0 पर सेट करना आबंटनकर्ता गी सिर्फ उसी गै अनुरोध करने लेई आखदा ऐ जेह् ड़ी लोड़चदी ऐ, जिस कन्नै शुरूआती ओवरहेड च काफी कमी औंदी ऐ. M_MMAP_THRESHOLD पैरामीटर उस आकार गी नियंत्रत करदा ऐ जिस थमां उप्पर आबंटन अखाड़े दी बजाय mmap दा इस्तेमाल करदे न. M_TRIM_THRESHOLD नियंत्रत करदा ऐ जिसलै मुक्त स्मृति गी ओएस च वापस कीता जंदा ऐ. ते चूंकि glibc 2.26, glibc.malloc.tcache_count ते glibc.malloc.tcache_max ट्यूनेबल तुसेंगी थ्रेड कैशे व्यवहार गी नियंत्रित करने दी अनुमति दिंदे न.

    हालांके, सावधानी दा इक शब्द: बिना सावधानी कन्नै बेंचमार्किंग दे इनें पैरामीटरें गी ट्यून करने कन्नै लगभग हमेशा हालात बदतर होई जंदे न। डिफाल्टें गी व्यापक असली-दुनिया प्रोफाइलिंग दे आधार उप्पर चुनेआ गेआ हा, ते एह् कम्मै दे बोझ दे विशाल बहुमत आस्तै इक मीठा थाह् र दा प्रतिनिधित्व करदे न। जदूं तकर तुंदे कोल प्रोडक्शन प्रोफाइलिंग थमां मजबूत सबूत नेईं होन जे मैलोक ओवरहेड इक अड़चन ऐ — ते तुसें अपने बदलावें दे असर गी मापने दा कम्म नेईं कीता ऐ — डिफाल्टें गी अकेला छोड़ो. आबंटनकर्ता दा समें कोला पैह् ले अनुकूलन याक शेविंग दा इक खास कपटी रूप ऐ जेह् ड़ा नगण्य फायदे आस्तै इंजीनियरिंग दे अनगिनत घंटें दा खपत करी चुके दा ऐ ।

    इस कन्नै असेंगी सिस्टम प्रोग्रामिंग दे बारे च केह् सिखाया जंदा ऐ

    72 केबी पैह् ले-आवंटन रहस्य, अपने मूल च, अमूर्त परतें दे बारे च इक सबक ऐ। C++ तुसेंगी एह् भ्रम दिंदा ऐ जे new int 4 बाइटें गी आवंटित करदा ऐ. भाशा दा मानक ऐसा आखदा ऐ। तुहाडा मानसिक मॉडल ऐह आखदा है। पर तुंदे कोड ते हार्डवेयर दे बश्कार परिष्कृत सिस्टमें दा इक ढेर बैठदा ऐ — C++ रनटाइम, C लाइब्रेरी आबंटन, कर्नेल दा वर्चुअल मेमोरी सबसिस्टम, ते हार्डवेयर दा MMU ते TLB — हर इक अपने-अपने व्यवहार, अनुकूलन, ते ओवरहेड गी जोड़दा ऐ.

    एह् कोई खामी नेईं ऐ। एह् सिस्टम सॉफ्टवेयर दा पूरा बिंदु ऐ। हर परत इक असली समस्या गी हल करने आस्तै मौजूद ऐ : आबंटन करने आह् ला मौजूद ऐ इसलेई तुसेंगी हर आबंटन आस्तै सिस्टम काल नेईं करना होग. वर्चुअल मेमोरी सिस्टम मौजूद ऐ इसलेई तुसेंगी भौतिक मेमोरी गी सीधे तौर पर प्रबंधत नेईं करना होग। पेज फाल्ट हैंडलर मौजूद ऐ इसलेई मेमोरी गी आलसी ते कुशलता कन्नै प्रतिबद्ध कीता जंदा ऐ. हर परत बड़ी मती मात्रा च प्रदर्शन ते सुविधा आस्तै थोह् ड़ी-मती पारदर्शिता दा व्यापार करदी ऐ ।

    सबने शा भरोसेमंद, उच्चतम प्रदर्शन करने आह् ले सिस्टम बनाने आह् ले डेवलपर ओह् न जेह् ड़े इनें परतें गी समझदे न — इस आस्तै नेईं जे उनेंगी उंदे बारे च लगातार सोचने दी लोड़ ऐ, पर इस आस्तै जे जिसलै कोई अप्रत्याशित होंदा ऐ (जि'यां इक रहस्यमय 72 केबी आबंटन), तां उंदे कोल एह् समझने दा मानसिक मॉडल होंदा ऐ जे कीऽ। चाहे तुस रियल-टाइम ट्रेडिंग सिस्टम, गेम इंजन, जां हज़ारें बरतूनी दी सेवा करने आह् ला बिजनेस प्लेटफार्म बना करदे ओ, इस बारे च तर्क करने दी समर्थता जे सिस्टम स्तर पर तुंदा कोड असल च केह् करदा ऐ, एह् गै सक्षम डेवलपर्स गी असाधारण डेवलपर्स थमां बक्ख करदी ऐ। 72 केबी कोई बग नेईं ऐ। एह् तुंदा आवंटनकर्ता ऐ जेह्ड़ा अपना कम्म शानदार ढंगै कन्नै करा करदा ऐ।

    अज्ज अपना बिजनेस ओएस बनाओ

    फ्रीलांसर थमां एजेंसियें तगर, मेवेज़ 207 इंटीग्रेटेड मॉड्यूल कन्नै 138,000+ कारोबारें गी शक्ति दिंदा ऐ. मुफ्त शुरू करो, जदूं तुस बधदे ओ तां अपग्रेड करो।

    मुफ्त खाता बनाओ →
    दा

    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