मैक ओएस एक्स योसेमाइट 10.10.5 पर, जब मैं एक गणना चलाने की कोशिश करता हूं जिसे 128 जीबी मेमोरी आवंटित करने और उपयोग करने की आवश्यकता होती है (यह सी में लिखा गया कमांड लाइन प्रोग्राम है), कर्नेल मेरी प्रक्रिया को अत्यधिक पूर्वाग्रह से मारता है। यह कंसोल लॉग प्रविष्टि एक उदाहरण का एक उदाहरण है:
9/25/15 7: 08: 40.000 PM कर्नेल [0]: कम स्वैप: हत्या पीआईडी 6202 (हिजड़ा)
गणना ठीक काम करती है और उचित समय में जब यह 64 जीबी मेमोरी आवंटित करता है और उपयोग करता है। माई मैक में हार्ड ड्राइव पर 32 जीबी की रैम और बीकूप स्पेस है। मैंने 8 जीबी रैम के साथ एक और मैक पर भी यह कोशिश की, जिस पर 64 जीबी गणना ठीक चलती है, बेशक अधिक समय लेती है, लेकिन 128 जीबी गणना उसी तरह से कर्नेल द्वारा मार दी जाती है।
वैसे, malloc()कोई त्रुटि कभी नहीं लौटती, चाहे मैं कितनी भी जगह मांगूं। कर्नेल प्रक्रिया को केवल एक बार मार देगा, क्योंकि उस मेमोरी का उपयोग वास्तव में प्रक्रिया द्वारा किया जा रहा है, जिसके परिणामस्वरूप हार्ड ड्राइव पर बहुत सारे स्वैपिंग होते हैं।
तो कहीं 64 जीबी और 128 जीबी के बीच एक गुप्त स्वैप स्थान सीमा प्रतीत होती है।
मेरा सवाल है: मैं और अधिक स्वैप स्थान की अनुमति देने के लिए कर्नेल को कैसे पुन: कॉन्फ़िगर करूं? मुझे एक आशाजनक दिखने वाली फ़ाइल मिली /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist, लेकिन मुझे वहां गुप्त संख्या दिखाई नहीं दे रही है। इसके लिए मैन पेज dynamic_pagerकहता है कि यह सब कुछ स्वैप फ़ाइलों का नाम और स्थान निर्धारित करता है। उसी मैन पेज का एक पुराना संस्करण है जो -Sबनाए गए स्वैपफाइल्स के आकार को सेट करने के लिए एक विकल्प का दस्तावेजीकरण करता है। मैंने कोशिश की कि, 160 जीबी स्वैपफाइल्स का अनुरोध करूं, लेकिन इसका कोई असर नहीं हुआ। स्वैपफाइल्स अभी भी प्रत्येक 1 जीबी थे, और प्रक्रिया अभी भी कर्नेल द्वारा मार दी गई थी।
mallocआपके पास इससे अधिक होने का कारण यह हो सकता है क्योंकि कमिटमेंट बहुत अधिक है (शायद अनंत)। इसलिए ओएस मेमोरी को आवंटित करेगा जो कि उसके पास नहीं है (यह शर्त लगा रहा है कि प्रक्रिया इसका उपयोग नहीं करेगी, ओएस आमतौर पर इस शर्त को जीतता है)। आप स्मृति सीमा होने के लिए प्रतिबद्ध सीमा को समायोजित करना चाह सकते हैं, इस तरह यह प्रक्रिया जल्दी विफल हो जाएगी।
malloc()ऐसा क्यों होता है। मैं किसी की सोच पर संभावित टिप्पणियों की अवहेलना कर रहा था, जिसकी वापसी मूल्य की जाँच नहीं कर रहा हूँ malloc()। वैसे, मेरा उद्देश्य पहले असफल होना नहीं है। मेरा उद्देश्य सफल होना है।