Pthreads के लिए डिफ़ॉल्ट स्टैक आकार


24

जैसा कि मैं समझता हूं, लिनक्स पर एक preadread के लिए डिफ़ॉल्ट स्टैक का आकार 16K है। मुझे अपने 64-बिट उबंटू इंस्टॉल पर अजीब परिणाम मिल रहे हैं।

$ ulimit -s
8192

इसके अलावा:

pthread_attr_init(&attr);
pthread_attr_getstacksize(&attr, &stacksize);
printf("Thread stack size = %d bytes \n", stacksize);

Prints
    Thread stack size = 8388608 bytes

मुझे पूरा यकीन है कि स्टैक का आकार "8388608" नहीं है। क्या गलत हो सकता है?


7
मुझे लगता है 8388608 / 1024 = 8192
कोउंगलम

6
आप 16k प्रति थ्रेड कर्नेल स्टैक के बारे में सोच रहे हैं । उपयोगकर्ता-अंतरिक्ष स्टैक मेमोरी से पूरी तरह से अलग मुद्दा। कर्नेल स्टैक छोटे होते हैं क्योंकि उन्हें पृष्ठांकित नहीं किया जा सकता है, या आलसी-आबंटित नहीं किया जा सकता है, और भौतिक स्मृति में सन्निहित पृष्ठ होने चाहिए। elinux.org/Kernel_Small_Stacks । कुल थ्रेड्स की अत्यधिक उच्च संख्या होना i386 के लिए एक समस्या हो सकती है, जहां पता-स्थान सीमित है, विशेष रूप से 32-बिट के लिए डिफ़ॉल्ट रूप से 8k स्टैक के साथ।
पीटर कॉर्ड्स

जवाबों:


21
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);

stacksizeविशेषता न्यूनतम ढेर आकार (बाइट्स में) बनाया धागे ढेर के लिए आवंटित परिभाषित करेगा।

आपके उदाहरण में, स्टैक का आकार 8388608 बाइट्स पर सेट है, जो 8MB से मेल खाता है, जैसा ulimit -s कि कमांड द्वारा लौटाया गया है ताकि मैच हो।

से pthread_create()विवरण:

पर लिनक्स / x86-32 , एक नया धागा के लिए डिफ़ॉल्ट ढेर आकार है 2 मेगाबाइटएनपीटीएल थ्रेडिंग कार्यान्वयन के तहत, यदि आरएलआईएमआईटी_स्टैक सॉफ्ट संसाधन सीमा उस समय शुरू होती है, जिसमें प्रोग्राम को "असीमित" के अलावा कोई मूल्य नहीं है, तो यह नए थ्रेड्स के डिफ़ॉल्ट स्टैक आकार को निर्धारित करता है। Pthread_attr_setstacksize (3) का उपयोग करके , स्टैक आकार विशेषता को डिफॉल्ट के अलावा एक स्टैक आकार प्राप्त करने के लिए, थ्रेड बनाने के लिए उपयोग किए जाने वाले attr तर्क में स्पष्ट रूप से सेट किया जा सकता है।

तो थ्रेड स्टैक का आकार या तो सेट फ़ंक्शन के माध्यम से सेट किया जा सकता है, या ulimitसिस्टम प्रॉपर्टी। आप जिस 16k का जिक्र कर रहे हैं, उसके लिए यह स्पष्ट नहीं है कि आपने कौन सा प्लेटफ़ॉर्म देखा है और / या इसके लिए कोई सिस्टम सीमा निर्धारित की है।

इस पर कुछ दिलचस्प उदाहरणों के लिए pthread_create पृष्ठ और यहाँ देखें ।


47

वास्तव में, अपने आभासी ढेर आकार है 8388608 बाइट्स (8 एमबी)। बेशक, यह निष्कर्ष निकालना स्वाभाविक है कि यह सही नहीं हो सकता है, क्योंकि यह एक बड़ी मात्रा में हर थ्रेड के लिए मेमोरी का स्टैक के लिए उपभोग करने के लिए है जब 99% केबी के एक जोड़े को शायद सभी की आवश्यकता होती है।

अच्छी खबर यह है कि आपका धागा केवल भौतिक मेमोरी की मात्रा का उपयोग करता है जिसकी उसे वास्तव में आवश्यकता होती है। यह जादुई शक्तियों में से एक है जो आपके ओएस को आपके प्रोसेसर में हार्डवेयर मेमोरी मैनेजमेंट यूनिट (MMU) का उपयोग करने से मिलता है। यहाँ क्या होता है:

  1. OS आपके थ्रेड के लिए MMU के पेज टेबल सेट करके आपके स्टैक के लिए 8 एमबी वर्चुअल मेमोरी आवंटित करता है। इसके लिए केवल पृष्ठ तालिका प्रविष्टियों को रखने के लिए बहुत कम RAM की आवश्यकता होती है।

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

  3. सीपीयू कोर पेज गलती अपवाद का जवाब देता है एक विशेषाधिकार प्राप्त निष्पादन मोड (जिसका अपना स्टैक है) पर स्विच करके और कर्नेल के अंदर पेज गलती अपवाद हैंडलर फ़ंक्शन को कॉल करके।

  4. कर्नेल भौतिक RAM के एक पृष्ठ को उस वर्चुअल मेमोरी पेज पर आवंटित करता है और उपयोगकर्ता स्पेस थ्रेड पर वापस लौटता है।

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

MMU आज के कंप्यूटर सिस्टम के हार्डवेयर का एक महत्वपूर्ण हिस्सा है। विशेष रूप से, यह सिस्टम में बहुत सारे "जादू" के लिए जिम्मेदार है, इसलिए मैं MMU क्या करता है, और सामान्य रूप से वर्चुअल मेमोरी के बारे में अधिक जानने की सलाह देता हूं। इसके अलावा, यदि आपका एप्लिकेशन संवेदनशील है और डेटा की एक महत्वपूर्ण राशि से संबंधित है, तो आपको यह समझना चाहिए कि TLB (MMU का पेज टेबल कैश) कैसे काम करता है और आप अपने TLB हिट रेट को अधिकतम करने के लिए अपने डेटा या अपने एल्गोरिदम का पुनर्गठन कैसे कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.