2010-09-03 8 views
5

http://lxr.linux.no/linux+v2.6.35/include/linux/preempt.h#L21कैसे linux सिंक्रनाइज़ है रखना गिनती

मैं सिर्फ लिनक्स स्रोत मिल कोशिश कर रहा हूँ। मैंने यह छूट गिनती देखी और लिनक्स कैसे सुनिश्चित करता है कि प्रीमेट गिनती परमाणु है? कोड सिर्फ मूल्य बढ़ाता है।

इसके अलावा मेरे पास एक और सवाल है। हस्तक्षेप हैंडल को पारस्परिक बहिष्कार को बनाए रखने की आवश्यकता क्यों है। क्योंकि केवल एक ही समय में निष्पादित कर सकता है?

जब इंटरप्ट अक्षम होते हैं तो ओएस क्या करता है? Interrups अनदेखा या एक कतार बनाए रखने?

उत्तर

6

यह preempt_count() वृद्धि कर देता है - नोटिस () - जो के रूप में एक मैक्रो परिभाषित किया जाता है:

#define preempt_count() (current_thread_info()->preempt_count) 

तो यह एक प्रति धागा चर, जो किसी भी ताला की आवश्यकता नहीं है और सुरक्षित है incrementing है।


यह अलग सवाल के रूप में अपने कई सवाल पूछने के लिए सबसे अच्छा है, लेकिन संक्षेप में:

  • इंटरप्ट हैंडलर सामान्य रूप में अन्य बाधा संचालकों द्वारा बाधित किया जा सकता है;
  • इंटरप्ट हैंडलर एक सीपीयू कोर पर चल सकते हैं जबकि अन्य कर्नेल कोड दूसरे कोर पर चल रहा है;
  • इंटरप्ट आमतौर पर एक हार्डवेयर तंत्र का उपयोग कर अक्षम कर दिया जाता है। इन्हें लंबित इंटरप्ट्स याद रखना पड़ता है, लेकिन अधिकतम प्रति इंटरप्ट वेक्टर तक ही।
+0

बढ़ता है बहुत बहुत धन्यवाद। क्या आप मेरे अगले प्रश्नों का उत्तर भी दे सकते हैं। – mousey

+0

आपको बहुत बहुत धन्यवाद। – mousey

+0

@ कैफ, और माउसी: अगर इंक/डीसी को गलती हैंडलर या इंटरप्ट हैंडलर भी कहा जाता है, तो क्या यह सुरक्षित होगा? या क्या कोई नियम कह रहा है कि नहीं किया जा सकता है? विचार? – minghua

0

हर आधुनिक प्रोसेसर परमाणु test-and-set अनुदेश किसी भिन्न रूप है।

+1

स्रोत की जांच करें। यह किसी भी सिस्टम विशिष्ट निर्देशों का उपयोग नहीं करता है। यह सिर्फ – mousey

1

preempt_count चर पर ऑपरेशन परमाणु नहीं है। एक इंक और थ्रेड के preempt_count के एक dec के बीच कोड क्षेत्र की गारंटी है कि शेड्यूलर द्वारा स्विच न किया जाए। इस कोड क्षेत्र में वर्तमान धागे से संदर्भ स्विचिंग केवल एम्बेडेड अपवाद या इंटरप्ट में हो सकती है। पहले इंक ऑपरेशन पूर्ण होने के बाद, आगे के हैंडलर देखेंगे कि वेरिएबल गैर-शून्य है, इस प्रकार संदर्भ स्विच नहीं होता है। इंक खत्म होने से पहले थ्रेड को स्विच किया जा सकता है लेकिन यह ठीक है क्योंकि कोड संरक्षित क्षेत्र तक नहीं पहुंच पाया है।

कुछ विवरण: एक परमाणु चर की परिभाषा "Atomic variables are the ones on whom the read modify write operation is done as one instruction with out any interruption" की तरह कुछ किया जाना चाहिए। Preempt_count पर "रीड-संशोधित-लिखें" ऑपरेशन को किसी अन्य अपवाद हैंडलर या इंटरप्ट हैंडलर द्वारा बाधित किया जा सकता है लेकिन केवल कर्नेल डिज़ाइन द्वारा सख्ती से एम्बेडेड तरीके से किया जा सकता है। चूंकि उन एम्बेडेड ऑपरेशंस जोड़े में हैं, इस प्रकार एक preempt_count का मान अंततः दूषित नहीं होगा। हालांकि आर-एम-डब्ल्यू ऑपरेशन को बाधित किया जा सकता है और वर्तमान धागा को स्विच किया जा सकता है (केवल अगर एकाधिक एम्बेडेड इंक में से कोई भी पूरा नहीं हुआ है), लेकिन यह ठीक है क्योंकि कोड संरक्षित क्षेत्र तक नहीं पहुंच पाया है। एक बार थ्रेड वापस स्विच हो जाने पर यह आर-एम-डब्ल्यू ऑपरेशन खत्म कर देगा और उस बिंदु से वर्तमान थ्रेड पर सभी युग्मित डीसी (ओं) तक खत्म नहीं हो जाएगा।