2015-11-27 8 views
5

लिनक्स कर्नेल में, किसी प्रक्रिया के मेमोरी क्षेत्रों को संग्रहीत करने के लिए, लिनक्स एक लिंक्ड सूची और लाल-काले पेड़ दोनों का उपयोग करता है। find_vma एक ऐसा फ़ंक्शन है जो पहले मेमोरी क्षेत्र का पता लगाता है जिसका vm_end फ़ील्ड लाल काले पेड़ के माध्यम से पारित पते से अधिक है। हालांकि, मुझे लगता है कि find_vma() के अंदर लाल काले पेड़ के लिए कोई सुरक्षा (लॉक की तरह) नहीं है। क्या होगा यदि एक और धागा पेड़ पर कुछ तत्व हटाने के लिए rb_erase फ़ंक्शन को कॉल करता है?कर्नेल में लाल काला पेड़ संरक्षित नहीं है?

+0

क्या यह आरसीयू के माध्यम से प्रबंधित नहीं है? – Joe

+0

ऐसा लगता है कि 'find_vma' को समवर्ती पहुंच (संशोधन) से कुछ सुरक्षा के साथ बुलाया जाना चाहिए। @ जो: सूचियों के विपरीत, आरसीयू द्वारा आरबी-पेड़ को संरक्षित नहीं किया जा सकता है। – Tsyvarev

+0

@Tsyvarev आपके उत्तर के लिए धन्यवाद। मैं आपसे सहमत हुँ। उदाहरण के लिए, [sys_msync] में (http://lxr.free-electrons.com/source/mm/filemap.c?v=2.4.37#L2381) ('msync' का सिस्टम कॉल), यह' डाउन_read 'कहता है (और वर्तमान-> मिमी-> mmap_sem) 'पहले और फिर' find_vma'। क्या यह लाल काले पेड़ की रक्षा करता है? – HuangJie

उत्तर

2

हां, find_vma फ़ंक्शन कॉल सेमफोर के माध्यम से समवर्ती पहुंच से संरक्षित है। शेड्यूलर में फ़ंक्शन का उपयोग सैमफोर कॉल के साथ किया जाता है।

 2209   down_read(&mm->mmap_sem); 
     2210   vma = find_vma(mm, start); 
     .... 
        up_read(&mm->mmap_sem); 



    mmap_sem is used to protect this function call which is a read-write semaphore. 
    struct rw_semaphore mmap_sem; defined inside struct mm_struct. 
संबंधित मुद्दे