Hacker News

प्रथमं C++ (m)विनियोगं सर्वदा 72 KB किमर्थं भवति ?

टिप्पणियाँ

2 min read Via joelsiks.com

Mewayz Team

Editorial Team

Hacker News

भवतः प्रथमस्य C++ आवंटनस्य पृष्ठतः रहस्यम्

भवन्तः सरलं C++ प्रोग्रामं लिखन्ति । एकः नवः अन्तर्ः । चत्वारि बाइट् । भवान् strace अथवा भवतः प्रियं स्मृतिप्रोफाइलरं प्रज्वालयति, तत्र च अस्ति — भवतः प्रक्रिया केवलं प्रचालनतन्त्रात् मोटेन ७२ KB अनुरोधितवती । न तु ४ बाइट् । न तु ६४ बाइट् । एकं पूर्णं ७२ केबी. यदि भवता कदापि तां संख्यां प्रेक्षमाणः चिन्तितः यत् भवतः साधनं भवतः मृषावादं करोति वा इति तर्हि भवतः एकः नास्ति । एषः विचित्रः इव व्यवहारः प्रथमवारं स्मृति-आन्तरिक-विषयेषु खनन्तः C++-विकासकानाम् एकः बहुधा पृष्टः प्रश्नः अस्ति, उत्तरं च अस्मान् भवतः कोडस्य वास्तविक-हार्डवेयरस्य च मध्ये उपविष्टानां स्तरानाम् माध्यमेन आकर्षकयात्रायां नेति ।

यदा भवन्तः नवीन

आह्वयन्ति तदा किं भवति

72 KB आकङ्क्षां ज्ञातुं भवद्भिः पूर्णविनियोगशृङ्खलायाः अनुसन्धानं कर्तव्यम् । यदा भवतः C++ कोडः new int निष्पादयति तदा संकलकः तत् operator new इत्यस्मै आह्वानरूपेण अनुवादयति, यत् अधिकांशेषु Linux प्रणालीषु glibc तः malloc प्रति प्रत्यायोजयति परन्तु malloc प्रत्यक्षतया कर्नेल् 4 बाइट् स्मृतिः न याचते । कर्नेल् पृष्ठेषु कार्यं करोति — सामान्यतया x86_64 इत्यत्र 4 KB — तथा च सरलस्मृतिप्रवेशस्य सापेक्षतया सिस्टम्-आह्वानस्य व्ययः विशालः भवति । प्रत्येकस्य व्यक्तिगतविनियोगस्य कृते brk() अथवा mmap() इति आह्वानं कृत्वा कोऽपि अतुच्छः कार्यक्रमः स्थगितः भविष्यति ।

तस्य स्थाने glibc इत्यस्य स्मृतिविनियोगकः — ptmalloc2 इति कार्यान्वयनम्, स्वयं Doug Lea इत्यस्य क्लासिक dlmalloc इत्यस्मात् अवतरत् — मध्यस्थरूपेण कार्यं करोति । इदं कर्नेल् तः पूर्वमेव बृहत् स्मृतिखण्डान् अनुरोधयति, ततः भवतः कार्यक्रमस्य आवश्यकतानुसारं तान् लघुखण्डेषु उत्कीर्णयति । एतत् मौलिकं कारणं यत् भवतः प्रथमं ४-बाइट् आवंटनं प्रचालनतन्त्राय बहु बृहत्तरं अनुरोधं प्रेरयति । आवंटकः अपव्ययः न भवति। रणनीतिकत्वं भवति।

७२ केबी विच्छेदनम्: बाइट् कुत्र गच्छन्ति

प्रारम्भिकविनियोगस्य उपरिभागः अनेकेभ्यः विशिष्टेभ्यः घटकेभ्यः आगच्छति यत् रनटाइम् इत्यनेन आरम्भः करणीयः यत् सः भवन्तं उपयोगयोग्यस्मृतेः एकं बाइट् अपि समर्पयितुं शक्नोति । प्रत्येकं घटकं अवगत्य संख्या यत्र अवतरति तत्र किमर्थं अवतरति इति व्याख्यायते ।

प्रथमं, glibc इत्यस्य malloc मुख्यक्षेत्रं — प्राथमिकं पुस्तकपालनसंरचनाम् आरभते यत् मुख्यसूत्रे सर्वाणि आवंटनानि निरीक्षते । अस्मिन् अखाड़े राशेः कृते मेटाडाटा, मुक्त-सूचीसूचकाः, भिन्न-भिन्न-आवंटन-आकारस्य कृते बिन्-संरचनानि च समाविष्टानि सन्ति । आवंटकः sbrk() मार्गेण कार्यक्रमविरामं विस्तारयति, आरम्भिकविस्तारः च M_TOP_PAD इति आन्तरिकमापदण्डेन नियन्त्रितः भवति, यः पूर्वनिर्धारितरूपेण 128 KB पैडिंग् भवति तथापि, वास्तविकः प्रारम्भिकः अनुरोधः पृष्ठसंरेखणस्य विद्यमानस्य च विरामस्थानस्य कृते समायोजितः भवति, यस्य परिणामः प्रायः लघुतरः प्रथमः अनुरोधः भवति — सामान्यतया नव आरब्धप्रक्रियायां तस्य ७२ केबी-आकृतेः समीपे अवतरति ।

द्वितीयं, glibc 2.26 इत्यस्मात् आरभ्य, आवंटकः प्रथमप्रयोगे thread-local cache (tcache) आरभते । tcache मध्ये 64 बिन् (एकं प्रति लघु-आवंटन-आकार-वर्गं) सन्ति, प्रत्येकं 7 कैश-कृत-खण्डान् यावत् धारयितुं समर्थम् । tcache_perthread_struct स्वयं 1 KB परिमितं उपभोगं करोति, परन्तु तस्य आरम्भस्य क्रिया व्यापकं क्षेत्रव्यवस्थापनं प्रेरयति । तृतीयम्, C++ रनटाइम् भवतः main() इत्यस्य चालनात् अपि पूर्वमेव आवंटनं कृतवान् — स्थिरनिर्मातारः, std::cout तथा मित्राणां कृते iostream बफर आरम्भीकरणं, तथा च स्थानीयस्थापनं सर्वे तस्मिन् प्रारम्भिकराशिपदचिह्ने योगदानं ददति ।

अरीना प्रणाली तथा पूर्वविनियोगः किमर्थं स्मार्टः

इति

स्मृतेः पर्याप्तं भागं पूर्वं आवंटयितुं निर्णयः खण्डखण्डे अनुरोधं न कृत्वा कार्यान्वयनस्य दुर्घटना नास्ति । दशकशः प्रणालीप्रोग्रामिंग-अनुभवे मूलभूतः इदं जानी-बुझकर अभियांत्रिकी-व्यापारः अस्ति । brk() अथवा mmap() इत्यस्य प्रत्येकं आह्वानं उपयोक्तृस्थानात् कर्नेल् स्थानं प्रति सन्दर्भपरिवर्तनं, प्रक्रियायाः आभासीस्मृतिमानचित्रणस्य परिवर्तनं, सम्भाव्यपृष्ठसारणी अद्यतनीकरणं च समाविष्टं भवति आधुनिकहार्डवेयर्-मध्ये एकस्य सिस्टम्-आह्वानस्य मूल्यं प्रायः १००-२०० नैनोसेकेण्ड्-पर्यन्तं भवति — पृथक्त्वे तुच्छं, स्केल-रूपेण विनाशकारी ।

एकं कार्यक्रमं विचारयन्तु यः आरम्भकाले १०,००० लघुविनियोगान् करोति । पूर्व-विनियोगं विना, तस्य अर्थः स्यात् १०,००० सिस्टम्-आह्वानाः, यस्य मूल्यं प्रायः १-२ मिलीसेकेण्ड् शुद्ध-उपरि-भारस्य भवति । एरिना-आधारित-आवंटकेन सह प्रथमं आवंटनं एकं सिस्टम्-आह्वानं प्रेरयति, तदनन्तरं ९,९९९ आवंटनानि सूचकगणितस्य तथा लिङ्क्ड्-लिस्ट्-सञ्चालनस्य माध्यमेन उपयोक्तृस्थाने पूर्णतया सेवां प्राप्नुवन्ति — प्रत्येकं मोटेन १०-५० नैनोसेकेण्ड् यावत् समयं गृह्णाति गणितं निर्विवादम् अस्ति : पूर्वविनियोगः परिमाणक्रमेण विजयते।

<ब्लॉककोट>

भवता प्रथमे आवंटने यत् 72 KB पश्यति तत् अपव्ययितस्मृतिः नास्ति — एषा कार्यप्रदर्शननिवेशः अस्ति । आवंटकः दावान् करोति यत् भवतः कार्यक्रमः शीघ्रमेव अधिकानि आवंटनानि करिष्यति, तथा च प्रायः प्रत्येकस्मिन् वास्तविक-जगतः परिदृश्ये, सः दावः सुन्दरं फलं ददाति। अप्रयुक्तस्य आभासी-सङ्केत-स्थानस्य व्ययः आधुनिक-६४-बिट्-प्रणालीषु मूलतः शून्यः भवति ।

इति

आभासीस्मृतिः बनाम भौतिकस्मृतिः: किमर्थं न महत्त्वपूर्णा

प्रथमवारं एतत् व्यवहारं सम्मुखीकृत्य विकासकानां मध्ये एकः सामान्यचिन्ता संसाधनस्य अपव्ययः अस्ति । यदि मम केवलं ४ बाइट् आवश्यकं तर्हि मम कार्यक्रमः ७२ केबी किमर्थं उपभोगयति? समीक्षात्मका अन्वेषणं यत् आभासीस्मृतिः भौतिकस्मृतिः नास्ति । यदा glibc प्रोग्राम् विरामं 72 KB यावत् विस्तारयति तदा कर्नेल् प्रक्रियायाः वर्चुअल् मेमोरी मैपिङ्ग्स् अद्यतनं करोति, परन्तु भौतिक 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 →

अस्य अर्थः अस्ति यत् यद्यपि भवतः प्रक्रियायाः आभासी आकारः ७२ KB वर्धते तथापि तस्य निवासी सेट् आकारः (RSS) — भौतिक-RAM इत्यस्य वास्तविकरूपेण उपभोक्तस्य परिमाणं — केवलं भवता वास्तविकरूपेण स्पृष्टैः पृष्ठैः वर्धते एकस्य new int कृते, तत् सामान्यतया एकं 4 KB पृष्ठं भवति, अपि च यत्किमपि पृष्ठं arena मेटाडाटा व्याप्नोति । शेषं आभासीस्थानं तत्र उपविशति, उपयोगाय सज्जं, यस्य मूल्यं पतास्थानं विना अन्यत् किमपि नास्ति — यस्य भवतः ६४-बिट् लिनक्स-प्रणाल्यां १२८ टीबी अस्ति ।

उत्पादन-अनुप्रयोगानाम् प्रोफाइलिंग्, निरीक्षणं च कुर्वन् अयं भेदः महत्त्वपूर्णः भवति । यदि भवान् सॉफ्टवेयरं निर्माति यस्य वास्तविकसंसाधनस्य उपभोगं निरीक्षितुं आवश्यकं भवति — भवेत् सा SaaS पृष्ठभागः, सूक्ष्मसेवा, अथवा व्यावसायिकसञ्चालनार्थं Mewayz इत्यादिषु मञ्चेषु चालितानां इव विश्लेषणपाइपलाइनः — तर्हि भवान् आभासी आकारस्य अपेक्षया RSS इत्यस्य निरीक्षणं सर्वदा कर्तव्यम् /proc/[pid]/smaps, valgrind --tool=massif, pmap इत्यादीनि साधनानि भवन्तं भ्रामक-आभासी-स्मृति-आकृतीनां अपेक्षया समीचीन-भौतिक-स्मृति-पदचिह्नानि दातुं शक्नुवन्ति ।

विभिन्न आवंटकाः प्रथमं आवंटनं कथं सम्पादयन्ति

72 KB आकृतिः glibc इत्यस्य ptmalloc2 इत्यस्य विशिष्टा अस्ति । अन्ये आवंटकाः भिन्नान् व्यापारान् कुर्वन्ति, तदनुसारं प्रारम्भिकविनियोगस्य उपरिभारः भिद्यते । कार्यप्रदर्शनसंवेदनशीलानाम् अनुप्रयोगानाम् आवंटकं चयनं कुर्वन् एतेषां भेदानाम् अवगमनं बहुमूल्यं भवति ।

    इति
  • jemalloc (Facebook, FreeBSD द्वारा उपयुज्यते) — थ्रेड्-स्थानीय-सञ्चयैः सह अधिक-दानेदार-अखाड़ा-संरचनायाः उपयोगं करोति । प्रारम्भिकः ओवरहेड् अधिकः (प्रायः २००+ केबी) भवति परन्तु तालाविवादस्य न्यूनतायाः कारणेन उत्तमं बहु-धागायुक्तं प्रदर्शनं प्रदाति ।
  • tcmalloc (Google इत्यस्य Thread-Caching Malloc) — पूर्वनिर्धारितरूपेण प्रायः 2 MB प्रति-थ्रेड्-सञ्चयं आवंटयति, आक्रामकपूर्व-आवंटनेन सह । प्रारम्भिकः उपरिभारः अधिकः भवति, परन्तु अनन्तरं लघुविनियोगाः अत्यन्तं द्रुताः भवन्ति ।
  • musl libc इत्यस्य malloc — सर्वेषां आवंटनानां कृते mmap इत्यस्य आधारेण बहु सरलतरं डिजाइनं उपयुज्यते । प्रारम्भिकः ओवरहेड् न्यूनतमः भवति (प्रायः प्रतिविनियोगं केवलं ४ केबी), परन्तु अधिकवारं प्रणाली-आह्वानस्य कारणेन प्रति-विनियोगव्ययः अधिकः भवति ।
  • mimalloc (Microsoft) — ६४ MB खण्डैः सह खण्डाधारितविनियोगस्य उपयोगं करोति । प्रथमं आवंटनं 64 MB आभासी आरक्षणं (न्यूनतमभौतिकप्रतिबद्धतायाः सह), असाधारणस्थानीयतायाः, थ्रूपुटस्य च कृते व्यापारिकसङ्केतस्थानं प्रेरयति ।
इति

एतेषां आवंटकानां मध्ये विकल्पः पूर्णतया भवतः कार्यभारस्य उपरि निर्भरं भवति । दीर्घकालं यावत् चलितसर्वर-अनुप्रयोगानाम् कृते भारी बहु-थ्रेडेड् आवंटनं भवति, 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 इत्यनेन मुक्तस्मृतिः कदा OS - मध्ये प्रत्यागच्छति इति नियन्त्रयति । तथा च glibc 2.26 तः, glibc.malloc.tcache_count तथा glibc.malloc.tcache_max ट्यूनेबल्स् भवन्तं थ्रेड् कैश व्यवहारं नियन्त्रयितुं शक्नुवन्ति ।

किन्तु सावधानतायाः वचनं : सावधानतया बेन्चमार्किंग् विना एतेषां मापदण्डानां ट्यूनिङ्ग् प्रायः सर्वदा विषयान् दुर्गतिम् अयच्छति । पूर्वनिर्धारितानि विस्तृतवास्तविक-जगतः प्रोफाइलिंग् इत्यस्य आधारेण चयनितानि आसन्, ते च कार्यभारस्य विशालबहुमतस्य कृते मधुरं स्थानं प्रतिनिधियन्ति । यावत् भवतः उत्पादनप्रोफाइलिंगतः दृढं प्रमाणं नास्ति यत् malloc overhead इति अटङ्कः अस्ति — तथा च भवता स्वपरिवर्तनानां प्रभावः न मापितः — तावत् पूर्वनिर्धारितं त्यजतु आवंटकस्य अकालं अनुकूलनं याक-मुण्डनस्य विशेषतया कपटपूर्णं रूपं भवति यत् नगण्यलाभार्थं असंख्य-इञ्जिनीयरिङ्ग-घण्टानां सेवनं कृतवान् अस्ति ।

एतत् अस्मान् सिस्टम्स् प्रोग्रामिंग् विषये किं शिक्षयति

७२ केबी प्रथम-विनियोग-रहस्यं, तस्य मूलतः, अमूर्त-स्तर विषये पाठः अस्ति । C++ भवन्तं भ्रमं ददाति यत् new int ४ बाइट् आवंटयति । भाषामानकः एवम् वदति। भवतः मानसिकप्रतिरूपं एवम् वदति। परन्तु भवतः कोडस्य हार्डवेयरस्य च मध्ये परिष्कृतप्रणालीनां ढेरः उपविशति — C++ रनटाइम्, C लाइब्रेरी आवंटकः, कर्नेल् इत्यस्य वर्चुअल् मेमोरी उपतन्त्रं, हार्डवेयरस्य MMU तथा TLB च — प्रत्येकं स्वकीयान् व्यवहारान्, अनुकूलनं, ओवरहेड् च योजयति ।

एतत् न दोषः। सिस्टम्स् सॉफ्टवेयरस्य सम्पूर्णः बिन्दुः अस्ति । प्रत्येकं स्तरं वास्तविकसमस्यायाः समाधानार्थं विद्यते: आवंटकः अस्ति अतः प्रत्येकस्य आवंटनस्य कृते भवद्भिः सिस्टम्-आह्वानं कर्तुं न प्रयोजनम् । वर्चुअल् मेमोरी सिस्टम् अस्ति अतः भवद्भिः प्रत्यक्षतया भौतिकस्मृतिः प्रबन्धयितुं न प्रयोजनम् । पृष्ठदोषनियन्त्रकः अस्ति अतः स्मृतिः आलस्येन कुशलतया च प्रतिबद्धा भवति । प्रत्येकं स्तरं बहु परिमाणं कार्यक्षमतायाः सुविधायाः च कृते अल्पं पारदर्शितायाः व्यापारं करोति ।

ये विकासकाः अत्यन्तं विश्वसनीयं, उच्चतम-प्रदर्शन-प्रणालीं निर्मान्ति ते एव सन्ति ये एतान् स्तराः अवगच्छन्ति — न तु यतोहि तेषां विषये नित्यं चिन्तयितुं आवश्यकता वर्तते, अपितु यतोहि यदा किमपि अप्रत्याशितम् भवति (रहस्यपूर्णं 72 KB आवंटनम् इव), तदा तेषां मानसिकं प्रतिरूपं भवति यत् ते किमर्थं अवगन्तुं शक्नुवन्ति भवान् वास्तविकसमयव्यापारप्रणालीं, क्रीडाइञ्जिनं, सहस्राणि उपयोक्तृणां सेवां कुर्वन् व्यापारमञ्चं वा निर्माति वा, भवतां कोडः वास्तवतः प्रणालीस्तरस्य किं करोति इति तर्कस्य क्षमता एव सक्षमविकासकानाम् अपवादात्मकानां मध्ये पृथक् करोति ७२ केबी न दोषः । भवतः आवंटकः एव स्वकार्यं तेजस्वीरूपेण कुर्वन् अस्ति।

अद्य एव स्वव्यापारस्य ओएस निर्मायताम्

स्वतन्त्रकार्यकर्तृभ्यः एजेन्सीपर्यन्तं, Mewayz 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