आप उस आदमी को देख रहे हैं जिसने उस विकल्प को बनाया है। डेविड कटलर और उनकी टीम ने एक मेगाबाइट को डिफ़ॉल्ट स्टैक आकार के रूप में चुना। .NET या C # के साथ कुछ भी नहीं करना है, जब वे Windows NT बनाया गया था, तो इसे बंद कर दिया गया था। एक मेगाबाइट वह होता है जो किसी प्रोग्राम या CreateThread () winapi कॉल के EXE हेडर को स्पष्ट रूप से स्टैक आकार निर्दिष्ट नहीं करता है। जो सामान्य तरीका है, लगभग किसी भी प्रोग्रामर ने आकार लेने के लिए इसे ओएस छोड़ दिया।
यह पसंद शायद विंडोज़ एनटी डिज़ाइन को प्री-डेट करती है, इतिहास इस तरह से बहुत अधिक अजीब है। अच्छा होगा अगर कटलर इसके बारे में एक किताब लिखेंगे, लेकिन वह कभी लेखक नहीं रहे। वह कंप्यूटर के काम करने के तरीके पर असाधारण रूप से प्रभावशाली रहा है। उनका पहला OS डिज़ाइन RSX-11M, DEC कंप्यूटर (डिजिटल उपकरण निगम) के लिए 16-बिट ऑपरेटिंग सिस्टम था। इसने 8-बिट माइक्रोप्रोसेसर के लिए गैरी किल्डल के CP / M, पहले सभ्य OS को बहुत प्रभावित किया। जिसने MS-DOS को भारी प्रभावित किया।
उनका अगला डिज़ाइन VMS था, जो वर्चुअल मेमोरी सपोर्ट के साथ 32-बिट प्रोसेसर के लिए एक ऑपरेटिंग सिस्टम था। बहुत सफल। सस्ते पीसी हार्डवेयर के साथ प्रतिस्पर्धा करने में सक्षम नहीं होने के कारण कंपनी द्वारा डिस्क्टेटिंग शुरू करने के बाद उनका अगला एक DEC रद्द कर दिया गया। Microsoft को, उन्होंने उसे एक ऐसा प्रस्ताव दिया जिसे वह अस्वीकार नहीं कर सकता था। उनके कई सहकर्मी भी इसमें शामिल हुए। उन्होंने VMS v2 पर काम किया, जिसे विंडोज़ एनटी के नाम से जाना जाता है। डीईसी इसके बारे में परेशान हो गया, इसे निपटाने के लिए पैसे ने हाथ बदल दिया। क्या VMS ने पहले से ही एक मेगाबाइट को चुना है जो मुझे नहीं पता, मैं केवल RSX-11 को अच्छी तरह से जानता हूं। यह संभावना नहीं है।
पर्याप्त इतिहास। एक मेगाबाइट एक बहुत है , एक असली धागा शायद ही कभी मुट्ठी भर किलोबाइट से अधिक खपत करता है। तो एक मेगाबाइट वास्तव में बेकार है। हालाँकि यह एक तरह की बर्बादी है जो आप एक डिमांड-पास्ड वर्चुअल मेमोरी ऑपरेटिंग सिस्टम पर खर्च कर सकते हैं, वह मेगाबाइट सिर्फ वर्चुअल मेमोरी है । बस प्रोसेसर के लिए नंबर, हर 4096 बाइट्स के लिए एक-एक। आप वास्तव में भौतिक मेमोरी, मशीन में रैम का उपयोग कभी नहीं करते हैं, जब तक आप वास्तव में इसे संबोधित नहीं करते हैं।
यह .NET प्रोग्राम में अतिरिक्त है क्योंकि मूल कार्यक्रमों को समायोजित करने के लिए मूल रूप से एक मेगाबाइट का आकार चुना गया था। जो स्टैक पर बड़े स्टैक फ्रेम और स्ट्रिंग्स और बफ़र्स (सरणियाँ) बनाने के लिए करते हैं। मैलवेयर हमला वेक्टर होने के लिए बदनाम, एक बफर अतिप्रवाह डेटा के साथ कार्यक्रम में हेरफेर कर सकता है। नहीं। जिस तरह से .NET प्रोग्राम काम करते हैं, स्ट्रिंग्स और सरणियों को जीसी हीप पर आवंटित किया जाता है और इंडेक्सिंग की जांच की जाती है। सी # के साथ स्टैक पर जगह आवंटित करने का एकमात्र तरीका असुरक्षित स्टैकॉलॉक कीवर्ड के साथ है।
.NET में स्टैक का एकमात्र गैर-तुच्छ उपयोग जटर द्वारा किया जाता है। यह एमएसआईएल को मशीन कोड के लिए समय-समय पर संकलन के लिए अपने धागे के ढेर का उपयोग करता है। मैंने कभी नहीं देखा या जाँच नहीं किया है कि इसे कितनी जगह की आवश्यकता है, यह कोड की प्रकृति पर निर्भर करता है और ऑप्टिमाइज़र सक्षम है या नहीं, लेकिन दसियों किलोबाइट की एक जोड़ी एक मोटा अनुमान है। जो अन्यथा इस वेबसाइट को अपना नाम कैसे मिला, .NET प्रोग्राम में स्टैक ओवरफ्लो काफी घातक है। अभी भी पर्याप्त स्थान नहीं बचा है (3 किलोबाइट से कम) जो अभी भी अपवाद को पकड़ने की कोशिश करने वाले किसी भी कोड को मज़बूती से JIT कर रहे हैं। Kaboom to Desktop ही एकमात्र विकल्प है।
पिछले नहीं बल्कि कम से कम, एक .NET प्रोग्राम स्टैक के साथ बहुत अनुत्पादक करता है। सीएलआर एक धागे के ढेर को प्रतिबद्ध करेगा । यह एक महंगा शब्द है, जिसका अर्थ है कि यह केवल स्टैक के आकार को आरक्षित नहीं करता है, यह यह भी सुनिश्चित करता है कि ऑपरेटिंग सिस्टम की पेजिंग फ़ाइल में स्थान आरक्षित है ताकि आवश्यक होने पर स्टैक को हमेशा स्वैप किया जा सके। करने के लिए असफल एक घातक त्रुटि है और बिना शर्त के एक कार्यक्रम को समाप्त करता है। यह केवल बहुत कम रैम के साथ मशीन पर होता है जो पूरी तरह से बहुत सारी प्रक्रियाओं को चलाता है, इस तरह की मशीन मरने से पहले प्रोग्रामों में बदल जाएगी। 15+ साल पहले एक संभावित समस्या, आज नहीं। प्रोग्रामर जो एफ 1 रेस-कार की तरह कार्य करने के लिए अपने प्रोग्राम को ट्यून करते हैं, <disableCommitThreadStack>
उनकी .config फ़ाइल में तत्व का उपयोग करते हैं ।
Fwiw, Cutler ने ऑपरेटिंग सिस्टम डिजाइन करना बंद नहीं किया। वह तस्वीर तब बनी थी जब उन्होंने अज़ूर पर काम किया था।
अद्यतन, मैंने देखा कि .NET अब स्टैक नहीं करता है। निश्चित रूप से नहीं कि यह कब या क्यों हुआ, यह बहुत लंबा हो गया है जब से मैंने जाँच की है। मुझे लगता है कि यह डिज़ाइन परिवर्तन .NET 4.5 के आसपास कहीं हुआ है। बहुत समझदार बदलाव।
Thread
। लेकिन, यह सवाल है, तुम एक बड़ा ढेर की आवश्यकता क्यों है?