आधुनिक लिनक्स पर क्यों, डिफ़ॉल्ट स्टैक का आकार इतना बड़ा है - 8 एमबी (कुछ वितरणों पर भी 10)


10

उदाहरण के लिए, OSX पर, यह 512k से भी कम है।

क्या कोई अनुशंसित आकार है, जिसे ध्यान में रखते हुए, कि ऐप पुनरावृत्ति का उपयोग नहीं करता है और ढेर ढेर चर आवंटित नहीं करता है ?
मुझे पता है कि सवाल बहुत व्यापक है और यह बहुत हद तक उपयोग पर निर्भर करता है, लेकिन फिर भी मैं पूछना चाहता था, क्योंकि मैं सोच रहा था कि क्या इस विशाल संख्या के पीछे कोई आंतरिक / आंतरिक कारण है


मैं सोच रहा था, जैसा कि मैंने अपने ऐप में स्टैक आकार को 512 KiB में बदलने का इरादा किया है - यह अभी भी इसके लिए एक बड़ी संख्या की तरह लगता है, लेकिन यह 8MiB की तुलना में बहुत छोटा है - और इस प्रक्रिया की आभासी मेमोरी को काफी कम कर देगा, जैसा कि मैंने बहुत सारे धागे हैं (I / O)।

मुझे यह भी पता है कि यह वास्तव में चोट नहीं करता है, यहाँ अच्छी तरह से समझाया गया है : pthreads के लिए डिफ़ॉल्ट स्टैक आकार


क्या आप 32-बिट CPU का उपयोग कर रहे हैं? X86_64 सीपीयू 128 टेराबाइट्स (यूजर स्पेस में) तक का वर्चुअल एड्रेस स्पेस देते हैं, जो 8 एमबी स्टैक के लिए काफी होना चाहिए।
जोहान मायरेन

@ जोहानमेरेन - नहीं, x64 यह है। यह कोई बड़ी बात नहीं है, मैं सोच रहा था, ऐसा करने का कोई वास्तविक कारण नहीं है (फिलहाल)।
किरिल किरोव

2019 और 8 MiB में बहुत मेमोरी है? मुझे ऐसा नहीं लगता। बड़े डिफ़ॉल्ट स्टैक आकार होने से रिकर्सन के साथ प्रोग्राम लिखना बहुत आसान हो जाता है। मुझे यह जानकर बहुत आश्चर्य हुआ कि विंडोज पर डिफ़ॉल्ट स्टैक का आकार केवल 1MiB है!
ओल्डहेर

जवाबों:


15

जैसा कि अन्य लोगों ने कहा है, और जैसा कि आप अपने प्रश्न में दिए गए लिंक में उल्लेख किया गया है, 8MiB स्टैक होने से कुछ भी चोट नहीं लगती (इसके अलावा पते की जगह का उपभोग - 64-बिट सिस्टम पर जो कि कोई फर्क नहीं पड़ेगा)।

लिनक्स ने बहुत लंबे समय तक 8MiB स्टैक का उपयोग किया है; परिवर्तन जुलाई १ ९९ ५ में कर्नेल के संस्करण १.३ . version में पेश किया गया था । इसके बाद इसे एक सीमा के रूप में प्रस्तुत किया गया था, पहले यह नहीं था:

स्टैक को कुछ सेंस डिफॉल्ट द्वारा सीमित करें: रूट हमेशा जरूरत पड़ने पर इस सीमा को बढ़ा सकता है .. 8MB उचित लगता है।

लिनक्स पर, स्टैक सीमा भी प्रोग्राम तर्कों और पर्यावरण के आकार को प्रभावित करती है, जो स्टैक सीमा के एक चौथाई तक सीमित हैं ; कर्नेल तर्क और पर्यावरण के लिए न्यूनतम 32 पृष्ठ लागू करता है।

थ्रेड्स के लिए, यदि स्टैक सीमा ( RLIMIT_STACK) असीमित है, तो pthread_createनए थ्रेड्स के ढेर पर अपनी सीमाएं लागू होती हैं - और अधिकांश आर्किटेक्चर पर, यह 8MiB से कम है।


1
दिलचस्प। मुझे लगा कि हाल ही में पेश किया गया था। मेरे पास लगभग 200 धागे हैं (यह एक और लंबा विषय है, इसलिए आइए इसे पल के लिए अनदेखा करें) और topडरावने VIRT परिणामों में दिखाता है। हालाँकि, थोड़ा गहरा खोदने पर, इस वर्चुअल एड्रेस स्पेस का अधिकांश हिस्सा प्रति थ्रेड (मेमोरी) एरेनास से लिया जाता है, स्टैक साइज़ से नहीं, इसलिए स्टैक का साइज़ कम करने से वर्चुअल मेमोरी कम नहीं होगी। मैं बस उत्सुक था कि 8MiB और इतना क्यों।
किरिल किरोव

"8 एमबी" का अर्थ है कि प्रत्येक थ्रेड का स्टैक 8 एमबी तक बढ़ सकता है यदि थ्रेड इसका उपयोग करने का निर्णय लेता है। लेकिन जब तक मेमोरी वास्तव में उपयोग नहीं की जाती तब तक भौतिक मेमोरी आवंटित नहीं की जाएगी। यदि आपके 200 धागे 512 केबी का उपयोग करते हैं, तो आप 100 एमबी भौतिक रैम का उपयोग करेंगे, 1.6 जीबी का नहीं।
गुंटराम ब्लोहम

यदि आप स्वैप नहीं कर रहे हैं, तो RES कॉलम topआपको VIRT की तुलना में "यह प्रक्रिया वास्तव में किस मेमोरी का उपयोग कर रहा है" का बेहतर जवाब देता है।
kbolino

1
@ गुंट्रम ओपी इस बात से भलीभांति परिचित है, प्रश्न में लिंक देखें।
स्टीफन किट

1

8MB स्टैक का आभासी आकार है। पृष्ठ दोष तब होगा जब आपका आवेदन वर्तमान में भौतिक रूप से आवंटित की तुलना में अधिक स्टैक का उपयोग करने का प्रयास करता है। कर्नेल का पेज फॉल्ट हैंडलर फिर एक भौतिक पेज आवंटित करेगा और फिर आपका आवेदन जारी रहेगा।

पूर्ण विवरण के लिए https://unix.stackexchange.com/a/280865/21212 देखें ।

इसलिए आपके स्टैक का आकार कम करने से आपके एप्लिकेशन के भौतिक मेमोरी उपयोग को कम करने में कोई प्रभाव नहीं होना चाहिए


1
मैंने अपने प्रश्न में इस उत्तर को पहले ही जोड़ दिया है। मैंने यह भी लिखा, कि मैं इससे अवगत हूं, लेकिन यह वास्तव में इस सवाल का जवाब नहीं देता है। वैसे भी धन्यवाद
Kiril Kirov

मुझे लगता है कि आपको प्रश्न के परिसर को फिर से देखना होगा, और यह (गैर-) उत्तर बिंदुओं को क्यों। वर्चुअल मेमोरी वास्तविक मेमोरी नहीं है। स्टैक का आकार 800MB हो सकता है और यह वास्तविक मेमोरी उपयोग को प्रभावित नहीं करेगा, जब तक कि आपके एप्लिकेशन ने 8MB से अधिक स्टैक फ़्रेम नहीं बनाए हों।
19bol पर kbolino
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.