Hacker News

पहिला C++ (m)आवंटन हमेशा 72 KB काहे होला?

टिप्पणी कइल गइल बा

1 min read Via joelsiks.com

Mewayz Team

Editorial Team

Hacker News

रउरा पहिला C++ आवंटन के पीछे के रहस्य

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

जब रउआ नया

के फोन करीं त का होला

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

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

72 केबी के विच्छेदन: बाइट कहाँ जाला

शुरुआती आवंटन ओवरहेड कई गो अलग-अलग घटक सभ से आवे ला जेकरा के रनटाइम के इनिशियलाइज करे के पड़े ला एकरे पहिले कि ऊ रउआँ के इस्तेमाल करे लायक मेमोरी के एक बाइट भी सौंप सके। हर घटक के समझला से पता चलेला कि संख्या जहाँ उतरेला ओहिजा काहे उतरेला।

पहिले, glibc के malloc मुख्य क्षेत्र के इनिशियलाइज करे ला — प्राथमिक बहीखाता संरचना जे मुख्य थ्रेड पर सगरी आवंटन सभ के ट्रैक करे ला। एह अखाड़ा में हीप खातिर मेटाडाटा, फ्री-लिस्ट पॉइंटर, आ अलग-अलग आवंटन साइज खातिर बिन संरचना सभ के सामिल कइल जाला। एलोकेटर प्रोग्राम ब्रेक के sbrk() के माध्यम से बिस्तार करे ला आ सुरुआती एक्सटेंशन के एगो इंटरनल पैरामीटर द्वारा नियंत्रित कइल जाला जेकरा के M_TOP_PAD कहल जाला, जवन डिफ़ॉल्ट रूप से 128 KB के पैडिंग होला। हालाँकि, वास्तविक सुरुआती अनुरोध के पन्ना संरेखण आ मौजूदा ब्रेक पोजीशन खातिर समायोजित कइल जाला, जेकर परिणाम अक्सर छोट पहिला अनुरोध होला — आमतौर पर ताजा शुरू भइल प्रक्रिया पर ओह 72 KB के आँकड़ा के लगे लैंडिंग होला।

दूसरा, glibc 2.26 के बाद से, आवंटक पहिला बेर इस्तेमाल पर थ्रेड-लोकल कैश (tcache) के इनिशियलाइज करे ला। tcache में 64 गो बिन (एक गो प्रति छोट-आवंटन साइज क्लास) होला, हर बिन 7 गो कैश कइल चंक्स तक ले रखे में सक्षम होला। tcache_perthread_struct खुद लगभग 1 KB के खपत करे ला, बाकी एकरा के इनिशियलाइज करे के क्रिया से व्यापक एरिना सेटअप के ट्रिगर हो जाला। तीसरा, 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 KB बढ़ावे ला तब कर्नेल प्रक्रिया के वर्चुअल मेमोरी मैपिंग सभ के अपडेट करे ला, बाकी ऊ तुरंत ओह पन्ना सभ के फिजिकल रैम से बैक ना करे ला। वास्तविक भौतिक पन्ना सभ के मांग पर पन्ना के गलती के माध्यम से आवंटित कइल जाला — तबहिए जब राउर प्रोग्राम कौनों बिसेस पता पर लिखे ला तब कर्नेल ओकरा के मेमोरी के वास्तविक पन्ना असाइन करे ला।

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

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

अलग-अलग आवंटनकर्ता पहिला आवंटन के कइसे संभालेलें

72 केबी के आंकड़ा glibc के ptmaloc2 खातिर विशिष्ट बा। बाकी आवंटन करे वाला लोग अलग-अलग ट्रेडऑफ करे ला आ सुरुआती आवंटन के ओवरहेड एकरे हिसाब से अलग-अलग होला। परफार्मेंस-सेंसिटिव एप्लीकेशन सभ खातिर आवंटक चुने के समय एह अंतर सभ के समझल मूल्यवान होला।

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

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

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

अगर डिफ़ॉल्ट 72 KB के शुरुआती ओवरहेड आपके यूज केस खातिर वास्तव में समस्याग्रस्त बा — शायद रउआ हजारन अल्पकालिक प्रक्रिया के स्पॉन कर रहल बानी, हर एक से खाली मुट्ठी भर आवंटन कर रहल बा — 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_countglibc.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