2013-01-22 14 views
7

मैं SLAB memory management mechanism की संरचना के रूप में उलझन में हूं।एसएलबी मेमोरी प्रबंधन

मुझे लगता है कि कई 'कैश' हैं जो आमतौर पर उपयोग की जाने वाली डेटा ऑब्जेक्ट्स के लिए विशिष्ट होते हैं, लेकिन प्रत्येक कैश में एकाधिक 'स्लैब' क्यों होते हैं?

कैश के भीतर प्रत्येक स्लैब को अलग करता है? क्यों न केवल डेटा ऑब्जेक्ट्स से भरा कैश है? इस अतिरिक्त परत की आवश्यकता क्यों है?

उत्तर

12

स्लैब आवंटक एक ही प्रकार की कई वस्तुओं के आसान आवंटन के लिए एक अमूर्त परत है। इंटरफ़ेस समारोह

struct kmem_cache * kmem_cache_create(const char *name, 
    size_t size, size_t align, unsigned long flags, 
    void (*ctor)(void*)); 

यह समारोह एक नया स्लैब संभाजक कि size के आवंटन को संभालने के लिए सक्षम हो जाएगा बनाता है लंबे वस्तुओं -bytes प्रदान करता है। यदि सृजन सफल होता है, तो आप अपने सूचक को संबंधित struct kmem_cache पर प्राप्त करते हैं। इस संरचना में स्लैब के बारे में जानकारी होती है जो यह प्रबंधित करती है।

जैसा कि यह विकिपीडिया विवरण पर निहित है, ऐसी अतिरिक्त परत का उद्देश्य स्मृति विखंडन के मुद्दों को रोकने के लिए है जो स्मृति आवंटन को सरल और सहज तरीके से बनाया गया हो सकता है। ऐसा करने के लिए, यह निम्न डेटा संरचना के माध्यम से स्लैब की धारणा का परिचय:

  • :

    struct slab { 
        struct list_head list; /* embedded list structure */ 
        unsigned long colouroff; 
        void *s_mem; /* first object in the slab */ 
        unsigned int inuse; /* allocated objects in the slab */ 
        kmem_bufctl_t free; /* first free object (if any) */ 
    }; 
    

    इस प्रकार, kmem_cache वस्तु अपने स्लैब के 3 सूचियों रखती है, 3 जायके में एकत्र हुए खाली स्लैब: इन स्लैब में इन-यूज ऑब्जेक्ट नहीं होता है।

  • आंशिक स्लैब: इन स्लैब में वर्तमान में उपयोग की जाने वाली ऑब्जेक्ट्स हैं लेकिन अभी भी स्मृति क्षेत्र है जो नई वस्तुओं को पकड़ सकता है।
  • पूर्ण स्लैब: इन स्लैब में वस्तुओं का उपयोग किया जा रहा है और नई वस्तुओं (पूर्ण ...) होस्ट नहीं कर सकता है।

जब पटिया allocator के माध्यम से एक वस्तु का अनुरोध है, यह एक आंशिक स्लैब के भीतर आवश्यक स्मृति क्षेत्र पाने के लिए, अगर यह नहीं है, यह इसके एक खाली स्लैब से मिलेगा कर सकते हैं की कोशिश करेंगे।

आप इस बारे में अधिक जानकारी इकट्ठा करने के लिए उत्सुक हैं, तो आप रॉबर्ट लव का Linux Kernel Development

2

मैं इस जवाब देने के लिए बहुत देर हो चुकी हो सकता है पर एक नज़र रखना चाहिए, लेकिन यह दूसरों के रूप में अच्छी तरह से मदद मिल सकती है। जैसा कि मैं Understanding Linux Virtual Memory Manager से देखता हूं, स्लैब के पास तीन प्रमुख लाभ होते हैं।

  1. आंतरिक विखंडन साथी प्रणाली की वजह से कम करना। क्योंकि हमारे पास ऐसे कैश हैं जो छोटी वस्तुओं के लिए उपयुक्त हैं।
  2. बेहतर हार्डवेयर कैश उपयोग - ऑब्जेक्ट्स को अलग-अलग स्लैब में अलग-अलग ऑफसेट पर शुरू करने के लिए ऑब्जेक्ट करके, ताकि कैश लाइनों के बीच हस्तक्षेप को कम किया जा सके। यह धारणा पर आधारित है कि हमारे पास शारीरिक रूप से अनुक्रमित कैश है।
  3. कैश में एक स्लैब प्राथमिक इकाई है, जिसे एक बार में अधिग्रहित/छोड़ा जाता है। यह बाहरी विखंडन में भी कमी का कारण बनता है (खंड 3 देखें।The Slab Allocator : An Object Caching Kernel memory Allocator से 2)।
+0

आंतरिक विखंडन को कैसे कम करता है? अक्सर स्लैब केवल आंशिक रूप से पूर्ण होते हैं – CodyBugstein

+2

@Imray: आंतरिक विखंडन तब होता है जब डेटा का आकार डेटा को पकड़ने के लिए आवंटित ब्लॉक के आकार से कम होता है। जब आप आकार के कैश ब्लॉक आवंटित करते हैं तो कैश ऑब्जेक्ट आकार "आंतरिक" विखंडन स्वचालित रूप से घट जाता है। पूरी तरह से पूर्ण होने के कारण कभी विखंडन का मानदंड नहीं था। –

+0

एक समान प्रभाव है यदि स्लैब में ऑब्जेक्ट आकार का योग स्लैब आकार से कम है। एक ext4 inode कैश ऑब्जेक्ट पर विचार करें, जो होता है (किसी विशेष कर्नेल में) आकार में 1070 बाइट्स होता है। एसएलबी आवंटक इसके लिए एक 4 के स्लैब चुनता है, क्योंकि इसे पुनः दावा करने योग्य के रूप में चिह्नित किया जाता है। 1070 * 3 =886 अपशिष्ट बाइट्स। आंतरिक बाइट-सूचियों के लिए कुछ बाइट्स का उपयोग किया जाता है, लेकिन आवंटित स्थान के 20% से अधिक का उपयोग नहीं किया जा सकता है। इसके अलावा, एक स्लैब में कुछ इनोड्स का पुनर्मूल्यांकन स्मृति की मात्रा का कारण बन सकता है जो पूर्ण नहीं हैं, फिर भी अन्य प्रयोजनों के लिए उपयोग नहीं किया जा सकता है जब तक कि शेष वस्तुओं को स्लैब में पुनः प्राप्त नहीं किया जाता है। – GreenReaper

संबंधित मुद्दे