2010-05-19 11 views
5

मैं 2.6.24.3 कर्नेल का उपयोग कर एम्बेडेड लिनक्स प्रोजेक्ट के लिए उपयोगकर्ता स्पेस ऐप पर काम कर रहा हूं। मेरा ऐप दो फाइल नोड्स के बीच डेटा पास करता है जो 2 पीथ्रेड बनाते हैं जो प्रत्येक नींद एक एसिंक्रोनस आईओ ऑपरेशन पूरा होने तक पूरा होता है, जिस पर यह जागता है और पूरा होने वाला हैंडलर चलाता है।क्या मैं महत्वपूर्ण कोड में लिनक्स उपयोगकर्ता स्पेस पर्थ्रेड उपज को रोक सकता हूं?

पूरा करने वाले हैंडलरों को ट्रैक रखने की आवश्यकता है कि कितने स्थानान्तरण लंबित हैं और कुछ हद तक जुड़ी सूचियों को बनाए रखने की आवश्यकता है जो एक थ्रेड जोड़ देगा और दूसरा हटा देगा।

// sleep here until events arrive or time out expires 
for(;;) { 
    no_of_events = io_getevents(ctx, 1, num_events, events, &timeout); 
    // Process each aio event that has completed or thrown an error 
    for (i=0; i<no_of_events; i++) { 
     // Get pointer to completion handler 
     io_complete = (io_callback_t) events[i].data; 
     // Get pointer to data object 
     iocb = (struct iocb *) events[i].obj; 
     // Call completion handler and pass it the data object 
     io_complete(ctx, iocb, events[i].res, events[i].res2); 
    } 
} 

मेरा प्रश्न यह है ...

वहाँ एक आसान तरीका मैं उपज के बजाय म्युटेक्स/स्पिन ताला मार्ग नीचे जा रहा है जबकि यह पूरा होने के संचालक बने रास्ते से वर्तमान में सक्रिय धागा रोका जा सकता है?

या विफल होने पर लिनक्स को एक पेंथ्रेड उत्पन्न करने से रोकने के लिए कॉन्फ़िगर किया जा सकता है जब एक म्यूटेक्स/स्पिन लॉक होता है?

उत्तर

4

आप sched_setscheduler() सिस्टम कॉल का उपयोग अस्थायी रूप से थ्रेड की शेड्यूलिंग नीति को SCHED_FIFO पर सेट करने के लिए कर सकते हैं, फिर इसे फिर से सेट करें। sched_setscheduler() आदमी पृष्ठ से:

एक SCHED_FIFO प्रक्रिया चलाता है या तो जब तक यह किसी I/O अनुरोध के द्वारा अवरुद्ध है, यह एक उच्च प्राथमिकता प्रक्रिया द्वारा रोका जाता है, या यह sched_yield(2) कहता है।

(इस संदर्भ में, "प्रक्रिया" वास्तव में "धागा" का अर्थ है)।

हालांकि, यह काफी संदिग्ध आवश्यकता है। आप जिस समस्या को हल करने की उम्मीद कर रहे हैं वह क्या है? यदि आप समेकित पहुंच से पूरा करने वाले हैंडलर की अपनी लिंक की गई सूची की रक्षा करने की कोशिश कर रहे हैं, तो एक साधारण म्यूटेक्स जाने का तरीका है। पूरा करने के थ्रेड mutex को लॉक करें, सूची आइटम को हटाएं, म्यूटेक्स अनलॉक करें, फिर पूरा करने वाले हैंडलर को कॉल करें।

+0

आवश्यकता मुख्य रूप से कोड को सरल रखने की कोशिश करने में से एक है, ऐसे कई आइटम हैं जिन्हें पूरा करने वाले हैंडलर के भीतर म्यूटक्स की आवश्यकता होगी, लेकिन यदि आप आश्वस्त कर सकते हैं कि यह केवल हैंडलर के बाहर पैदा होगा, मुझे नहीं लगता कि आपको किसी की आवश्यकता होगी । मुझे लगता है कि दूसरा विकल्प सिर्फ पूरे हैंडलर के चारों ओर एक मोटे म्यूटेक्स लगाया गया है। – KermitG

+4

@ किर्मिट जी: यदि आप पूरा होने वाले हैंडलर कोड के बारे में चिंतित हैं तो कोड के साथ किसी अन्य धागे में दौड़ते हैं, तो केवल प्रीमिशन को रोकने में मदद नहीं होगी। जब पूरा होल्डर शुरू होता है तो दूसरा धागा महत्वपूर्ण खंड में हो सकता है; भले ही आप इसे पूरा करते हैं, जबकि पूरा होने वाला हैंडलर चलता है, फिर भी वह उस डेटा को देखेगा जो इसके तहत से बाहर निकलने पर काम कर रहा है। सामान्यतः यदि हैंडलर में कोड दौड़ सकता है, तो हैंडलर को लॉक करने के लिए जिम्मेदार होना चाहिए। – caf

1

मुझे लगता है कि आप रेस स्थितियों को रोकने के लिए म्यूटेक्स/ताले का उपयोग करना चाहेंगे। म्यूटेक्स किसी भी तरह से वूडू जादू नहीं हैं और मनमाने ढंग से सिस्टम-विशिष्ट विशेषताओं का उपयोग करने से भी आपके कोड को सरल बना सकते हैं, जिन्हें आपको सिस्टम में संभावित रूप से बंदरगाह की आवश्यकता होगी। पता नहीं है कि बाद वाला आपके लिए कोई मुद्दा है या नहीं।

1

मेरा मानना ​​है कि आप गलत कारणों से यहां लिनक्स शेड्यूलर को आउटमार्ट करने का प्रयास कर रहे हैं।

सही समाधान एक पूर्णांक में चलने से रोकने के लिए एक म्यूटेक्स का उपयोग करना है। शेड्यूलर को अपना काम करने दें।

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